From a4a89745b643b0052c2c1a6b826851edca2921a5 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Sun, 31 Aug 2025 17:46:12 -0700 Subject: [PATCH 001/150] chore(ui-deps): bump framer-motion from 11.18.2 to 12.23.12 in /llama_stack/ui (#3291) Bumps [framer-motion](https://github.com/motiondivision/motion) from 11.18.2 to 12.23.12.
Changelog

Sourced from framer-motion's changelog.

[12.23.12] 2025-07-29

Added

[12.23.11] 2025-07-28

Added

[12.23.10] 2025-07-28

Fixed

[12.23.9] 2025-07-24

Changed

[12.23.8] 2025-07-24

Fixed

[12.23.7] 2025-07-23

Fixed

[12.23.6] 2025-07-11

Changed

[12.23.5] 2025-07-11

Fixed

... (truncated)

Commits

[![Dependabot compatibility score](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name=framer-motion&package-manager=npm_and_yarn&previous-version=11.18.2&new-version=12.23.12)](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores) Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting `@dependabot rebase`. [//]: # (dependabot-automerge-start) [//]: # (dependabot-automerge-end) ---
Dependabot commands and options
You can trigger Dependabot actions by commenting on this PR: - `@dependabot rebase` will rebase this PR - `@dependabot recreate` will recreate this PR, overwriting any edits that have been made to it - `@dependabot merge` will merge this PR after your CI passes on it - `@dependabot squash and merge` will squash and merge this PR after your CI passes on it - `@dependabot cancel merge` will cancel a previously requested merge and block automerging - `@dependabot reopen` will reopen this PR if it is closed - `@dependabot close` will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually - `@dependabot show ignore conditions` will show all of the ignore conditions of the specified dependency - `@dependabot ignore this major version` will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this minor version` will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this dependency` will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)
Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- llama_stack/ui/package-lock.json | 26 +++++++++++++------------- llama_stack/ui/package.json | 2 +- 2 files changed, 14 insertions(+), 14 deletions(-) diff --git a/llama_stack/ui/package-lock.json b/llama_stack/ui/package-lock.json index 8748d44ad..e4bbca085 100644 --- a/llama_stack/ui/package-lock.json +++ b/llama_stack/ui/package-lock.json @@ -17,7 +17,7 @@ "@radix-ui/react-tooltip": "^1.2.6", "class-variance-authority": "^0.7.1", "clsx": "^2.1.1", - "framer-motion": "^11.18.2", + "framer-motion": "^12.23.12", "llama-stack-client": "^0.2.20", "lucide-react": "^0.510.0", "next": "15.3.3", @@ -7268,13 +7268,13 @@ } }, "node_modules/framer-motion": { - "version": "11.18.2", - "resolved": "https://registry.npmjs.org/framer-motion/-/framer-motion-11.18.2.tgz", - "integrity": "sha512-5F5Och7wrvtLVElIpclDT0CBzMVg3dL22B64aZwHtsIY8RB4mXICLrkajK4G9R+ieSAGcgrLeae2SeUTg2pr6w==", + "version": "12.23.12", + "resolved": "https://registry.npmjs.org/framer-motion/-/framer-motion-12.23.12.tgz", + "integrity": "sha512-6e78rdVtnBvlEVgu6eFEAgG9v3wLnYEboM8I5O5EXvfKC8gxGQB8wXJdhkMy10iVcn05jl6CNw7/HTsTCfwcWg==", "license": "MIT", "dependencies": { - "motion-dom": "^11.18.1", - "motion-utils": "^11.18.1", + "motion-dom": "^12.23.12", + "motion-utils": "^12.23.6", "tslib": "^2.4.0" }, "peerDependencies": { @@ -11184,18 +11184,18 @@ } }, "node_modules/motion-dom": { - "version": "11.18.1", - "resolved": "https://registry.npmjs.org/motion-dom/-/motion-dom-11.18.1.tgz", - "integrity": "sha512-g76KvA001z+atjfxczdRtw/RXOM3OMSdd1f4DL77qCTF/+avrRJiawSG4yDibEQ215sr9kpinSlX2pCTJ9zbhw==", + "version": "12.23.12", + "resolved": "https://registry.npmjs.org/motion-dom/-/motion-dom-12.23.12.tgz", + "integrity": "sha512-RcR4fvMCTESQBD/uKQe49D5RUeDOokkGRmz4ceaJKDBgHYtZtntC/s2vLvY38gqGaytinij/yi3hMcWVcEF5Kw==", "license": "MIT", "dependencies": { - "motion-utils": "^11.18.1" + "motion-utils": "^12.23.6" } }, "node_modules/motion-utils": { - "version": "11.18.1", - "resolved": "https://registry.npmjs.org/motion-utils/-/motion-utils-11.18.1.tgz", - "integrity": "sha512-49Kt+HKjtbJKLtgO/LKj9Ld+6vw9BjH5d9sc40R/kVyH8GLAXgT42M2NnuPcJNuA3s9ZfZBUcwIgpmZWGEE+hA==", + "version": "12.23.6", + "resolved": "https://registry.npmjs.org/motion-utils/-/motion-utils-12.23.6.tgz", + "integrity": "sha512-eAWoPgr4eFEOFfg2WjIsMoqJTW6Z8MTUCgn/GZ3VRpClWBdnbjryiA3ZSNLyxCTmCQx4RmYX6jX1iWHbenUPNQ==", "license": "MIT" }, "node_modules/ms": { diff --git a/llama_stack/ui/package.json b/llama_stack/ui/package.json index a9c56f98e..7a4e96074 100644 --- a/llama_stack/ui/package.json +++ b/llama_stack/ui/package.json @@ -22,7 +22,7 @@ "@radix-ui/react-tooltip": "^1.2.6", "class-variance-authority": "^0.7.1", "clsx": "^2.1.1", - "framer-motion": "^11.18.2", + "framer-motion": "^12.23.12", "llama-stack-client": "^0.2.20", "lucide-react": "^0.510.0", "next": "15.3.3", From 26b4340de3ddc27775cddf716d3aa3a367808729 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Sun, 31 Aug 2025 17:47:31 -0700 Subject: [PATCH 002/150] chore(ui-deps): bump @types/node from 20.17.47 to 24.3.0 in /llama_stack/ui (#3290) Bumps [@types/node](https://github.com/DefinitelyTyped/DefinitelyTyped/tree/HEAD/types/node) from 20.17.47 to 24.3.0.
Commits

[![Dependabot compatibility score](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name=@types/node&package-manager=npm_and_yarn&previous-version=20.17.47&new-version=24.3.0)](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores) Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting `@dependabot rebase`. [//]: # (dependabot-automerge-start) [//]: # (dependabot-automerge-end) ---
Dependabot commands and options
You can trigger Dependabot actions by commenting on this PR: - `@dependabot rebase` will rebase this PR - `@dependabot recreate` will recreate this PR, overwriting any edits that have been made to it - `@dependabot merge` will merge this PR after your CI passes on it - `@dependabot squash and merge` will squash and merge this PR after your CI passes on it - `@dependabot cancel merge` will cancel a previously requested merge and block automerging - `@dependabot reopen` will reopen this PR if it is closed - `@dependabot close` will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually - `@dependabot show ignore conditions` will show all of the ignore conditions of the specified dependency - `@dependabot ignore this major version` will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this minor version` will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this dependency` will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)
Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- llama_stack/ui/package-lock.json | 16 ++++++++-------- llama_stack/ui/package.json | 2 +- 2 files changed, 9 insertions(+), 9 deletions(-) diff --git a/llama_stack/ui/package-lock.json b/llama_stack/ui/package-lock.json index e4bbca085..f67c471ce 100644 --- a/llama_stack/ui/package-lock.json +++ b/llama_stack/ui/package-lock.json @@ -39,7 +39,7 @@ "@testing-library/jest-dom": "^6.8.0", "@testing-library/react": "^16.3.0", "@types/jest": "^29.5.14", - "@types/node": "^20", + "@types/node": "^24", "@types/react": "^19", "@types/react-dom": "^19", "eslint": "^9", @@ -3910,12 +3910,12 @@ "license": "MIT" }, "node_modules/@types/node": { - "version": "20.17.47", - "resolved": "https://registry.npmjs.org/@types/node/-/node-20.17.47.tgz", - "integrity": "sha512-3dLX0Upo1v7RvUimvxLeXqwrfyKxUINk0EAM83swP2mlSUcwV73sZy8XhNz8bcZ3VbsfQyC/y6jRdL5tgCNpDQ==", + "version": "24.3.0", + "resolved": "https://registry.npmjs.org/@types/node/-/node-24.3.0.tgz", + "integrity": "sha512-aPTXCrfwnDLj4VvXrm+UUCQjNEvJgNA8s5F1cvwQU+3KNltTOkBm1j30uNLyqqPNe7gE3KFzImYoZEfLhp4Yow==", "license": "MIT", "dependencies": { - "undici-types": "~6.19.2" + "undici-types": "~7.10.0" } }, "node_modules/@types/node-fetch": { @@ -13986,9 +13986,9 @@ } }, "node_modules/undici-types": { - "version": "6.19.8", - "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.19.8.tgz", - "integrity": "sha512-ve2KP6f/JnbPBFyobGHuerC9g1FYGn/F8n1LWTwNxCEzd6IfqTwUQcNXgEtmmQ6DlRrC1hrSrBnCZPokRrDHjw==", + "version": "7.10.0", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-7.10.0.tgz", + "integrity": "sha512-t5Fy/nfn+14LuOc2KNYg75vZqClpAiqscVvMygNnlsHBFpSXdJaYtXMcdNLpl/Qvc3P2cB3s6lOV51nqsFq4ag==", "license": "MIT" }, "node_modules/unified": { diff --git a/llama_stack/ui/package.json b/llama_stack/ui/package.json index 7a4e96074..8cf2467f4 100644 --- a/llama_stack/ui/package.json +++ b/llama_stack/ui/package.json @@ -44,7 +44,7 @@ "@testing-library/jest-dom": "^6.8.0", "@testing-library/react": "^16.3.0", "@types/jest": "^29.5.14", - "@types/node": "^20", + "@types/node": "^24", "@types/react": "^19", "@types/react-dom": "^19", "eslint": "^9", From 7cc059fe419d68bda7dee72f07661e6376bc0c79 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 1 Sep 2025 10:18:15 +0200 Subject: [PATCH 003/150] chore(ui-deps): bump eslint-config-next from 15.3.2 to 15.5.2 in /llama_stack/ui (#3288) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Bumps [eslint-config-next](https://github.com/vercel/next.js/tree/HEAD/packages/eslint-config-next) from 15.3.2 to 15.5.2.
Release notes

Sourced from eslint-config-next's releases.

v15.5.2

[!NOTE]
This release is backporting bug fixes. It does not include all pending features/changes on canary.

Core Changes

  • fix: disable unknownatrules lint rule entirely (#83059)
  • revert: add ?dpl to fonts in /_next/static/media (#83062)

Credits

Huge thanks to @​bgub and @​ztanner for helping!

v15.5.1

[!NOTE]
This release is backporting bug fixes. It does not include all pending features/changes on canary.

Core Changes

  • fix: aliased navigations should apply scroll handling (#82900)
  • Turbopack: fix invalid NFT entry with file behind symlink (#82887)
  • fix: typesafe linking to route handlers and pages API routes (#82858)
  • fix: change "noUnknownAtRules" to "warn" for Biome (#82974)
  • fix: add path normalization to getRelativePath for Windows (#82918)
  • feat: add typesafety with config.typedRoutes to redirect() and permanentRedirect() (#82860)
  • fix: avoid importing types that will be unused (#82856)
  • fix: update the config.api.responseLimit type (#82852)
  • fix: update validation return types (#82854)

Credits

Huge thanks to @​bgub, @​mischnic, and @​ztanner for helping!

v15.5.1-canary.20

Misc Changes

  • Turbopack: hide blocking spans in trace server: #83167
  • Update Rspack production test manifest: #83207
  • [create-next-app] Generate route types after setup: #82956
  • Update Rspack development test manifest: #83208
  • docs: fix snippets in getting started: #83228

Credits

Huge thanks to @​sokra, @​vercel-release-bot, @​bgub, and @​icyJoseph for helping!

v15.5.1-canary.19

Core Changes

  • [sourcemaps] Always check for vendor chunks regardless of Node.js version: #83114
  • Turbopack: Remove undocumented legacy syntax for built-in conditions (e.g. foreign, browser): #83068
  • [metadata] update metadata routes cache headers: #83215

... (truncated)

Commits

[![Dependabot compatibility score](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name=eslint-config-next&package-manager=npm_and_yarn&previous-version=15.3.2&new-version=15.5.2)](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores) Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting `@dependabot rebase`. [//]: # (dependabot-automerge-start) [//]: # (dependabot-automerge-end) ---
Dependabot commands and options
You can trigger Dependabot actions by commenting on this PR: - `@dependabot rebase` will rebase this PR - `@dependabot recreate` will recreate this PR, overwriting any edits that have been made to it - `@dependabot merge` will merge this PR after your CI passes on it - `@dependabot squash and merge` will squash and merge this PR after your CI passes on it - `@dependabot cancel merge` will cancel a previously requested merge and block automerging - `@dependabot reopen` will reopen this PR if it is closed - `@dependabot close` will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually - `@dependabot show ignore conditions` will show all of the ignore conditions of the specified dependency - `@dependabot ignore this major version` will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this minor version` will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this dependency` will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)
Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- llama_stack/ui/package-lock.json | 16 ++++++++-------- llama_stack/ui/package.json | 2 +- 2 files changed, 9 insertions(+), 9 deletions(-) diff --git a/llama_stack/ui/package-lock.json b/llama_stack/ui/package-lock.json index f67c471ce..4e9100d64 100644 --- a/llama_stack/ui/package-lock.json +++ b/llama_stack/ui/package-lock.json @@ -43,7 +43,7 @@ "@types/react": "^19", "@types/react-dom": "^19", "eslint": "^9", - "eslint-config-next": "15.3.2", + "eslint-config-next": "15.5.2", "eslint-config-prettier": "^10.1.8", "eslint-plugin-prettier": "^5.5.4", "jest": "^29.7.0", @@ -1854,9 +1854,9 @@ "integrity": "sha512-OdiMrzCl2Xi0VTjiQQUK0Xh7bJHnOuET2s+3V+Y40WJBAXrJeGA3f+I8MZJ/YQ3mVGi5XGR1L66oFlgqXhQ4Vw==" }, "node_modules/@next/eslint-plugin-next": { - "version": "15.3.2", - "resolved": "https://registry.npmjs.org/@next/eslint-plugin-next/-/eslint-plugin-next-15.3.2.tgz", - "integrity": "sha512-ijVRTXBgnHT33aWnDtmlG+LJD+5vhc9AKTJPquGG5NKXjpKNjc62woIhFtrAcWdBobt8kqjCoaJ0q6sDQoX7aQ==", + "version": "15.5.2", + "resolved": "https://registry.npmjs.org/@next/eslint-plugin-next/-/eslint-plugin-next-15.5.2.tgz", + "integrity": "sha512-lkLrRVxcftuOsJNhWatf1P2hNVfh98k/omQHrCEPPriUypR6RcS13IvLdIrEvkm9AH2Nu2YpR5vLqBuy6twH3Q==", "dev": true, "license": "MIT", "dependencies": { @@ -6433,13 +6433,13 @@ } }, "node_modules/eslint-config-next": { - "version": "15.3.2", - "resolved": "https://registry.npmjs.org/eslint-config-next/-/eslint-config-next-15.3.2.tgz", - "integrity": "sha512-FerU4DYccO4FgeYFFglz0SnaKRe1ejXQrDb8kWUkTAg036YWi+jUsgg4sIGNCDhAsDITsZaL4MzBWKB6f4G1Dg==", + "version": "15.5.2", + "resolved": "https://registry.npmjs.org/eslint-config-next/-/eslint-config-next-15.5.2.tgz", + "integrity": "sha512-3hPZghsLupMxxZ2ggjIIrat/bPniM2yRpsVPVM40rp8ZMzKWOJp2CGWn7+EzoV2ddkUr5fxNfHpF+wU1hGt/3g==", "dev": true, "license": "MIT", "dependencies": { - "@next/eslint-plugin-next": "15.3.2", + "@next/eslint-plugin-next": "15.5.2", "@rushstack/eslint-patch": "^1.10.3", "@typescript-eslint/eslint-plugin": "^5.4.2 || ^6.0.0 || ^7.0.0 || ^8.0.0", "@typescript-eslint/parser": "^5.4.2 || ^6.0.0 || ^7.0.0 || ^8.0.0", diff --git a/llama_stack/ui/package.json b/llama_stack/ui/package.json index 8cf2467f4..e4d41d04d 100644 --- a/llama_stack/ui/package.json +++ b/llama_stack/ui/package.json @@ -48,7 +48,7 @@ "@types/react": "^19", "@types/react-dom": "^19", "eslint": "^9", - "eslint-config-next": "15.3.2", + "eslint-config-next": "15.5.2", "eslint-config-prettier": "^10.1.8", "eslint-plugin-prettier": "^5.5.4", "jest": "^29.7.0", From 4499559ed164f76f0f53ab5bc26632a61c5760a0 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 1 Sep 2025 10:18:40 +0200 Subject: [PATCH 004/150] chore(ui-deps): bump prettier from 3.5.3 to 3.6.2 in /llama_stack/ui (#3289) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Bumps [prettier](https://github.com/prettier/prettier) from 3.5.3 to 3.6.2.
Release notes

Sourced from prettier's releases.

3.6.2

What's Changed

🔗 Changelog

3.6.1

  • Fix "Warning: File descriptor 39 closed but not opened in unmanaged mode" error when running --experimental-cli

🔗 Changelog

3.6.0

diff

🔗 Release note "Prettier 3.6: Experimental fast CLI and new OXC and Hermes plugins!"

Changelog

Sourced from prettier's changelog.

3.6.2

diff

Markdown: Add missing blank line around code block (#17675 by @​fisker)

<!-- Input -->
1. Some text, and code block below, with newline after code block
---
foo: bar
  1. Another
  2. List

<!-- Prettier 3.6.1 -->

  1. Some text, and code block below, with newline after code block

    ---
    foo: bar
    
    1. Another
    2. List

<!-- Prettier 3.6.2 -->

  1. Some text, and code block below, with newline after code block

    ---
    foo: bar
    
    1. Another
    2. List

3.6.1

diff

TypeScript: Allow const without initializer (#17650, #17654 by @​fisker)

// Input
</tr></table>

... (truncated)

Commits
  • 7a8b05f Release 3.6.2
  • 46526b4 Add missing blank line around code block (#17675)
  • a04ec11 chore(deps): update babel to v7.27.7 (#17684)
  • 32be5b6 chore(deps): update dependency flow-parser to v0.274.1 (#17676)
  • b55e777 Update docs about "TypeScript Configuration Files" (#17677)
  • b197c99 chore(deps): update dependency @​vitejs/plugin-react to v4.6.0 (#17674)
  • 1185f83 chore(deps): update dependency @​angular/compiler to v20.0.5 (#17680)
  • aa1316f chore(deps): update dependency browserslist to v4.25.1 (#17671)
  • c468d33 chore(deps): update dependency oxc-parser to v0.75.0 (#17672)
  • 3f46d91 chore(deps): update dependency vite to v7 (#17673)
  • Additional commits viewable in compare view

[![Dependabot compatibility score](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name=prettier&package-manager=npm_and_yarn&previous-version=3.5.3&new-version=3.6.2)](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores) Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting `@dependabot rebase`. [//]: # (dependabot-automerge-start) [//]: # (dependabot-automerge-end) ---
Dependabot commands and options
You can trigger Dependabot actions by commenting on this PR: - `@dependabot rebase` will rebase this PR - `@dependabot recreate` will recreate this PR, overwriting any edits that have been made to it - `@dependabot merge` will merge this PR after your CI passes on it - `@dependabot squash and merge` will squash and merge this PR after your CI passes on it - `@dependabot cancel merge` will cancel a previously requested merge and block automerging - `@dependabot reopen` will reopen this PR if it is closed - `@dependabot close` will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually - `@dependabot show ignore conditions` will show all of the ignore conditions of the specified dependency - `@dependabot ignore this major version` will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this minor version` will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this dependency` will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)
Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- llama_stack/ui/package-lock.json | 8 ++++---- llama_stack/ui/package.json | 2 +- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/llama_stack/ui/package-lock.json b/llama_stack/ui/package-lock.json index 4e9100d64..da42958c3 100644 --- a/llama_stack/ui/package-lock.json +++ b/llama_stack/ui/package-lock.json @@ -48,7 +48,7 @@ "eslint-plugin-prettier": "^5.5.4", "jest": "^29.7.0", "jest-environment-jsdom": "^29.7.0", - "prettier": "3.5.3", + "prettier": "3.6.2", "tailwindcss": "^4", "ts-node": "^10.9.2", "tw-animate-css": "^1.2.9", @@ -12083,9 +12083,9 @@ } }, "node_modules/prettier": { - "version": "3.5.3", - "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.5.3.tgz", - "integrity": "sha512-QQtaxnoDJeAkDvDKWCLiwIXkTgRhwYDEQCghU9Z6q03iyek/rxRh/2lC3HB7P8sWT2xC/y5JDctPLBIGzHKbhw==", + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.6.2.tgz", + "integrity": "sha512-I7AIg5boAr5R0FFtJ6rCfD+LFsWHp81dolrFD8S79U9tb8Az2nGrJncnMSnys+bpQJfRUzqs9hnA81OAA3hCuQ==", "dev": true, "license": "MIT", "bin": { diff --git a/llama_stack/ui/package.json b/llama_stack/ui/package.json index e4d41d04d..9efde6dd4 100644 --- a/llama_stack/ui/package.json +++ b/llama_stack/ui/package.json @@ -53,7 +53,7 @@ "eslint-plugin-prettier": "^5.5.4", "jest": "^29.7.0", "jest-environment-jsdom": "^29.7.0", - "prettier": "3.5.3", + "prettier": "3.6.2", "tailwindcss": "^4", "ts-node": "^10.9.2", "tw-animate-css": "^1.2.9", From 9e5ef1af3c5d4df017710fa1d913081e9f18049f Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 1 Sep 2025 10:18:57 +0200 Subject: [PATCH 005/150] chore(ui-deps): bump @radix-ui/react-tooltip from 1.2.6 to 1.2.8 in /llama_stack/ui (#3287) Bumps [@radix-ui/react-tooltip](https://github.com/radix-ui/primitives) from 1.2.6 to 1.2.8.
Commits

[![Dependabot compatibility score](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name=@radix-ui/react-tooltip&package-manager=npm_and_yarn&previous-version=1.2.6&new-version=1.2.8)](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores) Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting `@dependabot rebase`. [//]: # (dependabot-automerge-start) [//]: # (dependabot-automerge-end) ---
Dependabot commands and options
You can trigger Dependabot actions by commenting on this PR: - `@dependabot rebase` will rebase this PR - `@dependabot recreate` will recreate this PR, overwriting any edits that have been made to it - `@dependabot merge` will merge this PR after your CI passes on it - `@dependabot squash and merge` will squash and merge this PR after your CI passes on it - `@dependabot cancel merge` will cancel a previously requested merge and block automerging - `@dependabot reopen` will reopen this PR if it is closed - `@dependabot close` will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually - `@dependabot show ignore conditions` will show all of the ignore conditions of the specified dependency - `@dependabot ignore this major version` will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this minor version` will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this dependency` will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)
Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- llama_stack/ui/package-lock.json | 231 +++++++++++++++++++++++++------ llama_stack/ui/package.json | 2 +- 2 files changed, 187 insertions(+), 46 deletions(-) diff --git a/llama_stack/ui/package-lock.json b/llama_stack/ui/package-lock.json index da42958c3..7873cdfd5 100644 --- a/llama_stack/ui/package-lock.json +++ b/llama_stack/ui/package-lock.json @@ -14,7 +14,7 @@ "@radix-ui/react-select": "^2.2.5", "@radix-ui/react-separator": "^1.1.7", "@radix-ui/react-slot": "^1.2.3", - "@radix-ui/react-tooltip": "^1.2.6", + "@radix-ui/react-tooltip": "^1.2.8", "class-variance-authority": "^0.7.1", "clsx": "^2.1.1", "framer-motion": "^12.23.12", @@ -2861,29 +2861,6 @@ } } }, - "node_modules/@radix-ui/react-select/node_modules/@radix-ui/react-visually-hidden": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/@radix-ui/react-visually-hidden/-/react-visually-hidden-1.2.3.tgz", - "integrity": "sha512-pzJq12tEaaIhqjbzpCuv/OypJY/BPavOofm+dbab+MHLajy277+1lLm6JFcGgF5eskJ6mquGirhXY2GD/8u8Ug==", - "license": "MIT", - "dependencies": { - "@radix-ui/react-primitive": "2.1.3" - }, - "peerDependencies": { - "@types/react": "*", - "@types/react-dom": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", - "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - }, - "@types/react-dom": { - "optional": true - } - } - }, "node_modules/@radix-ui/react-separator": { "version": "1.1.7", "resolved": "https://registry.npmjs.org/@radix-ui/react-separator/-/react-separator-1.1.7.tgz", @@ -2949,23 +2926,23 @@ } }, "node_modules/@radix-ui/react-tooltip": { - "version": "1.2.6", - "resolved": "https://registry.npmjs.org/@radix-ui/react-tooltip/-/react-tooltip-1.2.6.tgz", - "integrity": "sha512-zYb+9dc9tkoN2JjBDIIPLQtk3gGyz8FMKoqYTb8EMVQ5a5hBcdHPECrsZVI4NpPAUOixhkoqg7Hj5ry5USowfA==", + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/@radix-ui/react-tooltip/-/react-tooltip-1.2.8.tgz", + "integrity": "sha512-tY7sVt1yL9ozIxvmbtN5qtmH2krXcBCfjEiCgKGLqunJHvgvZG2Pcl2oQ3kbcZARb1BGEHdkLzcYGO8ynVlieg==", "license": "MIT", "dependencies": { - "@radix-ui/primitive": "1.1.2", + "@radix-ui/primitive": "1.1.3", "@radix-ui/react-compose-refs": "1.1.2", "@radix-ui/react-context": "1.1.2", - "@radix-ui/react-dismissable-layer": "1.1.9", + "@radix-ui/react-dismissable-layer": "1.1.11", "@radix-ui/react-id": "1.1.1", - "@radix-ui/react-popper": "1.2.6", - "@radix-ui/react-portal": "1.1.8", - "@radix-ui/react-presence": "1.1.4", - "@radix-ui/react-primitive": "2.1.2", - "@radix-ui/react-slot": "1.2.2", + "@radix-ui/react-popper": "1.2.8", + "@radix-ui/react-portal": "1.1.9", + "@radix-ui/react-presence": "1.1.5", + "@radix-ui/react-primitive": "2.1.3", + "@radix-ui/react-slot": "1.2.3", "@radix-ui/react-use-controllable-state": "1.2.2", - "@radix-ui/react-visually-hidden": "1.2.2" + "@radix-ui/react-visually-hidden": "1.2.3" }, "peerDependencies": { "@types/react": "*", @@ -2982,21 +2959,162 @@ } } }, - "node_modules/@radix-ui/react-tooltip/node_modules/@radix-ui/react-slot": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/@radix-ui/react-slot/-/react-slot-1.2.2.tgz", - "integrity": "sha512-y7TBO4xN4Y94FvcWIOIh18fM4R1A8S4q1jhoz4PNzOoHsFcN8pogcFmZrTYAm4F9VRUrWP/Mw7xSKybIeRI+CQ==", + "node_modules/@radix-ui/react-tooltip/node_modules/@radix-ui/primitive": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/@radix-ui/primitive/-/primitive-1.1.3.tgz", + "integrity": "sha512-JTF99U/6XIjCBo0wqkU5sK10glYe27MRRsfwoiq5zzOEZLHU3A3KCMa5X/azekYRCJ0HlwI0crAXS/5dEHTzDg==", + "license": "MIT" + }, + "node_modules/@radix-ui/react-tooltip/node_modules/@radix-ui/react-arrow": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/@radix-ui/react-arrow/-/react-arrow-1.1.7.tgz", + "integrity": "sha512-F+M1tLhO+mlQaOWspE8Wstg+z6PwxwRd8oQ8IXceWz92kfAmalTRf0EjrouQeo7QssEPfCn05B4Ihs1K9WQ/7w==", "license": "MIT", "dependencies": { - "@radix-ui/react-compose-refs": "1.1.2" + "@radix-ui/react-primitive": "2.1.3" }, "peerDependencies": { "@types/react": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "peerDependenciesMeta": { "@types/react": { "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-tooltip/node_modules/@radix-ui/react-dismissable-layer": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/@radix-ui/react-dismissable-layer/-/react-dismissable-layer-1.1.11.tgz", + "integrity": "sha512-Nqcp+t5cTB8BinFkZgXiMJniQH0PsUt2k51FUhbdfeKvc4ACcG2uQniY/8+h1Yv6Kza4Q7lD7PQV0z0oicE0Mg==", + "license": "MIT", + "dependencies": { + "@radix-ui/primitive": "1.1.3", + "@radix-ui/react-compose-refs": "1.1.2", + "@radix-ui/react-primitive": "2.1.3", + "@radix-ui/react-use-callback-ref": "1.1.1", + "@radix-ui/react-use-escape-keydown": "1.1.1" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-tooltip/node_modules/@radix-ui/react-popper": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/@radix-ui/react-popper/-/react-popper-1.2.8.tgz", + "integrity": "sha512-0NJQ4LFFUuWkE7Oxf0htBKS6zLkkjBH+hM1uk7Ng705ReR8m/uelduy1DBo0PyBXPKVnBA6YBlU94MBGXrSBCw==", + "license": "MIT", + "dependencies": { + "@floating-ui/react-dom": "^2.0.0", + "@radix-ui/react-arrow": "1.1.7", + "@radix-ui/react-compose-refs": "1.1.2", + "@radix-ui/react-context": "1.1.2", + "@radix-ui/react-primitive": "2.1.3", + "@radix-ui/react-use-callback-ref": "1.1.1", + "@radix-ui/react-use-layout-effect": "1.1.1", + "@radix-ui/react-use-rect": "1.1.1", + "@radix-ui/react-use-size": "1.1.1", + "@radix-ui/rect": "1.1.1" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-tooltip/node_modules/@radix-ui/react-portal": { + "version": "1.1.9", + "resolved": "https://registry.npmjs.org/@radix-ui/react-portal/-/react-portal-1.1.9.tgz", + "integrity": "sha512-bpIxvq03if6UNwXZ+HTK71JLh4APvnXntDc6XOX8UVq4XQOVl7lwok0AvIl+b8zgCw3fSaVTZMpAPPagXbKmHQ==", + "license": "MIT", + "dependencies": { + "@radix-ui/react-primitive": "2.1.3", + "@radix-ui/react-use-layout-effect": "1.1.1" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-tooltip/node_modules/@radix-ui/react-presence": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/@radix-ui/react-presence/-/react-presence-1.1.5.tgz", + "integrity": "sha512-/jfEwNDdQVBCNvjkGit4h6pMOzq8bHkopq458dPt2lMjx+eBQUohZNG9A7DtO/O5ukSbxuaNGXMjHicgwy6rQQ==", + "license": "MIT", + "dependencies": { + "@radix-ui/react-compose-refs": "1.1.2", + "@radix-ui/react-use-layout-effect": "1.1.1" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-tooltip/node_modules/@radix-ui/react-primitive": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/@radix-ui/react-primitive/-/react-primitive-2.1.3.tgz", + "integrity": "sha512-m9gTwRkhy2lvCPe6QJp4d3G1TYEUHn/FzJUtq9MjH46an1wJU+GdoGC5VLof8RX8Ft/DlpshApkhswDLZzHIcQ==", + "license": "MIT", + "dependencies": { + "@radix-ui/react-slot": "1.2.3" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true } } }, @@ -3137,12 +3255,35 @@ } }, "node_modules/@radix-ui/react-visually-hidden": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/@radix-ui/react-visually-hidden/-/react-visually-hidden-1.2.2.tgz", - "integrity": "sha512-ORCmRUbNiZIv6uV5mhFrhsIKw4UX/N3syZtyqvry61tbGm4JlgQuSn0hk5TwCARsCjkcnuRkSdCE3xfb+ADHew==", + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/@radix-ui/react-visually-hidden/-/react-visually-hidden-1.2.3.tgz", + "integrity": "sha512-pzJq12tEaaIhqjbzpCuv/OypJY/BPavOofm+dbab+MHLajy277+1lLm6JFcGgF5eskJ6mquGirhXY2GD/8u8Ug==", "license": "MIT", "dependencies": { - "@radix-ui/react-primitive": "2.1.2" + "@radix-ui/react-primitive": "2.1.3" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-visually-hidden/node_modules/@radix-ui/react-primitive": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/@radix-ui/react-primitive/-/react-primitive-2.1.3.tgz", + "integrity": "sha512-m9gTwRkhy2lvCPe6QJp4d3G1TYEUHn/FzJUtq9MjH46an1wJU+GdoGC5VLof8RX8Ft/DlpshApkhswDLZzHIcQ==", + "license": "MIT", + "dependencies": { + "@radix-ui/react-slot": "1.2.3" }, "peerDependencies": { "@types/react": "*", diff --git a/llama_stack/ui/package.json b/llama_stack/ui/package.json index 9efde6dd4..b37ff233f 100644 --- a/llama_stack/ui/package.json +++ b/llama_stack/ui/package.json @@ -19,7 +19,7 @@ "@radix-ui/react-select": "^2.2.5", "@radix-ui/react-separator": "^1.1.7", "@radix-ui/react-slot": "^1.2.3", - "@radix-ui/react-tooltip": "^1.2.6", + "@radix-ui/react-tooltip": "^1.2.8", "class-variance-authority": "^0.7.1", "clsx": "^2.1.1", "framer-motion": "^12.23.12", From 9625ac6d0206148ef96694ae6c66237bbb2eca3b Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 1 Sep 2025 16:49:09 +0200 Subject: [PATCH 006/150] chore(python-deps): bump locust from 2.39.0 to 2.39.1 (#3284) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Bumps [locust](https://github.com/locustio/locust) from 2.39.0 to 2.39.1.
Release notes

Sourced from locust's releases.

2.39.1

What's Changed

New Contributors

Full Changelog: https://github.com/locustio/locust/compare/2.39.0...2.39.1

Changelog

Sourced from locust's changelog.

Detailed changelog

The most important changes can also be found in the documentation.

Commits
  • 934c5c3 changelog
  • 9350084 disable macos build for now
  • 705e2f6 Disable another unit test on macos because of annoying behavior on GH (really...
  • d888b9d Disable another unit test on macos because of annoying behavior on GH
  • 45bc4d8 Disable annoying test case on macos for now. Only has issues on GH. @​amadeupp...
  • 9d7710a unit tests: give extra time for testing on macOS
  • fcbc740 Avoid broken gevent version for now (#3196)
  • cd1f600 mypy
  • 0cf52dc Autogen changelog for 2.39.0
  • 094395e Merge pull request #3195 from JumboBear/pyproject
  • Additional commits viewable in compare view

[![Dependabot compatibility score](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name=locust&package-manager=uv&previous-version=2.39.0&new-version=2.39.1)](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores) Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting `@dependabot rebase`. [//]: # (dependabot-automerge-start) [//]: # (dependabot-automerge-end) ---
Dependabot commands and options
You can trigger Dependabot actions by commenting on this PR: - `@dependabot rebase` will rebase this PR - `@dependabot recreate` will recreate this PR, overwriting any edits that have been made to it - `@dependabot merge` will merge this PR after your CI passes on it - `@dependabot squash and merge` will squash and merge this PR after your CI passes on it - `@dependabot cancel merge` will cancel a previously requested merge and block automerging - `@dependabot reopen` will reopen this PR if it is closed - `@dependabot close` will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually - `@dependabot show ignore conditions` will show all of the ignore conditions of the specified dependency - `@dependabot ignore this major version` will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this minor version` will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this dependency` will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)
Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- pyproject.toml | 2 +- uv.lock | 9 +++++---- 2 files changed, 6 insertions(+), 5 deletions(-) diff --git a/pyproject.toml b/pyproject.toml index 1f87a3aaa..7881b79db 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -146,7 +146,7 @@ docs = [ ] codegen = ["rich", "pydantic", "jinja2>=3.1.6"] benchmark = [ - "locust>=2.37.14", + "locust>=2.39.1", ] [project.urls] diff --git a/uv.lock b/uv.lock index 73b52a3e9..0c658011a 100644 --- a/uv.lock +++ b/uv.lock @@ -1930,7 +1930,7 @@ requires-dist = [ provides-extras = ["ui"] [package.metadata.requires-dev] -benchmark = [{ name = "locust", specifier = ">=2.37.14" }] +benchmark = [{ name = "locust", specifier = ">=2.39.1" }] codegen = [ { name = "jinja2", specifier = ">=3.1.6" }, { name = "pydantic" }, @@ -2043,7 +2043,7 @@ wheels = [ [[package]] name = "locust" -version = "2.39.0" +version = "2.39.1" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "configargparse" }, @@ -2055,6 +2055,7 @@ dependencies = [ { name = "locust-cloud" }, { name = "msgpack" }, { name = "psutil" }, + { name = "python-engineio" }, { name = "python-socketio", extra = ["client"] }, { name = "pywin32", marker = "sys_platform == 'win32'" }, { name = "pyzmq" }, @@ -2062,9 +2063,9 @@ dependencies = [ { name = "setuptools" }, { name = "werkzeug" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/c4/6f/d6ca4483f4795747fbbd610d28e798ca4f5d4358e03f309343eb5bab128f/locust-2.39.0.tar.gz", hash = "sha256:71e82a68324f9d63d4b800035288488c08eab12811fa4c24ff07f031643b7b39", size = 1409879, upload-time = "2025-08-20T13:39:55.233Z" } +sdist = { url = "https://files.pythonhosted.org/packages/95/c8/10aa5445c404eed389b56877e6714c1787190cc09dd70059ce3765979ec5/locust-2.39.1.tar.gz", hash = "sha256:6bdd19e27edf9a1c84391d6cf6e9a737dfb832be7dfbf39053191ae31b9cc498", size = 1409902, upload-time = "2025-08-29T17:41:01.544Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/7c/94/7dc9a2b4ccb18a5b0c4be4bfadfa79b6c0fd860267a7114641402627e7db/locust-2.39.0-py3-none-any.whl", hash = "sha256:3817c4d7cca387b4b871da779c9e145c2a95fbb0b5602be5833976902b967a8f", size = 1428138, upload-time = "2025-08-20T13:39:52.549Z" }, + { url = "https://files.pythonhosted.org/packages/ec/b3/b2f4b2ca88b1e72eba7be2b2982533b887f8b709d222db78eb9602aa5121/locust-2.39.1-py3-none-any.whl", hash = "sha256:fd5148f2f1a4ed34aee968abc4393674e69d1b5e1b54db50a397f6eb09ce0b04", size = 1428155, upload-time = "2025-08-29T17:41:00.245Z" }, ] [[package]] From 4a59961a6cd764db739aefeba06601dfaee68d88 Mon Sep 17 00:00:00 2001 From: IAN MILLER <75687988+r3v5@users.noreply.github.com> Date: Mon, 1 Sep 2025 15:50:50 +0100 Subject: [PATCH 007/150] refactor: remove lama-api-client from pyproject.toml (#3299) # What does this PR do? This PR is eliminating `lama-api-client` dependency at `pyproject.toml` because it's not used in Llama Stack codebase ## Test Plan ` ./scripts/unit-tests.sh` --- pyproject.toml | 1 - uv.lock | 18 ------------------ 2 files changed, 19 deletions(-) diff --git a/pyproject.toml b/pyproject.toml index 7881b79db..f615e632b 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -32,7 +32,6 @@ dependencies = [ "jinja2>=3.1.6", "jsonschema", "llama-stack-client>=0.2.20", - "llama-api-client>=0.1.2", "openai>=1.99.6", "prompt-toolkit", "python-dotenv", diff --git a/uv.lock b/uv.lock index 0c658011a..898194134 100644 --- a/uv.lock +++ b/uv.lock @@ -1748,22 +1748,6 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/5f/e4/f1546746049c99c6b8b247e2f34485b9eae36faa9322b84e2a17262e6712/litellm-1.74.9-py3-none-any.whl", hash = "sha256:ab8f8a6e4d8689d3c7c4f9c3bbc7e46212cc3ebc74ddd0f3c0c921bb459c9874", size = 8740449, upload-time = "2025-07-28T16:42:36.8Z" }, ] -[[package]] -name = "llama-api-client" -version = "0.2.0" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "anyio" }, - { name = "distro" }, - { name = "httpx" }, - { name = "pydantic" }, - { name = "sniffio" }, - { name = "typing-extensions" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/59/41/fa8521a0faff96bf5f810e2ab5b78c638f5ba44afd09aa86f94b6a1226ad/llama_api_client-0.2.0.tar.gz", hash = "sha256:b9bd5f5ad332b9133f0775a105f0940f057cbb311891f1d4487247d001c31f17", size = 117108, upload-time = "2025-08-12T17:07:07.734Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/1d/11/198e65c1a50d9e839b4e3d346b4bd0f624e532446e468d1aba6c74ed7484/llama_api_client-0.2.0-py3-none-any.whl", hash = "sha256:50614ed991e1a72439e6a624a97e6000615ada1b9e2046ecc026fe62f107663c", size = 85002, upload-time = "2025-08-12T17:07:06.293Z" }, -] [[package]] name = "llama-stack" @@ -1780,7 +1764,6 @@ dependencies = [ { name = "huggingface-hub" }, { name = "jinja2" }, { name = "jsonschema" }, - { name = "llama-api-client" }, { name = "llama-stack-client" }, { name = "openai" }, { name = "opentelemetry-exporter-otlp-proto-http" }, @@ -1906,7 +1889,6 @@ requires-dist = [ { name = "huggingface-hub", specifier = ">=0.34.0,<1.0" }, { name = "jinja2", specifier = ">=3.1.6" }, { name = "jsonschema" }, - { name = "llama-api-client", specifier = ">=0.1.2" }, { name = "llama-stack-client", specifier = ">=0.2.20" }, { name = "llama-stack-client", marker = "extra == 'ui'", specifier = ">=0.2.20" }, { name = "openai", specifier = ">=1.99.6" }, From 5c873d53dbaa8fd15d0167d1036126cf2488836a Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 1 Sep 2025 20:24:22 -0400 Subject: [PATCH 008/150] chore(python-deps): bump pymilvus from 2.6.0 to 2.6.1 (#3285) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Bumps [pymilvus](https://github.com/milvus-io/pymilvus) from 2.6.0 to 2.6.1.
Release notes

Sourced from pymilvus's releases.

PyMilvus v2.6.1 Release Notes

What's Changed

Full Changelog: https://github.com/milvus-io/pymilvus/compare/v2.6.0...v2.6.1

Commits
  • 0237c9f fix: [2.6]Passing unknown req.is_refresh to wait (#2964)
  • a083622 enhance: Multiple cherry picks from master branch (#2962)
  • 87e3c5a enhance: Add unixmsec in every RPC call (#2961)
  • 98077a2 fix: [2.6]Fix the existing version fmt (#2960)
  • 80e2e09 feat: Add partial update support for upsert operations (#2938) (#2940)
  • 0210ee9 [cherry-pick] support stageManager & stageFileManager (#2935)
  • 00fb8e6 [cherry-pick] bulkImport add objectUrls/token paramster & add example use (#2...
  • 442ef15 Avoid describe_collection when query by ids (#2930)
  • e704dd2 fix: Correct github actions on branch 2.6 (#2926)
  • See full diff in compare view

[![Dependabot compatibility score](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name=pymilvus&package-manager=uv&previous-version=2.6.0&new-version=2.6.1)](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores) Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting `@dependabot rebase`. [//]: # (dependabot-automerge-start) [//]: # (dependabot-automerge-end) ---
Dependabot commands and options
You can trigger Dependabot actions by commenting on this PR: - `@dependabot rebase` will rebase this PR - `@dependabot recreate` will recreate this PR, overwriting any edits that have been made to it - `@dependabot merge` will merge this PR after your CI passes on it - `@dependabot squash and merge` will squash and merge this PR after your CI passes on it - `@dependabot cancel merge` will cancel a previously requested merge and block automerging - `@dependabot reopen` will reopen this PR if it is closed - `@dependabot close` will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually - `@dependabot show ignore conditions` will show all of the ignore conditions of the specified dependency - `@dependabot ignore this major version` will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this minor version` will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this dependency` will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)
Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- pyproject.toml | 4 ++-- uv.lock | 10 +++++----- 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/pyproject.toml b/pyproject.toml index f615e632b..fb6d3a330 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -92,7 +92,7 @@ unit = [ "sqlalchemy[asyncio]>=2.0.41", "blobfile", "faiss-cpu", - "pymilvus>=2.5.12", + "pymilvus>=2.6.1", "milvus-lite>=2.5.0", "litellm", "together", @@ -120,7 +120,7 @@ test = [ "sqlalchemy", "sqlalchemy[asyncio]>=2.0.41", "requests", - "pymilvus>=2.5.12", + "pymilvus>=2.6.1", "milvus-lite>=2.5.0", "weaviate-client>=4.16.4", ] diff --git a/uv.lock b/uv.lock index 898194134..43cc59c7a 100644 --- a/uv.lock +++ b/uv.lock @@ -1963,7 +1963,7 @@ test = [ { name = "milvus-lite", specifier = ">=2.5.0" }, { name = "openai", specifier = ">=1.100.0" }, { name = "psycopg2-binary", specifier = ">=2.9.0" }, - { name = "pymilvus", specifier = ">=2.5.12" }, + { name = "pymilvus", specifier = ">=2.6.1" }, { name = "pypdf" }, { name = "requests" }, { name = "sqlalchemy" }, @@ -1988,7 +1988,7 @@ unit = [ { name = "ollama" }, { name = "openai" }, { name = "psycopg2-binary", specifier = ">=2.9.0" }, - { name = "pymilvus", specifier = ">=2.5.12" }, + { name = "pymilvus", specifier = ">=2.6.1" }, { name = "pypdf" }, { name = "qdrant-client" }, { name = "sqlalchemy" }, @@ -3491,7 +3491,7 @@ wheels = [ [[package]] name = "pymilvus" -version = "2.6.0" +version = "2.6.1" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "grpcio" }, @@ -3502,9 +3502,9 @@ dependencies = [ { name = "setuptools" }, { name = "ujson" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/86/21/5c25a975299415a5a8f26d4759ddf7852aefdf3595f002b5203c4aaf5c8e/pymilvus-2.6.0.tar.gz", hash = "sha256:2b2ca487e098abc34231755e33af2f5294e9f6a64d92d03551532defbac0a3fb", size = 1292994, upload-time = "2025-08-06T09:09:01.705Z" } +sdist = { url = "https://files.pythonhosted.org/packages/70/a9/b25af985972082d1bb0b26739fece8cea3f56370733b4b1de690c42a77cc/pymilvus-2.6.1.tar.gz", hash = "sha256:ef1d7f5039719398d131ca80c19e55bc2bccc7ab6609f2cca9a04217dcb0a7fb", size = 1322169, upload-time = "2025-08-29T10:03:50.523Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/f6/a2/dfc2a2225aeb90a7dff9443f2d26fe9d04f6f7bcefe537945b5d5220fddd/pymilvus-2.6.0-py3-none-any.whl", hash = "sha256:d743fdd928c9007184d24a52b4f5dfdd18d405a37b4dba66b5ea4bf196fac526", size = 248299, upload-time = "2025-08-06T09:08:58.272Z" }, + { url = "https://files.pythonhosted.org/packages/d4/1a/8b677e0f4ef683bbfb00d495960573fff0844ed509b3cf0abede79a48e90/pymilvus-2.6.1-py3-none-any.whl", hash = "sha256:e3d76d45ce04d3555a6849645a18a1e2992706e248d5b6dc58a00504d0b60165", size = 254252, upload-time = "2025-08-29T10:03:48.539Z" }, ] [[package]] From faf891b40c6236821ba9730e11d985582aad4b9a Mon Sep 17 00:00:00 2001 From: IAN MILLER <75687988+r3v5@users.noreply.github.com> Date: Tue, 2 Sep 2025 18:38:35 +0100 Subject: [PATCH 009/150] refactor: use generic WeightedInMemoryAggregator for hybrid search in SQLiteVecIndex (#3303) # What does this PR do? The purpose of this PR is to refactor `SQLiteVecIndex` to eliminate redundant code and simplify the code using generic `WeightedInMemoryAggregator` that can be used for any vector db provider. This pattern is already implemented for `PGVectorIndex` in #3064 CC: @franciscojavierarceo ## Test Plan 1. `./scripts/unit-tests.sh` 2. Integration tests in CI Workflow --- .../inline/vector_io/sqlite_vec/sqlite_vec.py | 67 ++----------------- 1 file changed, 5 insertions(+), 62 deletions(-) diff --git a/llama_stack/providers/inline/vector_io/sqlite_vec/sqlite_vec.py b/llama_stack/providers/inline/vector_io/sqlite_vec/sqlite_vec.py index 7cf163960..f34f8f6fb 100644 --- a/llama_stack/providers/inline/vector_io/sqlite_vec/sqlite_vec.py +++ b/llama_stack/providers/inline/vector_io/sqlite_vec/sqlite_vec.py @@ -30,11 +30,11 @@ from llama_stack.providers.utils.kvstore.api import KVStore from llama_stack.providers.utils.memory.openai_vector_store_mixin import OpenAIVectorStoreMixin from llama_stack.providers.utils.memory.vector_store import ( RERANKER_TYPE_RRF, - RERANKER_TYPE_WEIGHTED, ChunkForDeletion, EmbeddingIndex, VectorDBWithIndex, ) +from llama_stack.providers.utils.vector_io.vector_utils import WeightedInMemoryAggregator logger = get_logger(name=__name__, category="vector_io") @@ -66,59 +66,6 @@ def _create_sqlite_connection(db_path): return connection -def _normalize_scores(scores: dict[str, float]) -> dict[str, float]: - """Normalize scores to [0,1] range using min-max normalization.""" - if not scores: - return {} - min_score = min(scores.values()) - max_score = max(scores.values()) - score_range = max_score - min_score - if score_range > 0: - return {doc_id: (score - min_score) / score_range for doc_id, score in scores.items()} - return dict.fromkeys(scores, 1.0) - - -def _weighted_rerank( - vector_scores: dict[str, float], - keyword_scores: dict[str, float], - alpha: float = 0.5, -) -> dict[str, float]: - """ReRanker that uses weighted average of scores.""" - all_ids = set(vector_scores.keys()) | set(keyword_scores.keys()) - normalized_vector_scores = _normalize_scores(vector_scores) - normalized_keyword_scores = _normalize_scores(keyword_scores) - - return { - doc_id: (alpha * normalized_keyword_scores.get(doc_id, 0.0)) - + ((1 - alpha) * normalized_vector_scores.get(doc_id, 0.0)) - for doc_id in all_ids - } - - -def _rrf_rerank( - vector_scores: dict[str, float], - keyword_scores: dict[str, float], - impact_factor: float = 60.0, -) -> dict[str, float]: - """ReRanker that uses Reciprocal Rank Fusion.""" - # Convert scores to ranks - vector_ranks = { - doc_id: i + 1 for i, (doc_id, _) in enumerate(sorted(vector_scores.items(), key=lambda x: x[1], reverse=True)) - } - keyword_ranks = { - doc_id: i + 1 for i, (doc_id, _) in enumerate(sorted(keyword_scores.items(), key=lambda x: x[1], reverse=True)) - } - - all_ids = set(vector_scores.keys()) | set(keyword_scores.keys()) - rrf_scores = {} - for doc_id in all_ids: - vector_rank = vector_ranks.get(doc_id, float("inf")) - keyword_rank = keyword_ranks.get(doc_id, float("inf")) - # RRF formula: score = 1/(k + r) where k is impact_factor and r is the rank - rrf_scores[doc_id] = (1.0 / (impact_factor + vector_rank)) + (1.0 / (impact_factor + keyword_rank)) - return rrf_scores - - def _make_sql_identifier(name: str) -> str: return re.sub(r"[^a-zA-Z0-9_]", "_", name) @@ -398,14 +345,10 @@ class SQLiteVecIndex(EmbeddingIndex): for chunk, score in zip(keyword_response.chunks, keyword_response.scores, strict=False) } - # Combine scores using the specified reranker - if reranker_type == RERANKER_TYPE_WEIGHTED: - alpha = reranker_params.get("alpha", 0.5) - combined_scores = _weighted_rerank(vector_scores, keyword_scores, alpha) - else: - # Default to RRF for None, RRF, or any unknown types - impact_factor = reranker_params.get("impact_factor", 60.0) - combined_scores = _rrf_rerank(vector_scores, keyword_scores, impact_factor) + # Combine scores using the reranking utility + combined_scores = WeightedInMemoryAggregator.combine_search_results( + vector_scores, keyword_scores, reranker_type, reranker_params + ) # Sort by combined score and get top k results sorted_items = sorted(combined_scores.items(), key=lambda x: x[1], reverse=True) From c59d8c504742d0457b215ae4b6cfc60a67b67595 Mon Sep 17 00:00:00 2001 From: Varsha Date: Wed, 3 Sep 2025 00:59:16 -0700 Subject: [PATCH 010/150] fix: Fix mock vector DB schema in Qdrant tests (#3295) # What does this PR do? Fix: https://github.com/llamastack/llama-stack/issues/3293 ## Test Plan ``` ===================================================== test session starts ===================================================== platform darwin -- Python 3.12.11, pytest-7.4.4, pluggy-1.5.0 -- /Users/vnarsing/miniconda3/envs/stack-client/bin/python cachedir: .pytest_cache metadata: {'Python': '3.12.11', 'Platform': 'macOS-14.7.7-arm64-arm-64bit', 'Packages': {'pytest': '7.4.4', 'pluggy': '1.5.0'}, 'Plugins': {'asyncio': '0.23.8', 'cov': '6.0.0', 'timeout': '2.2.0', 'socket': '0.7.0', 'xdist': '3.8.0', 'html': '3.1.1', 'langsmith': '0.3.39', 'anyio': '4.8.0', 'metadata': '3.0.0'}} rootdir: /Users/vnarsing/go/src/github/meta-llama/llama-stack configfile: pyproject.toml plugins: asyncio-0.23.8, cov-6.0.0, timeout-2.2.0, socket-0.7.0, xdist-3.8.0, html-3.1.1, langsmith-0.3.39, anyio-4.8.0, metadata-3.0.0 asyncio: mode=Mode.AUTO collected 3 items tests/unit/providers/vector_io/test_qdrant.py::test_qdrant_adapter_returns_expected_chunks[2-2] PASSED [ 33%] tests/unit/providers/vector_io/test_qdrant.py::test_qdrant_adapter_returns_expected_chunks[100-60] PASSED [ 66%] tests/unit/providers/vector_io/test_qdrant.py::test_qdrant_register_and_unregister_vector_db PASSED [100%] ``` Co-authored-by: Francisco Arceo --- tests/unit/providers/vector_io/test_qdrant.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/tests/unit/providers/vector_io/test_qdrant.py b/tests/unit/providers/vector_io/test_qdrant.py index d7900dbfd..aab5b6f45 100644 --- a/tests/unit/providers/vector_io/test_qdrant.py +++ b/tests/unit/providers/vector_io/test_qdrant.py @@ -54,7 +54,9 @@ def mock_vector_db(vector_db_id) -> MagicMock: mock_vector_db.identifier = vector_db_id mock_vector_db.embedding_dimension = 384 mock_vector_db.model_dump_json.return_value = ( - '{"identifier": "' + vector_db_id + '", "embedding_model": "embedding_model", "embedding_dimension": 384}' + '{"identifier": "' + + vector_db_id + + '", "provider_id": "qdrant", "embedding_model": "embedding_model", "embedding_dimension": 384}' ) return mock_vector_db From ccaf6aaa511a544948a6cf8a99e13ca200852c40 Mon Sep 17 00:00:00 2001 From: Cesare Pompeiano Date: Wed, 3 Sep 2025 11:33:35 +0200 Subject: [PATCH 011/150] chore(python-deps): replace ibm_watson_machine_learning with ibm_watsonx_ai (#3302) # What does this PR do? This PR updates the Watsonx provider dependencies from `ibm_watson_machine_learning` to `ibm_watsonx_ai`. The old package `ibm_watson_machine_learning` is in **deprecation mode** ([[PyPI link](https://pypi.org/project/ibm-watson-machine-learning/)](https://pypi.org/project/ibm-watson-machine-learning/)) and relies on older versions of dependencies such as `pandas`. Updating to `ibm_watsonx_ai` ensures compatibility with current dependency versions and ongoing support. ## Test Plan I verified the update by running an inference using a model provided by Watsonx. The model ran successfully, confirming that the new dependency works as expected. Co-authored-by: are-ces --- llama_stack/providers/registry/inference.py | 2 +- llama_stack/providers/remote/inference/watsonx/watsonx.py | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/llama_stack/providers/registry/inference.py b/llama_stack/providers/registry/inference.py index 6264de7c7..fb841afdf 100644 --- a/llama_stack/providers/registry/inference.py +++ b/llama_stack/providers/registry/inference.py @@ -292,7 +292,7 @@ Available Models: api=Api.inference, adapter=AdapterSpec( adapter_type="watsonx", - pip_packages=["ibm_watson_machine_learning"], + pip_packages=["ibm_watsonx_ai"], module="llama_stack.providers.remote.inference.watsonx", config_class="llama_stack.providers.remote.inference.watsonx.WatsonXConfig", provider_data_validator="llama_stack.providers.remote.inference.watsonx.WatsonXProviderDataValidator", diff --git a/llama_stack/providers/remote/inference/watsonx/watsonx.py b/llama_stack/providers/remote/inference/watsonx/watsonx.py index 78161d1cb..cb7fc175f 100644 --- a/llama_stack/providers/remote/inference/watsonx/watsonx.py +++ b/llama_stack/providers/remote/inference/watsonx/watsonx.py @@ -7,8 +7,8 @@ from collections.abc import AsyncGenerator, AsyncIterator from typing import Any -from ibm_watson_machine_learning.foundation_models import Model -from ibm_watson_machine_learning.metanames import GenTextParamsMetaNames as GenParams +from ibm_watsonx_ai.foundation_models import Model +from ibm_watsonx_ai.metanames import GenTextParamsMetaNames as GenParams from openai import AsyncOpenAI from llama_stack.apis.common.content_types import InterleavedContent, InterleavedContentItem From d948e63340b37d1dd5f13fa2bb2e380db0f337ec Mon Sep 17 00:00:00 2001 From: ehhuang Date: Wed, 3 Sep 2025 07:11:59 -0700 Subject: [PATCH 012/150] chore: Improve error message for missing provider dependencies (#3315) Generated with CC: Replace cryptic KeyError with clear, actionable error message that shows: - Which API the failing provider belongs to - The provider ID and type that's failing - Which dependency is missing - Clear instructions on how to fix the issue ## Test plan Use a run config with Agents API and no safety provider Before: KeyError: After: Failed to resolve 'agents' provider 'meta-reference' of type 'inline::meta-reference': required dependency 'safety' is not available. Please add a 'safety' provider to your configuration or check if the provider is properly configured. --- llama_stack/core/resolver.py | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/llama_stack/core/resolver.py b/llama_stack/core/resolver.py index 7ac98dac8..a8ad03e1a 100644 --- a/llama_stack/core/resolver.py +++ b/llama_stack/core/resolver.py @@ -284,7 +284,15 @@ async def instantiate_providers( if provider.provider_id is None: continue - deps = {a: impls[a] for a in provider.spec.api_dependencies} + try: + deps = {a: impls[a] for a in provider.spec.api_dependencies} + except KeyError as e: + missing_api = e.args[0] + raise RuntimeError( + f"Failed to resolve '{provider.spec.api.value}' provider '{provider.provider_id}' of type '{provider.spec.provider_type}': " + f"required dependency '{missing_api.value}' is not available. " + f"Please add a '{missing_api.value}' provider to your configuration or check if the provider is properly configured." + ) from e for a in provider.spec.optional_api_dependencies: if a in impls: deps[a] = impls[a] From c3d3a0b83333a720886c4a846e41ed3ad2766e00 Mon Sep 17 00:00:00 2001 From: Ashwin Bharambe Date: Wed, 3 Sep 2025 11:33:03 -0700 Subject: [PATCH 013/150] feat(tests): auto-merge all model list responses and unify recordings (#3320) One needed to specify record-replay related environment variables for running integration tests. We could not use defaults because integration tests could be run against Ollama instances which could be running different models. For example, text vs vision tests needed separate instances of Ollama because a single instance typically cannot serve both of these models if you assume the standard CI worker configuration on Github. As a result, `client.list()` as returned by the Ollama client would be different between these runs and we'd end up overwriting responses. This PR "solves" it by adding a small amount of complexity -- we store model list responses specially, keyed by the hashes of the models they return. At replay time, we merge all of them and pretend that we have the union of all models available. ## Test Plan Re-recorded all the tests using `scripts/integration-tests.sh --inference-mode record`, including the vision tests. --- .gitignore | 2 + .../contributing/testing/record-replay.md | 9 +- .../remote/inference/ollama/ollama.py | 8 +- llama_stack/testing/inference_recorder.py | 154 +- scripts/integration-tests.sh | 14 +- tests/README.md | 12 - tests/integration/README.md | 19 +- .../recordings/responses/00ba04f74a96.json | 10 +- .../recordings/responses/04172112ffbb.json | 44 +- .../recordings/responses/0b27fd737699.json | 10 +- .../recordings/responses/0b3f2e4754ff.json | 32 +- .../recordings/responses/0e8f2b001dd9.json | 12 +- .../recordings/responses/10eea8c15ddc.json | 10 +- .../recordings/responses/140187e305dc.json | 12 +- .../recordings/responses/17253d7cc667.json | 10 +- .../recordings/responses/173ecb3aab28.json | 32 +- .../recordings/responses/174458ad71b2.json | 10 +- .../recordings/responses/178016edef0e.json | 10 +- .../recordings/responses/197228e26971.json | 10 +- .../recordings/responses/198ef7208389.json | 10 +- .../recordings/responses/1adfaa0e062e.json | 10 +- .../recordings/responses/1b8394f90636.json | 10 +- .../recordings/responses/1b92be674e2a.json | 10 +- .../recordings/responses/1e11c2b20ff8.json | 768 +- .../recordings/responses/211b1562d4e6.json | 10 +- .../recordings/responses/23506e73bb9e.json | 768 +- .../recordings/responses/2afe3b38ca01.json | 34 +- .../recordings/responses/2d187a11704c.json | 208 +- .../recordings/responses/325a72db5755.json | 758 +- .../recordings/responses/382c2f22274c.json | 8 +- .../recordings/responses/3c0bf9ba81b2.json | 6 +- .../recordings/responses/3c3f13cb7794.json | 30 +- .../recordings/responses/3ca695048bee.json | 14 +- .../recordings/responses/3dff18060ebc.json | 768 +- .../recordings/responses/417020320684.json | 768 +- .../recordings/responses/4420515208a8.json | 768 +- .../recordings/responses/44a1d9de0602.json | 4 +- .../recordings/responses/44fb9cf5875f.json | 10 +- .../recordings/responses/48d2fb183a2a.json | 10 +- .../recordings/responses/50340cd4d253.json | 10 +- .../recordings/responses/5370751803dc.json | 768 +- .../recordings/responses/545d86510a80.json | 34 +- .../recordings/responses/554de3cd986f.json | 46 +- .../recordings/responses/561746e1c8de.json | 30 +- .../recordings/responses/563b994bb7d1.json | 10 +- .../recordings/responses/5f5d16afadb4.json | 30 +- .../recordings/responses/62aa454ea5f9.json | 768 +- .../recordings/responses/6906a6e71988.json | 10 +- .../recordings/responses/6cc063bbd7d3.json | 48 +- .../recordings/responses/6d35c91287e2.json | 34 +- .../recordings/responses/6f96090aa955.json | 178 +- .../recordings/responses/6fbea1abca7c.json | 46 +- .../recordings/responses/6fe1d4fedf12.json | 9570 +++++++++-------- .../recordings/responses/70adef2c30c4.json | 10 +- .../recordings/responses/72c1126ff2f9.json | 768 +- .../recordings/responses/7354ec181984.json | 10 +- .../recordings/responses/75d0dd9d0fa3.json | 10 +- .../recordings/responses/7b25b702ea18.json | 768 +- .../recordings/responses/7b4815aba6c5.json | 46 +- .../recordings/responses/7e6806cba34a.json | 34 +- .../recordings/responses/802f60021837.json | 768 +- .../recordings/responses/80e4404d8987.json | 28 +- .../recordings/responses/8295382a8e7c.json | 12 +- .../recordings/responses/836f51dfb3c5.json | 10 +- .../recordings/responses/840fbb380b73.json | 10 +- .../recordings/responses/84cab42e1f5c.json | 1340 +-- .../recordings/responses/85594a69d74a.json | 10 +- .../recordings/responses/97d3812bfccb.json | 10 +- .../recordings/responses/97e259c0d3e5.json | 46 +- .../recordings/responses/9c140a29ae09.json | 34 +- .../recordings/responses/9c28ec9ac338.json | 44 +- .../recordings/responses/9e651e5fcfe2.json | 3072 +++--- .../recordings/responses/9e7a83d3d596.json | 10 +- .../recordings/responses/9fadf5a3d68f.json | 10 +- .../recordings/responses/a0c4df33879f.json | 2368 ++-- .../recordings/responses/a4c8d19bb1eb.json | 12 +- .../recordings/responses/a5187d9d5057.json | 12 +- .../recordings/responses/a59d0d7c1485.json | 10 +- .../recordings/responses/a6810c23eda8.json | 94 +- .../recordings/responses/ae1c22f18ecc.json | 10 +- .../recordings/responses/ae6835cfe70e.json | 10 +- .../recordings/responses/b14ff438ca99.json | 10 +- .../recordings/responses/b5e3ed420986.json | 768 +- .../recordings/responses/b612debbd3bf.json | 768 +- .../recordings/responses/bd356b27a085.json | 24 +- .../recordings/responses/c2199d6064db.json | 768 +- .../recordings/responses/c9cba6f3ee38.json | 10 +- .../recordings/responses/cb3df2a1dc22.json | 12 +- .../recordings/responses/cd094caaf1c0.json | 796 +- .../recordings/responses/d0ac68cbde69.json | 20 +- .../recordings/responses/d4c86ac355fb.json | 10 +- .../recordings/responses/d86d4fc1eaca.json | 768 +- .../recordings/responses/dac7a32e5db9.json | 10 +- .../recordings/responses/dd226d71f844.json | 34 +- .../recordings/responses/dd9e7d5913e9.json | 12 +- .../recordings/responses/decfd950646c.json | 26 +- .../recordings/responses/e0a6dce1d94b.json | 768 +- .../recordings/responses/e2c9b07709fe.json | 8 +- .../recordings/responses/e96152610712.json | 10 +- .../recordings/responses/e9c8a0e4f0e0.json | 12 +- .../recordings/responses/ed9e9b34008d.json | 10 +- .../recordings/responses/eee47930e3ae.json | 46 +- .../recordings/responses/ef59cbff54d0.json | 10 +- .../recordings/responses/ef757a75ed08.json | 26 +- .../{vision => }/responses/f1592dee71e5.json | 14 +- .../recordings/responses/f477c2fe1332.json | 50 +- .../recordings/responses/f6d655e91ac3.json | 768 +- .../recordings/responses/f70f30f54211.json | 8 +- .../recordings/responses/fcdef245da95.json | 10 +- .../{vision => }/responses/ff7db0102b28.json | 658 +- .../models-4a3a4447b16b-3057338f.json | 164 + .../recordings/vision/index.sqlite | Bin 12288 -> 0 bytes .../vision/responses/3877ecf1bc62.json | 22 - .../vision/responses/4096743baf8e.json | 56 - .../vision/responses/4a3a4447b16b.json | 68 - .../vision/responses/67198cbad48f.json | 56 - .../vision/responses/830a1fe14938.json | 56 - .../vision/responses/9c007f300365.json | 58 - .../vision/responses/c9667519ad7c.json | 58 - .../vision/responses/d0ac68cbde69.json | 19 - .../vision/responses/d4f56d7d1996.json | 56 - .../distribution/test_inference_recordings.py | 2 +- 122 files changed, 17460 insertions(+), 16129 deletions(-) rename tests/integration/recordings/{vision => }/responses/f1592dee71e5.json (99%) rename tests/integration/recordings/{vision => }/responses/ff7db0102b28.json (98%) create mode 100644 tests/integration/recordings/responses/models-4a3a4447b16b-3057338f.json delete mode 100644 tests/integration/recordings/vision/index.sqlite delete mode 100644 tests/integration/recordings/vision/responses/3877ecf1bc62.json delete mode 100644 tests/integration/recordings/vision/responses/4096743baf8e.json delete mode 100644 tests/integration/recordings/vision/responses/4a3a4447b16b.json delete mode 100644 tests/integration/recordings/vision/responses/67198cbad48f.json delete mode 100644 tests/integration/recordings/vision/responses/830a1fe14938.json delete mode 100644 tests/integration/recordings/vision/responses/9c007f300365.json delete mode 100644 tests/integration/recordings/vision/responses/c9667519ad7c.json delete mode 100644 tests/integration/recordings/vision/responses/d0ac68cbde69.json delete mode 100644 tests/integration/recordings/vision/responses/d4f56d7d1996.json diff --git a/.gitignore b/.gitignore index f3831f29c..11cc59847 100644 --- a/.gitignore +++ b/.gitignore @@ -26,5 +26,7 @@ venv/ pytest-report.xml .coverage .python-version +AGENTS.md +server.log CLAUDE.md .claude/ diff --git a/docs/source/contributing/testing/record-replay.md b/docs/source/contributing/testing/record-replay.md index 3049d333c..7b0f345b0 100644 --- a/docs/source/contributing/testing/record-replay.md +++ b/docs/source/contributing/testing/record-replay.md @@ -40,18 +40,15 @@ The system patches OpenAI and Ollama client methods to intercept calls before th ### Storage Architecture -Recordings use a two-tier storage system optimized for both speed and debuggability: +Recordings are stored as JSON files in the recording directory. They are looked up by their request hash. ``` recordings/ -├── index.sqlite # Fast lookup by request hash └── responses/ ├── abc123def456.json # Individual response files └── def789ghi012.json ``` -**SQLite index** enables O(log n) hash lookups and metadata queries without loading response bodies. - **JSON files** store complete request/response pairs in human-readable format for debugging. ## Recording Modes @@ -166,8 +163,8 @@ This preserves type safety - when replayed, you get the same Pydantic objects wi Control recording behavior globally: ```bash -export LLAMA_STACK_TEST_INFERENCE_MODE=replay -export LLAMA_STACK_TEST_RECORDING_DIR=/path/to/recordings +export LLAMA_STACK_TEST_INFERENCE_MODE=replay # this is the default +export LLAMA_STACK_TEST_RECORDING_DIR=/path/to/recordings # default is tests/integration/recordings pytest tests/integration/ ``` diff --git a/llama_stack/providers/remote/inference/ollama/ollama.py b/llama_stack/providers/remote/inference/ollama/ollama.py index fcaf5ee92..d3d107e1d 100644 --- a/llama_stack/providers/remote/inference/ollama/ollama.py +++ b/llama_stack/providers/remote/inference/ollama/ollama.py @@ -118,10 +118,10 @@ class OllamaInferenceAdapter( async def initialize(self) -> None: logger.info(f"checking connectivity to Ollama at `{self.config.url}`...") - health_response = await self.health() - if health_response["status"] == HealthStatus.ERROR: + r = await self.health() + if r["status"] == HealthStatus.ERROR: logger.warning( - "Ollama Server is not running, make sure to start it using `ollama serve` in a separate terminal" + f"Ollama Server is not running (message: {r['message']}). Make sure to start it using `ollama serve` in a separate terminal" ) async def should_refresh_models(self) -> bool: @@ -156,7 +156,7 @@ class OllamaInferenceAdapter( ), Model( identifier="nomic-embed-text", - provider_resource_id="nomic-embed-text", + provider_resource_id="nomic-embed-text:latest", provider_id=provider_id, metadata={ "embedding_dimension": 768, diff --git a/llama_stack/testing/inference_recorder.py b/llama_stack/testing/inference_recorder.py index 8fa5f5f2e..5b64e26d3 100644 --- a/llama_stack/testing/inference_recorder.py +++ b/llama_stack/testing/inference_recorder.py @@ -30,6 +30,9 @@ from openai.types.completion_choice import CompletionChoice CompletionChoice.model_fields["finish_reason"].annotation = Literal["stop", "length", "content_filter"] | None CompletionChoice.model_rebuild() +REPO_ROOT = Path(__file__).parent.parent.parent +DEFAULT_STORAGE_DIR = REPO_ROOT / "tests/integration/recordings" + class InferenceMode(StrEnum): LIVE = "live" @@ -51,7 +54,7 @@ def normalize_request(method: str, url: str, headers: dict[str, Any], body: dict def get_inference_mode() -> InferenceMode: - return InferenceMode(os.environ.get("LLAMA_STACK_TEST_INFERENCE_MODE", "live").lower()) + return InferenceMode(os.environ.get("LLAMA_STACK_TEST_INFERENCE_MODE", "replay").lower()) def setup_inference_recording(): @@ -60,28 +63,18 @@ def setup_inference_recording(): to increase their reliability and reduce reliance on expensive, external services. Currently, this is only supported for OpenAI and Ollama clients. These should cover the vast majority of use cases. - Calls to the /models endpoint are not currently trapped. We probably need to add support for this. - Two environment variables are required: - - LLAMA_STACK_TEST_INFERENCE_MODE: The mode to run in. Must be 'live', 'record', or 'replay'. - - LLAMA_STACK_TEST_RECORDING_DIR: The directory to store the recordings in. + Two environment variables are supported: + - LLAMA_STACK_TEST_INFERENCE_MODE: The mode to run in. Must be 'live', 'record', or 'replay'. Default is 'replay'. + - LLAMA_STACK_TEST_RECORDING_DIR: The directory to store the recordings in. Default is 'tests/integration/recordings'. - The recordings are stored in a SQLite database and a JSON file for each request. The SQLite database is used to - quickly find the correct recording for a given request. The JSON files are used to store the request and response - bodies. + The recordings are stored as JSON files. """ mode = get_inference_mode() - - if mode not in InferenceMode: - raise ValueError(f"Invalid LLAMA_STACK_TEST_INFERENCE_MODE: {mode}. Must be 'live', 'record', or 'replay'") - if mode == InferenceMode.LIVE: return None - if "LLAMA_STACK_TEST_RECORDING_DIR" not in os.environ: - raise ValueError("LLAMA_STACK_TEST_RECORDING_DIR must be set for recording or replaying") - storage_dir = os.environ["LLAMA_STACK_TEST_RECORDING_DIR"] - + storage_dir = os.environ.get("LLAMA_STACK_TEST_RECORDING_DIR", DEFAULT_STORAGE_DIR) return inference_recording(mode=mode, storage_dir=storage_dir) @@ -134,8 +127,8 @@ class ResponseStorage: def store_recording(self, request_hash: str, request: dict[str, Any], response: dict[str, Any]): """Store a request/response pair.""" # Generate unique response filename - response_file = f"{request_hash[:12]}.json" - response_path = self.responses_dir / response_file + short_hash = request_hash[:12] + response_file = f"{short_hash}.json" # Serialize response body if needed serialized_response = dict(response) @@ -147,6 +140,14 @@ class ResponseStorage: # Handle single response serialized_response["body"] = _serialize_response(serialized_response["body"]) + # If this is an Ollama /api/tags recording, include models digest in filename to distinguish variants + endpoint = request.get("endpoint") + if endpoint in ("/api/tags", "/v1/models"): + digest = _model_identifiers_digest(endpoint, response) + response_file = f"models-{short_hash}-{digest}.json" + + response_path = self.responses_dir / response_file + # Save response to JSON file with open(response_path, "w") as f: json.dump({"request": request, "response": serialized_response}, f, indent=2) @@ -161,19 +162,85 @@ class ResponseStorage: if not response_path.exists(): return None - with open(response_path) as f: - data = json.load(f) + return _recording_from_file(response_path) - # Deserialize response body if needed - if "response" in data and "body" in data["response"]: - if isinstance(data["response"]["body"], list): - # Handle streaming responses - data["response"]["body"] = [_deserialize_response(chunk) for chunk in data["response"]["body"]] + def _model_list_responses(self, short_hash: str) -> list[dict[str, Any]]: + results: list[dict[str, Any]] = [] + for path in self.responses_dir.glob(f"models-{short_hash}-*.json"): + data = _recording_from_file(path) + results.append(data) + return results + + +def _recording_from_file(response_path) -> dict[str, Any]: + with open(response_path) as f: + data = json.load(f) + + # Deserialize response body if needed + if "response" in data and "body" in data["response"]: + if isinstance(data["response"]["body"], list): + # Handle streaming responses + data["response"]["body"] = [_deserialize_response(chunk) for chunk in data["response"]["body"]] + else: + # Handle single response + data["response"]["body"] = _deserialize_response(data["response"]["body"]) + + return cast(dict[str, Any], data) + + +def _model_identifiers_digest(endpoint: str, response: dict[str, Any]) -> str: + def _extract_model_identifiers(): + """Extract a stable set of identifiers for model-list endpoints. + + Supported endpoints: + - '/api/tags' (Ollama): response body has 'models': [ { name/model/digest/id/... }, ... ] + - '/v1/models' (OpenAI): response body has 'data': [ { id: ... }, ... ] + Returns a list of unique identifiers or None if structure doesn't match. + """ + body = response["body"] + if endpoint == "/api/tags": + items = body.get("models") + idents = [m.model for m in items] + else: + items = body.get("data") + idents = [m.id for m in items] + return sorted(set(idents)) + + identifiers = _extract_model_identifiers() + return hashlib.sha1(("|".join(identifiers)).encode("utf-8")).hexdigest()[:8] + + +def _combine_model_list_responses(endpoint: str, records: list[dict[str, Any]]) -> dict[str, Any] | None: + """Return a single, unioned recording for supported model-list endpoints.""" + seen: dict[str, dict[str, Any]] = {} + for rec in records: + body = rec["response"]["body"] + if endpoint == "/api/tags": + items = body.models + elif endpoint == "/v1/models": + items = body.data + else: + items = [] + + for m in items: + if endpoint == "/v1/models": + key = m.id else: - # Handle single response - data["response"]["body"] = _deserialize_response(data["response"]["body"]) + key = m.model + seen[key] = m - return cast(dict[str, Any], data) + ordered = [seen[k] for k in sorted(seen.keys())] + canonical = records[0] + canonical_req = canonical.get("request", {}) + if isinstance(canonical_req, dict): + canonical_req["endpoint"] = endpoint + if endpoint == "/v1/models": + body = {"data": ordered, "object": "list"} + else: + from ollama import ListResponse + + body = ListResponse(models=ordered) + return {"request": canonical_req, "response": {"body": body, "is_streaming": False}} async def _patched_inference_method(original_method, self, client_type, endpoint, *args, **kwargs): @@ -195,8 +262,6 @@ async def _patched_inference_method(original_method, self, client_type, endpoint raise ValueError(f"Unknown client type: {client_type}") url = base_url.rstrip("/") + endpoint - - # Normalize request for matching method = "POST" headers = {} body = kwargs @@ -204,7 +269,12 @@ async def _patched_inference_method(original_method, self, client_type, endpoint request_hash = normalize_request(method, url, headers, body) if _current_mode == InferenceMode.REPLAY: - recording = _current_storage.find_recording(request_hash) + # Special handling for model-list endpoints: return union of all responses + if endpoint in ("/api/tags", "/v1/models"): + records = _current_storage._model_list_responses(request_hash[:12]) + recording = _combine_model_list_responses(endpoint, records) + else: + recording = _current_storage.find_recording(request_hash) if recording: response_body = recording["response"]["body"] @@ -274,12 +344,14 @@ def patch_inference_clients(): from openai.resources.chat.completions import AsyncCompletions as AsyncChatCompletions from openai.resources.completions import AsyncCompletions from openai.resources.embeddings import AsyncEmbeddings + from openai.resources.models import AsyncModels # Store original methods for both OpenAI and Ollama clients _original_methods = { "chat_completions_create": AsyncChatCompletions.create, "completions_create": AsyncCompletions.create, "embeddings_create": AsyncEmbeddings.create, + "models_list": AsyncModels.list, "ollama_generate": OllamaAsyncClient.generate, "ollama_chat": OllamaAsyncClient.chat, "ollama_embed": OllamaAsyncClient.embed, @@ -304,10 +376,16 @@ def patch_inference_clients(): _original_methods["embeddings_create"], self, "openai", "/v1/embeddings", *args, **kwargs ) + async def patched_models_list(self, *args, **kwargs): + return await _patched_inference_method( + _original_methods["models_list"], self, "openai", "/v1/models", *args, **kwargs + ) + # Apply OpenAI patches AsyncChatCompletions.create = patched_chat_completions_create AsyncCompletions.create = patched_completions_create AsyncEmbeddings.create = patched_embeddings_create + AsyncModels.list = patched_models_list # Create patched methods for Ollama client async def patched_ollama_generate(self, *args, **kwargs): @@ -361,11 +439,13 @@ def unpatch_inference_clients(): from openai.resources.chat.completions import AsyncCompletions as AsyncChatCompletions from openai.resources.completions import AsyncCompletions from openai.resources.embeddings import AsyncEmbeddings + from openai.resources.models import AsyncModels # Restore OpenAI client methods AsyncChatCompletions.create = _original_methods["chat_completions_create"] AsyncCompletions.create = _original_methods["completions_create"] AsyncEmbeddings.create = _original_methods["embeddings_create"] + AsyncModels.list = _original_methods["models_list"] # Restore Ollama client methods if they were patched OllamaAsyncClient.generate = _original_methods["ollama_generate"] @@ -379,16 +459,10 @@ def unpatch_inference_clients(): @contextmanager -def inference_recording(mode: str = "live", storage_dir: str | Path | None = None) -> Generator[None, None, None]: +def inference_recording(mode: str, storage_dir: str | Path | None = None) -> Generator[None, None, None]: """Context manager for inference recording/replaying.""" global _current_mode, _current_storage - # Set defaults - if storage_dir is None: - storage_dir_path = Path.home() / ".llama" / "recordings" - else: - storage_dir_path = Path(storage_dir) - # Store previous state prev_mode = _current_mode prev_storage = _current_storage @@ -397,7 +471,9 @@ def inference_recording(mode: str = "live", storage_dir: str | Path | None = Non _current_mode = mode if mode in ["record", "replay"]: - _current_storage = ResponseStorage(storage_dir_path) + if storage_dir is None: + raise ValueError("storage_dir is required for record and replay modes") + _current_storage = ResponseStorage(Path(storage_dir)) patch_inference_clients() yield diff --git a/scripts/integration-tests.sh b/scripts/integration-tests.sh index e152444e1..104ba5cf3 100755 --- a/scripts/integration-tests.sh +++ b/scripts/integration-tests.sh @@ -140,13 +140,6 @@ THIS_DIR=$(dirname "$0") ROOT_DIR="$THIS_DIR/.." cd $ROOT_DIR -# Set recording directory -if [[ "$RUN_VISION_TESTS" == "true" ]]; then - export LLAMA_STACK_TEST_RECORDING_DIR="tests/integration/recordings/vision" -else - export LLAMA_STACK_TEST_RECORDING_DIR="tests/integration/recordings" -fi - # check if "llama" and "pytest" are available. this script does not use `uv run` given # it can be used in a pre-release environment where we have not been able to tell # uv about pre-release dependencies properly (yet). @@ -298,5 +291,12 @@ echo "=== System Resources After Tests ===" free -h 2>/dev/null || echo "free command not available" df -h +# stop server +if [[ "$STACK_CONFIG" == *"server:"* ]]; then + echo "Stopping Llama Stack Server..." + kill $(lsof -i :8321 | awk 'NR>1 {print $2}') + echo "Llama Stack Server stopped" +fi + echo "" echo "=== Integration Tests Complete ===" diff --git a/tests/README.md b/tests/README.md index 3b129fbd9..81f025f86 100644 --- a/tests/README.md +++ b/tests/README.md @@ -38,26 +38,15 @@ For running integration tests, you must provide a few things: - a distribution name (e.g., `starter`) or a path to a `run.yaml` file - a comma-separated list of api=provider pairs, e.g. `inference=fireworks,safety=llama-guard,agents=meta-reference`. This is most useful for testing a single API surface. -- Whether you are using replay or live mode for inference. This is specified with the LLAMA_STACK_TEST_INFERENCE_MODE environment variable. The default mode currently is "live" -- that is certainly surprising, but we will fix this soon. - - Any API keys you need to use should be set in the environment, or can be passed in with the --env option. You can run the integration tests in replay mode with: ```bash # Run all tests with existing recordings -LLAMA_STACK_TEST_INFERENCE_MODE=replay \ - LLAMA_STACK_TEST_RECORDING_DIR=tests/integration/recordings \ uv run --group test \ pytest -sv tests/integration/ --stack-config=starter ``` -If you don't specify LLAMA_STACK_TEST_INFERENCE_MODE, by default it will be in "live" mode -- that is, it will make real API calls. - -```bash -# Test against live APIs -FIREWORKS_API_KEY=your_key pytest -sv tests/integration/inference --stack-config=starter -``` - ### Re-recording tests #### Local Re-recording (Manual Setup Required) @@ -66,7 +55,6 @@ If you want to re-record tests locally, you can do so with: ```bash LLAMA_STACK_TEST_INFERENCE_MODE=record \ - LLAMA_STACK_TEST_RECORDING_DIR=tests/integration/recordings \ uv run --group test \ pytest -sv tests/integration/ --stack-config=starter -k "" ``` diff --git a/tests/integration/README.md b/tests/integration/README.md index 46d66fd79..d177cbebf 100644 --- a/tests/integration/README.md +++ b/tests/integration/README.md @@ -98,29 +98,25 @@ pytest -s -v tests/integration/vector_io/ \ The testing system supports three modes controlled by environment variables: -### LIVE Mode (Default) -Tests make real API calls: +### REPLAY Mode (Default) +Uses cached responses instead of making API calls: ```bash -LLAMA_STACK_TEST_INFERENCE_MODE=live pytest tests/integration/ +pytest tests/integration/ ``` - ### RECORD Mode Captures API interactions for later replay: ```bash LLAMA_STACK_TEST_INFERENCE_MODE=record \ -LLAMA_STACK_TEST_RECORDING_DIR=tests/integration/recordings \ pytest tests/integration/inference/test_new_feature.py ``` -### REPLAY Mode -Uses cached responses instead of making API calls: +### LIVE Mode +Tests make real API calls (but not recorded): ```bash -LLAMA_STACK_TEST_INFERENCE_MODE=replay \ -LLAMA_STACK_TEST_RECORDING_DIR=tests/integration/recordings \ -pytest tests/integration/ +LLAMA_STACK_TEST_INFERENCE_MODE=live pytest tests/integration/ ``` -Note that right now you must specify the recording directory. This is because different tests use different recording directories and we don't (yet) have a fool-proof way to map a test to a recording directory. We are working on this. +By default, the recording directory is `tests/integration/recordings`. You can override this by setting the `LLAMA_STACK_TEST_RECORDING_DIR` environment variable. ## Managing Recordings @@ -146,7 +142,6 @@ See the [main testing guide](../README.md#remote-re-recording-recommended) for f ```bash # Re-record specific tests LLAMA_STACK_TEST_INFERENCE_MODE=record \ -LLAMA_STACK_TEST_RECORDING_DIR=tests/integration/recordings \ pytest -s -v --stack-config=server:starter tests/integration/inference/test_modified.py ``` diff --git a/tests/integration/recordings/responses/00ba04f74a96.json b/tests/integration/recordings/responses/00ba04f74a96.json index d2e482d76..642c58414 100644 --- a/tests/integration/recordings/responses/00ba04f74a96.json +++ b/tests/integration/recordings/responses/00ba04f74a96.json @@ -20,15 +20,15 @@ "__type__": "ollama._types.GenerateResponse", "__data__": { "model": "llama-guard3:1b", - "created_at": "2025-08-01T23:12:53.860911Z", + "created_at": "2025-09-03T17:37:35.23084Z", "done": true, "done_reason": "stop", - "total_duration": 249137667, - "load_duration": 152509542, + "total_duration": 195981375, + "load_duration": 110522917, "prompt_eval_count": 216, - "prompt_eval_duration": 71000000, + "prompt_eval_duration": 72393958, "eval_count": 2, - "eval_duration": 24000000, + "eval_duration": 11843000, "response": "safe", "thinking": null, "context": null diff --git a/tests/integration/recordings/responses/04172112ffbb.json b/tests/integration/recordings/responses/04172112ffbb.json index bf94b0697..da5f58a50 100644 --- a/tests/integration/recordings/responses/04172112ffbb.json +++ b/tests/integration/recordings/responses/04172112ffbb.json @@ -21,7 +21,7 @@ "__type__": "ollama._types.GenerateResponse", "__data__": { "model": "llama3.2:3b-instruct-fp16", - "created_at": "2025-07-31T17:59:18.033900164Z", + "created_at": "2025-09-03T17:41:43.950283Z", "done": false, "done_reason": null, "total_duration": null, @@ -39,7 +39,7 @@ "__type__": "ollama._types.GenerateResponse", "__data__": { "model": "llama3.2:3b-instruct-fp16", - "created_at": "2025-07-31T17:59:18.213371151Z", + "created_at": "2025-09-03T17:41:43.991122Z", "done": false, "done_reason": null, "total_duration": null, @@ -57,7 +57,7 @@ "__type__": "ollama._types.GenerateResponse", "__data__": { "model": "llama3.2:3b-instruct-fp16", - "created_at": "2025-07-31T17:59:18.387513976Z", + "created_at": "2025-09-03T17:41:44.031378Z", "done": false, "done_reason": null, "total_duration": null, @@ -75,7 +75,7 @@ "__type__": "ollama._types.GenerateResponse", "__data__": { "model": "llama3.2:3b-instruct-fp16", - "created_at": "2025-07-31T17:59:18.564344287Z", + "created_at": "2025-09-03T17:41:44.073098Z", "done": false, "done_reason": null, "total_duration": null, @@ -93,7 +93,7 @@ "__type__": "ollama._types.GenerateResponse", "__data__": { "model": "llama3.2:3b-instruct-fp16", - "created_at": "2025-07-31T17:59:18.746579415Z", + "created_at": "2025-09-03T17:41:44.115961Z", "done": false, "done_reason": null, "total_duration": null, @@ -111,7 +111,7 @@ "__type__": "ollama._types.GenerateResponse", "__data__": { "model": "llama3.2:3b-instruct-fp16", - "created_at": "2025-07-31T17:59:18.923276047Z", + "created_at": "2025-09-03T17:41:44.156517Z", "done": false, "done_reason": null, "total_duration": null, @@ -129,7 +129,7 @@ "__type__": "ollama._types.GenerateResponse", "__data__": { "model": "llama3.2:3b-instruct-fp16", - "created_at": "2025-07-31T17:59:19.099961963Z", + "created_at": "2025-09-03T17:41:44.197079Z", "done": false, "done_reason": null, "total_duration": null, @@ -147,7 +147,7 @@ "__type__": "ollama._types.GenerateResponse", "__data__": { "model": "llama3.2:3b-instruct-fp16", - "created_at": "2025-07-31T17:59:19.275621884Z", + "created_at": "2025-09-03T17:41:44.237565Z", "done": false, "done_reason": null, "total_duration": null, @@ -165,7 +165,7 @@ "__type__": "ollama._types.GenerateResponse", "__data__": { "model": "llama3.2:3b-instruct-fp16", - "created_at": "2025-07-31T17:59:19.452204196Z", + "created_at": "2025-09-03T17:41:44.277755Z", "done": false, "done_reason": null, "total_duration": null, @@ -183,7 +183,7 @@ "__type__": "ollama._types.GenerateResponse", "__data__": { "model": "llama3.2:3b-instruct-fp16", - "created_at": "2025-07-31T17:59:19.626937514Z", + "created_at": "2025-09-03T17:41:44.318476Z", "done": false, "done_reason": null, "total_duration": null, @@ -201,7 +201,7 @@ "__type__": "ollama._types.GenerateResponse", "__data__": { "model": "llama3.2:3b-instruct-fp16", - "created_at": "2025-07-31T17:59:19.805566767Z", + "created_at": "2025-09-03T17:41:44.358628Z", "done": false, "done_reason": null, "total_duration": null, @@ -219,7 +219,7 @@ "__type__": "ollama._types.GenerateResponse", "__data__": { "model": "llama3.2:3b-instruct-fp16", - "created_at": "2025-07-31T17:59:19.985987477Z", + "created_at": "2025-09-03T17:41:44.398984Z", "done": false, "done_reason": null, "total_duration": null, @@ -237,7 +237,7 @@ "__type__": "ollama._types.GenerateResponse", "__data__": { "model": "llama3.2:3b-instruct-fp16", - "created_at": "2025-07-31T17:59:20.166458601Z", + "created_at": "2025-09-03T17:41:44.439232Z", "done": false, "done_reason": null, "total_duration": null, @@ -255,7 +255,7 @@ "__type__": "ollama._types.GenerateResponse", "__data__": { "model": "llama3.2:3b-instruct-fp16", - "created_at": "2025-07-31T17:59:20.343346795Z", + "created_at": "2025-09-03T17:41:44.479478Z", "done": false, "done_reason": null, "total_duration": null, @@ -273,7 +273,7 @@ "__type__": "ollama._types.GenerateResponse", "__data__": { "model": "llama3.2:3b-instruct-fp16", - "created_at": "2025-07-31T17:59:20.525008091Z", + "created_at": "2025-09-03T17:41:44.520202Z", "done": false, "done_reason": null, "total_duration": null, @@ -291,7 +291,7 @@ "__type__": "ollama._types.GenerateResponse", "__data__": { "model": "llama3.2:3b-instruct-fp16", - "created_at": "2025-07-31T17:59:20.709087695Z", + "created_at": "2025-09-03T17:41:44.560517Z", "done": false, "done_reason": null, "total_duration": null, @@ -309,7 +309,7 @@ "__type__": "ollama._types.GenerateResponse", "__data__": { "model": "llama3.2:3b-instruct-fp16", - "created_at": "2025-07-31T17:59:20.887074305Z", + "created_at": "2025-09-03T17:41:44.601592Z", "done": false, "done_reason": null, "total_duration": null, @@ -327,15 +327,15 @@ "__type__": "ollama._types.GenerateResponse", "__data__": { "model": "llama3.2:3b-instruct-fp16", - "created_at": "2025-07-31T17:59:21.065244925Z", + "created_at": "2025-09-03T17:41:44.642064Z", "done": true, "done_reason": "stop", - "total_duration": 4373531496, - "load_duration": 44438132, + "total_duration": 887142667, + "load_duration": 119331417, "prompt_eval_count": 56, - "prompt_eval_duration": 1296273199, + "prompt_eval_duration": 74294709, "eval_count": 18, - "eval_duration": 3032321735, + "eval_duration": 692842791, "response": "", "thinking": null, "context": null diff --git a/tests/integration/recordings/responses/0b27fd737699.json b/tests/integration/recordings/responses/0b27fd737699.json index e20c65c75..e25cde820 100644 --- a/tests/integration/recordings/responses/0b27fd737699.json +++ b/tests/integration/recordings/responses/0b27fd737699.json @@ -20,15 +20,15 @@ "__type__": "ollama._types.GenerateResponse", "__data__": { "model": "llama-guard3:1b", - "created_at": "2025-08-01T23:13:57.556416Z", + "created_at": "2025-09-03T17:37:47.461886Z", "done": true, "done_reason": "stop", - "total_duration": 432363250, - "load_duration": 159296417, + "total_duration": 338927833, + "load_duration": 100895125, "prompt_eval_count": 223, - "prompt_eval_duration": 257000000, + "prompt_eval_duration": 221583042, "eval_count": 2, - "eval_duration": 14000000, + "eval_duration": 12341416, "response": "safe", "thinking": null, "context": null diff --git a/tests/integration/recordings/responses/0b3f2e4754ff.json b/tests/integration/recordings/responses/0b3f2e4754ff.json index 28e923e9c..8496deeb0 100644 --- a/tests/integration/recordings/responses/0b3f2e4754ff.json +++ b/tests/integration/recordings/responses/0b3f2e4754ff.json @@ -24,7 +24,7 @@ { "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", "__data__": { - "id": "chatcmpl-29", + "id": "chatcmpl-414", "choices": [ { "delta": { @@ -39,7 +39,7 @@ "logprobs": null } ], - "created": 1754090031, + "created": 1756921333, "model": "llama3.2:3b-instruct-fp16", "object": "chat.completion.chunk", "service_tier": null, @@ -50,7 +50,7 @@ { "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", "__data__": { - "id": "chatcmpl-29", + "id": "chatcmpl-414", "choices": [ { "delta": { @@ -65,7 +65,7 @@ "logprobs": null } ], - "created": 1754090031, + "created": 1756921333, "model": "llama3.2:3b-instruct-fp16", "object": "chat.completion.chunk", "service_tier": null, @@ -76,7 +76,7 @@ { "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", "__data__": { - "id": "chatcmpl-29", + "id": "chatcmpl-414", "choices": [ { "delta": { @@ -91,7 +91,7 @@ "logprobs": null } ], - "created": 1754090031, + "created": 1756921333, "model": "llama3.2:3b-instruct-fp16", "object": "chat.completion.chunk", "service_tier": null, @@ -102,7 +102,7 @@ { "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", "__data__": { - "id": "chatcmpl-29", + "id": "chatcmpl-414", "choices": [ { "delta": { @@ -117,7 +117,7 @@ "logprobs": null } ], - "created": 1754090031, + "created": 1756921333, "model": "llama3.2:3b-instruct-fp16", "object": "chat.completion.chunk", "service_tier": null, @@ -128,7 +128,7 @@ { "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", "__data__": { - "id": "chatcmpl-29", + "id": "chatcmpl-414", "choices": [ { "delta": { @@ -143,7 +143,7 @@ "logprobs": null } ], - "created": 1754090031, + "created": 1756921334, "model": "llama3.2:3b-instruct-fp16", "object": "chat.completion.chunk", "service_tier": null, @@ -154,7 +154,7 @@ { "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", "__data__": { - "id": "chatcmpl-29", + "id": "chatcmpl-414", "choices": [ { "delta": { @@ -169,7 +169,7 @@ "logprobs": null } ], - "created": 1754090031, + "created": 1756921334, "model": "llama3.2:3b-instruct-fp16", "object": "chat.completion.chunk", "service_tier": null, @@ -180,7 +180,7 @@ { "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", "__data__": { - "id": "chatcmpl-29", + "id": "chatcmpl-414", "choices": [ { "delta": { @@ -195,7 +195,7 @@ "logprobs": null } ], - "created": 1754090031, + "created": 1756921334, "model": "llama3.2:3b-instruct-fp16", "object": "chat.completion.chunk", "service_tier": null, @@ -206,7 +206,7 @@ { "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", "__data__": { - "id": "chatcmpl-29", + "id": "chatcmpl-414", "choices": [ { "delta": { @@ -221,7 +221,7 @@ "logprobs": null } ], - "created": 1754090031, + "created": 1756921334, "model": "llama3.2:3b-instruct-fp16", "object": "chat.completion.chunk", "service_tier": null, diff --git a/tests/integration/recordings/responses/0e8f2b001dd9.json b/tests/integration/recordings/responses/0e8f2b001dd9.json index 7c5973fae..6bcdfdfed 100644 --- a/tests/integration/recordings/responses/0e8f2b001dd9.json +++ b/tests/integration/recordings/responses/0e8f2b001dd9.json @@ -1,7 +1,7 @@ { "request": { "method": "POST", - "url": "http://localhost:11434/v1/v1/chat/completions", + "url": "http://0.0.0.0:11434/v1/v1/chat/completions", "headers": {}, "body": { "model": "llama3.2:3b-instruct-fp16", @@ -20,14 +20,14 @@ "body": { "__type__": "openai.types.chat.chat_completion.ChatCompletion", "__data__": { - "id": "chatcmpl-368", + "id": "chatcmpl-161", "choices": [ { "finish_reason": "stop", "index": 0, "logprobs": null, "message": { - "content": "Saturn is known for its extensive ring system.", + "content": "The answer is Saturn.", "refusal": null, "role": "assistant", "annotations": null, @@ -37,15 +37,15 @@ } } ], - "created": 1754081853, + "created": 1756921364, "model": "llama3.2:3b-instruct-fp16", "object": "chat.completion", "service_tier": null, "system_fingerprint": "fp_ollama", "usage": { - "completion_tokens": 11, + "completion_tokens": 6, "prompt_tokens": 39, - "total_tokens": 50, + "total_tokens": 45, "completion_tokens_details": null, "prompt_tokens_details": null } diff --git a/tests/integration/recordings/responses/10eea8c15ddc.json b/tests/integration/recordings/responses/10eea8c15ddc.json index 71496da9a..bc608ef09 100644 --- a/tests/integration/recordings/responses/10eea8c15ddc.json +++ b/tests/integration/recordings/responses/10eea8c15ddc.json @@ -20,15 +20,15 @@ "__type__": "ollama._types.GenerateResponse", "__data__": { "model": "llama-guard3:1b", - "created_at": "2025-08-01T23:12:51.682357Z", + "created_at": "2025-09-03T17:37:33.473237Z", "done": true, "done_reason": "stop", - "total_duration": 238161000, - "load_duration": 72494750, + "total_duration": 279025042, + "load_duration": 162673250, "prompt_eval_count": 212, - "prompt_eval_duration": 87000000, + "prompt_eval_duration": 73595834, "eval_count": 5, - "eval_duration": 74000000, + "eval_duration": 41950291, "response": "unsafe\nS8", "thinking": null, "context": null diff --git a/tests/integration/recordings/responses/140187e305dc.json b/tests/integration/recordings/responses/140187e305dc.json index 44d00c96f..69b9712eb 100644 --- a/tests/integration/recordings/responses/140187e305dc.json +++ b/tests/integration/recordings/responses/140187e305dc.json @@ -1,7 +1,7 @@ { "request": { "method": "POST", - "url": "http://localhost:11434/v1/v1/chat/completions", + "url": "http://0.0.0.0:11434/v1/v1/chat/completions", "headers": {}, "body": { "model": "llama3.2:3b-instruct-fp16", @@ -20,14 +20,14 @@ "body": { "__type__": "openai.types.chat.chat_completion.ChatCompletion", "__data__": { - "id": "chatcmpl-876", + "id": "chatcmpl-974", "choices": [ { "finish_reason": "stop", "index": 0, "logprobs": null, "message": { - "content": "I'm afraid I don't have a built-in ability to directly interface with or \"test\" OpenAI models, including the original GPT-1 model. However, I can explain how you might approach this task:\n\nThe OpenAI GPT-1 is a large transformer-based language model that was trained on a massive dataset of text and achieved state-of-the-art results in various natural language processing tasks.\n\nTo test or evaluate the performance of a model like GPT-1, you would typically follow these steps:\n\n1. **Get access to the OpenAI API**: The OpenAI API provides a way for developers to interact with the GPT-1 model programmatically. You can sign up for an API key on the OpenAI website.\n2. **Choose a testing platform or environment**: You'll need a compute platform that supports the necessary algorithms and data structures to run inference on the GPT-1 model. Some popular options include AWS, Google Cloud, or Azure Compute Virtual Machines.\n3. **Prepare your test input data**: This will involve creating text inputs in the format expected by the OpenAI API (i.e., a JSON object containing the text to be processed).\n4. **Use the OpenAI Python library or SDK**: The OpenAI Python library provides an easy-to-use interface for interacting with the GPT-1 model through the API.\n\nHere's some example code that demonstrates how you might use the OpenAI Flask API to test a single input:\n\n```python\nfrom flask import Flask, request, jsonify\nimport json\n\napp = Flask(__name__)\n\n@ app . route ( '/ /gpt-en ', ' Text ', methods = ['POST'])\ndef gpt_en () -> Json :\n data = request . get_json ()\n if not data or \"message\" in ( data ):\n return None , 400 , { ' error' : \"Input must be a text string.\" }\n response = []\n while True:\n message = \"\"\n for token in data [\"input\"]:\n response_text = f\"{data['prompt']} {token}\"\n data[\"input\"] = [response_text]\n new_response = gpt_en()(data)\n if all([not item or not isinstance(item, dict) for item in new_response]):\n break\n\n message = json . dumps ({}\"text\": response_text})\n response.append(message)\n\n return jsonify ({\"output\": response}), 200 , {}\n\nif __name__ == \"__main__\":\n app.run(debug=True)\n```\n\n5. **Evaluate the output**: Once you have processed your test input data using the GPT-1 model, you can evaluate the accuracy of the generated responses.\n\nKeep in mind that this is just a basic example to illustrate how you might approach testing the OpenAI GPT-1 model.", + "content": "I'm happy to help you test the OpenAI API, however I can not access the API.\n\nInstead why don't we follow these steps:\n\n* Check documentation\n* Contact support\n* Reach out to their community forum. \n\nLet me know if I can be of any additional assistance", "refusal": null, "role": "assistant", "annotations": null, @@ -37,15 +37,15 @@ } } ], - "created": 1754510050, + "created": 1756921202, "model": "llama3.2:3b-instruct-fp16", "object": "chat.completion", "service_tier": null, "system_fingerprint": "fp_ollama", "usage": { - "completion_tokens": 567, + "completion_tokens": 61, "prompt_tokens": 31, - "total_tokens": 598, + "total_tokens": 92, "completion_tokens_details": null, "prompt_tokens_details": null } diff --git a/tests/integration/recordings/responses/17253d7cc667.json b/tests/integration/recordings/responses/17253d7cc667.json index 1013a8b08..290c0395b 100644 --- a/tests/integration/recordings/responses/17253d7cc667.json +++ b/tests/integration/recordings/responses/17253d7cc667.json @@ -20,15 +20,15 @@ "__type__": "ollama._types.GenerateResponse", "__data__": { "model": "llama-guard3:1b", - "created_at": "2025-08-01T23:12:52.919624Z", + "created_at": "2025-09-03T17:37:34.308033Z", "done": true, "done_reason": "stop", - "total_duration": 201956834, - "load_duration": 105132584, + "total_duration": 200296000, + "load_duration": 115974708, "prompt_eval_count": 212, - "prompt_eval_duration": 75000000, + "prompt_eval_duration": 72173459, "eval_count": 2, - "eval_duration": 20000000, + "eval_duration": 11536750, "response": "safe", "thinking": null, "context": null diff --git a/tests/integration/recordings/responses/173ecb3aab28.json b/tests/integration/recordings/responses/173ecb3aab28.json index bc550edd5..0c29b278b 100644 --- a/tests/integration/recordings/responses/173ecb3aab28.json +++ b/tests/integration/recordings/responses/173ecb3aab28.json @@ -40,7 +40,7 @@ { "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", "__data__": { - "id": "chatcmpl-457", + "id": "chatcmpl-921", "choices": [ { "delta": { @@ -55,7 +55,7 @@ "logprobs": null } ], - "created": 1754090032, + "created": 1756920971, "model": "llama3.2:3b-instruct-fp16", "object": "chat.completion.chunk", "service_tier": null, @@ -66,7 +66,7 @@ { "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", "__data__": { - "id": "chatcmpl-457", + "id": "chatcmpl-921", "choices": [ { "delta": { @@ -81,7 +81,7 @@ "logprobs": null } ], - "created": 1754090032, + "created": 1756920971, "model": "llama3.2:3b-instruct-fp16", "object": "chat.completion.chunk", "service_tier": null, @@ -92,7 +92,7 @@ { "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", "__data__": { - "id": "chatcmpl-457", + "id": "chatcmpl-921", "choices": [ { "delta": { @@ -107,7 +107,7 @@ "logprobs": null } ], - "created": 1754090032, + "created": 1756920971, "model": "llama3.2:3b-instruct-fp16", "object": "chat.completion.chunk", "service_tier": null, @@ -118,7 +118,7 @@ { "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", "__data__": { - "id": "chatcmpl-457", + "id": "chatcmpl-921", "choices": [ { "delta": { @@ -133,7 +133,7 @@ "logprobs": null } ], - "created": 1754090032, + "created": 1756920971, "model": "llama3.2:3b-instruct-fp16", "object": "chat.completion.chunk", "service_tier": null, @@ -144,7 +144,7 @@ { "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", "__data__": { - "id": "chatcmpl-457", + "id": "chatcmpl-921", "choices": [ { "delta": { @@ -159,7 +159,7 @@ "logprobs": null } ], - "created": 1754090032, + "created": 1756920971, "model": "llama3.2:3b-instruct-fp16", "object": "chat.completion.chunk", "service_tier": null, @@ -170,7 +170,7 @@ { "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", "__data__": { - "id": "chatcmpl-457", + "id": "chatcmpl-921", "choices": [ { "delta": { @@ -185,7 +185,7 @@ "logprobs": null } ], - "created": 1754090032, + "created": 1756920971, "model": "llama3.2:3b-instruct-fp16", "object": "chat.completion.chunk", "service_tier": null, @@ -196,7 +196,7 @@ { "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", "__data__": { - "id": "chatcmpl-457", + "id": "chatcmpl-921", "choices": [ { "delta": { @@ -211,7 +211,7 @@ "logprobs": null } ], - "created": 1754090032, + "created": 1756920971, "model": "llama3.2:3b-instruct-fp16", "object": "chat.completion.chunk", "service_tier": null, @@ -222,7 +222,7 @@ { "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", "__data__": { - "id": "chatcmpl-457", + "id": "chatcmpl-921", "choices": [ { "delta": { @@ -237,7 +237,7 @@ "logprobs": null } ], - "created": 1754090032, + "created": 1756920971, "model": "llama3.2:3b-instruct-fp16", "object": "chat.completion.chunk", "service_tier": null, diff --git a/tests/integration/recordings/responses/174458ad71b2.json b/tests/integration/recordings/responses/174458ad71b2.json index 2dcb85262..ba99d54e6 100644 --- a/tests/integration/recordings/responses/174458ad71b2.json +++ b/tests/integration/recordings/responses/174458ad71b2.json @@ -20,15 +20,15 @@ "__type__": "ollama._types.GenerateResponse", "__data__": { "model": "llama-guard3:1b", - "created_at": "2025-08-01T23:12:53.580806Z", + "created_at": "2025-09-03T17:37:34.994704Z", "done": true, "done_reason": "stop", - "total_duration": 205732750, - "load_duration": 98967000, + "total_duration": 339570875, + "load_duration": 262794125, "prompt_eval_count": 213, - "prompt_eval_duration": 86000000, + "prompt_eval_duration": 64061000, "eval_count": 2, - "eval_duration": 18000000, + "eval_duration": 11839042, "response": "safe", "thinking": null, "context": null diff --git a/tests/integration/recordings/responses/178016edef0e.json b/tests/integration/recordings/responses/178016edef0e.json index be545c221..83746aa33 100644 --- a/tests/integration/recordings/responses/178016edef0e.json +++ b/tests/integration/recordings/responses/178016edef0e.json @@ -20,15 +20,15 @@ "__type__": "ollama._types.GenerateResponse", "__data__": { "model": "llama-guard3:1b", - "created_at": "2025-08-01T23:12:52.354566Z", + "created_at": "2025-09-03T17:37:33.769233Z", "done": true, "done_reason": "stop", - "total_duration": 605192500, - "load_duration": 457087166, + "total_duration": 253836584, + "load_duration": 138624959, "prompt_eval_count": 210, - "prompt_eval_duration": 63000000, + "prompt_eval_duration": 69496125, "eval_count": 5, - "eval_duration": 84000000, + "eval_duration": 45062833, "response": "unsafe\nS12", "thinking": null, "context": null diff --git a/tests/integration/recordings/responses/197228e26971.json b/tests/integration/recordings/responses/197228e26971.json index 6c1730df2..4fa9e2126 100644 --- a/tests/integration/recordings/responses/197228e26971.json +++ b/tests/integration/recordings/responses/197228e26971.json @@ -20,15 +20,15 @@ "__type__": "ollama._types.GenerateResponse", "__data__": { "model": "llama-guard3:1b", - "created_at": "2025-08-01T23:12:52.686478Z", + "created_at": "2025-09-03T17:37:34.074233Z", "done": true, "done_reason": "stop", - "total_duration": 304136208, - "load_duration": 155977000, + "total_duration": 270746375, + "load_duration": 156423042, "prompt_eval_count": 213, - "prompt_eval_duration": 71000000, + "prompt_eval_duration": 70338083, "eval_count": 5, - "eval_duration": 76000000, + "eval_duration": 43379167, "response": "unsafe\nS2", "thinking": null, "context": null diff --git a/tests/integration/recordings/responses/198ef7208389.json b/tests/integration/recordings/responses/198ef7208389.json index b196d3be2..f0f9d6a7d 100644 --- a/tests/integration/recordings/responses/198ef7208389.json +++ b/tests/integration/recordings/responses/198ef7208389.json @@ -20,15 +20,15 @@ "__type__": "ollama._types.GenerateResponse", "__data__": { "model": "llama-guard3:1b", - "created_at": "2025-08-01T23:12:51.186501Z", + "created_at": "2025-09-03T17:37:32.84197Z", "done": true, "done_reason": "stop", - "total_duration": 3146184459, - "load_duration": 2533467917, + "total_duration": 21572898667, + "load_duration": 21155275042, "prompt_eval_count": 212, - "prompt_eval_duration": 526000000, + "prompt_eval_duration": 371898125, "eval_count": 5, - "eval_duration": 83000000, + "eval_duration": 43290458, "response": "unsafe\nS1", "thinking": null, "context": null diff --git a/tests/integration/recordings/responses/1adfaa0e062e.json b/tests/integration/recordings/responses/1adfaa0e062e.json index 5a3d44394..253c230d9 100644 --- a/tests/integration/recordings/responses/1adfaa0e062e.json +++ b/tests/integration/recordings/responses/1adfaa0e062e.json @@ -20,15 +20,15 @@ "__type__": "ollama._types.GenerateResponse", "__data__": { "model": "llama-guard3:1b", - "created_at": "2025-08-01T23:12:53.332041Z", + "created_at": "2025-09-03T17:37:34.607413Z", "done": true, "done_reason": "stop", - "total_duration": 365895333, - "load_duration": 257825208, + "total_duration": 267812042, + "load_duration": 181570000, "prompt_eval_count": 213, - "prompt_eval_duration": 78000000, + "prompt_eval_duration": 73947375, "eval_count": 2, - "eval_duration": 28000000, + "eval_duration": 11708000, "response": "safe", "thinking": null, "context": null diff --git a/tests/integration/recordings/responses/1b8394f90636.json b/tests/integration/recordings/responses/1b8394f90636.json index f5885805b..6857c6840 100644 --- a/tests/integration/recordings/responses/1b8394f90636.json +++ b/tests/integration/recordings/responses/1b8394f90636.json @@ -22,15 +22,15 @@ "__type__": "ollama._types.GenerateResponse", "__data__": { "model": "llama3.2:3b-instruct-fp16", - "created_at": "2025-08-04T22:55:05.685988Z", + "created_at": "2025-09-03T17:36:13.821929Z", "done": true, "done_reason": "stop", - "total_duration": 14128980625, - "load_duration": 7220159208, + "total_duration": 1907912167, + "load_duration": 90979292, "prompt_eval_count": 18, - "prompt_eval_duration": 4658000000, + "prompt_eval_duration": 77350291, "eval_count": 43, - "eval_duration": 2224000000, + "eval_duration": 1738568334, "response": " _______.\n\nThe best answer is blue. The traditional nursery rhyme goes like this:\n\nRoses are red,\nViolets are blue,\nSugar is sweet,\nAnd so are you! (Or something similar.)", "thinking": null, "context": null diff --git a/tests/integration/recordings/responses/1b92be674e2a.json b/tests/integration/recordings/responses/1b92be674e2a.json index 2ed061949..e5f05bf54 100644 --- a/tests/integration/recordings/responses/1b92be674e2a.json +++ b/tests/integration/recordings/responses/1b92be674e2a.json @@ -20,15 +20,15 @@ "__type__": "ollama._types.GenerateResponse", "__data__": { "model": "llama3.2:3b-instruct-fp16", - "created_at": "2025-07-31T17:50:06.140190726Z", + "created_at": "2025-09-03T17:39:38.236797Z", "done": true, "done_reason": "stop", - "total_duration": 5213341378, - "load_duration": 43943569, + "total_duration": 1296281500, + "load_duration": 283393917, "prompt_eval_count": 23, - "prompt_eval_duration": 1049424427, + "prompt_eval_duration": 75453042, "eval_count": 24, - "eval_duration": 4119422888, + "eval_duration": 936860125, "response": "Mark Zuckerberg is the founder, chairman and CEO of Meta, which he originally founded as Facebook in 2004.", "thinking": null, "context": null diff --git a/tests/integration/recordings/responses/1e11c2b20ff8.json b/tests/integration/recordings/responses/1e11c2b20ff8.json index 98e855fdf..6131b1d5e 100644 --- a/tests/integration/recordings/responses/1e11c2b20ff8.json +++ b/tests/integration/recordings/responses/1e11c2b20ff8.json @@ -20,390 +20,390 @@ "data": [ { "embedding": [ - 0.042499725, - -0.061890375, - -0.07846951, - 0.006408736, - 0.031287834, - 0.008066364, - 0.058032244, - 0.025457833, - 0.016401615, - 0.04601607, - -0.028947692, - 0.04452766, - 0.056886304, - -0.0153307365, - -0.070184045, - -0.057157565, - -0.0768682, - 0.0067744707, - 0.0043326365, - -0.1236485, - 0.0031424984, - -0.032562014, - -0.029376298, - 0.024144078, - -0.028531333, - 0.102257624, - 0.0021518522, - -0.0069792354, - 0.02530627, - -0.055496883, - 0.031227645, - -0.0070384145, - 0.08432449, - -0.028390806, - -0.083012834, - 0.009549195, - -0.020060178, - -0.00240923, - -0.007700305, - -0.023067193, - -0.092922784, - -0.04261493, - -0.019990565, - 0.008238936, - 0.060982026, - 0.05032288, - -0.051029027, - -0.008544468, - -0.030194579, - -0.035787255, - -0.17837463, - -0.047271743, - 0.033892605, - 0.031609993, - -0.0088130655, - 0.10480617, - 0.03355418, - 0.09033605, - -0.01574583, - -0.012574861, - -0.08468548, - -0.114774585, - -0.13755703, - 0.021649128, - 0.047812033, - 0.043242246, - 0.008644588, - 0.03873661, - 0.046728984, - -0.07743038, - -0.0488837, - 0.031276364, - 0.022359744, - 0.00040771137, - 0.05229871, - -0.012229048, - -0.035172377, - -0.008257451, - -0.0088830395, - -0.034264818, - -0.045780584, - 0.0024807125, - -0.040849846, - 0.080489986, - 0.09471281, - 0.041345056, - 0.005824089, - 0.04501066, - 0.025380718, - 0.006616412, - 0.010480027, - -0.07959875, - -0.03109039, - -0.035281006, - 0.018305738, - 0.053488795, - 0.06565703, - -0.07258639, - 0.025227, - 0.10518925, - 0.035734728, - 0.02812301, - 0.0116889635, - 0.04420422, - 0.012585445, - 0.0018629873, - 0.03925016, - 0.043145437, - 0.097845145, - -0.08803666, - -0.060626414, - 0.026821595, - 0.0041026343, - 0.033468857, - 0.011819169, - 0.009573708, - -0.009524407, - -0.021213718, - -0.008906247, - 0.029348776, - -0.012694493, - -0.019262077, - 0.009897482, - -0.008127538, - 0.018616533, - -0.00074092194, - -0.056122895, - -3.8021082e-33, - 0.020863937, - 0.0047333767, - 0.019744372, - 0.060233314, - -0.06857584, - -0.07498767, - 0.007997102, - -0.04733539, - 0.05782872, - 0.049535874, - 0.018785646, - 0.032732572, - 0.017672436, - 0.074836925, - 0.024971113, - -0.011844539, - -0.11211646, - 0.007026034, - 0.028080462, - -0.017474122, - 0.0817653, - -0.007904061, - 0.03210623, - -0.122978985, - 0.03375521, - 0.02587286, - -0.004479943, - 0.07948923, - 0.004065995, - 0.033063736, - 0.008058094, - 0.013444748, - -0.032908894, - 0.031558145, - 0.040147394, - 0.001501024, - 0.030767068, - 0.029500617, - 0.041341957, - -0.047430623, - 0.039448265, - -0.075250365, - 0.037944954, - -0.026018769, - 0.016939783, - 0.013666865, - 0.007116529, - -0.053848118, - -0.074419044, - -0.006100011, - 0.024430456, - -0.03985037, - -0.02065548, - -0.033364378, - 0.008992889, - 0.12111313, - -0.028268464, - -0.03619572, - -0.021325285, - 0.05334936, - 0.051584847, - -0.01202104, - 0.03557552, - 0.054104213, - 0.06071252, - 0.071583234, - 0.042997945, - 0.008561662, - 0.07422672, - 0.008418425, - -0.036365964, - -0.008559546, - -0.08816671, - -0.04907638, - 0.00028750877, - -0.051279917, - 0.035895903, - -0.030404305, - -0.012635731, - 0.018795075, - 0.017144373, - -0.06645754, - 0.023793342, - 0.000993731, - -0.01938052, - -0.05343233, - -0.017068349, - -0.06219081, - -0.059607625, - -0.012196407, - -0.0131753115, - -0.03705957, - 0.0008210978, - 0.09808552, - 0.024671523, - 2.1774687e-33, - -0.010076338, - -0.016777446, - -0.042147383, - 0.08836867, - -0.028899672, - -0.0048874663, - -0.08209485, - 0.029246984, - -0.04308444, - -0.014178017, - -0.028403133, - 0.025991142, - -0.017637307, - 0.04654231, - -0.0057748524, - 0.029987331, - 0.011357778, - 0.017457604, - 0.055051018, - 0.03222884, - -0.07999247, - 0.032465667, - -0.060007077, - -0.011553406, - 0.010223051, - 0.04651086, - 0.0011846055, - 0.07870393, - -0.044612467, - 0.032810863, - 0.0023138348, - -0.03884047, - -0.017668914, - 0.079135194, - -0.004594527, - 0.043508377, - -0.031625524, - 0.008872064, - -0.050121736, - 0.06896808, - 0.043688085, - 0.019938715, - -0.08469436, - -0.046897292, - -0.006832939, - -0.026140738, - -0.05106749, - 0.054356705, - 0.030691773, - -0.010932293, - 0.047189884, - -0.01740432, - -0.020789616, - -0.08175918, - -0.027700473, - 0.035974283, - 0.05395729, - 0.04489479, - 0.059698317, - 0.041220855, - -0.066653565, - -0.09200203, - 0.008937433, - 0.02581428, - -0.03863856, - -0.0043950165, - -0.05208163, - 0.02743701, - 0.012093444, - 0.048299577, - 0.059836566, - 0.09734695, - -0.053629622, - -0.07637932, - 0.015765766, - -0.044513486, - -0.13213192, - -0.07024786, - -0.10133136, - -0.11906537, - -0.027716314, - 0.0068639666, - -0.0053682425, - 0.054165307, - -0.11115557, - 0.07837099, - 0.03506696, - 0.016077982, - 0.021501223, - -0.061516896, - 0.007429458, - 0.048352152, - -0.013604487, - 0.012456823, - -0.12730241, - -1.40081795e-08, - -0.040906876, - -0.015950777, - 0.060046297, - 0.038068157, - 0.066364, - 0.04727011, - -0.01611309, - 0.09689113, - -0.044232138, - -0.028793652, - -0.012945379, - 0.01303288, - 0.022385143, - 0.047113802, - 0.06399741, - 0.12131601, - 0.060635034, - 0.102205545, - -0.07575499, - -0.02380431, - 0.12489149, - -0.045490686, - 0.09547224, - 0.021274548, - 0.0373141, - -0.07523771, - -0.0026329542, - 0.047245234, - 0.048495702, - 0.12357625, - 0.018002188, - 0.013794, - -0.03588812, - -0.05179344, - 0.061835315, - 0.051598098, - 0.008910207, - -0.12502904, - 0.016457288, - -0.08591687, - -0.07110172, - 0.06984138, - -0.036050156, - -0.005367899, - -0.048767615, - 0.0008031624, - -0.021520091, - -0.061076768, - 0.002495028, - -0.032736864, - 0.045757275, - 0.0389445, - -0.024670867, - 0.025894105, - 0.10298855, - -0.01300183, - 0.04781103, - -0.071152866, - 0.04602928, - 0.08051811, - -0.10304887, - 0.0844638, - 0.028001137, - -0.036985613 + 0.042460807, + -0.06189971, + -0.0784711, + 0.0064329687, + 0.03129365, + 0.00807445, + 0.05801836, + 0.025447326, + 0.016402787, + 0.045995634, + -0.028924342, + 0.04451832, + 0.05686613, + -0.015340794, + -0.07020505, + -0.057178136, + -0.07683263, + 0.006748679, + 0.0043323045, + -0.123651944, + 0.0031534543, + -0.03258051, + -0.02936216, + 0.024140852, + -0.028559243, + 0.10224467, + 0.0021632623, + -0.006975691, + 0.025292527, + -0.055500276, + 0.031231727, + -0.0070274337, + 0.08430815, + -0.028431177, + -0.083029, + 0.009555893, + -0.020029299, + -0.00243229, + -0.00768719, + -0.023077851, + -0.09293533, + -0.042625993, + -0.020000124, + 0.008240663, + 0.060970567, + 0.050315727, + -0.0510085, + -0.008543903, + -0.030227834, + -0.03582846, + -0.17836656, + -0.047279052, + 0.033892106, + 0.031623542, + -0.008832113, + 0.10480918, + 0.033559043, + 0.090348184, + -0.015757555, + -0.0125672715, + -0.084686965, + -0.114781834, + -0.13755985, + 0.021652374, + 0.047834594, + 0.043243896, + 0.008659893, + 0.038724966, + 0.046716973, + -0.077413626, + -0.04887495, + 0.031287406, + 0.022356613, + 0.00043283988, + 0.052321073, + -0.012254071, + -0.035172574, + -0.00825216, + -0.008866574, + -0.034267236, + -0.04576201, + 0.002467568, + -0.040877618, + 0.08047682, + 0.09472728, + 0.0413438, + 0.0057974122, + 0.044982508, + 0.025369909, + 0.006618073, + 0.010467276, + -0.07960384, + -0.03108485, + -0.03528749, + 0.01831391, + 0.053473305, + 0.06568304, + -0.07259002, + 0.02523736, + 0.10520362, + 0.035732146, + 0.028157586, + 0.011687256, + 0.044207197, + 0.012604437, + 0.0018819098, + 0.03926183, + 0.043135095, + 0.09784739, + -0.08801336, + -0.06060836, + 0.02681984, + 0.0041358666, + 0.033492945, + 0.011799116, + 0.009551661, + -0.0095491735, + -0.021212189, + -0.008917248, + 0.029352615, + -0.012693442, + -0.019269384, + 0.009901157, + -0.00812101, + 0.018603146, + -0.0007501193, + -0.056115113, + -3.8018077e-33, + 0.020848714, + 0.0047160466, + 0.019726405, + 0.06024251, + -0.0685974, + -0.07497267, + 0.007997452, + -0.047339544, + 0.057801835, + 0.049544968, + 0.01878086, + 0.03274472, + 0.017663997, + 0.07483022, + 0.02496901, + -0.011843339, + -0.11212756, + 0.0070379525, + 0.028099466, + -0.01746246, + 0.08173482, + -0.007920462, + 0.032095373, + -0.12300146, + 0.033773854, + 0.025873141, + -0.0045020077, + 0.079493225, + 0.0040725255, + 0.03305898, + 0.008061117, + 0.0134422695, + -0.03292251, + 0.031554114, + 0.04013794, + 0.0014983519, + 0.030762345, + 0.029481992, + 0.041350223, + -0.047438618, + 0.03944708, + -0.07526981, + 0.037927423, + -0.026016014, + 0.016933467, + 0.0136799775, + 0.0071263947, + -0.05386736, + -0.07443268, + -0.006070775, + 0.024427462, + -0.039844982, + -0.020661902, + -0.033354662, + 0.009005565, + 0.12111172, + -0.028260944, + -0.036192853, + -0.021332363, + 0.05333571, + 0.05161245, + -0.01204843, + 0.035563566, + 0.05408247, + 0.060722187, + 0.07159865, + 0.04299143, + 0.008544481, + 0.07421879, + 0.00841512, + -0.036342908, + -0.008549791, + -0.08816386, + -0.049075164, + 0.00029373015, + -0.05127952, + 0.03586739, + -0.030380003, + -0.012642127, + 0.018771531, + 0.01711824, + -0.06644723, + 0.023793438, + 0.0010271219, + -0.01939443, + -0.053452212, + -0.017060323, + -0.062207118, + -0.05962535, + -0.012172617, + -0.013190802, + -0.037036054, + 0.00082622556, + 0.098088354, + 0.024690514, + 2.1767905e-33, + -0.010088812, + -0.016811697, + -0.042140447, + 0.08837209, + -0.028899776, + -0.0048947735, + -0.082139015, + 0.029238816, + -0.043079354, + -0.014153092, + -0.028387645, + 0.025998218, + -0.017625, + 0.046511114, + -0.005768211, + 0.030010609, + 0.011375536, + 0.017426634, + 0.055062976, + 0.032230247, + -0.07995765, + 0.032486655, + -0.060016844, + -0.011561194, + 0.010211269, + 0.046528235, + 0.001191399, + 0.0786961, + -0.0446158, + 0.032789085, + 0.0023115936, + -0.03886269, + -0.017663589, + 0.07913024, + -0.004583343, + 0.043521065, + -0.031589273, + 0.008867868, + -0.05013296, + 0.068929516, + 0.043675046, + 0.019968731, + -0.08471742, + -0.046864275, + -0.0068198936, + -0.026138468, + -0.05107216, + 0.054374695, + 0.03069186, + -0.010925094, + 0.04721093, + -0.017387696, + -0.020754937, + -0.081763394, + -0.027709637, + 0.035980806, + 0.05396534, + 0.044874854, + 0.059699643, + 0.041227758, + -0.06664364, + -0.09201654, + 0.008915574, + 0.025849758, + -0.038651932, + -0.0044070315, + -0.052066546, + 0.027435115, + 0.012089562, + 0.048306923, + 0.059854515, + 0.097325735, + -0.053612895, + -0.07639326, + 0.015773866, + -0.0444848, + -0.13214406, + -0.0702488, + -0.10134438, + -0.11905995, + -0.027714504, + 0.006891868, + -0.0053650527, + 0.054135524, + -0.111159205, + 0.07835098, + 0.03506018, + 0.016036613, + 0.021490784, + -0.061526407, + 0.007425222, + 0.04833579, + -0.01361202, + 0.012450488, + -0.12729599, + -1.4009424e-08, + -0.040908325, + -0.01596458, + 0.060048707, + 0.03804525, + 0.0663794, + 0.04727275, + -0.016112225, + 0.09687414, + -0.04424251, + -0.028799534, + -0.01294642, + 0.013026413, + 0.022404836, + 0.04713173, + 0.06402557, + 0.12130648, + 0.06062839, + 0.10218965, + -0.0757528, + -0.023806982, + 0.12489501, + -0.045460615, + 0.09545599, + 0.021262301, + 0.03731495, + -0.075220875, + -0.0026194793, + 0.0472452, + 0.048499025, + 0.12358729, + 0.017998053, + 0.013811017, + -0.035893846, + -0.051789004, + 0.06182457, + 0.05160056, + 0.008895317, + -0.12500942, + 0.016453298, + -0.08590811, + -0.071096726, + 0.06987216, + -0.036072273, + -0.0053715096, + -0.048762616, + 0.00081640907, + -0.021502526, + -0.061078615, + 0.002485032, + -0.032720752, + 0.045743283, + 0.038934175, + -0.024666062, + 0.025897244, + 0.10301431, + -0.013001504, + 0.04783332, + -0.07114252, + 0.046031926, + 0.080549754, + -0.10302451, + 0.08449227, + 0.028010191, + -0.03697792 ], "index": 0, "object": "embedding" diff --git a/tests/integration/recordings/responses/211b1562d4e6.json b/tests/integration/recordings/responses/211b1562d4e6.json index ba254a166..2d0044e27 100644 --- a/tests/integration/recordings/responses/211b1562d4e6.json +++ b/tests/integration/recordings/responses/211b1562d4e6.json @@ -20,15 +20,15 @@ "__type__": "ollama._types.GenerateResponse", "__data__": { "model": "llama3.2:3b-instruct-fp16", - "created_at": "2025-08-04T22:55:11.15982Z", + "created_at": "2025-09-03T17:36:17.894986Z", "done": true, "done_reason": "stop", - "total_duration": 498612042, - "load_duration": 71411834, + "total_duration": 363397458, + "load_duration": 86692791, "prompt_eval_count": 23, - "prompt_eval_duration": 102000000, + "prompt_eval_duration": 68658541, "eval_count": 6, - "eval_duration": 323000000, + "eval_duration": 207389084, "response": "Humans live on Earth.", "thinking": null, "context": null diff --git a/tests/integration/recordings/responses/23506e73bb9e.json b/tests/integration/recordings/responses/23506e73bb9e.json index d6e34c3f9..20ec9f1d1 100644 --- a/tests/integration/recordings/responses/23506e73bb9e.json +++ b/tests/integration/recordings/responses/23506e73bb9e.json @@ -20,390 +20,390 @@ "data": [ { "embedding": [ - -0.055977955, - 0.075997174, - -0.09249559, - 0.014318654, - 0.05876127, - -0.032458965, - 0.020946832, - 0.028819378, - -0.06590933, - 0.013517223, - 0.13000485, - 0.0045786807, - -0.0069082035, - -0.055431433, - -0.04756826, - -0.02912152, - -0.12239366, - -0.05359766, - -0.014712379, - 0.059826344, - 0.034466766, - 0.02072927, - -0.048724595, - 0.013531463, - 0.05862551, - -0.0030636105, - -0.031532496, - 0.08256397, - -0.031230088, - -0.12059464, - 0.03833127, - 0.06573049, - 0.064165965, - 0.03838281, - 0.12570563, - 0.031128457, - 0.10817016, - -0.001977333, - -0.024726717, - 0.028785817, - 0.012688804, - -0.039854225, - 0.043296516, - -0.015909227, - -0.013514834, - -0.005097704, - -0.007898244, - 0.0397803, - 0.0037018042, - -0.03366439, - -0.058511946, - 0.0048645996, - -0.08961216, - -0.010436317, - 0.05919557, - -0.020386472, - 0.014281465, - 0.013961121, - -0.0045877, - 0.03835435, - 0.004833604, - 0.029750798, - -0.02082645, - 0.018628312, - 0.124215424, - -0.023262355, - -0.0403046, - -0.023597443, - -0.0074503124, - -0.09082856, - -0.16860788, - 0.010149646, - -0.03580583, - 0.0105862, - -0.02046927, - 0.0021231866, - -0.109239034, - 0.007925489, - 0.048885852, - -0.11390797, - -0.060719617, - -0.13435687, - 0.006331373, - -0.008848544, - -0.031521764, - 0.09917924, - 0.055304468, - 0.0068802955, - -0.023466706, - -0.0031231036, - 0.036759574, - 0.014334804, - 0.022158744, - 0.04709372, - 0.007092632, - 0.06810656, - 0.018511463, - 0.040857043, - 0.05504883, - 0.09488118, - -0.01585433, - -0.000100159355, - 0.01078331, - 0.09177411, - -0.07465409, - -0.064712845, - 0.070150875, - -0.044969488, - 0.057672877, - -0.026067073, - 0.0063218353, - -0.094980195, - -0.010527798, - -0.07887331, - 0.039760627, - -0.041514914, - -0.055244483, - 0.07536157, - -0.046700213, - 0.03613181, - 0.08028084, - -0.03635332, - -0.034757905, - 0.0169972, - -0.04701302, - -0.06517364, - 0.06215512, - -4.2211668e-33, - -0.001730556, - -0.09387539, - -0.029811831, - 0.12576838, - 0.03797533, - -0.036525473, - 0.0060974187, - 0.059078563, - -0.110772625, - 0.005687099, - -0.025972685, - -0.074838035, - 0.0083624, - 0.0274395, - -0.052505072, - 0.023982009, - -0.004383019, - 0.03933067, - -0.0421536, - -0.0273022, - 0.05469264, - 0.027077684, - -0.033308104, - -0.060588703, - -0.050718505, - 0.017972048, - -0.003501518, - -0.046666663, - 0.073935315, - 0.01332508, - -0.003336597, - -0.04653879, - -0.060137972, - 0.034129404, - 0.0015396234, - 0.03913038, - 0.039914686, - -0.012313295, - -0.03049878, - -0.001898293, - -0.014593095, - -0.013025945, - 0.019526742, - -0.022328524, - 0.07434842, - -0.05336983, - -0.02397039, - 0.029210743, - 0.027515827, - 0.015095782, - -0.020450259, - 0.043337505, - 0.019659057, - 0.01736381, - -0.0035567854, - 0.019467248, - -0.0003600355, - 0.0004236338, - -0.0051459596, - 0.06621258, - 0.027880289, - 0.04102983, - -0.06717971, - 0.028754033, - -0.03474935, - -0.055536743, - -0.032726888, - -0.08101375, - 0.092146546, - 0.06396539, - -0.04917468, - -0.039915428, - 0.036926597, - -0.0015941713, - 0.00030078198, - -0.026029347, - -0.006002226, - 0.0547852, - -0.0956802, - -0.05187664, - -0.048835263, - -0.08641023, - -0.033999704, - -0.033261146, - -0.05655725, - -0.051167108, - 0.008072844, - -0.08582387, - 0.06508922, - -0.08545701, - 0.027998457, - 0.029824113, - -0.031671796, - -0.08560477, - 0.101766, - 2.1853336e-33, - 0.011631667, - 0.07766936, - -0.017357787, - 0.00522221, - 0.0009766584, - 0.06540673, - 0.07256414, - -0.044297714, - -0.04751489, - 0.14031266, - -0.02573919, - 0.005799934, - 0.040961996, - -0.054869186, - 0.074385494, - -0.023611594, - 0.018366067, - -0.06055796, - -0.04411962, - 0.0027609242, - -0.0457808, - 0.11723751, - 0.10269976, - 0.079064004, - -0.046609085, - 0.018625101, - 0.02980095, - 0.037249736, - 0.022749124, - -0.002641677, - 0.04173634, - 0.06440922, - -0.08910874, - 0.018179348, - 0.024035122, - -0.09641835, - 0.086450025, - -0.053884093, - 0.01923183, - 0.045059275, - 0.045154754, - 0.096540354, - 0.014918263, - 0.05959024, - 0.03068157, - 0.05884942, - 0.11149687, - 0.01664536, - 0.011553633, - -0.023707153, - -0.008613074, - -0.055065807, - 0.047565654, - -0.014617207, - -0.01412784, - 0.06996046, - 0.032047763, - 0.04266437, - -0.053910665, - 0.031057829, - 0.009195878, - 0.032976385, - -0.018986467, - 0.00552569, - -0.014989692, - -0.09192638, - -0.032122552, - 0.015356909, - 0.02916829, - 0.012490537, - -0.00481679, - 0.02338388, - -0.028228622, - -0.0845363, - 0.051079277, - -0.013396008, - -0.029029451, - -0.022589581, - 0.010921808, - -0.009802942, - 0.049751375, - -0.0032863966, - -0.038782034, - 0.027910566, - 0.017915333, - 0.005342976, - 0.058715835, - 0.0958275, - -0.014351606, - 0.006968306, - -0.027336437, - 0.06917409, - 0.057280898, - 0.032035258, - 0.004253816, - -1.6765805e-08, - -0.03635166, - -0.091484524, - -0.026345165, - -0.007943707, - -0.024149738, - 0.09897989, - -0.04723456, - -0.037648056, - -0.029387534, - -0.022535043, - 0.041274313, - -0.001120282, - -0.05565933, - 0.020671127, - -0.03811821, - -0.052506164, - -0.026291005, - -0.053353462, - -0.040578876, - -0.0073704817, - -0.0014502247, - 0.027114222, - 0.02715861, - 0.009327082, - -0.0002262999, - 0.038208842, - 0.037102137, - 0.08402326, - -0.063428074, - -0.014857683, - 0.0503535, - 0.06702617, - 0.027663387, - -0.04361141, - -0.012074137, - 0.08499847, - 0.11162084, - 0.10458964, - 0.019746903, - -0.0002763885, - -0.041129645, - 0.009574697, - -0.05287082, - -0.0026483443, - -0.031138659, - -0.08863464, - -0.06762413, - -0.074503295, - -0.053003356, - -0.09557731, - -0.052699838, - 0.013066509, - 0.0029109598, - 0.041860294, - -0.045234714, - 0.01671661, - 0.017218111, - 0.021572877, - -0.037175495, - 0.023540929, - 0.051999625, - 0.064441204, - 0.023920247, - -0.025235547 + -0.055990793, + 0.076004684, + -0.09247725, + 0.014340361, + 0.058780864, + -0.032434482, + 0.020954052, + 0.028818125, + -0.06591213, + 0.013541593, + 0.12999941, + 0.004603084, + -0.0069239275, + -0.055457443, + -0.047553156, + -0.029139794, + -0.12236376, + -0.05360872, + -0.014706594, + 0.05984688, + 0.034442738, + 0.02076038, + -0.048697792, + 0.0135388365, + 0.058592733, + -0.003076384, + -0.031565297, + 0.082541116, + -0.031259205, + -0.12057633, + 0.038319625, + 0.06574785, + 0.06415721, + 0.038382582, + 0.12570712, + 0.03108174, + 0.10821103, + -0.0019794356, + -0.024704305, + 0.028765837, + 0.01268161, + -0.039844505, + 0.043253522, + -0.015898596, + -0.0135526005, + -0.0050831717, + -0.007911988, + 0.039783813, + 0.0036548872, + -0.033632487, + -0.058547974, + 0.0048877494, + -0.089586094, + -0.010457663, + 0.059202507, + -0.020414542, + 0.014278556, + 0.013986488, + -0.0046022516, + 0.0383391, + 0.0048145773, + 0.029772853, + -0.020863408, + 0.018640704, + 0.12422993, + -0.023236223, + -0.040323637, + -0.023598222, + -0.007448043, + -0.09083128, + -0.16859712, + 0.01012451, + -0.035808884, + 0.010595173, + -0.02050494, + 0.0020821376, + -0.10925222, + 0.00793264, + 0.048889533, + -0.11391199, + -0.06072707, + -0.13435508, + 0.0063265716, + -0.008838073, + -0.03153269, + 0.099169336, + 0.055310693, + 0.0068571265, + -0.023463152, + -0.0031599961, + 0.036782328, + 0.014336826, + 0.022220163, + 0.047114056, + 0.007079763, + 0.06806425, + 0.01851431, + 0.040882625, + 0.055058856, + 0.09488346, + -0.015833577, + -7.924328e-05, + 0.010821554, + 0.09177704, + -0.07464829, + -0.06471165, + 0.07013805, + -0.04499751, + 0.057702336, + -0.0260911, + 0.006323043, + -0.09500501, + -0.010549514, + -0.07887475, + 0.039744847, + -0.04154404, + -0.055268157, + 0.07540271, + -0.04667509, + 0.036143072, + 0.080297194, + -0.036381353, + -0.03477274, + 0.01701203, + -0.047007203, + -0.06519774, + 0.062141683, + -4.222482e-33, + -0.0017580023, + -0.09383388, + -0.02982657, + 0.1257841, + 0.03802007, + -0.03654342, + 0.0060920226, + 0.05906885, + -0.11074452, + 0.005664566, + -0.0259852, + -0.074819505, + 0.008342821, + 0.027451068, + -0.05248069, + 0.02401768, + -0.004380289, + 0.039321493, + -0.04213744, + -0.027290314, + 0.054677974, + 0.02707243, + -0.03329442, + -0.060589895, + -0.050737355, + 0.017969057, + -0.0035060972, + -0.04666249, + 0.073946096, + 0.01333894, + -0.0033873583, + -0.046544433, + -0.060105033, + 0.03406923, + 0.001542676, + 0.039177947, + 0.03989323, + -0.012346489, + -0.030511485, + -0.0019157606, + -0.014608986, + -0.012997742, + 0.019522104, + -0.022349002, + 0.074362256, + -0.053366993, + -0.023993475, + 0.029225096, + 0.027534606, + 0.015111057, + -0.020442221, + 0.043327376, + 0.019660354, + 0.017330697, + -0.0035011724, + 0.019482937, + -0.0003428041, + 0.0004143988, + -0.005117252, + 0.06624799, + 0.027922852, + 0.041020587, + -0.067166425, + 0.028737254, + -0.03478325, + -0.055551115, + -0.032713737, + -0.08099247, + 0.09216284, + 0.06395264, + -0.049168136, + -0.039908994, + 0.036915958, + -0.001602359, + 0.00033041168, + -0.026015632, + -0.005999889, + 0.05474541, + -0.09568287, + -0.05186289, + -0.048838183, + -0.08639551, + -0.034023147, + -0.033257127, + -0.05651867, + -0.051131375, + 0.00809173, + -0.08581851, + 0.06507323, + -0.085427366, + 0.027997404, + 0.029847065, + -0.031673994, + -0.08560956, + 0.1017672, + 2.1855676e-33, + 0.01160785, + 0.077607885, + -0.017380483, + 0.005239329, + 0.0009684126, + 0.06543702, + 0.07256893, + -0.044318836, + -0.04749324, + 0.14031002, + -0.025741624, + 0.0057860985, + 0.040946104, + -0.054880083, + 0.074413285, + -0.023610368, + 0.018364722, + -0.060585637, + -0.044149306, + 0.0027854694, + -0.04580664, + 0.1172219, + 0.10268574, + 0.07907412, + -0.0466143, + 0.018618405, + 0.029834948, + 0.037265483, + 0.02273822, + -0.0026589038, + 0.041726097, + 0.06439532, + -0.089163445, + 0.018188318, + 0.024064727, + -0.096389584, + 0.08642254, + -0.05389359, + 0.01923105, + 0.045092683, + 0.045125954, + 0.09655961, + 0.014908797, + 0.059611585, + 0.03066662, + 0.05882299, + 0.111484826, + 0.016632542, + 0.011590394, + -0.023702666, + -0.008617484, + -0.055030316, + 0.047606383, + -0.014632687, + -0.014156344, + 0.069926, + 0.032047603, + 0.042642817, + -0.053942375, + 0.031047028, + 0.009216673, + 0.033024028, + -0.019033706, + 0.005568194, + -0.014985451, + -0.09193244, + -0.03210824, + 0.015367608, + 0.029150328, + 0.01250386, + -0.004827391, + 0.023345906, + -0.028271332, + -0.08454125, + 0.051068563, + -0.0133641455, + -0.029022738, + -0.02258452, + 0.010884119, + -0.009810021, + 0.049751773, + -0.0032637494, + -0.038813565, + 0.027924104, + 0.017925078, + 0.005337612, + 0.058691237, + 0.09577674, + -0.014308608, + 0.006972794, + -0.02733344, + 0.06912433, + 0.05727631, + 0.03206042, + 0.0042422824, + -1.6766318e-08, + -0.036354303, + -0.09146416, + -0.026319364, + -0.007941995, + -0.024127059, + 0.09896698, + -0.04723083, + -0.03767135, + -0.029419973, + -0.022513283, + 0.04125822, + -0.0011487947, + -0.05570366, + 0.020679709, + -0.038118906, + -0.0524994, + -0.02624128, + -0.05336954, + -0.040593866, + -0.0073642326, + -0.0014442836, + 0.02714257, + 0.027141048, + 0.00932513, + -0.00026505854, + 0.038233075, + 0.037096914, + 0.08405413, + -0.06340637, + -0.014856458, + 0.05038612, + 0.06703033, + 0.027668556, + -0.04360097, + -0.012041474, + 0.08500689, + 0.111594744, + 0.1046117, + 0.019726463, + -0.0003025109, + -0.04110389, + 0.009575226, + -0.05285304, + -0.0026365265, + -0.031144748, + -0.08860188, + -0.06762232, + -0.07451522, + -0.053012833, + -0.09560941, + -0.05273455, + 0.013032144, + 0.0029190276, + 0.041905046, + -0.04522114, + 0.016730292, + 0.017214278, + 0.021578068, + -0.03718778, + 0.02353425, + 0.052041385, + 0.06444499, + 0.02387539, + -0.025236009 ], "index": 0, "object": "embedding" diff --git a/tests/integration/recordings/responses/2afe3b38ca01.json b/tests/integration/recordings/responses/2afe3b38ca01.json index 4b5c82ad4..270d2744c 100644 --- a/tests/integration/recordings/responses/2afe3b38ca01.json +++ b/tests/integration/recordings/responses/2afe3b38ca01.json @@ -22,7 +22,7 @@ "__type__": "ollama._types.GenerateResponse", "__data__": { "model": "llama3.2:3b-instruct-fp16", - "created_at": "2025-08-01T23:14:01.887809Z", + "created_at": "2025-09-03T17:37:50.436472Z", "done": false, "done_reason": null, "total_duration": null, @@ -40,7 +40,7 @@ "__type__": "ollama._types.GenerateResponse", "__data__": { "model": "llama3.2:3b-instruct-fp16", - "created_at": "2025-08-01T23:14:01.942369Z", + "created_at": "2025-09-03T17:37:50.478138Z", "done": false, "done_reason": null, "total_duration": null, @@ -58,7 +58,7 @@ "__type__": "ollama._types.GenerateResponse", "__data__": { "model": "llama3.2:3b-instruct-fp16", - "created_at": "2025-08-01T23:14:01.99605Z", + "created_at": "2025-09-03T17:37:50.519952Z", "done": false, "done_reason": null, "total_duration": null, @@ -76,7 +76,7 @@ "__type__": "ollama._types.GenerateResponse", "__data__": { "model": "llama3.2:3b-instruct-fp16", - "created_at": "2025-08-01T23:14:02.049974Z", + "created_at": "2025-09-03T17:37:50.561433Z", "done": false, "done_reason": null, "total_duration": null, @@ -94,7 +94,7 @@ "__type__": "ollama._types.GenerateResponse", "__data__": { "model": "llama3.2:3b-instruct-fp16", - "created_at": "2025-08-01T23:14:02.102027Z", + "created_at": "2025-09-03T17:37:50.603624Z", "done": false, "done_reason": null, "total_duration": null, @@ -112,7 +112,7 @@ "__type__": "ollama._types.GenerateResponse", "__data__": { "model": "llama3.2:3b-instruct-fp16", - "created_at": "2025-08-01T23:14:02.158416Z", + "created_at": "2025-09-03T17:37:50.645851Z", "done": false, "done_reason": null, "total_duration": null, @@ -130,7 +130,7 @@ "__type__": "ollama._types.GenerateResponse", "__data__": { "model": "llama3.2:3b-instruct-fp16", - "created_at": "2025-08-01T23:14:02.211753Z", + "created_at": "2025-09-03T17:37:50.688403Z", "done": false, "done_reason": null, "total_duration": null, @@ -148,7 +148,7 @@ "__type__": "ollama._types.GenerateResponse", "__data__": { "model": "llama3.2:3b-instruct-fp16", - "created_at": "2025-08-01T23:14:02.265564Z", + "created_at": "2025-09-03T17:37:50.72991Z", "done": false, "done_reason": null, "total_duration": null, @@ -166,7 +166,7 @@ "__type__": "ollama._types.GenerateResponse", "__data__": { "model": "llama3.2:3b-instruct-fp16", - "created_at": "2025-08-01T23:14:02.31618Z", + "created_at": "2025-09-03T17:37:50.771635Z", "done": false, "done_reason": null, "total_duration": null, @@ -184,7 +184,7 @@ "__type__": "ollama._types.GenerateResponse", "__data__": { "model": "llama3.2:3b-instruct-fp16", - "created_at": "2025-08-01T23:14:02.370325Z", + "created_at": "2025-09-03T17:37:50.813711Z", "done": false, "done_reason": null, "total_duration": null, @@ -202,7 +202,7 @@ "__type__": "ollama._types.GenerateResponse", "__data__": { "model": "llama3.2:3b-instruct-fp16", - "created_at": "2025-08-01T23:14:02.424667Z", + "created_at": "2025-09-03T17:37:50.856201Z", "done": false, "done_reason": null, "total_duration": null, @@ -220,7 +220,7 @@ "__type__": "ollama._types.GenerateResponse", "__data__": { "model": "llama3.2:3b-instruct-fp16", - "created_at": "2025-08-01T23:14:02.47913Z", + "created_at": "2025-09-03T17:37:50.899048Z", "done": false, "done_reason": null, "total_duration": null, @@ -238,15 +238,15 @@ "__type__": "ollama._types.GenerateResponse", "__data__": { "model": "llama3.2:3b-instruct-fp16", - "created_at": "2025-08-01T23:14:02.536984Z", + "created_at": "2025-09-03T17:37:50.94069Z", "done": true, "done_reason": "stop", - "total_duration": 1042724125, - "load_duration": 86161375, + "total_duration": 688370708, + "load_duration": 107469833, "prompt_eval_count": 399, - "prompt_eval_duration": 305000000, + "prompt_eval_duration": 74988334, "eval_count": 13, - "eval_duration": 650000000, + "eval_duration": 505216458, "response": "", "thinking": null, "context": null diff --git a/tests/integration/recordings/responses/2d187a11704c.json b/tests/integration/recordings/responses/2d187a11704c.json index fbfcb91f8..c0f746ffe 100644 --- a/tests/integration/recordings/responses/2d187a11704c.json +++ b/tests/integration/recordings/responses/2d187a11704c.json @@ -22,7 +22,7 @@ "__type__": "ollama._types.GenerateResponse", "__data__": { "model": "llama3.2:3b-instruct-fp16", - "created_at": "2025-08-01T23:14:11.938867Z", + "created_at": "2025-09-03T17:37:56.566151Z", "done": false, "done_reason": null, "total_duration": null, @@ -40,7 +40,7 @@ "__type__": "ollama._types.GenerateResponse", "__data__": { "model": "llama3.2:3b-instruct-fp16", - "created_at": "2025-08-01T23:14:11.991247Z", + "created_at": "2025-09-03T17:37:56.609308Z", "done": false, "done_reason": null, "total_duration": null, @@ -58,7 +58,7 @@ "__type__": "ollama._types.GenerateResponse", "__data__": { "model": "llama3.2:3b-instruct-fp16", - "created_at": "2025-08-01T23:14:12.043953Z", + "created_at": "2025-09-03T17:37:56.651314Z", "done": false, "done_reason": null, "total_duration": null, @@ -76,7 +76,7 @@ "__type__": "ollama._types.GenerateResponse", "__data__": { "model": "llama3.2:3b-instruct-fp16", - "created_at": "2025-08-01T23:14:12.096001Z", + "created_at": "2025-09-03T17:37:56.693185Z", "done": false, "done_reason": null, "total_duration": null, @@ -94,7 +94,7 @@ "__type__": "ollama._types.GenerateResponse", "__data__": { "model": "llama3.2:3b-instruct-fp16", - "created_at": "2025-08-01T23:14:12.150454Z", + "created_at": "2025-09-03T17:37:56.734643Z", "done": false, "done_reason": null, "total_duration": null, @@ -112,7 +112,7 @@ "__type__": "ollama._types.GenerateResponse", "__data__": { "model": "llama3.2:3b-instruct-fp16", - "created_at": "2025-08-01T23:14:12.201249Z", + "created_at": "2025-09-03T17:37:56.776343Z", "done": false, "done_reason": null, "total_duration": null, @@ -130,7 +130,7 @@ "__type__": "ollama._types.GenerateResponse", "__data__": { "model": "llama3.2:3b-instruct-fp16", - "created_at": "2025-08-01T23:14:12.252534Z", + "created_at": "2025-09-03T17:37:56.81705Z", "done": false, "done_reason": null, "total_duration": null, @@ -148,7 +148,7 @@ "__type__": "ollama._types.GenerateResponse", "__data__": { "model": "llama3.2:3b-instruct-fp16", - "created_at": "2025-08-01T23:14:12.30063Z", + "created_at": "2025-09-03T17:37:56.857959Z", "done": false, "done_reason": null, "total_duration": null, @@ -166,7 +166,7 @@ "__type__": "ollama._types.GenerateResponse", "__data__": { "model": "llama3.2:3b-instruct-fp16", - "created_at": "2025-08-01T23:14:12.351034Z", + "created_at": "2025-09-03T17:37:56.899424Z", "done": false, "done_reason": null, "total_duration": null, @@ -184,7 +184,7 @@ "__type__": "ollama._types.GenerateResponse", "__data__": { "model": "llama3.2:3b-instruct-fp16", - "created_at": "2025-08-01T23:14:12.405032Z", + "created_at": "2025-09-03T17:37:56.939218Z", "done": false, "done_reason": null, "total_duration": null, @@ -202,7 +202,7 @@ "__type__": "ollama._types.GenerateResponse", "__data__": { "model": "llama3.2:3b-instruct-fp16", - "created_at": "2025-08-01T23:14:12.462645Z", + "created_at": "2025-09-03T17:37:56.980065Z", "done": false, "done_reason": null, "total_duration": null, @@ -220,7 +220,7 @@ "__type__": "ollama._types.GenerateResponse", "__data__": { "model": "llama3.2:3b-instruct-fp16", - "created_at": "2025-08-01T23:14:12.520337Z", + "created_at": "2025-09-03T17:37:57.02214Z", "done": false, "done_reason": null, "total_duration": null, @@ -238,7 +238,7 @@ "__type__": "ollama._types.GenerateResponse", "__data__": { "model": "llama3.2:3b-instruct-fp16", - "created_at": "2025-08-01T23:14:12.575809Z", + "created_at": "2025-09-03T17:37:57.0628Z", "done": false, "done_reason": null, "total_duration": null, @@ -256,7 +256,7 @@ "__type__": "ollama._types.GenerateResponse", "__data__": { "model": "llama3.2:3b-instruct-fp16", - "created_at": "2025-08-01T23:14:12.633724Z", + "created_at": "2025-09-03T17:37:57.106061Z", "done": false, "done_reason": null, "total_duration": null, @@ -274,7 +274,7 @@ "__type__": "ollama._types.GenerateResponse", "__data__": { "model": "llama3.2:3b-instruct-fp16", - "created_at": "2025-08-01T23:14:12.683133Z", + "created_at": "2025-09-03T17:37:57.1492Z", "done": false, "done_reason": null, "total_duration": null, @@ -292,7 +292,7 @@ "__type__": "ollama._types.GenerateResponse", "__data__": { "model": "llama3.2:3b-instruct-fp16", - "created_at": "2025-08-01T23:14:12.734309Z", + "created_at": "2025-09-03T17:37:57.190075Z", "done": false, "done_reason": null, "total_duration": null, @@ -310,7 +310,7 @@ "__type__": "ollama._types.GenerateResponse", "__data__": { "model": "llama3.2:3b-instruct-fp16", - "created_at": "2025-08-01T23:14:12.785917Z", + "created_at": "2025-09-03T17:37:57.23178Z", "done": false, "done_reason": null, "total_duration": null, @@ -328,7 +328,7 @@ "__type__": "ollama._types.GenerateResponse", "__data__": { "model": "llama3.2:3b-instruct-fp16", - "created_at": "2025-08-01T23:14:12.835705Z", + "created_at": "2025-09-03T17:37:57.272738Z", "done": false, "done_reason": null, "total_duration": null, @@ -346,7 +346,7 @@ "__type__": "ollama._types.GenerateResponse", "__data__": { "model": "llama3.2:3b-instruct-fp16", - "created_at": "2025-08-01T23:14:12.886509Z", + "created_at": "2025-09-03T17:37:57.313855Z", "done": false, "done_reason": null, "total_duration": null, @@ -364,7 +364,7 @@ "__type__": "ollama._types.GenerateResponse", "__data__": { "model": "llama3.2:3b-instruct-fp16", - "created_at": "2025-08-01T23:14:12.937134Z", + "created_at": "2025-09-03T17:37:57.354964Z", "done": false, "done_reason": null, "total_duration": null, @@ -382,7 +382,7 @@ "__type__": "ollama._types.GenerateResponse", "__data__": { "model": "llama3.2:3b-instruct-fp16", - "created_at": "2025-08-01T23:14:12.988532Z", + "created_at": "2025-09-03T17:37:57.395971Z", "done": false, "done_reason": null, "total_duration": null, @@ -400,7 +400,7 @@ "__type__": "ollama._types.GenerateResponse", "__data__": { "model": "llama3.2:3b-instruct-fp16", - "created_at": "2025-08-01T23:14:13.041798Z", + "created_at": "2025-09-03T17:37:57.438471Z", "done": false, "done_reason": null, "total_duration": null, @@ -418,7 +418,7 @@ "__type__": "ollama._types.GenerateResponse", "__data__": { "model": "llama3.2:3b-instruct-fp16", - "created_at": "2025-08-01T23:14:13.095443Z", + "created_at": "2025-09-03T17:37:57.479796Z", "done": false, "done_reason": null, "total_duration": null, @@ -436,7 +436,7 @@ "__type__": "ollama._types.GenerateResponse", "__data__": { "model": "llama3.2:3b-instruct-fp16", - "created_at": "2025-08-01T23:14:13.151402Z", + "created_at": "2025-09-03T17:37:57.520641Z", "done": false, "done_reason": null, "total_duration": null, @@ -454,7 +454,7 @@ "__type__": "ollama._types.GenerateResponse", "__data__": { "model": "llama3.2:3b-instruct-fp16", - "created_at": "2025-08-01T23:14:13.203462Z", + "created_at": "2025-09-03T17:37:57.561511Z", "done": false, "done_reason": null, "total_duration": null, @@ -472,7 +472,7 @@ "__type__": "ollama._types.GenerateResponse", "__data__": { "model": "llama3.2:3b-instruct-fp16", - "created_at": "2025-08-01T23:14:13.254567Z", + "created_at": "2025-09-03T17:37:57.602875Z", "done": false, "done_reason": null, "total_duration": null, @@ -490,7 +490,7 @@ "__type__": "ollama._types.GenerateResponse", "__data__": { "model": "llama3.2:3b-instruct-fp16", - "created_at": "2025-08-01T23:14:13.305865Z", + "created_at": "2025-09-03T17:37:57.643406Z", "done": false, "done_reason": null, "total_duration": null, @@ -508,7 +508,7 @@ "__type__": "ollama._types.GenerateResponse", "__data__": { "model": "llama3.2:3b-instruct-fp16", - "created_at": "2025-08-01T23:14:13.357658Z", + "created_at": "2025-09-03T17:37:57.684279Z", "done": false, "done_reason": null, "total_duration": null, @@ -526,7 +526,7 @@ "__type__": "ollama._types.GenerateResponse", "__data__": { "model": "llama3.2:3b-instruct-fp16", - "created_at": "2025-08-01T23:14:13.407773Z", + "created_at": "2025-09-03T17:37:57.725699Z", "done": false, "done_reason": null, "total_duration": null, @@ -544,7 +544,7 @@ "__type__": "ollama._types.GenerateResponse", "__data__": { "model": "llama3.2:3b-instruct-fp16", - "created_at": "2025-08-01T23:14:13.458919Z", + "created_at": "2025-09-03T17:37:57.766658Z", "done": false, "done_reason": null, "total_duration": null, @@ -562,7 +562,7 @@ "__type__": "ollama._types.GenerateResponse", "__data__": { "model": "llama3.2:3b-instruct-fp16", - "created_at": "2025-08-01T23:14:13.510456Z", + "created_at": "2025-09-03T17:37:57.80738Z", "done": false, "done_reason": null, "total_duration": null, @@ -580,7 +580,7 @@ "__type__": "ollama._types.GenerateResponse", "__data__": { "model": "llama3.2:3b-instruct-fp16", - "created_at": "2025-08-01T23:14:13.565948Z", + "created_at": "2025-09-03T17:37:57.848466Z", "done": false, "done_reason": null, "total_duration": null, @@ -598,7 +598,7 @@ "__type__": "ollama._types.GenerateResponse", "__data__": { "model": "llama3.2:3b-instruct-fp16", - "created_at": "2025-08-01T23:14:13.619155Z", + "created_at": "2025-09-03T17:37:57.889056Z", "done": false, "done_reason": null, "total_duration": null, @@ -616,7 +616,7 @@ "__type__": "ollama._types.GenerateResponse", "__data__": { "model": "llama3.2:3b-instruct-fp16", - "created_at": "2025-08-01T23:14:13.672754Z", + "created_at": "2025-09-03T17:37:57.931554Z", "done": false, "done_reason": null, "total_duration": null, @@ -634,7 +634,7 @@ "__type__": "ollama._types.GenerateResponse", "__data__": { "model": "llama3.2:3b-instruct-fp16", - "created_at": "2025-08-01T23:14:13.729473Z", + "created_at": "2025-09-03T17:37:57.974754Z", "done": false, "done_reason": null, "total_duration": null, @@ -652,7 +652,7 @@ "__type__": "ollama._types.GenerateResponse", "__data__": { "model": "llama3.2:3b-instruct-fp16", - "created_at": "2025-08-01T23:14:13.788666Z", + "created_at": "2025-09-03T17:37:58.016978Z", "done": false, "done_reason": null, "total_duration": null, @@ -670,7 +670,7 @@ "__type__": "ollama._types.GenerateResponse", "__data__": { "model": "llama3.2:3b-instruct-fp16", - "created_at": "2025-08-01T23:14:13.850575Z", + "created_at": "2025-09-03T17:37:58.057942Z", "done": false, "done_reason": null, "total_duration": null, @@ -688,7 +688,7 @@ "__type__": "ollama._types.GenerateResponse", "__data__": { "model": "llama3.2:3b-instruct-fp16", - "created_at": "2025-08-01T23:14:13.904807Z", + "created_at": "2025-09-03T17:37:58.099015Z", "done": false, "done_reason": null, "total_duration": null, @@ -706,7 +706,7 @@ "__type__": "ollama._types.GenerateResponse", "__data__": { "model": "llama3.2:3b-instruct-fp16", - "created_at": "2025-08-01T23:14:13.958524Z", + "created_at": "2025-09-03T17:37:58.140531Z", "done": false, "done_reason": null, "total_duration": null, @@ -724,7 +724,7 @@ "__type__": "ollama._types.GenerateResponse", "__data__": { "model": "llama3.2:3b-instruct-fp16", - "created_at": "2025-08-01T23:14:14.011742Z", + "created_at": "2025-09-03T17:37:58.181382Z", "done": false, "done_reason": null, "total_duration": null, @@ -742,7 +742,7 @@ "__type__": "ollama._types.GenerateResponse", "__data__": { "model": "llama3.2:3b-instruct-fp16", - "created_at": "2025-08-01T23:14:14.064933Z", + "created_at": "2025-09-03T17:37:58.223318Z", "done": false, "done_reason": null, "total_duration": null, @@ -760,7 +760,7 @@ "__type__": "ollama._types.GenerateResponse", "__data__": { "model": "llama3.2:3b-instruct-fp16", - "created_at": "2025-08-01T23:14:14.116454Z", + "created_at": "2025-09-03T17:37:58.26358Z", "done": false, "done_reason": null, "total_duration": null, @@ -778,7 +778,7 @@ "__type__": "ollama._types.GenerateResponse", "__data__": { "model": "llama3.2:3b-instruct-fp16", - "created_at": "2025-08-01T23:14:14.172682Z", + "created_at": "2025-09-03T17:37:58.305496Z", "done": false, "done_reason": null, "total_duration": null, @@ -796,7 +796,7 @@ "__type__": "ollama._types.GenerateResponse", "__data__": { "model": "llama3.2:3b-instruct-fp16", - "created_at": "2025-08-01T23:14:14.227654Z", + "created_at": "2025-09-03T17:37:58.347254Z", "done": false, "done_reason": null, "total_duration": null, @@ -814,7 +814,7 @@ "__type__": "ollama._types.GenerateResponse", "__data__": { "model": "llama3.2:3b-instruct-fp16", - "created_at": "2025-08-01T23:14:14.282068Z", + "created_at": "2025-09-03T17:37:58.390044Z", "done": false, "done_reason": null, "total_duration": null, @@ -832,7 +832,7 @@ "__type__": "ollama._types.GenerateResponse", "__data__": { "model": "llama3.2:3b-instruct-fp16", - "created_at": "2025-08-01T23:14:14.334565Z", + "created_at": "2025-09-03T17:37:58.430867Z", "done": false, "done_reason": null, "total_duration": null, @@ -850,7 +850,7 @@ "__type__": "ollama._types.GenerateResponse", "__data__": { "model": "llama3.2:3b-instruct-fp16", - "created_at": "2025-08-01T23:14:14.383532Z", + "created_at": "2025-09-03T17:37:58.471376Z", "done": false, "done_reason": null, "total_duration": null, @@ -868,7 +868,7 @@ "__type__": "ollama._types.GenerateResponse", "__data__": { "model": "llama3.2:3b-instruct-fp16", - "created_at": "2025-08-01T23:14:14.432138Z", + "created_at": "2025-09-03T17:37:58.51208Z", "done": false, "done_reason": null, "total_duration": null, @@ -886,7 +886,7 @@ "__type__": "ollama._types.GenerateResponse", "__data__": { "model": "llama3.2:3b-instruct-fp16", - "created_at": "2025-08-01T23:14:14.480995Z", + "created_at": "2025-09-03T17:37:58.553226Z", "done": false, "done_reason": null, "total_duration": null, @@ -904,7 +904,7 @@ "__type__": "ollama._types.GenerateResponse", "__data__": { "model": "llama3.2:3b-instruct-fp16", - "created_at": "2025-08-01T23:14:14.531968Z", + "created_at": "2025-09-03T17:37:58.594787Z", "done": false, "done_reason": null, "total_duration": null, @@ -922,7 +922,7 @@ "__type__": "ollama._types.GenerateResponse", "__data__": { "model": "llama3.2:3b-instruct-fp16", - "created_at": "2025-08-01T23:14:14.584044Z", + "created_at": "2025-09-03T17:37:58.63466Z", "done": false, "done_reason": null, "total_duration": null, @@ -940,7 +940,7 @@ "__type__": "ollama._types.GenerateResponse", "__data__": { "model": "llama3.2:3b-instruct-fp16", - "created_at": "2025-08-01T23:14:14.635691Z", + "created_at": "2025-09-03T17:37:58.674628Z", "done": false, "done_reason": null, "total_duration": null, @@ -958,7 +958,7 @@ "__type__": "ollama._types.GenerateResponse", "__data__": { "model": "llama3.2:3b-instruct-fp16", - "created_at": "2025-08-01T23:14:14.68837Z", + "created_at": "2025-09-03T17:37:58.714616Z", "done": false, "done_reason": null, "total_duration": null, @@ -976,7 +976,7 @@ "__type__": "ollama._types.GenerateResponse", "__data__": { "model": "llama3.2:3b-instruct-fp16", - "created_at": "2025-08-01T23:14:14.73985Z", + "created_at": "2025-09-03T17:37:58.754906Z", "done": false, "done_reason": null, "total_duration": null, @@ -994,7 +994,7 @@ "__type__": "ollama._types.GenerateResponse", "__data__": { "model": "llama3.2:3b-instruct-fp16", - "created_at": "2025-08-01T23:14:14.792412Z", + "created_at": "2025-09-03T17:37:58.795048Z", "done": false, "done_reason": null, "total_duration": null, @@ -1012,7 +1012,7 @@ "__type__": "ollama._types.GenerateResponse", "__data__": { "model": "llama3.2:3b-instruct-fp16", - "created_at": "2025-08-01T23:14:14.845872Z", + "created_at": "2025-09-03T17:37:58.835297Z", "done": false, "done_reason": null, "total_duration": null, @@ -1030,7 +1030,7 @@ "__type__": "ollama._types.GenerateResponse", "__data__": { "model": "llama3.2:3b-instruct-fp16", - "created_at": "2025-08-01T23:14:14.900102Z", + "created_at": "2025-09-03T17:37:58.875738Z", "done": false, "done_reason": null, "total_duration": null, @@ -1048,7 +1048,7 @@ "__type__": "ollama._types.GenerateResponse", "__data__": { "model": "llama3.2:3b-instruct-fp16", - "created_at": "2025-08-01T23:14:14.954589Z", + "created_at": "2025-09-03T17:37:58.91604Z", "done": false, "done_reason": null, "total_duration": null, @@ -1066,7 +1066,7 @@ "__type__": "ollama._types.GenerateResponse", "__data__": { "model": "llama3.2:3b-instruct-fp16", - "created_at": "2025-08-01T23:14:15.006629Z", + "created_at": "2025-09-03T17:37:58.956596Z", "done": false, "done_reason": null, "total_duration": null, @@ -1084,7 +1084,7 @@ "__type__": "ollama._types.GenerateResponse", "__data__": { "model": "llama3.2:3b-instruct-fp16", - "created_at": "2025-08-01T23:14:15.058561Z", + "created_at": "2025-09-03T17:37:58.996664Z", "done": false, "done_reason": null, "total_duration": null, @@ -1102,7 +1102,7 @@ "__type__": "ollama._types.GenerateResponse", "__data__": { "model": "llama3.2:3b-instruct-fp16", - "created_at": "2025-08-01T23:14:15.111954Z", + "created_at": "2025-09-03T17:37:59.037796Z", "done": false, "done_reason": null, "total_duration": null, @@ -1120,7 +1120,7 @@ "__type__": "ollama._types.GenerateResponse", "__data__": { "model": "llama3.2:3b-instruct-fp16", - "created_at": "2025-08-01T23:14:15.169173Z", + "created_at": "2025-09-03T17:37:59.078586Z", "done": false, "done_reason": null, "total_duration": null, @@ -1138,7 +1138,7 @@ "__type__": "ollama._types.GenerateResponse", "__data__": { "model": "llama3.2:3b-instruct-fp16", - "created_at": "2025-08-01T23:14:15.222569Z", + "created_at": "2025-09-03T17:37:59.119448Z", "done": false, "done_reason": null, "total_duration": null, @@ -1156,7 +1156,7 @@ "__type__": "ollama._types.GenerateResponse", "__data__": { "model": "llama3.2:3b-instruct-fp16", - "created_at": "2025-08-01T23:14:15.275795Z", + "created_at": "2025-09-03T17:37:59.160318Z", "done": false, "done_reason": null, "total_duration": null, @@ -1174,7 +1174,7 @@ "__type__": "ollama._types.GenerateResponse", "__data__": { "model": "llama3.2:3b-instruct-fp16", - "created_at": "2025-08-01T23:14:15.3327Z", + "created_at": "2025-09-03T17:37:59.201852Z", "done": false, "done_reason": null, "total_duration": null, @@ -1192,7 +1192,7 @@ "__type__": "ollama._types.GenerateResponse", "__data__": { "model": "llama3.2:3b-instruct-fp16", - "created_at": "2025-08-01T23:14:15.389931Z", + "created_at": "2025-09-03T17:37:59.243763Z", "done": false, "done_reason": null, "total_duration": null, @@ -1210,7 +1210,7 @@ "__type__": "ollama._types.GenerateResponse", "__data__": { "model": "llama3.2:3b-instruct-fp16", - "created_at": "2025-08-01T23:14:15.442349Z", + "created_at": "2025-09-03T17:37:59.284948Z", "done": false, "done_reason": null, "total_duration": null, @@ -1228,7 +1228,7 @@ "__type__": "ollama._types.GenerateResponse", "__data__": { "model": "llama3.2:3b-instruct-fp16", - "created_at": "2025-08-01T23:14:15.494175Z", + "created_at": "2025-09-03T17:37:59.325598Z", "done": false, "done_reason": null, "total_duration": null, @@ -1246,7 +1246,7 @@ "__type__": "ollama._types.GenerateResponse", "__data__": { "model": "llama3.2:3b-instruct-fp16", - "created_at": "2025-08-01T23:14:15.545764Z", + "created_at": "2025-09-03T17:37:59.366289Z", "done": false, "done_reason": null, "total_duration": null, @@ -1264,7 +1264,7 @@ "__type__": "ollama._types.GenerateResponse", "__data__": { "model": "llama3.2:3b-instruct-fp16", - "created_at": "2025-08-01T23:14:15.599099Z", + "created_at": "2025-09-03T17:37:59.406764Z", "done": false, "done_reason": null, "total_duration": null, @@ -1282,7 +1282,7 @@ "__type__": "ollama._types.GenerateResponse", "__data__": { "model": "llama3.2:3b-instruct-fp16", - "created_at": "2025-08-01T23:14:15.649852Z", + "created_at": "2025-09-03T17:37:59.447922Z", "done": false, "done_reason": null, "total_duration": null, @@ -1300,7 +1300,7 @@ "__type__": "ollama._types.GenerateResponse", "__data__": { "model": "llama3.2:3b-instruct-fp16", - "created_at": "2025-08-01T23:14:15.698222Z", + "created_at": "2025-09-03T17:37:59.488486Z", "done": false, "done_reason": null, "total_duration": null, @@ -1318,7 +1318,7 @@ "__type__": "ollama._types.GenerateResponse", "__data__": { "model": "llama3.2:3b-instruct-fp16", - "created_at": "2025-08-01T23:14:15.747168Z", + "created_at": "2025-09-03T17:37:59.529Z", "done": false, "done_reason": null, "total_duration": null, @@ -1336,7 +1336,7 @@ "__type__": "ollama._types.GenerateResponse", "__data__": { "model": "llama3.2:3b-instruct-fp16", - "created_at": "2025-08-01T23:14:15.797196Z", + "created_at": "2025-09-03T17:37:59.569417Z", "done": false, "done_reason": null, "total_duration": null, @@ -1354,7 +1354,7 @@ "__type__": "ollama._types.GenerateResponse", "__data__": { "model": "llama3.2:3b-instruct-fp16", - "created_at": "2025-08-01T23:14:15.845587Z", + "created_at": "2025-09-03T17:37:59.610542Z", "done": false, "done_reason": null, "total_duration": null, @@ -1372,7 +1372,7 @@ "__type__": "ollama._types.GenerateResponse", "__data__": { "model": "llama3.2:3b-instruct-fp16", - "created_at": "2025-08-01T23:14:15.897171Z", + "created_at": "2025-09-03T17:37:59.651411Z", "done": false, "done_reason": null, "total_duration": null, @@ -1390,7 +1390,7 @@ "__type__": "ollama._types.GenerateResponse", "__data__": { "model": "llama3.2:3b-instruct-fp16", - "created_at": "2025-08-01T23:14:15.944524Z", + "created_at": "2025-09-03T17:37:59.69241Z", "done": false, "done_reason": null, "total_duration": null, @@ -1408,7 +1408,7 @@ "__type__": "ollama._types.GenerateResponse", "__data__": { "model": "llama3.2:3b-instruct-fp16", - "created_at": "2025-08-01T23:14:15.994467Z", + "created_at": "2025-09-03T17:37:59.732339Z", "done": false, "done_reason": null, "total_duration": null, @@ -1426,7 +1426,7 @@ "__type__": "ollama._types.GenerateResponse", "__data__": { "model": "llama3.2:3b-instruct-fp16", - "created_at": "2025-08-01T23:14:16.045224Z", + "created_at": "2025-09-03T17:37:59.772462Z", "done": false, "done_reason": null, "total_duration": null, @@ -1444,7 +1444,7 @@ "__type__": "ollama._types.GenerateResponse", "__data__": { "model": "llama3.2:3b-instruct-fp16", - "created_at": "2025-08-01T23:14:16.093853Z", + "created_at": "2025-09-03T17:37:59.812507Z", "done": false, "done_reason": null, "total_duration": null, @@ -1462,7 +1462,7 @@ "__type__": "ollama._types.GenerateResponse", "__data__": { "model": "llama3.2:3b-instruct-fp16", - "created_at": "2025-08-01T23:14:16.144847Z", + "created_at": "2025-09-03T17:37:59.852762Z", "done": false, "done_reason": null, "total_duration": null, @@ -1480,7 +1480,7 @@ "__type__": "ollama._types.GenerateResponse", "__data__": { "model": "llama3.2:3b-instruct-fp16", - "created_at": "2025-08-01T23:14:16.197888Z", + "created_at": "2025-09-03T17:37:59.892984Z", "done": false, "done_reason": null, "total_duration": null, @@ -1498,7 +1498,7 @@ "__type__": "ollama._types.GenerateResponse", "__data__": { "model": "llama3.2:3b-instruct-fp16", - "created_at": "2025-08-01T23:14:16.250854Z", + "created_at": "2025-09-03T17:37:59.933555Z", "done": false, "done_reason": null, "total_duration": null, @@ -1516,7 +1516,7 @@ "__type__": "ollama._types.GenerateResponse", "__data__": { "model": "llama3.2:3b-instruct-fp16", - "created_at": "2025-08-01T23:14:16.301995Z", + "created_at": "2025-09-03T17:37:59.973778Z", "done": false, "done_reason": null, "total_duration": null, @@ -1534,7 +1534,7 @@ "__type__": "ollama._types.GenerateResponse", "__data__": { "model": "llama3.2:3b-instruct-fp16", - "created_at": "2025-08-01T23:14:16.352508Z", + "created_at": "2025-09-03T17:38:00.014923Z", "done": false, "done_reason": null, "total_duration": null, @@ -1552,7 +1552,7 @@ "__type__": "ollama._types.GenerateResponse", "__data__": { "model": "llama3.2:3b-instruct-fp16", - "created_at": "2025-08-01T23:14:16.40259Z", + "created_at": "2025-09-03T17:38:00.057464Z", "done": false, "done_reason": null, "total_duration": null, @@ -1570,7 +1570,7 @@ "__type__": "ollama._types.GenerateResponse", "__data__": { "model": "llama3.2:3b-instruct-fp16", - "created_at": "2025-08-01T23:14:16.453514Z", + "created_at": "2025-09-03T17:38:00.09902Z", "done": false, "done_reason": null, "total_duration": null, @@ -1588,7 +1588,7 @@ "__type__": "ollama._types.GenerateResponse", "__data__": { "model": "llama3.2:3b-instruct-fp16", - "created_at": "2025-08-01T23:14:16.50378Z", + "created_at": "2025-09-03T17:38:00.140492Z", "done": false, "done_reason": null, "total_duration": null, @@ -1606,7 +1606,7 @@ "__type__": "ollama._types.GenerateResponse", "__data__": { "model": "llama3.2:3b-instruct-fp16", - "created_at": "2025-08-01T23:14:16.554395Z", + "created_at": "2025-09-03T17:38:00.180239Z", "done": false, "done_reason": null, "total_duration": null, @@ -1624,7 +1624,7 @@ "__type__": "ollama._types.GenerateResponse", "__data__": { "model": "llama3.2:3b-instruct-fp16", - "created_at": "2025-08-01T23:14:16.605795Z", + "created_at": "2025-09-03T17:38:00.220364Z", "done": false, "done_reason": null, "total_duration": null, @@ -1642,7 +1642,7 @@ "__type__": "ollama._types.GenerateResponse", "__data__": { "model": "llama3.2:3b-instruct-fp16", - "created_at": "2025-08-01T23:14:16.656313Z", + "created_at": "2025-09-03T17:38:00.26097Z", "done": false, "done_reason": null, "total_duration": null, @@ -1660,7 +1660,7 @@ "__type__": "ollama._types.GenerateResponse", "__data__": { "model": "llama3.2:3b-instruct-fp16", - "created_at": "2025-08-01T23:14:16.706438Z", + "created_at": "2025-09-03T17:38:00.301228Z", "done": false, "done_reason": null, "total_duration": null, @@ -1678,7 +1678,7 @@ "__type__": "ollama._types.GenerateResponse", "__data__": { "model": "llama3.2:3b-instruct-fp16", - "created_at": "2025-08-01T23:14:16.756444Z", + "created_at": "2025-09-03T17:38:00.341631Z", "done": false, "done_reason": null, "total_duration": null, @@ -1696,7 +1696,7 @@ "__type__": "ollama._types.GenerateResponse", "__data__": { "model": "llama3.2:3b-instruct-fp16", - "created_at": "2025-08-01T23:14:16.807687Z", + "created_at": "2025-09-03T17:38:00.383006Z", "done": false, "done_reason": null, "total_duration": null, @@ -1714,7 +1714,7 @@ "__type__": "ollama._types.GenerateResponse", "__data__": { "model": "llama3.2:3b-instruct-fp16", - "created_at": "2025-08-01T23:14:16.85835Z", + "created_at": "2025-09-03T17:38:00.423509Z", "done": false, "done_reason": null, "total_duration": null, @@ -1732,7 +1732,7 @@ "__type__": "ollama._types.GenerateResponse", "__data__": { "model": "llama3.2:3b-instruct-fp16", - "created_at": "2025-08-01T23:14:16.909311Z", + "created_at": "2025-09-03T17:38:00.464702Z", "done": false, "done_reason": null, "total_duration": null, @@ -1750,7 +1750,7 @@ "__type__": "ollama._types.GenerateResponse", "__data__": { "model": "llama3.2:3b-instruct-fp16", - "created_at": "2025-08-01T23:14:16.959327Z", + "created_at": "2025-09-03T17:38:00.505914Z", "done": false, "done_reason": null, "total_duration": null, @@ -1768,7 +1768,7 @@ "__type__": "ollama._types.GenerateResponse", "__data__": { "model": "llama3.2:3b-instruct-fp16", - "created_at": "2025-08-01T23:14:17.010211Z", + "created_at": "2025-09-03T17:38:00.546505Z", "done": false, "done_reason": null, "total_duration": null, @@ -1786,7 +1786,7 @@ "__type__": "ollama._types.GenerateResponse", "__data__": { "model": "llama3.2:3b-instruct-fp16", - "created_at": "2025-08-01T23:14:17.061365Z", + "created_at": "2025-09-03T17:38:00.587839Z", "done": false, "done_reason": null, "total_duration": null, @@ -1804,15 +1804,15 @@ "__type__": "ollama._types.GenerateResponse", "__data__": { "model": "llama3.2:3b-instruct-fp16", - "created_at": "2025-08-01T23:14:17.111956Z", + "created_at": "2025-09-03T17:38:00.629018Z", "done": true, "done_reason": "stop", - "total_duration": 5499672375, - "load_duration": 58161750, + "total_duration": 4303339291, + "load_duration": 156231250, "prompt_eval_count": 36, - "prompt_eval_duration": 266000000, + "prompt_eval_duration": 81909875, "eval_count": 100, - "eval_duration": 5174000000, + "eval_duration": 4064559292, "response": "", "thinking": null, "context": null diff --git a/tests/integration/recordings/responses/325a72db5755.json b/tests/integration/recordings/responses/325a72db5755.json index a41db435b..ca3eea2f3 100644 --- a/tests/integration/recordings/responses/325a72db5755.json +++ b/tests/integration/recordings/responses/325a72db5755.json @@ -1,7 +1,7 @@ { "request": { "method": "POST", - "url": "http://localhost:11434/v1/v1/chat/completions", + "url": "http://0.0.0.0:11434/v1/v1/chat/completions", "headers": {}, "body": { "model": "llama3.2:3b-instruct-fp16", @@ -21,7 +21,7 @@ { "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", "__data__": { - "id": "chatcmpl-312", + "id": "chatcmpl-923", "choices": [ { "delta": { @@ -36,7 +36,7 @@ "logprobs": null } ], - "created": 1754081853, + "created": 1756921364, "model": "llama3.2:3b-instruct-fp16", "object": "chat.completion.chunk", "service_tier": null, @@ -47,7 +47,7 @@ { "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", "__data__": { - "id": "chatcmpl-312", + "id": "chatcmpl-923", "choices": [ { "delta": { @@ -62,7 +62,7 @@ "logprobs": null } ], - "created": 1754081853, + "created": 1756921364, "model": "llama3.2:3b-instruct-fp16", "object": "chat.completion.chunk", "service_tier": null, @@ -73,7 +73,7 @@ { "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", "__data__": { - "id": "chatcmpl-312", + "id": "chatcmpl-923", "choices": [ { "delta": { @@ -88,7 +88,7 @@ "logprobs": null } ], - "created": 1754081853, + "created": 1756921364, "model": "llama3.2:3b-instruct-fp16", "object": "chat.completion.chunk", "service_tier": null, @@ -99,7 +99,7 @@ { "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", "__data__": { - "id": "chatcmpl-312", + "id": "chatcmpl-923", "choices": [ { "delta": { @@ -114,7 +114,7 @@ "logprobs": null } ], - "created": 1754081853, + "created": 1756921364, "model": "llama3.2:3b-instruct-fp16", "object": "chat.completion.chunk", "service_tier": null, @@ -125,7 +125,7 @@ { "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", "__data__": { - "id": "chatcmpl-312", + "id": "chatcmpl-923", "choices": [ { "delta": { @@ -140,7 +140,7 @@ "logprobs": null } ], - "created": 1754081853, + "created": 1756921364, "model": "llama3.2:3b-instruct-fp16", "object": "chat.completion.chunk", "service_tier": null, @@ -151,7 +151,7 @@ { "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", "__data__": { - "id": "chatcmpl-312", + "id": "chatcmpl-923", "choices": [ { "delta": { @@ -166,7 +166,7 @@ "logprobs": null } ], - "created": 1754081853, + "created": 1756921364, "model": "llama3.2:3b-instruct-fp16", "object": "chat.completion.chunk", "service_tier": null, @@ -177,7 +177,7 @@ { "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", "__data__": { - "id": "chatcmpl-312", + "id": "chatcmpl-923", "choices": [ { "delta": { @@ -192,7 +192,7 @@ "logprobs": null } ], - "created": 1754081853, + "created": 1756921364, "model": "llama3.2:3b-instruct-fp16", "object": "chat.completion.chunk", "service_tier": null, @@ -203,7 +203,7 @@ { "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", "__data__": { - "id": "chatcmpl-312", + "id": "chatcmpl-923", "choices": [ { "delta": { @@ -218,7 +218,7 @@ "logprobs": null } ], - "created": 1754081853, + "created": 1756921364, "model": "llama3.2:3b-instruct-fp16", "object": "chat.completion.chunk", "service_tier": null, @@ -229,7 +229,7 @@ { "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", "__data__": { - "id": "chatcmpl-312", + "id": "chatcmpl-923", "choices": [ { "delta": { @@ -244,7 +244,7 @@ "logprobs": null } ], - "created": 1754081853, + "created": 1756921364, "model": "llama3.2:3b-instruct-fp16", "object": "chat.completion.chunk", "service_tier": null, @@ -255,7 +255,7 @@ { "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", "__data__": { - "id": "chatcmpl-312", + "id": "chatcmpl-923", "choices": [ { "delta": { @@ -270,7 +270,7 @@ "logprobs": null } ], - "created": 1754081853, + "created": 1756921364, "model": "llama3.2:3b-instruct-fp16", "object": "chat.completion.chunk", "service_tier": null, @@ -281,7 +281,7 @@ { "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", "__data__": { - "id": "chatcmpl-312", + "id": "chatcmpl-923", "choices": [ { "delta": { @@ -296,7 +296,7 @@ "logprobs": null } ], - "created": 1754081854, + "created": 1756921364, "model": "llama3.2:3b-instruct-fp16", "object": "chat.completion.chunk", "service_tier": null, @@ -307,7 +307,7 @@ { "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", "__data__": { - "id": "chatcmpl-312", + "id": "chatcmpl-923", "choices": [ { "delta": { @@ -322,7 +322,7 @@ "logprobs": null } ], - "created": 1754081854, + "created": 1756921364, "model": "llama3.2:3b-instruct-fp16", "object": "chat.completion.chunk", "service_tier": null, @@ -333,7 +333,7 @@ { "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", "__data__": { - "id": "chatcmpl-312", + "id": "chatcmpl-923", "choices": [ { "delta": { @@ -348,7 +348,7 @@ "logprobs": null } ], - "created": 1754081854, + "created": 1756921364, "model": "llama3.2:3b-instruct-fp16", "object": "chat.completion.chunk", "service_tier": null, @@ -359,7 +359,7 @@ { "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", "__data__": { - "id": "chatcmpl-312", + "id": "chatcmpl-923", "choices": [ { "delta": { @@ -374,7 +374,7 @@ "logprobs": null } ], - "created": 1754081854, + "created": 1756921364, "model": "llama3.2:3b-instruct-fp16", "object": "chat.completion.chunk", "service_tier": null, @@ -385,7 +385,7 @@ { "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", "__data__": { - "id": "chatcmpl-312", + "id": "chatcmpl-923", "choices": [ { "delta": { @@ -400,7 +400,7 @@ "logprobs": null } ], - "created": 1754081854, + "created": 1756921364, "model": "llama3.2:3b-instruct-fp16", "object": "chat.completion.chunk", "service_tier": null, @@ -411,7 +411,7 @@ { "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", "__data__": { - "id": "chatcmpl-312", + "id": "chatcmpl-923", "choices": [ { "delta": { @@ -426,7 +426,7 @@ "logprobs": null } ], - "created": 1754081854, + "created": 1756921365, "model": "llama3.2:3b-instruct-fp16", "object": "chat.completion.chunk", "service_tier": null, @@ -437,7 +437,7 @@ { "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", "__data__": { - "id": "chatcmpl-312", + "id": "chatcmpl-923", "choices": [ { "delta": { @@ -452,7 +452,7 @@ "logprobs": null } ], - "created": 1754081854, + "created": 1756921365, "model": "llama3.2:3b-instruct-fp16", "object": "chat.completion.chunk", "service_tier": null, @@ -463,7 +463,7 @@ { "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", "__data__": { - "id": "chatcmpl-312", + "id": "chatcmpl-923", "choices": [ { "delta": { @@ -478,7 +478,7 @@ "logprobs": null } ], - "created": 1754081854, + "created": 1756921365, "model": "llama3.2:3b-instruct-fp16", "object": "chat.completion.chunk", "service_tier": null, @@ -489,7 +489,7 @@ { "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", "__data__": { - "id": "chatcmpl-312", + "id": "chatcmpl-923", "choices": [ { "delta": { @@ -504,7 +504,7 @@ "logprobs": null } ], - "created": 1754081854, + "created": 1756921365, "model": "llama3.2:3b-instruct-fp16", "object": "chat.completion.chunk", "service_tier": null, @@ -515,7 +515,683 @@ { "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", "__data__": { - "id": "chatcmpl-312", + "id": "chatcmpl-923", + "choices": [ + { + "delta": { + "content": " It", + "function_call": null, + "refusal": null, + "role": "assistant", + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null + } + ], + "created": 1756921365, + "model": "llama3.2:3b-instruct-fp16", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": "fp_ollama", + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "chatcmpl-923", + "choices": [ + { + "delta": { + "content": "'s", + "function_call": null, + "refusal": null, + "role": "assistant", + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null + } + ], + "created": 1756921365, + "model": "llama3.2:3b-instruct-fp16", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": "fp_ollama", + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "chatcmpl-923", + "choices": [ + { + "delta": { + "content": " a", + "function_call": null, + "refusal": null, + "role": "assistant", + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null + } + ], + "created": 1756921365, + "model": "llama3.2:3b-instruct-fp16", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": "fp_ollama", + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "chatcmpl-923", + "choices": [ + { + "delta": { + "content": " federally", + "function_call": null, + "refusal": null, + "role": "assistant", + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null + } + ], + "created": 1756921365, + "model": "llama3.2:3b-instruct-fp16", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": "fp_ollama", + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "chatcmpl-923", + "choices": [ + { + "delta": { + "content": " owned", + "function_call": null, + "refusal": null, + "role": "assistant", + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null + } + ], + "created": 1756921365, + "model": "llama3.2:3b-instruct-fp16", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": "fp_ollama", + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "chatcmpl-923", + "choices": [ + { + "delta": { + "content": " district", + "function_call": null, + "refusal": null, + "role": "assistant", + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null + } + ], + "created": 1756921365, + "model": "llama3.2:3b-instruct-fp16", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": "fp_ollama", + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "chatcmpl-923", + "choices": [ + { + "delta": { + "content": " that", + "function_call": null, + "refusal": null, + "role": "assistant", + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null + } + ], + "created": 1756921365, + "model": "llama3.2:3b-instruct-fp16", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": "fp_ollama", + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "chatcmpl-923", + "choices": [ + { + "delta": { + "content": " serves", + "function_call": null, + "refusal": null, + "role": "assistant", + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null + } + ], + "created": 1756921365, + "model": "llama3.2:3b-instruct-fp16", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": "fp_ollama", + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "chatcmpl-923", + "choices": [ + { + "delta": { + "content": " as", + "function_call": null, + "refusal": null, + "role": "assistant", + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null + } + ], + "created": 1756921365, + "model": "llama3.2:3b-instruct-fp16", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": "fp_ollama", + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "chatcmpl-923", + "choices": [ + { + "delta": { + "content": " the", + "function_call": null, + "refusal": null, + "role": "assistant", + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null + } + ], + "created": 1756921365, + "model": "llama3.2:3b-instruct-fp16", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": "fp_ollama", + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "chatcmpl-923", + "choices": [ + { + "delta": { + "content": " seat", + "function_call": null, + "refusal": null, + "role": "assistant", + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null + } + ], + "created": 1756921365, + "model": "llama3.2:3b-instruct-fp16", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": "fp_ollama", + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "chatcmpl-923", + "choices": [ + { + "delta": { + "content": " of", + "function_call": null, + "refusal": null, + "role": "assistant", + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null + } + ], + "created": 1756921365, + "model": "llama3.2:3b-instruct-fp16", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": "fp_ollama", + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "chatcmpl-923", + "choices": [ + { + "delta": { + "content": " the", + "function_call": null, + "refusal": null, + "role": "assistant", + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null + } + ], + "created": 1756921365, + "model": "llama3.2:3b-instruct-fp16", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": "fp_ollama", + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "chatcmpl-923", + "choices": [ + { + "delta": { + "content": " federal", + "function_call": null, + "refusal": null, + "role": "assistant", + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null + } + ], + "created": 1756921365, + "model": "llama3.2:3b-instruct-fp16", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": "fp_ollama", + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "chatcmpl-923", + "choices": [ + { + "delta": { + "content": " government", + "function_call": null, + "refusal": null, + "role": "assistant", + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null + } + ], + "created": 1756921365, + "model": "llama3.2:3b-instruct-fp16", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": "fp_ollama", + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "chatcmpl-923", + "choices": [ + { + "delta": { + "content": ",", + "function_call": null, + "refusal": null, + "role": "assistant", + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null + } + ], + "created": 1756921365, + "model": "llama3.2:3b-instruct-fp16", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": "fp_ollama", + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "chatcmpl-923", + "choices": [ + { + "delta": { + "content": " housing", + "function_call": null, + "refusal": null, + "role": "assistant", + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null + } + ], + "created": 1756921365, + "model": "llama3.2:3b-instruct-fp16", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": "fp_ollama", + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "chatcmpl-923", + "choices": [ + { + "delta": { + "content": " many", + "function_call": null, + "refusal": null, + "role": "assistant", + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null + } + ], + "created": 1756921365, + "model": "llama3.2:3b-instruct-fp16", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": "fp_ollama", + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "chatcmpl-923", + "choices": [ + { + "delta": { + "content": " national", + "function_call": null, + "refusal": null, + "role": "assistant", + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null + } + ], + "created": 1756921365, + "model": "llama3.2:3b-instruct-fp16", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": "fp_ollama", + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "chatcmpl-923", + "choices": [ + { + "delta": { + "content": " landmarks", + "function_call": null, + "refusal": null, + "role": "assistant", + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null + } + ], + "created": 1756921365, + "model": "llama3.2:3b-instruct-fp16", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": "fp_ollama", + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "chatcmpl-923", + "choices": [ + { + "delta": { + "content": ",", + "function_call": null, + "refusal": null, + "role": "assistant", + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null + } + ], + "created": 1756921365, + "model": "llama3.2:3b-instruct-fp16", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": "fp_ollama", + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "chatcmpl-923", + "choices": [ + { + "delta": { + "content": " institutions", + "function_call": null, + "refusal": null, + "role": "assistant", + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null + } + ], + "created": 1756921366, + "model": "llama3.2:3b-instruct-fp16", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": "fp_ollama", + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "chatcmpl-923", + "choices": [ + { + "delta": { + "content": ",", + "function_call": null, + "refusal": null, + "role": "assistant", + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null + } + ], + "created": 1756921366, + "model": "llama3.2:3b-instruct-fp16", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": "fp_ollama", + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "chatcmpl-923", + "choices": [ + { + "delta": { + "content": " and", + "function_call": null, + "refusal": null, + "role": "assistant", + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null + } + ], + "created": 1756921366, + "model": "llama3.2:3b-instruct-fp16", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": "fp_ollama", + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "chatcmpl-923", + "choices": [ + { + "delta": { + "content": " offices", + "function_call": null, + "refusal": null, + "role": "assistant", + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null + } + ], + "created": 1756921366, + "model": "llama3.2:3b-instruct-fp16", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": "fp_ollama", + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "chatcmpl-923", + "choices": [ + { + "delta": { + "content": ".", + "function_call": null, + "refusal": null, + "role": "assistant", + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null + } + ], + "created": 1756921366, + "model": "llama3.2:3b-instruct-fp16", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": "fp_ollama", + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "chatcmpl-923", "choices": [ { "delta": { @@ -530,7 +1206,7 @@ "logprobs": null } ], - "created": 1754081854, + "created": 1756921366, "model": "llama3.2:3b-instruct-fp16", "object": "chat.completion.chunk", "service_tier": null, diff --git a/tests/integration/recordings/responses/382c2f22274c.json b/tests/integration/recordings/responses/382c2f22274c.json index 6d05649a5..eb4a24f47 100644 --- a/tests/integration/recordings/responses/382c2f22274c.json +++ b/tests/integration/recordings/responses/382c2f22274c.json @@ -1,7 +1,7 @@ { "request": { "method": "POST", - "url": "http://localhost:11434/v1/v1/chat/completions", + "url": "http://0.0.0.0:11434/v1/v1/chat/completions", "headers": {}, "body": { "model": "llama3.2:3b-instruct-fp16", @@ -22,14 +22,14 @@ "body": { "__type__": "openai.types.chat.chat_completion.ChatCompletion", "__data__": { - "id": "chatcmpl-339", + "id": "chatcmpl-442", "choices": [ { "finish_reason": "length", "index": 0, "logprobs": null, "message": { - "content": "I can guide you through the process, but please note that this is not an official OpenAI API call. OpenAI's API terms and conditions prohibit using their models for malicious purposes.\n\nTo test a model like \"text-temperature\" with a temperature of 0 (i.e., no noise or randomness), we'll need to use a third-party library that connects to the OpenAI API. One such library is `transformers`.\n\nFirst, you need to install the `transformers` and `", + "content": "I can guide you on how to use the `test-temperature` parameter with OpenAI's API, but please note that using a temperature of 0 may not produce meaningful results. Temperature is a hyperparameter that controls the level of randomness in the model's output.\n\nOpenAI's API uses a variant of the GPT-3 model, which is trained on a large corpus of text data. The `test-temperature` parameter allows you to adjust the level of randomness in the model's output", "refusal": null, "role": "assistant", "annotations": null, @@ -39,7 +39,7 @@ } } ], - "created": 1754510065, + "created": 1756921254, "model": "llama3.2:3b-instruct-fp16", "object": "chat.completion", "service_tier": null, diff --git a/tests/integration/recordings/responses/3c0bf9ba81b2.json b/tests/integration/recordings/responses/3c0bf9ba81b2.json index 1b5f16c22..3d2b85e8d 100644 --- a/tests/integration/recordings/responses/3c0bf9ba81b2.json +++ b/tests/integration/recordings/responses/3c0bf9ba81b2.json @@ -20,14 +20,14 @@ "body": { "__type__": "openai.types.chat.chat_completion.ChatCompletion", "__data__": { - "id": "chatcmpl-651", + "id": "chatcmpl-334", "choices": [ { "finish_reason": "length", "index": 0, "logprobs": null, "message": { - "content": "I'm ready to help", + "content": "It looks like we've", "refusal": null, "role": "assistant", "annotations": null, @@ -37,7 +37,7 @@ } } ], - "created": 1755294941, + "created": 1756921086, "model": "llama3.2:3b-instruct-fp16", "object": "chat.completion", "service_tier": null, diff --git a/tests/integration/recordings/responses/3c3f13cb7794.json b/tests/integration/recordings/responses/3c3f13cb7794.json index a1f240a9c..117fbcceb 100644 --- a/tests/integration/recordings/responses/3c3f13cb7794.json +++ b/tests/integration/recordings/responses/3c3f13cb7794.json @@ -21,7 +21,7 @@ "__type__": "ollama._types.GenerateResponse", "__data__": { "model": "llama3.2:3b-instruct-fp16", - "created_at": "2025-08-04T22:55:11.338232Z", + "created_at": "2025-09-03T17:36:18.136699Z", "done": false, "done_reason": null, "total_duration": null, @@ -39,7 +39,7 @@ "__type__": "ollama._types.GenerateResponse", "__data__": { "model": "llama3.2:3b-instruct-fp16", - "created_at": "2025-08-04T22:55:11.39419Z", + "created_at": "2025-09-03T17:36:18.177622Z", "done": false, "done_reason": null, "total_duration": null, @@ -57,7 +57,7 @@ "__type__": "ollama._types.GenerateResponse", "__data__": { "model": "llama3.2:3b-instruct-fp16", - "created_at": "2025-08-04T22:55:11.445346Z", + "created_at": "2025-09-03T17:36:18.218104Z", "done": false, "done_reason": null, "total_duration": null, @@ -75,7 +75,7 @@ "__type__": "ollama._types.GenerateResponse", "__data__": { "model": "llama3.2:3b-instruct-fp16", - "created_at": "2025-08-04T22:55:11.496701Z", + "created_at": "2025-09-03T17:36:18.258837Z", "done": false, "done_reason": null, "total_duration": null, @@ -93,7 +93,7 @@ "__type__": "ollama._types.GenerateResponse", "__data__": { "model": "llama3.2:3b-instruct-fp16", - "created_at": "2025-08-04T22:55:11.546804Z", + "created_at": "2025-09-03T17:36:18.299715Z", "done": false, "done_reason": null, "total_duration": null, @@ -111,7 +111,7 @@ "__type__": "ollama._types.GenerateResponse", "__data__": { "model": "llama3.2:3b-instruct-fp16", - "created_at": "2025-08-04T22:55:11.601009Z", + "created_at": "2025-09-03T17:36:18.341602Z", "done": false, "done_reason": null, "total_duration": null, @@ -129,7 +129,7 @@ "__type__": "ollama._types.GenerateResponse", "__data__": { "model": "llama3.2:3b-instruct-fp16", - "created_at": "2025-08-04T22:55:11.652788Z", + "created_at": "2025-09-03T17:36:18.385504Z", "done": false, "done_reason": null, "total_duration": null, @@ -147,7 +147,7 @@ "__type__": "ollama._types.GenerateResponse", "__data__": { "model": "llama3.2:3b-instruct-fp16", - "created_at": "2025-08-04T22:55:11.703325Z", + "created_at": "2025-09-03T17:36:18.429427Z", "done": false, "done_reason": null, "total_duration": null, @@ -165,7 +165,7 @@ "__type__": "ollama._types.GenerateResponse", "__data__": { "model": "llama3.2:3b-instruct-fp16", - "created_at": "2025-08-04T22:55:11.754033Z", + "created_at": "2025-09-03T17:36:18.473547Z", "done": false, "done_reason": null, "total_duration": null, @@ -183,7 +183,7 @@ "__type__": "ollama._types.GenerateResponse", "__data__": { "model": "llama3.2:3b-instruct-fp16", - "created_at": "2025-08-04T22:55:11.804654Z", + "created_at": "2025-09-03T17:36:18.516327Z", "done": false, "done_reason": null, "total_duration": null, @@ -201,15 +201,15 @@ "__type__": "ollama._types.GenerateResponse", "__data__": { "model": "llama3.2:3b-instruct-fp16", - "created_at": "2025-08-04T22:55:11.854841Z", + "created_at": "2025-09-03T17:36:18.559332Z", "done": true, "done_reason": "stop", - "total_duration": 652371000, - "load_duration": 42086042, + "total_duration": 628034000, + "load_duration": 116384417, "prompt_eval_count": 26, - "prompt_eval_duration": 78000000, + "prompt_eval_duration": 87798792, "eval_count": 11, - "eval_duration": 531000000, + "eval_duration": 423189583, "response": "", "thinking": null, "context": null diff --git a/tests/integration/recordings/responses/3ca695048bee.json b/tests/integration/recordings/responses/3ca695048bee.json index bed6762e7..b307b2f98 100644 --- a/tests/integration/recordings/responses/3ca695048bee.json +++ b/tests/integration/recordings/responses/3ca695048bee.json @@ -1,7 +1,7 @@ { "request": { "method": "POST", - "url": "http://localhost:11434/v1/v1/chat/completions", + "url": "http://0.0.0.0:11434/v1/v1/chat/completions", "headers": {}, "body": { "model": "llama3.2:3b-instruct-fp16", @@ -39,7 +39,7 @@ { "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", "__data__": { - "id": "chatcmpl-490", + "id": "chatcmpl-3", "choices": [ { "delta": { @@ -50,7 +50,7 @@ "tool_calls": [ { "index": 0, - "id": "call_rolv1ozt", + "id": "call_3kigugt3", "function": { "arguments": "{\"city\":\"Tokyo\"}", "name": "get_weather" @@ -64,7 +64,7 @@ "logprobs": null } ], - "created": 1754081852, + "created": 1756921361, "model": "llama3.2:3b-instruct-fp16", "object": "chat.completion.chunk", "service_tier": null, @@ -75,7 +75,7 @@ { "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", "__data__": { - "id": "chatcmpl-490", + "id": "chatcmpl-3", "choices": [ { "delta": { @@ -85,12 +85,12 @@ "role": "assistant", "tool_calls": null }, - "finish_reason": "stop", + "finish_reason": "tool_calls", "index": 0, "logprobs": null } ], - "created": 1754081852, + "created": 1756921361, "model": "llama3.2:3b-instruct-fp16", "object": "chat.completion.chunk", "service_tier": null, diff --git a/tests/integration/recordings/responses/3dff18060ebc.json b/tests/integration/recordings/responses/3dff18060ebc.json index e04bb8be7..c3da2998e 100644 --- a/tests/integration/recordings/responses/3dff18060ebc.json +++ b/tests/integration/recordings/responses/3dff18060ebc.json @@ -20,390 +20,390 @@ "data": [ { "embedding": [ - -0.060643002, - 0.063731536, - -0.059394535, - -0.010293381, - -0.119798504, - 0.033409704, - 0.056838214, - -0.006487789, - 0.029893834, - -0.05035498, - 0.015207984, - -0.0634482, - 0.015118864, - -0.08356639, - 0.009297568, - 0.04425259, - -0.02442732, - -0.050995167, - -0.028106945, - -0.07392448, - 0.070876844, - 0.08103935, - 0.006026678, - -0.043081142, - 0.010737864, - -0.01581646, - 0.035146058, - 0.06534572, - 0.036411658, - -0.056240093, - 0.073675275, - 0.047330413, - 0.06715632, - -0.012079616, - -0.018175518, - 0.0042696777, - 0.029169064, - 0.006755428, - 0.037944797, - 0.002459526, - 0.014023556, - 0.022665394, - -0.09053435, - 0.041958958, - -0.0793576, - 0.032003723, - -0.03836551, - 0.037002493, - -0.0036971096, - -0.017005432, - 0.036977224, - -0.077020966, - -0.020112924, - 0.07730264, - 0.04523538, - -0.007810078, - -0.005882345, - 0.009965143, - 0.033477366, - 0.08996437, - 0.016154636, - 0.03699466, - -0.03920663, - -0.010970169, - 0.023925098, - -0.036968958, - -0.008223206, - 0.018760787, - -0.000688964, - -0.061974872, - -0.030354673, - -0.03764463, - -0.046544887, - 0.03845807, - -0.010353121, - -0.032976467, - 0.013553099, - -0.059050683, - 0.06307999, - 0.015977552, - -0.048430033, - -0.06991109, - -0.022508044, - 0.04406567, - 0.036172677, - 0.060487013, - -0.04315455, - 0.028775847, - 0.006216682, - 0.01028539, - -0.07873024, - -0.091566674, - 0.043936655, - 0.013187522, - -0.0037702306, - 0.010252617, - 0.020211454, - 0.056324948, - -0.09704479, - 0.06579238, - 0.047095913, - 0.018813917, - 0.124447405, - -0.064461194, - -0.012602576, - 0.016044088, - 0.0860477, - 0.02487444, - 0.106261514, - -0.043173406, - -0.04631391, - -0.031489294, - -0.0018045203, - -0.0234808, - -0.050789703, - 0.0046832566, - 0.04323459, - 0.057140227, - -0.065862894, - 0.032980002, - -0.028766194, - 0.03784897, - 0.0002090952, - 0.04331736, - -0.13265643, - 0.026365368, - -0.042440306, - -3.335036e-33, - -0.0022078454, - 0.050638728, - 0.028040074, - -0.0339003, - -0.004550283, - -0.034626767, - -0.086259365, - 0.04313123, - 0.010241412, - 0.04403283, - -0.030186933, - -0.0935834, - -0.06522679, - -0.059730206, - 0.037564293, - -0.025941465, - -0.06653215, - 0.004382199, - 0.018841932, - -0.03557901, - 0.022377534, - 0.0894181, - 0.033572253, - -0.11379638, - 0.038214155, - -0.0444022, - 0.10258949, - -0.07330576, - 0.089417316, - 0.05668133, - -0.009440494, - -0.06464684, - 0.016628003, - 0.0073475256, - 0.00518807, - 0.0051437207, - -0.013597164, - -0.04918519, - -0.06671375, - 0.010821772, - 0.04635121, - -0.11489337, - -0.055055846, - 0.040418062, - -0.0327241, - 0.034979116, - -0.02358068, - -0.012229059, - 0.048057053, - 0.011607797, - 0.00786425, - 0.038057882, - -0.027768329, - 0.0033014645, - -0.0033301115, - 0.006048222, - 0.031986434, - 0.04835162, - 0.013795478, - 0.03616475, - -0.022675272, - 0.09197521, - 0.029851481, - 0.08111755, - -0.086777106, - -0.028026069, - 0.055648096, - -0.030405777, - -0.016515536, - 0.031827636, - -0.07586154, - -0.009904298, - 0.028109884, - 0.0022400685, - -0.104984276, - -0.023682386, - -0.02420211, - -0.00031999213, - 0.0016354885, - -0.037583202, - 0.02554201, - -0.052216183, - 0.021622796, - 0.099114954, - -0.06895898, - -0.018579148, - 0.072459795, - -0.10584089, - -0.08503219, - -0.030006522, - -0.01574946, - -0.056850888, - -0.02701468, - -0.06409775, - 0.0057065156, - 1.2905196e-33, - 0.054916188, - -0.036421828, - -0.0023367621, - -0.03591332, - 0.10682448, - -0.049314465, - 0.037890658, - 0.05061744, - -0.08387186, - -0.018746993, - 0.0036053627, - 0.029014338, - -0.0028278087, - -0.036458995, - 0.11148448, - 0.050991904, - 0.040261153, - 0.092449345, - -0.013685468, - -0.07097927, - -0.043229934, - -0.060135942, - -0.030182164, - 0.009103864, - -0.04419895, - 0.04841717, - 0.1172092, - -0.009820357, - 0.0024167346, - 0.0933731, - -0.059857536, - 0.010170529, - -0.03779587, - -0.043445412, - -0.14679031, - -0.022706114, - -0.008936355, - -0.021539144, - -0.021903422, - -0.06614074, - 0.016270082, - 0.062619805, - 0.010576195, - 0.04721768, - -0.08721729, - 0.009404518, - -0.017676886, - -0.03845903, - 0.01042728, - 0.022961272, - 0.099522196, - -0.021459235, - 0.0017192952, - -0.039389413, - 0.01643467, - 0.03967745, - -0.11970654, - 0.009909872, - 0.0038936618, - 0.018281214, - -0.045416683, - 0.002060889, - 0.024235422, - 0.016998425, - 0.06879841, - -0.027463643, - -0.018185377, - 0.053853985, - -0.02881535, - -0.04521435, - 0.114714146, - 0.01980149, - -0.057876598, - 0.01657406, - -0.073635235, - 0.040253133, - -0.015108487, - 0.0066914097, - -0.049663424, - 0.04593752, - 0.077961996, - -0.042919736, - 0.021851214, - 0.06381258, - 0.08111257, - -0.07067202, - -0.032432877, - 0.09261935, - -0.020485587, - 0.070126526, - -0.020741673, - 0.09339737, - -0.05117133, - 0.039423097, - 0.025603252, - -1.676899e-08, - 0.0015320816, - 0.008086889, - -0.017632706, - -0.0340569, - 0.068081565, - 0.07389828, - -0.07586309, - -0.1137352, - -0.02203125, - 0.00911275, - 0.031093195, - -0.005707322, - -0.046190932, - 0.0037106895, - 0.013285116, - -0.03215832, - -0.05558973, - -0.010595662, - 0.0067340815, - -0.025494263, - -0.08369286, - 0.08884646, - 0.0051370384, - -0.051632546, - -0.051877208, - 0.039703675, - -0.042113848, - 0.05714819, - 0.088881046, - 0.049764536, - 0.04144229, - 0.09467376, - -0.037112173, - -0.06844063, - -0.061656013, - 0.09893085, - -0.059514027, - -0.033182237, - -0.026037138, - 0.07761722, - 0.05612508, - 0.010711438, - 0.018973859, - 0.056075387, - -0.04172223, - -0.02732456, - 0.101854175, - -0.036197703, - -0.029915968, - -0.043326378, - 0.043677974, - 0.018775862, - -0.0042756326, - 0.055917986, - -0.0034246107, - 0.0602753, - -0.13372745, - 0.008189692, - -0.031539913, - 0.022382092, - 0.037938736, - 0.024559673, - 0.068045974, - 0.07020884 + -0.060630284, + 0.06372823, + -0.059383437, + -0.010313639, + -0.11985778, + 0.033409074, + 0.056847293, + -0.0064553, + 0.029896382, + -0.05037607, + 0.015193001, + -0.0634204, + 0.015119892, + -0.08354324, + 0.0092577925, + 0.044272587, + -0.024397198, + -0.05100177, + -0.028086444, + -0.07390362, + 0.07088186, + 0.08101153, + 0.006050408, + -0.043090094, + 0.010714593, + -0.01581376, + 0.0351736, + 0.06538307, + 0.03639655, + -0.05625738, + 0.073681176, + 0.04730274, + 0.067169026, + -0.01207242, + -0.018193275, + 0.0042488067, + 0.029168725, + 0.0067459582, + 0.037927665, + 0.0024767139, + 0.014044963, + 0.022671249, + -0.090508185, + 0.041952047, + -0.07933115, + 0.031992197, + -0.038355146, + 0.037013844, + -0.0036946274, + -0.016986867, + 0.03696087, + -0.07697335, + -0.020080294, + 0.07733012, + 0.04521822, + -0.007816803, + -0.0058926586, + 0.009962128, + 0.033492323, + 0.09000152, + 0.016161384, + 0.036999356, + -0.039193578, + -0.010969346, + 0.023929566, + -0.03698458, + -0.008227196, + 0.018780757, + -0.0006967325, + -0.062018193, + -0.030388007, + -0.037649162, + -0.04654288, + 0.038450293, + -0.010377299, + -0.032971557, + 0.013547814, + -0.059036925, + 0.0630603, + 0.0159564, + -0.04845087, + -0.069917254, + -0.022502322, + 0.04408022, + 0.03618941, + 0.060470726, + -0.04313285, + 0.028797466, + 0.0062393937, + 0.01027349, + -0.078714885, + -0.091531575, + 0.04391341, + 0.013202597, + -0.0037814155, + 0.0102497, + 0.020225797, + 0.05634384, + -0.09700619, + 0.06577961, + 0.047118917, + 0.01876648, + 0.12445029, + -0.06447121, + -0.012632697, + 0.016056264, + 0.08604982, + 0.024878234, + 0.10627678, + -0.043176394, + -0.046339765, + -0.03149599, + -0.001784808, + -0.023469802, + -0.05079461, + 0.0046657966, + 0.043237828, + 0.057146583, + -0.065833576, + 0.032975562, + -0.028763266, + 0.037831448, + 0.00017829033, + 0.043322463, + -0.13265091, + 0.0263673, + -0.04247752, + -3.3340873e-33, + -0.0022191573, + 0.050657377, + 0.028066125, + -0.033898965, + -0.0045730886, + -0.034653578, + -0.08628417, + 0.043108672, + 0.01022734, + 0.044009056, + -0.03020062, + -0.0936044, + -0.06522928, + -0.059762992, + 0.037560984, + -0.025942331, + -0.06655938, + 0.0043691625, + 0.018846871, + -0.035582166, + 0.02240012, + 0.08943218, + 0.033568345, + -0.11379316, + 0.03822112, + -0.044403847, + 0.10261262, + -0.07330182, + 0.089390896, + 0.056668896, + -0.009407597, + -0.0646505, + 0.016652016, + 0.007326742, + 0.005187682, + 0.0051324354, + -0.013595071, + -0.04918112, + -0.06672084, + 0.010838405, + 0.04638185, + -0.11490209, + -0.055054087, + 0.040443793, + -0.032746885, + 0.03498173, + -0.023567867, + -0.012213799, + 0.048050664, + 0.01159698, + 0.007860181, + 0.03801084, + -0.027765153, + 0.003296162, + -0.0033349432, + 0.006083357, + 0.03200884, + 0.048306234, + 0.013800832, + 0.036165927, + -0.022672432, + 0.09197581, + 0.029846204, + 0.08112345, + -0.08677228, + -0.028041098, + 0.0556574, + -0.030357547, + -0.016538681, + 0.031826265, + -0.07586954, + -0.009915978, + 0.028101236, + 0.002207158, + -0.10496646, + -0.023673821, + -0.024204832, + -0.0003132271, + 0.0016462951, + -0.037603874, + 0.025533162, + -0.05221861, + 0.021656586, + 0.099111386, + -0.06896361, + -0.018568028, + 0.07245527, + -0.10582686, + -0.08505038, + -0.029969748, + -0.015717981, + -0.056855034, + -0.02698479, + -0.06410572, + 0.0057078917, + 1.2902391e-33, + 0.05490771, + -0.036417797, + -0.0023541928, + -0.03591478, + 0.106852315, + -0.04931468, + 0.037884213, + 0.050633065, + -0.083874516, + -0.018756155, + 0.0036251817, + 0.028974183, + -0.0027879397, + -0.036439158, + 0.11148004, + 0.051007163, + 0.040258586, + 0.09245398, + -0.01367112, + -0.070999645, + -0.043213032, + -0.060117763, + -0.03019449, + 0.009107182, + -0.044254936, + 0.04843456, + 0.117205575, + -0.009833911, + 0.0023962231, + 0.09339494, + -0.059902366, + 0.0101377955, + -0.03777244, + -0.04344207, + -0.14677393, + -0.022666233, + -0.008934328, + -0.02157697, + -0.021902358, + -0.06611372, + 0.016243221, + 0.062620856, + 0.01056146, + 0.04721975, + -0.087221384, + 0.009420561, + -0.017691165, + -0.03847053, + 0.010398396, + 0.022942957, + 0.099518456, + -0.021421565, + 0.0016765085, + -0.039359514, + 0.01641369, + 0.039669517, + -0.119695365, + 0.009885617, + 0.003855461, + 0.018273395, + -0.0454586, + 0.0020496584, + 0.024263415, + 0.016978405, + 0.06884217, + -0.027432522, + -0.01813802, + 0.053840507, + -0.028815664, + -0.045221787, + 0.11472852, + 0.019796453, + -0.05785514, + 0.016556906, + -0.07362942, + 0.04025756, + -0.01510899, + 0.0067040483, + -0.049666926, + 0.045941774, + 0.077951804, + -0.042951427, + 0.021852365, + 0.063826546, + 0.08110754, + -0.070652775, + -0.03245094, + 0.09259784, + -0.020451743, + 0.0701599, + -0.020740295, + 0.09339449, + -0.051164806, + 0.039440546, + 0.02560772, + -1.6767814e-08, + 0.001529873, + 0.0080792755, + -0.017666567, + -0.034070052, + 0.06805411, + 0.07387949, + -0.07592055, + -0.11369049, + -0.022008128, + 0.009088418, + 0.03108134, + -0.0056734695, + -0.0462051, + 0.0037219985, + 0.013269294, + -0.03213892, + -0.05557376, + -0.010602884, + 0.006751397, + -0.025462827, + -0.0836812, + 0.08886153, + 0.005159859, + -0.051621262, + -0.051873572, + 0.039706588, + -0.042155124, + 0.057125967, + 0.088910565, + 0.049736783, + 0.04144574, + 0.094677895, + -0.037107926, + -0.06845684, + -0.061673928, + 0.09891817, + -0.05952751, + -0.0331722, + -0.026014913, + 0.077612035, + 0.056150436, + 0.010709955, + 0.018974187, + 0.056079865, + -0.041700333, + -0.02731697, + 0.10184176, + -0.036189064, + -0.029914921, + -0.043333948, + 0.043660097, + 0.018800316, + -0.0042763646, + 0.055898346, + -0.0034344571, + 0.060258396, + -0.1337251, + 0.008184424, + -0.031549457, + 0.022398692, + 0.037932154, + 0.024529235, + 0.068037644, + 0.07021777 ], "index": 0, "object": "embedding" diff --git a/tests/integration/recordings/responses/417020320684.json b/tests/integration/recordings/responses/417020320684.json index 56ddea6aa..73f1e4238 100644 --- a/tests/integration/recordings/responses/417020320684.json +++ b/tests/integration/recordings/responses/417020320684.json @@ -20,390 +20,390 @@ "data": [ { "embedding": [ - -0.06384743, - 0.013436034, - -0.054533605, - 0.011913119, - -0.074255615, - -0.13346045, - 0.04293264, - 0.045415178, - -0.069499195, - -0.03594047, - 0.012013141, - 0.0068701585, - 0.088894635, - 0.0025958198, - 0.03248322, - -0.00781389, - -0.05045716, - 0.0066499636, - 0.02780642, - -0.1278895, - 0.00061722804, - 0.04524771, - -0.036062278, - 0.044238217, - 0.012931149, - -0.009267752, - 0.011908537, - 0.026050908, - 0.020050693, - -0.033657826, - -0.028060015, - 0.08754526, - 0.059001748, - 0.053905424, - 0.020296838, - 0.06843132, - -0.031828973, - -0.08757766, - -0.11278083, - 0.022646705, - -0.09042749, - -0.0033280335, - -0.04013833, - -0.03408772, - -0.032974605, - 0.029246835, - -0.03902113, - 0.045517426, - -0.0331051, - -0.006541718, - -0.09631428, - -0.011705091, - -0.052590065, - -0.064790964, - 0.03107029, - -0.012614695, - 0.0973954, - 0.0052277497, - -0.035061166, - -0.14041117, - -0.06678556, - 0.03656035, - -0.039271023, - 0.070130296, - -0.001007227, - -0.026842492, - -0.017554138, - 0.030476976, - 0.0640168, - -0.03162716, - -0.1459817, - -0.04540497, - -0.018482737, - 0.06690258, - 0.030561155, - -0.12253459, - 0.06106281, - -0.05676725, - -0.005102081, - -0.008781471, - 0.0065009934, - -0.016409436, - -0.033660814, - 0.084904715, - -0.000299427, - -0.073421866, - 0.038623117, - 0.15695204, - 0.010100481, - 0.025317656, - -0.0021393092, - -0.046127863, - 0.062426485, - -0.019896954, - -0.054696236, - 0.097949564, - 0.038487267, - -0.072427474, - -0.038710196, - 0.07158003, - 0.0073204385, - -0.051196836, - 0.031370413, - -0.032227658, - 0.03930787, - -0.009667071, - 0.06993779, - -0.052014988, - 0.049430363, - -0.04273174, - -0.003752437, - -0.041564792, - -0.056199003, - -0.033390746, - 0.05104195, - 0.038621522, - -0.002969481, - 0.08187672, - -0.0035807535, - 0.045314044, - 0.0068791825, - 0.016496154, - 0.016330697, - 0.007280202, - -0.021685049, - -0.004648767, - -0.007916633, - -4.153803e-33, - -0.045814347, - -0.050876923, - -0.038647644, - 0.010091659, - 0.0700144, - -0.025181346, - 0.10506424, - -0.0049788426, - -0.0641887, - -0.047635607, - 0.012736192, - 0.051960304, - -0.0160108, - 0.08172301, - 0.023975011, - -0.02088898, - 0.04570414, - 0.09154945, - 0.025109906, - 0.019044904, - 0.048153024, - 0.097932264, - 0.034160685, - 0.035437047, - 0.0114016645, - -0.043437798, - -0.0041986653, - -0.055648174, - 0.011477498, - 0.0071031414, - -0.06427046, - -0.02060021, - -0.004527582, - -0.012953201, - 0.026594209, - -0.012370914, - 0.008425176, - -0.06823755, - 0.046840925, - -0.041645527, - -0.025629306, - -0.0038959885, - 0.050076205, - -0.008090696, - -0.023280276, - 0.023890443, - 0.0015592615, - 0.04615769, - -0.06899702, - 0.041591667, - 0.0045278594, - -0.047615696, - 0.054234404, - 0.06972373, - -0.016879166, - 0.04805917, - 0.012710964, - 0.0022028312, - -0.00632154, - -0.03153454, - 0.02372792, - 0.06859583, - 0.07721348, - -0.012276763, - 0.039006572, - 0.03434665, - 0.030310014, - 0.058712285, - 0.08029841, - 0.06976497, - -0.09046315, - 0.02376487, - -0.008737595, - 0.038339745, - -0.027534455, - 0.02316122, - 0.027078442, - -0.081344925, - -0.010344974, - 0.04727033, - -0.020315375, - -0.025998361, - -0.017408848, - -0.0035885328, - -0.018698875, - -0.0374002, - 0.041077297, - 0.05317115, - -0.00557377, - -0.058558866, - -0.07202089, - -0.0750218, - 0.04825297, - 0.011333554, - -0.022591913, - 1.3509705e-33, - 0.006217277, - 0.03161211, - -0.036121942, - -0.0016698099, - -0.08257381, - -0.060688194, - 0.059951965, - 0.014476651, - 0.05951137, - 0.027058002, - -0.0116078025, - -0.05761336, - 0.103633516, - -0.0028178988, - 0.07695233, - 0.019430202, - -0.052228313, - 0.015157555, - -0.001314194, - 0.027793957, - -0.11528974, - 0.047293015, - -0.075984485, - -0.07435121, - -0.029174728, - -0.020066952, - -0.03471861, - -0.057671476, - -0.030140208, - 0.047475602, - 0.0122009255, - 0.011492795, - -0.051974766, - 0.059714273, - 0.03282909, - 0.0013831124, - 0.0577218, - -0.04120374, - -0.021517176, - -0.0067665633, - 0.14197157, - 0.057943344, - 0.010075872, - 0.096026145, - 0.014512136, - 0.021362338, - -0.07552857, - 0.07883896, - -0.042723794, - -0.06604244, - -0.03871113, - -0.008144072, - 0.014999539, - -0.049409784, - -0.037078433, - -0.023772687, - 0.03742616, - 0.008203275, - -0.08696922, - -0.05963844, - -0.07733288, - -0.056535304, - 0.029040048, - 0.007370859, - -0.07786975, - 0.0025485628, - -0.10403352, - -0.04738507, - -0.015877869, - -0.11589796, - 0.09726567, - 0.0049555353, - -0.010271941, - 0.0066397907, - -0.060328998, - 0.025491165, - -0.052938554, - -0.0038485127, - -0.050254337, - 0.07681007, - 0.046079025, - 0.0074015437, - 0.0047005047, - 0.07386609, - -0.077935226, - 0.001350664, - 0.01371514, - 0.056624677, - 0.021921877, - 0.0072018835, - 0.0076770596, - 0.1022247, - 0.06007294, - 0.036791492, - -0.03775615, - -1.1873974e-08, - -0.008835198, - 0.017599683, - 0.0622159, - 0.03203167, - -0.011572803, - 0.051924217, - -0.011727461, - -0.06392444, - -0.029854134, - 0.03257704, - 0.005516639, - -0.012049206, - -0.054406274, - -0.056717165, - -0.030638915, - 0.14277336, - 0.028553458, - -0.028731374, - 0.019938445, - 0.025647435, - 0.07379124, - -0.006680472, - 0.0061455644, - 0.09610866, - -0.0880125, - -0.00892061, - 0.038242683, - 0.04831363, - 0.018802335, - -0.10537713, - 0.048258167, - -0.022250284, - 0.020506755, - 0.014618206, - 0.03079222, - -0.029113656, - 0.008291428, - -0.045047753, - 0.002552782, - 0.02174108, - -0.0081180185, - 0.009036818, - -0.013369313, - -0.014042713, - 0.06843612, - 0.045168996, - -0.034600396, - -0.07275618, - -0.0041681295, - -0.05823282, - -0.03303698, - 0.0040505864, - -0.020017866, - -0.020105122, - 0.05537091, - 0.102509096, - -0.10799596, - -0.013787153, - -0.009659191, - 0.015613784, - -0.031229256, - 0.13294649, - 0.15243623, - -0.022428894 + -0.063880146, + 0.013411989, + -0.054502595, + 0.01193493, + -0.074262686, + -0.13344447, + 0.04294062, + 0.045387108, + -0.06949706, + -0.035939943, + 0.01200873, + 0.0068830596, + 0.08886977, + 0.0026030506, + 0.032482542, + -0.007821568, + -0.05044649, + 0.006662123, + 0.027794942, + -0.12791364, + 0.00062353734, + 0.045270294, + -0.03605076, + 0.044243146, + 0.0129354475, + -0.0092799105, + 0.011904844, + 0.026060482, + 0.020055141, + -0.03368774, + -0.028043076, + 0.087557025, + 0.059002083, + 0.053893365, + 0.02027196, + 0.06840361, + -0.03180594, + -0.087597735, + -0.11277839, + 0.022651086, + -0.09037903, + -0.0033202847, + -0.040132593, + -0.034084503, + -0.032953303, + 0.02925268, + -0.03903928, + 0.04551951, + -0.0331016, + -0.006518362, + -0.09629851, + -0.011739161, + -0.052575007, + -0.064773224, + 0.031043475, + -0.012586444, + 0.09737276, + 0.005224713, + -0.035071153, + -0.1404299, + -0.06678175, + 0.03654573, + -0.039277818, + 0.07014256, + -0.0010227569, + -0.026846789, + -0.0175696, + 0.03044068, + 0.06403526, + -0.031643596, + -0.14598879, + -0.045400888, + -0.018469285, + 0.06689445, + 0.030553635, + -0.12255281, + 0.061046645, + -0.05678168, + -0.005118667, + -0.0087622, + 0.006514719, + -0.016424034, + -0.033650044, + 0.08491301, + -0.00029260007, + -0.07339515, + 0.038627055, + 0.15695965, + 0.010035773, + 0.025318887, + -0.0021428047, + -0.04613549, + 0.06244243, + -0.019905778, + -0.05471386, + 0.09796629, + 0.0384793, + -0.072424814, + -0.038704097, + 0.07158691, + 0.007360897, + -0.05120446, + 0.0313513, + -0.032230332, + 0.039326303, + -0.009643992, + 0.069905065, + -0.052026685, + 0.049440835, + -0.04272916, + -0.0037707465, + -0.04155246, + -0.0561972, + -0.03340213, + 0.05105359, + 0.038616214, + -0.0029470131, + 0.08188407, + -0.0035886324, + 0.04530431, + 0.0068888925, + 0.016499842, + 0.016347302, + 0.007283021, + -0.021663606, + -0.0046215886, + -0.007931065, + -4.1536508e-33, + -0.045777988, + -0.050903402, + -0.038634304, + 0.0100991195, + 0.070007294, + -0.025182785, + 0.1050647, + -0.0049731904, + -0.064141616, + -0.047639705, + 0.012718577, + 0.05198462, + -0.016051587, + 0.08170543, + 0.024008816, + -0.020879291, + 0.045706064, + 0.091577366, + 0.02512945, + 0.019055998, + 0.048144504, + 0.097951256, + 0.034154113, + 0.03543114, + 0.011410896, + -0.043446988, + -0.0041784984, + -0.05564714, + 0.01147717, + 0.0071039577, + -0.06426582, + -0.020623188, + -0.0045247558, + -0.012943628, + 0.02658834, + -0.012385487, + 0.008399212, + -0.06824828, + 0.04683057, + -0.04165085, + -0.025662417, + -0.0038799767, + 0.05007075, + -0.008117481, + -0.023308154, + 0.023914568, + 0.0015741173, + 0.046142872, + -0.06898886, + 0.041611847, + 0.0045286645, + -0.047628563, + 0.054236773, + 0.06972688, + -0.016889753, + 0.04806098, + 0.012714234, + 0.0022186628, + -0.006355918, + -0.031550523, + 0.023726372, + 0.06859327, + 0.077228814, + -0.01227583, + 0.03901903, + 0.034360897, + 0.03032876, + 0.058690928, + 0.08030179, + 0.06976231, + -0.09047136, + 0.02376998, + -0.008751518, + 0.038334776, + -0.02751323, + 0.023137644, + 0.027101006, + -0.08135271, + -0.010334998, + 0.04730408, + -0.02033998, + -0.026008504, + -0.017415512, + -0.0035714875, + -0.018727385, + -0.037389226, + 0.041064497, + 0.05317889, + -0.0055602547, + -0.058561854, + -0.072036326, + -0.075019896, + 0.04825644, + 0.011348427, + -0.02259257, + 1.3515749e-33, + 0.006240622, + 0.031606406, + -0.036119435, + -0.0016494404, + -0.08255665, + -0.06069396, + 0.059934463, + 0.014492232, + 0.059514895, + 0.027053975, + -0.011601325, + -0.057609312, + 0.10365583, + -0.002784741, + 0.07693759, + 0.019432511, + -0.052210074, + 0.015158053, + -0.0012768542, + 0.027789148, + -0.115292676, + 0.047323048, + -0.07599195, + -0.074344486, + -0.029194841, + -0.020079462, + -0.034749795, + -0.05769437, + -0.0301632, + 0.04749987, + 0.012206333, + 0.011497502, + -0.051970575, + 0.05972769, + 0.03281016, + 0.0013676677, + 0.057720944, + -0.041179247, + -0.02150875, + -0.0067487382, + 0.1419711, + 0.05795878, + 0.010094941, + 0.09603845, + 0.014521089, + 0.02133803, + -0.07551916, + 0.07887724, + -0.04273237, + -0.06601746, + -0.038729392, + -0.008161129, + 0.015012324, + -0.049418066, + -0.037083283, + -0.02378242, + 0.03743137, + 0.008194503, + -0.086978436, + -0.05960285, + -0.07732487, + -0.056507926, + 0.029065313, + 0.0073954053, + -0.077878684, + 0.0026059505, + -0.10405392, + -0.04738624, + -0.015872862, + -0.11591199, + 0.09724705, + 0.0049243565, + -0.010273523, + 0.0066429917, + -0.060295314, + 0.02550513, + -0.052950058, + -0.0038489713, + -0.050250847, + 0.07679287, + 0.046089787, + 0.007386997, + 0.0046740095, + 0.07385862, + -0.07792065, + 0.0013675193, + 0.013730894, + 0.05658653, + 0.021934126, + 0.007195913, + 0.0076705213, + 0.10221154, + 0.060060997, + 0.036779005, + -0.037765697, + -1.187368e-08, + -0.00885571, + 0.01760442, + 0.062224448, + 0.032051455, + -0.011581793, + 0.051908698, + -0.011685676, + -0.06391574, + -0.029866237, + 0.03258576, + 0.0055078953, + -0.012040446, + -0.054406017, + -0.056690563, + -0.030638037, + 0.14276367, + 0.028526368, + -0.028743364, + 0.019917691, + 0.025652615, + 0.073813364, + -0.0066998666, + 0.0061508445, + 0.09610696, + -0.08799916, + -0.0089272335, + 0.03823298, + 0.04832936, + 0.018829934, + -0.10534708, + 0.048226915, + -0.02225069, + 0.020491786, + 0.014641141, + 0.030794447, + -0.029119467, + 0.008283775, + -0.04506887, + 0.0025344177, + 0.021756247, + -0.008108281, + 0.00904927, + -0.013340866, + -0.014037631, + 0.06845187, + 0.045173325, + -0.034587316, + -0.07275669, + -0.004159724, + -0.058231864, + -0.033032075, + 0.0040235794, + -0.019985583, + -0.020122562, + 0.055365406, + 0.10250875, + -0.10799118, + -0.013780294, + -0.009652406, + 0.015592658, + -0.031221472, + 0.1329332, + 0.15243866, + -0.022426173 ], "index": 0, "object": "embedding" diff --git a/tests/integration/recordings/responses/4420515208a8.json b/tests/integration/recordings/responses/4420515208a8.json index 4d43b3fb8..779593849 100644 --- a/tests/integration/recordings/responses/4420515208a8.json +++ b/tests/integration/recordings/responses/4420515208a8.json @@ -20,390 +20,390 @@ "data": [ { "embedding": [ - -0.07471535, - 0.08136051, - -0.0646403, - 0.011820692, - -0.074530184, - 0.02182932, - 0.077565186, - 0.012791591, - 0.05854512, - -0.014144753, - 0.054007743, - -0.026551379, - -0.018058892, - -0.060439672, - -0.019246193, - -0.0065063615, - -0.047261372, - -0.048988443, - -0.0904866, - -0.066554815, - 0.09284568, - 0.021294983, - -0.013393054, - -0.0066470345, - 0.008009612, - 0.016829057, - 0.039714802, - 0.021865955, - 0.014889775, - -0.039430078, - 0.025233349, - -0.036833033, - 0.016638417, - 0.008795953, - -0.05348616, - 0.0361554, - -0.034618407, - -0.009877053, - 0.064839765, - -0.015148702, - 0.020900138, - -0.07136567, - -0.008516019, - 0.051174764, - -0.06211658, - 0.059481908, - -0.047928233, - 0.07046077, - -0.024866259, - -0.010772497, - 0.06539378, - -0.03691645, - -0.08241172, - 0.081707805, - 0.017110538, - 0.0129555175, - -0.047113538, - 0.0025686903, - 0.008714549, - 0.09987858, - 0.0496949, - -0.025898866, - -0.017353507, - 0.03393223, - 0.038376898, - -0.054239143, - 0.00860024, - -0.040809266, - 0.02656175, - -0.071856335, - -0.019946808, - -0.041174017, - -0.07246157, - 0.00040759498, - 0.018743936, - 0.023058625, - 0.0166551, - -0.063356385, - 0.034956083, - 0.05005474, - 0.00041865162, - -0.06177827, - 0.006278017, - 0.11141626, - 0.0040813377, - 0.08571246, - 0.023260446, - 0.057005797, - -0.03149278, - -0.013331491, - -0.04513824, - -0.11731193, - 0.0160608, - -0.016902346, - -0.028950376, - 0.03577902, - -0.051558092, - 0.03297068, - -0.11266136, - 0.06640369, - 0.037849367, - 0.022930682, - 0.05809001, - -0.03963197, - -0.03245654, - 0.01767903, - -0.005010206, - 0.019044327, - 0.07743703, - -0.020407042, - -0.020311069, - -0.00953332, - 0.003143125, - -0.00456264, - -0.02911311, - 0.03384037, - 0.00048523775, - 0.06419016, - 0.01071009, - 0.124172516, - -0.0053817774, - 0.004929672, - -0.059669737, - 0.029508028, - -0.13410243, - 0.016187606, - -0.048119176, - -6.608228e-33, - 0.012317927, - 0.060396116, - 0.036468223, - -0.035990786, - -0.041977834, - 0.01232469, - -0.08480998, - 0.012524896, - 0.027948672, - 0.086107045, - -0.030785998, - -0.06136775, - -0.0009515558, - -0.025208496, - 0.045449734, - -0.027582139, - -0.0095786555, - 0.0067018326, - 0.043680843, - -0.021498295, - 0.003277214, - 0.11862199, - 0.047027264, - -0.13488089, - 0.025457613, - -0.010294456, - 0.0022531834, - -0.061856117, - 0.10388324, - 0.01866347, - -0.0017658875, - -0.051914714, - 0.04644036, - 0.037606996, - 0.03376949, - 0.006641087, - 0.022004316, - -0.07835444, - -0.008207682, - 0.027414316, - 0.0173955, - -0.075223684, - 0.006482484, - 0.02727821, - 0.00059299107, - -0.010945533, - -0.020044776, - -0.000120837554, - 0.013701114, - 0.004716937, - 0.02277811, - 0.015490094, - -0.0142633, - -0.013935009, - 0.015847908, - -0.02308094, - 0.033789054, - -0.039197993, - -0.043216396, - 0.029982513, - -0.016503252, - 0.0698185, - 0.046076864, - 0.053330805, - -0.055297256, - 0.025112566, - 0.014026739, - -0.09400958, - 0.035901215, - 0.029467817, - -0.1319919, - -0.0050726864, - -0.037837584, - -0.0318086, - -0.09549526, - -0.027866103, - 0.002436243, - -0.007881375, - 0.058288272, - -0.031986125, - -0.0607737, - -0.023380116, - -0.00047972053, - 0.13766052, - -0.060590804, - -0.008125084, - -0.03488867, - -0.102469996, - -0.009079019, - -0.018955158, - -0.0016528872, - -0.07709843, - -0.043352164, - -0.03619871, - 0.039568264, - 3.0214064e-33, - 0.0050480226, - 0.00017108663, - -0.063063554, - 0.012236582, - 0.10636841, - 0.015972469, - 0.0066562137, - 0.018790383, - -0.047090903, - 0.04585031, - 0.007611995, - 0.032441676, - 0.03210589, - -0.02090312, - 0.106981054, - 0.0075532557, - 0.036063127, - 0.14623925, - 0.037788242, - -0.043172225, - -0.02176524, - -0.009350843, - -0.06982138, - 0.015577218, - 0.02114412, - 0.030659605, - 0.084352896, - -0.09288308, - 0.00815284, - 0.07806744, - -0.0816394, - 0.011901701, - 0.017101644, - 0.0040163086, - -0.14144793, - 0.0040214215, - 0.04631442, - 0.008958798, - -0.0056624487, - -0.055584785, - 0.028006915, - 0.055925272, - 0.062281866, - 0.0860523, - -0.12157215, - 0.021931145, - -0.0050777225, - 0.029814675, - -0.012117963, - 0.048798613, - 0.06408485, - -0.041422654, - 0.018091682, - -0.028209666, - -0.021357967, - 0.055625696, - -0.15479031, - 0.027474454, - 0.018845506, - 0.04327976, - 0.011504344, - 0.017370872, - -0.023188887, - 0.050985955, - 0.029468553, - 0.012529372, - -0.045431048, - -0.00222149, - -0.05612193, - -0.07891998, - 0.0796125, - -0.02043551, - -0.076230876, - 0.011581566, - -0.035624538, - -0.0480372, - -0.066065714, - -0.057384264, - -0.040163297, - 0.071754575, - 0.031339016, - 0.023032097, - -0.023996511, - 0.023609873, - 0.09607155, - -0.06843605, - 0.014263025, - 0.088031664, - -0.037747264, - 0.029464351, - -0.028663024, - 0.10216597, - -0.06609628, - 0.0228385, - 0.04214049, - -1.4813483e-08, - 0.030838875, - 0.043892786, - -0.024579313, - -0.09817689, - 0.0566737, - 0.09298153, - -0.010350536, - -0.09840461, - 0.018022444, - -0.0131554445, - 0.026413994, - 0.00880124, - -0.052855253, - -0.04217533, - 0.030118503, - 0.017092122, - -0.06243192, - -0.018758481, - -0.015982535, - -0.018381983, - -0.026471734, - 0.010303105, - -0.03048123, - -0.08456848, - -0.054054197, - 0.0100427205, - 0.029534454, - 0.1355571, - 0.033424437, - 0.12097715, - 0.04077808, - 0.0081999, - -0.018245617, - -0.056846414, - -0.12899645, - 0.12415884, - -0.053460255, - -0.038143307, - 0.030224878, - 0.019799955, - 0.047839224, - 0.029400205, - 0.0015434423, - 0.06115486, - -0.055583358, - -0.030215869, - 0.10799345, - -0.07073566, - -0.08214588, - 0.0045075943, - -0.0155852465, - -0.013693905, - -0.00234985, - 0.026380839, - -0.015793327, - 0.016262477, - -0.040624544, - -0.013973127, - -0.08311349, - 0.03198475, - 0.05000169, - -0.0038599824, - 0.07030323, - 0.0049196184 + -0.07473014, + 0.08137506, + -0.06463602, + 0.011821943, + -0.07454815, + 0.021821007, + 0.077573344, + 0.012804661, + 0.05853777, + -0.014141324, + 0.053993534, + -0.026554074, + -0.018055506, + -0.060447972, + -0.019253474, + -0.006501444, + -0.047272332, + -0.048944764, + -0.090516366, + -0.06656194, + 0.09287066, + 0.02129739, + -0.013401809, + -0.006629013, + 0.0079892, + 0.016818035, + 0.03971694, + 0.021875564, + 0.014873574, + -0.039426163, + 0.025255844, + -0.036836684, + 0.016627828, + 0.008789532, + -0.053503897, + 0.03616121, + -0.034633957, + -0.009877797, + 0.064843215, + -0.01517806, + 0.020897496, + -0.07135096, + -0.008519908, + 0.05118655, + -0.062102985, + 0.059486073, + -0.047937352, + 0.07045817, + -0.024867272, + -0.010756205, + 0.06538509, + -0.03693754, + -0.08240387, + 0.08169191, + 0.017090658, + 0.012944557, + -0.047139525, + 0.0025796075, + 0.008701712, + 0.099866174, + 0.04969699, + -0.025922626, + -0.017354922, + 0.03395182, + 0.038391408, + -0.054247838, + 0.008610521, + -0.04077977, + 0.0265637, + -0.07186012, + -0.019953186, + -0.041191205, + -0.07246228, + 0.00041248833, + 0.018758524, + 0.023036895, + 0.01662864, + -0.06335885, + 0.03495032, + 0.050063577, + 0.00043262896, + -0.06176693, + 0.0062733325, + 0.11142063, + 0.0040838965, + 0.085737824, + 0.023284689, + 0.05699812, + -0.03149832, + -0.013344509, + -0.045138564, + -0.117300816, + 0.016063986, + -0.016894838, + -0.028934335, + 0.03575864, + -0.05156192, + 0.032958068, + -0.11266628, + 0.06640015, + 0.037839692, + 0.022948038, + 0.058071073, + -0.039643735, + -0.03247236, + 0.017690921, + -0.005001274, + 0.019046135, + 0.07745316, + -0.020402163, + -0.020310633, + -0.009519755, + 0.0031459313, + -0.0045639877, + -0.029116316, + 0.033835515, + 0.00050839526, + 0.06419946, + 0.010721198, + 0.124151744, + -0.0053820186, + 0.00491648, + -0.059696514, + 0.029483523, + -0.13409872, + 0.016187217, + -0.048092023, + -6.6084764e-33, + 0.012305612, + 0.060384244, + 0.036461998, + -0.035974216, + -0.04197416, + 0.012333701, + -0.084805995, + 0.012502633, + 0.02794982, + 0.0861082, + -0.030791838, + -0.061355945, + -0.0009604986, + -0.0252044, + 0.045444816, + -0.027590565, + -0.009594973, + 0.006712001, + 0.043692384, + -0.021483036, + 0.003300438, + 0.11860881, + 0.047044385, + -0.1348901, + 0.025469579, + -0.01029819, + 0.0022393467, + -0.061863262, + 0.10386513, + 0.018658707, + -0.0017492755, + -0.051914047, + 0.046442248, + 0.03761067, + 0.033752125, + 0.006650237, + 0.022015076, + -0.07834835, + -0.008209136, + 0.027432231, + 0.017393896, + -0.07524756, + 0.006497012, + 0.027272953, + 0.0005804994, + -0.010941825, + -0.020050043, + -0.00012092298, + 0.013705002, + 0.004699541, + 0.022770848, + 0.015477994, + -0.0142482165, + -0.013953546, + 0.015865315, + -0.023075614, + 0.03379947, + -0.039221376, + -0.043229815, + 0.02998769, + -0.01652291, + 0.06981088, + 0.04606923, + 0.05332633, + -0.055300076, + 0.02511626, + 0.014049543, + -0.09398743, + 0.03590562, + 0.029452223, + -0.13200304, + -0.005059034, + -0.03784268, + -0.03180819, + -0.095502876, + -0.027853556, + 0.0024331037, + -0.007881495, + 0.058296, + -0.031999517, + -0.06077097, + -0.023381822, + -0.00048603877, + 0.13765746, + -0.060579, + -0.008109843, + -0.034873307, + -0.1024547, + -0.009072849, + -0.018931676, + -0.0016711762, + -0.07710289, + -0.043332253, + -0.03619527, + 0.03958017, + 3.0217083e-33, + 0.0050329794, + 0.00016030145, + -0.063078895, + 0.012225751, + 0.10637338, + 0.015972024, + 0.006653195, + 0.01880781, + -0.04708357, + 0.045863643, + 0.0076015075, + 0.03243478, + 0.032097474, + -0.020893326, + 0.10697852, + 0.0075498912, + 0.036074348, + 0.1462344, + 0.03779065, + -0.043190572, + -0.02176097, + -0.009340132, + -0.06983617, + 0.015578788, + 0.021121953, + 0.030661412, + 0.08434581, + -0.09288574, + 0.008169474, + 0.078080945, + -0.081626564, + 0.011895231, + 0.017099649, + 0.0040119104, + -0.14145434, + 0.0040375097, + 0.046316408, + 0.008959473, + -0.0056506568, + -0.055587813, + 0.028007837, + 0.055937108, + 0.062269785, + 0.08602392, + -0.12157818, + 0.021943888, + -0.0050934856, + 0.029819332, + -0.012127162, + 0.048801802, + 0.06409215, + -0.041438665, + 0.01809265, + -0.028214281, + -0.0213588, + 0.05564267, + -0.1547868, + 0.027465124, + 0.018855799, + 0.04327939, + 0.011500479, + 0.017364705, + -0.023216385, + 0.051007293, + 0.02946264, + 0.012533944, + -0.04542834, + -0.002238765, + -0.05611544, + -0.0789272, + 0.07960444, + -0.020431034, + -0.0762138, + 0.011588508, + -0.035614885, + -0.04803985, + -0.06607436, + -0.057365946, + -0.040188126, + 0.07176218, + 0.03135825, + 0.02303279, + -0.023997622, + 0.023614945, + 0.09607302, + -0.06843066, + 0.014260722, + 0.08802569, + -0.037736766, + 0.029445928, + -0.028643936, + 0.10217973, + -0.0660917, + 0.022864237, + 0.042151757, + -1.4814046e-08, + 0.030838449, + 0.043877687, + -0.0245681, + -0.09818859, + 0.056659035, + 0.0929652, + -0.010337853, + -0.0983916, + 0.018008571, + -0.0131424805, + 0.026400762, + 0.008793538, + -0.05285605, + -0.042175982, + 0.030133193, + 0.01710666, + -0.06242493, + -0.018753909, + -0.015986755, + -0.018400662, + -0.026477808, + 0.010281372, + -0.030476814, + -0.084556945, + -0.05402664, + 0.010030052, + 0.029531356, + 0.13555466, + 0.033426728, + 0.12098221, + 0.040777553, + 0.008206964, + -0.018235989, + -0.0568263, + -0.1289943, + 0.12416113, + -0.053454727, + -0.038151894, + 0.030221034, + 0.019807614, + 0.047819767, + 0.029434063, + 0.0015704447, + 0.0611775, + -0.05557245, + -0.030236417, + 0.10799873, + -0.07073352, + -0.08215229, + 0.004518122, + -0.015573616, + -0.013696145, + -0.0023438279, + 0.026377691, + -0.015769389, + 0.016251203, + -0.04062322, + -0.013962793, + -0.08309221, + 0.031991288, + 0.049991824, + -0.0038595141, + 0.07031122, + 0.0049263495 ], "index": 0, "object": "embedding" diff --git a/tests/integration/recordings/responses/44a1d9de0602.json b/tests/integration/recordings/responses/44a1d9de0602.json index 2d158a06c..d714d1334 100644 --- a/tests/integration/recordings/responses/44a1d9de0602.json +++ b/tests/integration/recordings/responses/44a1d9de0602.json @@ -20,7 +20,7 @@ "body": { "__type__": "openai.types.chat.chat_completion.ChatCompletion", "__data__": { - "id": "chatcmpl-987", + "id": "chatcmpl-507", "choices": [ { "finish_reason": "length", @@ -37,7 +37,7 @@ } } ], - "created": 1755294921, + "created": 1756921150, "model": "llama3.2:3b-instruct-fp16", "object": "chat.completion", "service_tier": null, diff --git a/tests/integration/recordings/responses/44fb9cf5875f.json b/tests/integration/recordings/responses/44fb9cf5875f.json index c7b0333f2..17c538862 100644 --- a/tests/integration/recordings/responses/44fb9cf5875f.json +++ b/tests/integration/recordings/responses/44fb9cf5875f.json @@ -20,15 +20,15 @@ "__type__": "ollama._types.GenerateResponse", "__data__": { "model": "llama3.2:3b-instruct-fp16", - "created_at": "2025-07-31T17:59:42.166585642Z", + "created_at": "2025-09-03T17:41:49.581065Z", "done": true, "done_reason": "stop", - "total_duration": 9490295253, - "load_duration": 42349084, + "total_duration": 2391571708, + "load_duration": 182022958, "prompt_eval_count": 20, - "prompt_eval_duration": 545470166, + "prompt_eval_duration": 74456583, "eval_count": 51, - "eval_duration": 8901928284, + "eval_duration": 2134471458, "response": "It seems like you're trying to test the system, but I'm not sure what specific functionality or feature you'd like to test. Could you please provide more context or clarify what you're looking for? I'll do my best to assist you!", "thinking": null, "context": null diff --git a/tests/integration/recordings/responses/48d2fb183a2a.json b/tests/integration/recordings/responses/48d2fb183a2a.json index c8fbcb07d..1b5ee286c 100644 --- a/tests/integration/recordings/responses/48d2fb183a2a.json +++ b/tests/integration/recordings/responses/48d2fb183a2a.json @@ -67,15 +67,15 @@ "__type__": "ollama._types.GenerateResponse", "__data__": { "model": "llama3.2:3b-instruct-fp16", - "created_at": "2025-08-04T22:55:40.583477Z", + "created_at": "2025-09-03T17:36:40.283084Z", "done": true, "done_reason": "stop", - "total_duration": 3928481500, - "load_duration": 151903250, + "total_duration": 2900042958, + "load_duration": 83372125, "prompt_eval_count": 259, - "prompt_eval_duration": 468000000, + "prompt_eval_duration": 352890750, "eval_count": 60, - "eval_duration": 3306000000, + "eval_duration": 2462885208, "response": "{\n \"first_name\": \"Michael\",\n \"last_name\": \"Jordan\",\n \"year_of_birth\": 1963,\n \"nba_stats\": {\n \"year_for_draft\": 1984,\n \"num_seasons_in_nba\": 15\n }\n}", "thinking": null, "context": null diff --git a/tests/integration/recordings/responses/50340cd4d253.json b/tests/integration/recordings/responses/50340cd4d253.json index f35923c06..3101fa9d8 100644 --- a/tests/integration/recordings/responses/50340cd4d253.json +++ b/tests/integration/recordings/responses/50340cd4d253.json @@ -20,15 +20,15 @@ "__type__": "ollama._types.GenerateResponse", "__data__": { "model": "llama-guard3:1b", - "created_at": "2025-08-01T23:14:19.298378Z", + "created_at": "2025-09-03T17:38:01.239743Z", "done": true, "done_reason": "stop", - "total_duration": 266786083, - "load_duration": 53820458, + "total_duration": 207264667, + "load_duration": 73437959, "prompt_eval_count": 216, - "prompt_eval_duration": 192000000, + "prompt_eval_duration": 121657333, "eval_count": 2, - "eval_duration": 17000000, + "eval_duration": 11348417, "response": "safe", "thinking": null, "context": null diff --git a/tests/integration/recordings/responses/5370751803dc.json b/tests/integration/recordings/responses/5370751803dc.json index 1edae9956..af1d8efab 100644 --- a/tests/integration/recordings/responses/5370751803dc.json +++ b/tests/integration/recordings/responses/5370751803dc.json @@ -20,390 +20,390 @@ "data": [ { "embedding": [ - -0.07649938, - 0.021244217, - -0.036287725, - -0.0011695292, - -0.048568938, - -0.13184524, - -0.08424354, - 0.059378363, - -0.06171173, - -0.009400254, - -0.08092405, - 0.05547966, - 0.05243954, - 0.026002606, - 0.06304219, - -0.062263194, - -0.06520713, - -0.022376515, - 0.017407224, - -0.11619268, - -0.03641897, - 0.04050772, - -0.032505907, - -0.017739171, - 0.057254575, - 0.012360873, - -0.018550506, - -0.029990712, - 0.00235547, - 0.0067841834, - -0.088615544, - 0.07800687, - 0.037015557, - 0.029492933, - -0.019656634, - 0.054334868, - -0.0006793985, - -0.08961444, - -0.05305694, - -0.012659472, - -0.0860912, - 0.07697376, - -0.038515005, - -0.011632789, - -0.032334387, - -0.0075316867, - -0.024749892, - -0.068094365, - -0.030428912, - -0.02603917, - -0.09692951, - 0.009892155, - -0.05358676, - -0.09094546, - -0.009154104, - -0.008819028, - 0.048186116, - -0.0033502842, - -0.005917261, - -0.13302499, - -0.09727019, - 0.013533918, - 0.047219984, - 0.062738694, - -0.01572617, - -0.037660386, - -0.016604222, - 0.029844316, - 0.093244925, - -0.06728843, - -0.13382566, - -0.020838322, - -0.025856238, - 0.11628718, - 0.0306645, - -0.10493003, - 0.038982447, - -0.010721579, - -0.0013596424, - 0.020682583, - 0.0018240656, - 0.027716527, - -0.078466296, - 0.10784201, - 0.029109064, - -0.05404029, - 0.030583676, - 0.07008342, - -0.03429503, - 0.009839805, - 0.03469849, - -0.042428855, - 0.06508966, - 0.026623009, - -0.032148074, - 0.07619082, - 0.020044614, - -0.030803965, - -0.071872465, - 0.027219178, - -0.018790914, - -0.0541197, - 0.07494771, - 0.01770988, - 0.03380063, - 0.024214497, - 0.09087066, - -0.052000217, - 0.04061227, - -0.018418813, - -0.012485012, - -0.06401856, - -0.023183277, - -0.06190061, - 0.053444423, - 0.047886662, - -0.010557972, - 0.078470305, - 0.03581419, - 0.02720849, - 0.022449464, - -0.004947443, - -0.024473231, - 0.003690138, - 0.00033914045, - -0.00892056, - 0.00927688, - 2.0050864e-34, - -0.03232352, - -0.0242469, - 0.02715213, - 0.021707827, - 0.06515407, - -0.019538436, - 0.0531206, - 0.007928102, - -0.039223887, - -0.020031622, - 0.007848442, - 0.02391591, - 0.014990736, - 0.11268782, - 0.06107525, - -0.011977935, - 0.016781967, - 0.045509085, - 0.0013573953, - 0.009146736, - 0.013215661, - -0.01195797, - 0.02703829, - 0.007053157, - 0.022530165, - -0.013689941, - -0.004301088, - -0.0007768117, - 0.033448935, - 0.011239952, - -0.05143586, - -0.07399211, - -0.031036023, - 0.019600574, - -0.0103345895, - -0.0029444918, - -0.0047988347, - -0.10445514, - 0.034700666, - -0.024362778, - -0.0471351, - 0.03554556, - 0.037065983, - -0.016996143, - 0.005622871, - 0.050610665, - -0.008597168, - 0.0059816362, - -0.12275667, - 0.03674253, - -0.022365745, - -0.00964108, - 0.07596107, - 0.08905326, - 0.016492268, - 0.044219263, - 0.06803503, - 0.06454952, - -0.050047003, - -0.0017108961, - -0.00074994087, - 0.09930796, - 0.09251372, - -0.011378917, - 0.050366722, - 0.07712465, - 0.009745006, - 0.1009996, - 0.03286012, - 0.064262226, - -0.044561703, - 0.038564857, - -0.019407123, - 0.03742708, - -0.0017875227, - 0.011954917, - 0.01135132, - -0.10406638, - 0.06980167, - 0.019202363, - -0.028420014, - -0.0136866, - 0.048647687, - -0.015362756, - -0.034191117, - -0.055556074, - 0.0050155777, - 0.025966194, - -0.0009168385, - -0.0042535486, - -0.06399157, - -0.059880342, - 0.081461415, - 0.014113321, - -0.038159303, - -2.1536519e-33, - -0.027272146, - -0.034751415, - -0.024606032, - 0.026892362, - -0.09076156, - -0.045825478, - 0.01362092, - 0.0023044816, - 0.054052215, - 0.032981824, - -0.029818065, - -0.058822677, - 0.09836217, - 0.032525893, - 0.110115595, - 0.020737587, - -0.09583008, - 0.0005333771, - 0.0019376605, - 0.017484892, - -0.06849545, - 0.064435944, - -0.050152197, - -0.048923954, - -0.027651085, - -0.014845199, - -0.12104595, - -0.04417338, - -0.011146107, - 0.058580566, - -0.007487375, - 0.038694676, - -0.07034722, - 0.030289542, - 0.055677116, - -0.0011476888, - 0.017125413, - -0.042026866, - -0.016522061, - -0.025752945, - 0.11801853, - 0.042021915, - 0.06467938, - 0.046182197, - 0.015046265, - 0.029888034, - -0.039066464, - 0.087210484, - -0.012382869, - -0.035691217, - -0.0481768, - 0.041446336, - 0.03895, - -0.025257591, - -0.028859945, - -0.029144095, - 0.029815607, - 0.051508367, - -0.08636757, - -0.06916314, - -0.07273463, - -0.059568703, - 0.00502403, - 0.025671752, - -0.022013027, - 0.024832714, - -0.09721394, - 0.0063272356, - -0.04942868, - -0.13045275, - 0.1247814, - -0.013577642, - -0.022800498, - 0.03898444, - -0.07545284, - 0.04942631, - 0.00082998566, - 0.004718136, - -0.04070612, - 0.063641116, - 0.11005218, - 0.020110086, - -0.048857097, - 0.05847898, - -0.066304415, - 0.026930936, - -0.06279101, - -0.014113123, - 0.023336235, - 0.023582496, - -0.0020861977, - 0.07764345, - 0.03095139, - 0.020153554, - -0.020101866, - -2.4304368e-08, - 0.020170629, - -0.008566916, - 0.06203045, - -0.0083030015, - 0.02522894, - 0.08902528, - -0.008051052, - -0.01893583, - -0.0355399, - 0.06187224, - -0.017073143, - -0.030130422, - -0.10230193, - -0.06516148, - -0.004159112, - 0.10910979, - -0.021820752, - -0.05356566, - 0.011770625, - 0.052257556, - 0.058287114, - 0.0053074392, - -0.05998588, - 0.0871507, - -0.082790464, - -0.040782016, - 0.06573996, - 0.028298022, - -0.012104256, - -0.07195988, - 0.014542897, - -0.032275774, - 0.0027686171, - 0.038691588, - 0.05546941, - -0.015204906, - 0.054877073, - -0.025119307, - -0.0337842, - 0.0030478975, - -0.037556846, - 0.015074203, - 0.022833891, - 0.012173256, - 0.035718966, - 0.0068811844, - -0.040539283, - -0.04956289, - -0.054521065, - -0.07317816, - -0.024969948, - -0.0021052386, - -0.013215133, - -0.06650142, - 0.02316441, - 0.046906833, - -0.13285862, - -0.010965043, - -0.024110796, - 0.043096602, - 0.024323147, - 0.069191284, - 0.15650614, - 0.0177121 + -0.07642644, + 0.0213101, + -0.03612849, + -0.0012144424, + -0.048599217, + -0.13194773, + -0.084226094, + 0.059389386, + -0.0617182, + -0.009323243, + -0.08099486, + 0.055514984, + 0.052610602, + 0.026061919, + 0.063071534, + -0.062316332, + -0.065115415, + -0.022351492, + 0.017378356, + -0.11605584, + -0.036349725, + 0.0404155, + -0.0325302, + -0.01770141, + 0.05722761, + 0.012393438, + -0.018529164, + -0.030017126, + 0.002365914, + 0.0066701965, + -0.08862459, + 0.0779319, + 0.03702611, + 0.029523117, + -0.01977821, + 0.05424799, + -0.00074063655, + -0.08949148, + -0.05312112, + -0.012703181, + -0.08622611, + 0.07689996, + -0.038602136, + -0.011616902, + -0.03234132, + -0.0073969415, + -0.024779495, + -0.067999884, + -0.03039565, + -0.025974417, + -0.09690519, + 0.009931951, + -0.05362519, + -0.09107193, + -0.009222061, + -0.008804084, + 0.048185978, + -0.003329437, + -0.0058579347, + -0.13306528, + -0.09721703, + 0.013474277, + 0.047286008, + 0.06279936, + -0.01582815, + -0.03771013, + -0.01651892, + 0.029905442, + 0.09326656, + -0.06746783, + -0.13385954, + -0.020873511, + -0.02586237, + 0.11623731, + 0.030632136, + -0.10494776, + 0.03905967, + -0.010701787, + -0.0014734551, + 0.020711906, + 0.0017687598, + 0.027797814, + -0.078500465, + 0.10791581, + 0.02910256, + -0.05398749, + 0.030513834, + 0.07001416, + -0.034323946, + 0.00986597, + 0.034644563, + -0.04232179, + 0.065106474, + 0.026648693, + -0.032122962, + 0.07616709, + 0.020026332, + -0.030642457, + -0.07188906, + 0.027189687, + -0.018678213, + -0.05416582, + 0.07488992, + 0.017753933, + 0.03386007, + 0.02414506, + 0.09077034, + -0.052096054, + 0.040722203, + -0.018450806, + -0.012474094, + -0.06403705, + -0.023205942, + -0.061878704, + 0.053436812, + 0.047876816, + -0.010608645, + 0.07852118, + 0.03579911, + 0.027097313, + 0.022424318, + -0.004912598, + -0.02455264, + 0.003700777, + 0.00039888592, + -0.008842094, + 0.009365857, + 2.05052e-34, + -0.03236592, + -0.024301885, + 0.027186498, + 0.021633558, + 0.06519107, + -0.019539308, + 0.05306087, + 0.007985293, + -0.03927361, + -0.020062907, + 0.008070545, + 0.02382429, + 0.015006528, + 0.1128094, + 0.06113956, + -0.011911169, + 0.016901307, + 0.045509744, + 0.0013988831, + 0.00907712, + 0.01314859, + -0.012022324, + 0.027043821, + 0.0071581583, + 0.022573117, + -0.013721936, + -0.004378743, + -0.0007087661, + 0.033585846, + 0.011227843, + -0.05136015, + -0.0739591, + -0.03094639, + 0.01957863, + -0.010360539, + -0.0029881562, + -0.00480912, + -0.10446798, + 0.034694213, + -0.02424012, + -0.047155295, + 0.035451673, + 0.037169226, + -0.016986743, + 0.0056092087, + 0.05057555, + -0.008601115, + 0.0060349177, + -0.12273999, + 0.036871877, + -0.022267655, + -0.009739047, + 0.075974636, + 0.08902226, + 0.01647873, + 0.044345584, + 0.06792565, + 0.06456903, + -0.050189856, + -0.0016995457, + -0.00090498856, + 0.09925942, + 0.09253569, + -0.011321612, + 0.050309792, + 0.07697773, + 0.0100068, + 0.101032645, + 0.03268899, + 0.06433435, + -0.044524822, + 0.03860177, + -0.019314477, + 0.037440598, + -0.0017394378, + 0.011816814, + 0.011359969, + -0.1040215, + 0.06984421, + 0.01910163, + -0.028409261, + -0.013704911, + 0.048502754, + -0.015429918, + -0.03423058, + -0.055616368, + 0.005001686, + 0.026054256, + -0.0007700968, + -0.0041726283, + -0.0640977, + -0.05985385, + 0.0813829, + 0.014288322, + -0.038147252, + -2.1576616e-33, + -0.027279941, + -0.034765568, + -0.02465107, + 0.026859807, + -0.090699576, + -0.045698144, + 0.013666582, + 0.002109106, + 0.054007426, + 0.032838397, + -0.029939773, + -0.058843046, + 0.09825693, + 0.03251322, + 0.109977886, + 0.020682266, + -0.0958973, + 0.0005566991, + 0.0018037638, + 0.017544486, + -0.06843023, + 0.06435102, + -0.050149646, + -0.048880838, + -0.027535524, + -0.014993001, + -0.1210176, + -0.04412877, + -0.011025324, + 0.058610573, + -0.007498303, + 0.038722932, + -0.07025986, + 0.030281536, + 0.055707317, + -0.001162887, + 0.01707519, + -0.042081844, + -0.016578361, + -0.025714336, + 0.117893435, + 0.04196084, + 0.064787276, + 0.046081997, + 0.014950138, + 0.030026693, + -0.039077066, + 0.087156676, + -0.012328571, + -0.035646956, + -0.048145168, + 0.041394625, + 0.038984135, + -0.025188481, + -0.028836856, + -0.02917782, + 0.029690607, + 0.051454436, + -0.08629761, + -0.06921346, + -0.07273269, + -0.05952071, + 0.0050034616, + 0.025693603, + -0.022103382, + 0.024972659, + -0.09724792, + 0.0062089814, + -0.04963219, + -0.13054384, + 0.124669954, + -0.01361085, + -0.022798477, + 0.039057832, + -0.07550591, + 0.049364913, + 0.0007779102, + 0.004692535, + -0.040757872, + 0.06355995, + 0.110190175, + 0.02015945, + -0.048807338, + 0.05842704, + -0.066375315, + 0.026938869, + -0.062775925, + -0.014049011, + 0.023343485, + 0.02358394, + -0.002172394, + 0.07766165, + 0.031056313, + 0.020171564, + -0.020073414, + -2.4317085e-08, + 0.020261949, + -0.008623839, + 0.0621209, + -0.008334477, + 0.02526615, + 0.08902315, + -0.007958188, + -0.018911751, + -0.035572145, + 0.06189234, + -0.017249323, + -0.030186126, + -0.10225455, + -0.06522741, + -0.004033112, + 0.10897627, + -0.02168822, + -0.053784374, + 0.011841631, + 0.052263785, + 0.058334205, + 0.0052479547, + -0.06017166, + 0.08723854, + -0.08275336, + -0.040676847, + 0.065786876, + 0.028317772, + -0.012168614, + -0.07196286, + 0.014588226, + -0.03231537, + 0.0028357722, + 0.03868031, + 0.055439528, + -0.015238348, + 0.05482384, + -0.025080629, + -0.033771332, + 0.0030752022, + -0.037511814, + 0.015122315, + 0.02292684, + 0.012024873, + 0.03559873, + 0.006865039, + -0.04049267, + -0.049685854, + -0.05455341, + -0.073071465, + -0.024902396, + -0.002133957, + -0.013212662, + -0.06657236, + 0.023245512, + 0.046919, + -0.13278763, + -0.011092663, + -0.023939205, + 0.043182902, + 0.024406029, + 0.06922961, + 0.15658055, + 0.017658537 ], "index": 0, "object": "embedding" diff --git a/tests/integration/recordings/responses/545d86510a80.json b/tests/integration/recordings/responses/545d86510a80.json index 8126fd241..7cd718d56 100644 --- a/tests/integration/recordings/responses/545d86510a80.json +++ b/tests/integration/recordings/responses/545d86510a80.json @@ -22,7 +22,7 @@ "__type__": "ollama._types.GenerateResponse", "__data__": { "model": "llama3.2:3b-instruct-fp16", - "created_at": "2025-08-01T23:14:38.59711Z", + "created_at": "2025-09-03T17:42:32.625862Z", "done": false, "done_reason": null, "total_duration": null, @@ -40,7 +40,7 @@ "__type__": "ollama._types.GenerateResponse", "__data__": { "model": "llama3.2:3b-instruct-fp16", - "created_at": "2025-08-01T23:14:38.671294Z", + "created_at": "2025-09-03T17:42:32.668885Z", "done": false, "done_reason": null, "total_duration": null, @@ -58,7 +58,7 @@ "__type__": "ollama._types.GenerateResponse", "__data__": { "model": "llama3.2:3b-instruct-fp16", - "created_at": "2025-08-01T23:14:38.736161Z", + "created_at": "2025-09-03T17:42:32.710947Z", "done": false, "done_reason": null, "total_duration": null, @@ -76,7 +76,7 @@ "__type__": "ollama._types.GenerateResponse", "__data__": { "model": "llama3.2:3b-instruct-fp16", - "created_at": "2025-08-01T23:14:38.809857Z", + "created_at": "2025-09-03T17:42:32.752286Z", "done": false, "done_reason": null, "total_duration": null, @@ -94,7 +94,7 @@ "__type__": "ollama._types.GenerateResponse", "__data__": { "model": "llama3.2:3b-instruct-fp16", - "created_at": "2025-08-01T23:14:38.883599Z", + "created_at": "2025-09-03T17:42:32.793309Z", "done": false, "done_reason": null, "total_duration": null, @@ -112,7 +112,7 @@ "__type__": "ollama._types.GenerateResponse", "__data__": { "model": "llama3.2:3b-instruct-fp16", - "created_at": "2025-08-01T23:14:38.942471Z", + "created_at": "2025-09-03T17:42:32.834578Z", "done": false, "done_reason": null, "total_duration": null, @@ -130,7 +130,7 @@ "__type__": "ollama._types.GenerateResponse", "__data__": { "model": "llama3.2:3b-instruct-fp16", - "created_at": "2025-08-01T23:14:38.999844Z", + "created_at": "2025-09-03T17:42:32.876536Z", "done": false, "done_reason": null, "total_duration": null, @@ -148,7 +148,7 @@ "__type__": "ollama._types.GenerateResponse", "__data__": { "model": "llama3.2:3b-instruct-fp16", - "created_at": "2025-08-01T23:14:39.050862Z", + "created_at": "2025-09-03T17:42:32.918807Z", "done": false, "done_reason": null, "total_duration": null, @@ -166,7 +166,7 @@ "__type__": "ollama._types.GenerateResponse", "__data__": { "model": "llama3.2:3b-instruct-fp16", - "created_at": "2025-08-01T23:14:39.104589Z", + "created_at": "2025-09-03T17:42:32.960101Z", "done": false, "done_reason": null, "total_duration": null, @@ -184,7 +184,7 @@ "__type__": "ollama._types.GenerateResponse", "__data__": { "model": "llama3.2:3b-instruct-fp16", - "created_at": "2025-08-01T23:14:39.158301Z", + "created_at": "2025-09-03T17:42:33.00196Z", "done": false, "done_reason": null, "total_duration": null, @@ -202,7 +202,7 @@ "__type__": "ollama._types.GenerateResponse", "__data__": { "model": "llama3.2:3b-instruct-fp16", - "created_at": "2025-08-01T23:14:39.210985Z", + "created_at": "2025-09-03T17:42:33.043876Z", "done": false, "done_reason": null, "total_duration": null, @@ -220,7 +220,7 @@ "__type__": "ollama._types.GenerateResponse", "__data__": { "model": "llama3.2:3b-instruct-fp16", - "created_at": "2025-08-01T23:14:39.263525Z", + "created_at": "2025-09-03T17:42:33.08756Z", "done": false, "done_reason": null, "total_duration": null, @@ -238,15 +238,15 @@ "__type__": "ollama._types.GenerateResponse", "__data__": { "model": "llama3.2:3b-instruct-fp16", - "created_at": "2025-08-01T23:14:39.314455Z", + "created_at": "2025-09-03T17:42:33.12966Z", "done": true, "done_reason": "stop", - "total_duration": 914060542, - "load_duration": 63705209, + "total_duration": 648814958, + "load_duration": 75300875, "prompt_eval_count": 408, - "prompt_eval_duration": 95000000, + "prompt_eval_duration": 66740291, "eval_count": 13, - "eval_duration": 753000000, + "eval_duration": 505313125, "response": "", "thinking": null, "context": null diff --git a/tests/integration/recordings/responses/554de3cd986f.json b/tests/integration/recordings/responses/554de3cd986f.json index 990de1928..7a359c50e 100644 --- a/tests/integration/recordings/responses/554de3cd986f.json +++ b/tests/integration/recordings/responses/554de3cd986f.json @@ -22,7 +22,7 @@ "__type__": "ollama._types.GenerateResponse", "__data__": { "model": "llama3.2:3b-instruct-fp16", - "created_at": "2025-08-01T23:14:04.40585Z", + "created_at": "2025-09-03T17:37:51.805591Z", "done": false, "done_reason": null, "total_duration": null, @@ -40,7 +40,7 @@ "__type__": "ollama._types.GenerateResponse", "__data__": { "model": "llama3.2:3b-instruct-fp16", - "created_at": "2025-08-01T23:14:04.455647Z", + "created_at": "2025-09-03T17:37:51.850067Z", "done": false, "done_reason": null, "total_duration": null, @@ -58,7 +58,7 @@ "__type__": "ollama._types.GenerateResponse", "__data__": { "model": "llama3.2:3b-instruct-fp16", - "created_at": "2025-08-01T23:14:04.509581Z", + "created_at": "2025-09-03T17:37:51.892443Z", "done": false, "done_reason": null, "total_duration": null, @@ -76,7 +76,7 @@ "__type__": "ollama._types.GenerateResponse", "__data__": { "model": "llama3.2:3b-instruct-fp16", - "created_at": "2025-08-01T23:14:04.56592Z", + "created_at": "2025-09-03T17:37:51.934364Z", "done": false, "done_reason": null, "total_duration": null, @@ -94,7 +94,7 @@ "__type__": "ollama._types.GenerateResponse", "__data__": { "model": "llama3.2:3b-instruct-fp16", - "created_at": "2025-08-01T23:14:04.616979Z", + "created_at": "2025-09-03T17:37:51.978382Z", "done": false, "done_reason": null, "total_duration": null, @@ -112,7 +112,7 @@ "__type__": "ollama._types.GenerateResponse", "__data__": { "model": "llama3.2:3b-instruct-fp16", - "created_at": "2025-08-01T23:14:04.671413Z", + "created_at": "2025-09-03T17:37:52.019332Z", "done": false, "done_reason": null, "total_duration": null, @@ -130,7 +130,7 @@ "__type__": "ollama._types.GenerateResponse", "__data__": { "model": "llama3.2:3b-instruct-fp16", - "created_at": "2025-08-01T23:14:04.725494Z", + "created_at": "2025-09-03T17:37:52.060708Z", "done": false, "done_reason": null, "total_duration": null, @@ -148,7 +148,7 @@ "__type__": "ollama._types.GenerateResponse", "__data__": { "model": "llama3.2:3b-instruct-fp16", - "created_at": "2025-08-01T23:14:04.779905Z", + "created_at": "2025-09-03T17:37:52.102717Z", "done": false, "done_reason": null, "total_duration": null, @@ -166,7 +166,7 @@ "__type__": "ollama._types.GenerateResponse", "__data__": { "model": "llama3.2:3b-instruct-fp16", - "created_at": "2025-08-01T23:14:04.829791Z", + "created_at": "2025-09-03T17:37:52.143996Z", "done": false, "done_reason": null, "total_duration": null, @@ -184,7 +184,7 @@ "__type__": "ollama._types.GenerateResponse", "__data__": { "model": "llama3.2:3b-instruct-fp16", - "created_at": "2025-08-01T23:14:04.880729Z", + "created_at": "2025-09-03T17:37:52.185479Z", "done": false, "done_reason": null, "total_duration": null, @@ -202,7 +202,7 @@ "__type__": "ollama._types.GenerateResponse", "__data__": { "model": "llama3.2:3b-instruct-fp16", - "created_at": "2025-08-01T23:14:04.93338Z", + "created_at": "2025-09-03T17:37:52.227562Z", "done": false, "done_reason": null, "total_duration": null, @@ -220,7 +220,7 @@ "__type__": "ollama._types.GenerateResponse", "__data__": { "model": "llama3.2:3b-instruct-fp16", - "created_at": "2025-08-01T23:14:04.981714Z", + "created_at": "2025-09-03T17:37:52.270178Z", "done": false, "done_reason": null, "total_duration": null, @@ -238,7 +238,7 @@ "__type__": "ollama._types.GenerateResponse", "__data__": { "model": "llama3.2:3b-instruct-fp16", - "created_at": "2025-08-01T23:14:05.036068Z", + "created_at": "2025-09-03T17:37:52.31151Z", "done": false, "done_reason": null, "total_duration": null, @@ -256,7 +256,7 @@ "__type__": "ollama._types.GenerateResponse", "__data__": { "model": "llama3.2:3b-instruct-fp16", - "created_at": "2025-08-01T23:14:05.088069Z", + "created_at": "2025-09-03T17:37:52.35278Z", "done": false, "done_reason": null, "total_duration": null, @@ -274,7 +274,7 @@ "__type__": "ollama._types.GenerateResponse", "__data__": { "model": "llama3.2:3b-instruct-fp16", - "created_at": "2025-08-01T23:14:05.144485Z", + "created_at": "2025-09-03T17:37:52.393954Z", "done": false, "done_reason": null, "total_duration": null, @@ -292,7 +292,7 @@ "__type__": "ollama._types.GenerateResponse", "__data__": { "model": "llama3.2:3b-instruct-fp16", - "created_at": "2025-08-01T23:14:05.203042Z", + "created_at": "2025-09-03T17:37:52.435238Z", "done": false, "done_reason": null, "total_duration": null, @@ -310,7 +310,7 @@ "__type__": "ollama._types.GenerateResponse", "__data__": { "model": "llama3.2:3b-instruct-fp16", - "created_at": "2025-08-01T23:14:05.257133Z", + "created_at": "2025-09-03T17:37:52.476197Z", "done": false, "done_reason": null, "total_duration": null, @@ -328,7 +328,7 @@ "__type__": "ollama._types.GenerateResponse", "__data__": { "model": "llama3.2:3b-instruct-fp16", - "created_at": "2025-08-01T23:14:05.311623Z", + "created_at": "2025-09-03T17:37:52.517914Z", "done": false, "done_reason": null, "total_duration": null, @@ -346,15 +346,15 @@ "__type__": "ollama._types.GenerateResponse", "__data__": { "model": "llama3.2:3b-instruct-fp16", - "created_at": "2025-08-01T23:14:05.370124Z", + "created_at": "2025-09-03T17:37:52.55904Z", "done": true, "done_reason": "stop", - "total_duration": 1532801458, - "load_duration": 213911041, + "total_duration": 971882292, + "load_duration": 116634209, "prompt_eval_count": 376, - "prompt_eval_duration": 350000000, + "prompt_eval_duration": 99382958, "eval_count": 19, - "eval_duration": 967000000, + "eval_duration": 755260750, "response": "", "thinking": null, "context": null diff --git a/tests/integration/recordings/responses/561746e1c8de.json b/tests/integration/recordings/responses/561746e1c8de.json index 120f40661..1bb8a3345 100644 --- a/tests/integration/recordings/responses/561746e1c8de.json +++ b/tests/integration/recordings/responses/561746e1c8de.json @@ -21,7 +21,7 @@ "__type__": "ollama._types.GenerateResponse", "__data__": { "model": "llama3.2:3b-instruct-fp16", - "created_at": "2025-08-15T20:24:49.18651486Z", + "created_at": "2025-09-03T17:36:20.465701Z", "done": false, "done_reason": null, "total_duration": null, @@ -39,7 +39,7 @@ "__type__": "ollama._types.GenerateResponse", "__data__": { "model": "llama3.2:3b-instruct-fp16", - "created_at": "2025-08-15T20:24:49.370611348Z", + "created_at": "2025-09-03T17:36:20.507671Z", "done": false, "done_reason": null, "total_duration": null, @@ -57,7 +57,7 @@ "__type__": "ollama._types.GenerateResponse", "__data__": { "model": "llama3.2:3b-instruct-fp16", - "created_at": "2025-08-15T20:24:49.557000029Z", + "created_at": "2025-09-03T17:36:20.549443Z", "done": false, "done_reason": null, "total_duration": null, @@ -75,7 +75,7 @@ "__type__": "ollama._types.GenerateResponse", "__data__": { "model": "llama3.2:3b-instruct-fp16", - "created_at": "2025-08-15T20:24:49.746777116Z", + "created_at": "2025-09-03T17:36:20.590803Z", "done": false, "done_reason": null, "total_duration": null, @@ -93,7 +93,7 @@ "__type__": "ollama._types.GenerateResponse", "__data__": { "model": "llama3.2:3b-instruct-fp16", - "created_at": "2025-08-15T20:24:49.942233333Z", + "created_at": "2025-09-03T17:36:20.631683Z", "done": false, "done_reason": null, "total_duration": null, @@ -111,7 +111,7 @@ "__type__": "ollama._types.GenerateResponse", "__data__": { "model": "llama3.2:3b-instruct-fp16", - "created_at": "2025-08-15T20:24:50.126788846Z", + "created_at": "2025-09-03T17:36:20.672443Z", "done": false, "done_reason": null, "total_duration": null, @@ -129,7 +129,7 @@ "__type__": "ollama._types.GenerateResponse", "__data__": { "model": "llama3.2:3b-instruct-fp16", - "created_at": "2025-08-15T20:24:50.311346131Z", + "created_at": "2025-09-03T17:36:20.713329Z", "done": false, "done_reason": null, "total_duration": null, @@ -147,7 +147,7 @@ "__type__": "ollama._types.GenerateResponse", "__data__": { "model": "llama3.2:3b-instruct-fp16", - "created_at": "2025-08-15T20:24:50.501507173Z", + "created_at": "2025-09-03T17:36:20.754254Z", "done": false, "done_reason": null, "total_duration": null, @@ -165,7 +165,7 @@ "__type__": "ollama._types.GenerateResponse", "__data__": { "model": "llama3.2:3b-instruct-fp16", - "created_at": "2025-08-15T20:24:50.692296777Z", + "created_at": "2025-09-03T17:36:20.795119Z", "done": false, "done_reason": null, "total_duration": null, @@ -183,7 +183,7 @@ "__type__": "ollama._types.GenerateResponse", "__data__": { "model": "llama3.2:3b-instruct-fp16", - "created_at": "2025-08-15T20:24:50.878846539Z", + "created_at": "2025-09-03T17:36:20.836145Z", "done": false, "done_reason": null, "total_duration": null, @@ -201,15 +201,15 @@ "__type__": "ollama._types.GenerateResponse", "__data__": { "model": "llama3.2:3b-instruct-fp16", - "created_at": "2025-08-15T20:24:51.063200561Z", + "created_at": "2025-09-03T17:36:20.877784Z", "done": true, "done_reason": "stop", - "total_duration": 33982453650, - "load_duration": 2909001805, + "total_duration": 612057417, + "load_duration": 97443583, "prompt_eval_count": 341, - "prompt_eval_duration": 29194357307, + "prompt_eval_duration": 100914750, "eval_count": 11, - "eval_duration": 1878247732, + "eval_duration": 413024250, "response": "", "thinking": null, "context": null diff --git a/tests/integration/recordings/responses/563b994bb7d1.json b/tests/integration/recordings/responses/563b994bb7d1.json index 9f3354cfa..62e38dc5c 100644 --- a/tests/integration/recordings/responses/563b994bb7d1.json +++ b/tests/integration/recordings/responses/563b994bb7d1.json @@ -20,15 +20,15 @@ "__type__": "ollama._types.GenerateResponse", "__data__": { "model": "llama3.2:3b-instruct-fp16", - "created_at": "2025-08-04T22:55:13.25248Z", + "created_at": "2025-09-03T17:36:19.594923Z", "done": true, "done_reason": "stop", - "total_duration": 1344654917, - "load_duration": 200585375, + "total_duration": 988472417, + "load_duration": 117976625, "prompt_eval_count": 326, - "prompt_eval_duration": 564000000, + "prompt_eval_duration": 451625542, "eval_count": 11, - "eval_duration": 578000000, + "eval_duration": 418313417, "response": "[get_weather(location=\"San Francisco, CA\")]", "thinking": null, "context": null diff --git a/tests/integration/recordings/responses/5f5d16afadb4.json b/tests/integration/recordings/responses/5f5d16afadb4.json index 8b4061494..f93d688c4 100644 --- a/tests/integration/recordings/responses/5f5d16afadb4.json +++ b/tests/integration/recordings/responses/5f5d16afadb4.json @@ -21,7 +21,7 @@ "__type__": "ollama._types.GenerateResponse", "__data__": { "model": "llama3.2:3b-instruct-fp16", - "created_at": "2025-08-04T22:55:13.354888Z", + "created_at": "2025-09-03T17:36:19.808372Z", "done": false, "done_reason": null, "total_duration": null, @@ -39,7 +39,7 @@ "__type__": "ollama._types.GenerateResponse", "__data__": { "model": "llama3.2:3b-instruct-fp16", - "created_at": "2025-08-04T22:55:13.427569Z", + "created_at": "2025-09-03T17:36:19.84991Z", "done": false, "done_reason": null, "total_duration": null, @@ -57,7 +57,7 @@ "__type__": "ollama._types.GenerateResponse", "__data__": { "model": "llama3.2:3b-instruct-fp16", - "created_at": "2025-08-04T22:55:13.486244Z", + "created_at": "2025-09-03T17:36:19.892111Z", "done": false, "done_reason": null, "total_duration": null, @@ -75,7 +75,7 @@ "__type__": "ollama._types.GenerateResponse", "__data__": { "model": "llama3.2:3b-instruct-fp16", - "created_at": "2025-08-04T22:55:13.540455Z", + "created_at": "2025-09-03T17:36:19.933857Z", "done": false, "done_reason": null, "total_duration": null, @@ -93,7 +93,7 @@ "__type__": "ollama._types.GenerateResponse", "__data__": { "model": "llama3.2:3b-instruct-fp16", - "created_at": "2025-08-04T22:55:13.594439Z", + "created_at": "2025-09-03T17:36:19.975148Z", "done": false, "done_reason": null, "total_duration": null, @@ -111,7 +111,7 @@ "__type__": "ollama._types.GenerateResponse", "__data__": { "model": "llama3.2:3b-instruct-fp16", - "created_at": "2025-08-04T22:55:13.649837Z", + "created_at": "2025-09-03T17:36:20.016641Z", "done": false, "done_reason": null, "total_duration": null, @@ -129,7 +129,7 @@ "__type__": "ollama._types.GenerateResponse", "__data__": { "model": "llama3.2:3b-instruct-fp16", - "created_at": "2025-08-04T22:55:13.703358Z", + "created_at": "2025-09-03T17:36:20.058229Z", "done": false, "done_reason": null, "total_duration": null, @@ -147,7 +147,7 @@ "__type__": "ollama._types.GenerateResponse", "__data__": { "model": "llama3.2:3b-instruct-fp16", - "created_at": "2025-08-04T22:55:13.7553Z", + "created_at": "2025-09-03T17:36:20.100222Z", "done": false, "done_reason": null, "total_duration": null, @@ -165,7 +165,7 @@ "__type__": "ollama._types.GenerateResponse", "__data__": { "model": "llama3.2:3b-instruct-fp16", - "created_at": "2025-08-04T22:55:13.807251Z", + "created_at": "2025-09-03T17:36:20.143456Z", "done": false, "done_reason": null, "total_duration": null, @@ -183,7 +183,7 @@ "__type__": "ollama._types.GenerateResponse", "__data__": { "model": "llama3.2:3b-instruct-fp16", - "created_at": "2025-08-04T22:55:13.857952Z", + "created_at": "2025-09-03T17:36:20.184657Z", "done": false, "done_reason": null, "total_duration": null, @@ -201,15 +201,15 @@ "__type__": "ollama._types.GenerateResponse", "__data__": { "model": "llama3.2:3b-instruct-fp16", - "created_at": "2025-08-04T22:55:13.918522Z", + "created_at": "2025-09-03T17:36:20.226017Z", "done": true, "done_reason": "stop", - "total_duration": 647785042, - "load_duration": 26355584, + "total_duration": 598395375, + "load_duration": 129432167, "prompt_eval_count": 326, - "prompt_eval_duration": 55000000, + "prompt_eval_duration": 50057334, "eval_count": 11, - "eval_duration": 557000000, + "eval_duration": 418284791, "response": "", "thinking": null, "context": null diff --git a/tests/integration/recordings/responses/62aa454ea5f9.json b/tests/integration/recordings/responses/62aa454ea5f9.json index 1e74bbbbb..38b8ffd3b 100644 --- a/tests/integration/recordings/responses/62aa454ea5f9.json +++ b/tests/integration/recordings/responses/62aa454ea5f9.json @@ -20,390 +20,390 @@ "data": [ { "embedding": [ - -0.08570448, - -0.095600754, - 0.04398704, - -0.016002586, - 0.02937856, - 0.07229825, - -0.0108823925, - -0.023841137, - 0.073795915, - -0.057006016, - -0.033788595, - 0.051158767, - 0.0050739567, - 0.014298775, - -0.07881352, - -0.012878745, - -0.041616067, - 0.06878784, - -0.10782497, - -0.040376976, - 0.026258128, - -0.001976873, - -0.011027494, - -0.0019720662, - 0.0040587694, - 0.088816345, - 0.014071338, - -0.018417818, - 0.032645598, - -0.034702033, - 0.076144606, - -0.014125607, - -0.02493309, - 0.03755479, - -0.10195466, - 0.05470191, - -0.022550134, - 0.024206808, - 0.011727895, - -0.008955921, - -0.050100796, - 0.0026504535, - 0.05590394, - 0.009941025, - 0.12794785, - -0.025010481, - 0.02435104, - -0.024520388, - -0.0022285185, - -0.024684334, - -0.104818396, - -0.059973124, - -0.055206526, - 0.015273937, - 0.034947917, - 0.05265324, - -0.00064814935, - 0.06637618, - -0.031795718, - -0.0072964546, - -0.0050489027, - -0.042481057, - -0.04087265, - 0.02008772, - 0.03870467, - 0.022511596, - -0.028690359, - 0.053362943, - 0.022450354, - 0.019296993, - 0.12269906, - 0.023923857, - -0.03728355, - 0.005889267, - 0.052346867, - 0.054002233, - 0.08020592, - -0.010999822, - 0.029368848, - -0.06721461, - -0.0002297595, - -0.050588466, - -0.0095366035, - 0.046173498, - 0.07868036, - 0.014159739, - -0.03324329, - 0.0018601778, - -0.066629566, - -0.020975014, - -0.017125193, - -0.043948952, - -0.059707303, - -0.073459946, - -0.039868142, - -0.030861603, - -0.019913651, - -0.10752571, - -0.02664692, - 0.0689932, - -0.0049655125, - 0.026640149, - 0.018917048, - 0.022118697, - 0.06419974, - -0.053135265, - 0.061616186, - 0.014025234, - 0.11771526, - -0.05178239, - -0.07634793, - 0.030905172, - -0.03857174, - -0.025236985, - 0.039299082, - -0.06143655, - 0.008370295, - 0.016200868, - 0.03228489, - 0.066803135, - -0.06503229, - 0.014640972, - -0.038513865, - 0.018730285, - -0.03011228, - -0.028523602, - -0.14709216, - -3.454768e-33, - -0.04858036, - -0.024983805, - 0.071692064, - 0.03562587, - 0.07928956, - -0.07811275, - 0.02311943, - -0.047469147, - 0.08866776, - -0.0009905098, - -0.11322911, - 0.09129462, - 0.023959681, - 0.11371455, - 0.042178337, - -0.057762112, - -0.07452438, - -0.0021433395, - -0.051525325, - -0.05095998, - -0.0016218564, - 0.030707737, - 0.04509054, - -0.039753992, - -0.058684282, - -0.03064905, - 0.0017237811, - 0.009109253, - -0.013751708, - 0.023424868, - 0.0017645947, - 0.046604484, - -0.07229431, - -0.027867278, - 0.016140861, - 0.04446358, - -0.004325922, - -0.06178838, - 0.06979857, - 0.031267133, - -0.013667371, - -0.0074066212, - 0.031622607, - -0.0236915, - 0.07152246, - 0.023948636, - 0.009776826, - 0.0071919537, - -0.03232169, - -0.049612403, - -0.050260104, - 0.02150285, - 0.015312771, - -0.06745535, - 0.06546945, - -0.025536334, - 0.03208605, - 0.020402592, - 0.011268207, - 0.00021468061, - -0.02349139, - -0.004954465, - -0.014090667, - 0.0014277936, - 0.059316903, - 0.039940886, - -0.032523617, - -0.023729, - 0.05446682, - 0.06422314, - -0.034017127, - 0.08744712, - -0.08048706, - -0.090565994, - -0.06538303, - -0.00010127551, - -0.021434912, - -0.068461135, - -0.029138267, - 0.03413734, - -0.07802728, - -0.05389643, - -0.035581492, - 0.044851534, - -0.040098358, - 0.07973631, - 0.026042009, - -0.081827834, - 0.0017979769, - -0.02764713, - -0.04310408, - -0.04207307, - 0.08336723, - -0.0494554, - -0.09028882, - 2.6716478e-33, - -0.091917306, - 0.026388643, - -0.07020338, - 0.075572066, - 0.039003927, - 0.027942013, - -0.054444574, - -0.036634557, - -0.048207656, - 0.07556485, - 0.046478804, - 0.025872312, - 0.05219267, - -0.00020983674, - 0.010589843, - -0.040604923, - -0.028473163, - -0.02054734, - 0.08885036, - -0.067588866, - 0.04945189, - 0.13227695, - -0.06998917, - -0.040121764, - 0.044024557, - 0.03420703, - -0.08647228, - 0.057482626, - -0.007488546, - 0.04904739, - -0.014908641, - -0.018117905, - -0.020271562, - 0.03883485, - 0.022270914, - 0.13485505, - 0.06897264, - -0.0026128246, - -0.016425159, - 0.0033841128, - 0.017271666, - 0.013608802, - 0.044169303, - 0.049203753, - -0.008237051, - -0.04662037, - -0.04390372, - 0.041557033, - -0.0354663, - 0.04278537, - 0.031310573, - 0.017929101, - -0.02624033, - -0.0545814, - -0.042623743, - -0.004118359, - 0.029068246, - 0.001052956, - 0.09042771, - 0.014050165, - -0.06879308, - -0.071003124, - 0.020317351, - 0.004283492, - -0.046952303, - 0.016503377, - -0.028376328, - 0.1043668, - 0.0028236075, - -0.08338905, - 0.03736013, - 0.058911674, - 0.037606813, - 0.09578536, - -0.12376857, - -0.054084644, - -0.014489054, - 0.0013207535, - -0.04531095, - -0.089944325, - 0.0017439555, - -0.05519527, - 0.00056134106, - 0.0005587594, - 0.07862233, - 0.104556754, - 0.0035775604, - 0.008373316, - 0.04291439, - 0.010107487, - 0.025184723, - 0.057374246, - -0.023012979, - 0.054407477, - -0.049804952, - -1.32878e-08, - -0.053895604, - 0.08075507, - 0.03399497, - 0.024384415, - 0.090608515, - -0.07165007, - 0.07552621, - 0.017241832, - -0.061231323, - -0.03297735, - 0.07829615, - 0.0396499, - -0.03669638, - 0.026653878, - 0.10006404, - -0.014379535, - 0.02066834, - -0.039198436, - 0.008517119, - -0.0012403574, - 0.06739532, - 0.014030484, - -0.054005865, - -0.016788486, - 0.076489784, - -0.035523314, - -0.050076444, - 0.083784595, - -0.00999262, - 0.081417, - 0.019268963, - 0.049931277, - 0.0022461978, - -0.07805938, - 0.01945713, - 0.11157225, - -0.012694483, - -0.064655006, - -0.09344128, - -0.04999159, - -0.042193726, - 0.059935458, - 0.034836538, - -0.014958905, - 0.014489057, - -0.022633748, - 0.06917315, - -0.08858699, - 0.02150387, - 0.013796807, - -0.007545836, - 0.027875464, - 0.015522231, - 0.0052421056, - 0.01061417, - -0.022906043, - -0.025388915, - -0.04141604, - -0.08376164, - 0.09259756, - 0.051795125, - 0.09296195, - 0.0111989025, - -0.01673378 + -0.08566708, + -0.09559047, + 0.044014607, + -0.015974598, + 0.029406257, + 0.07229597, + -0.010901963, + -0.023829829, + 0.07381301, + -0.05698464, + -0.033780586, + 0.051200844, + 0.0050912783, + 0.014317088, + -0.07878143, + -0.012908666, + -0.041628323, + 0.06881713, + -0.10783476, + -0.04042705, + 0.026262026, + -0.0019893218, + -0.011008084, + -0.0019646112, + 0.004033132, + 0.08881656, + 0.014049165, + -0.018416086, + 0.032621212, + -0.034692146, + 0.07614942, + -0.014122101, + -0.024901746, + 0.03755059, + -0.10197354, + 0.054705318, + -0.022539826, + 0.024209768, + 0.011698194, + -0.008956377, + -0.050146304, + 0.0026327297, + 0.055942897, + 0.009974366, + 0.12796965, + -0.025006283, + 0.024338534, + -0.024487961, + -0.0022703854, + -0.024687177, + -0.10482094, + -0.05994297, + -0.055200897, + 0.0152664175, + 0.03496896, + 0.052624088, + -0.0006445885, + 0.06637695, + -0.031790398, + -0.007308742, + -0.0050764186, + -0.042508755, + -0.04089097, + 0.020062948, + 0.038683955, + 0.022463562, + -0.02866933, + 0.053370677, + 0.022435635, + 0.01934692, + 0.12264713, + 0.023911418, + -0.037264284, + 0.0059156846, + 0.05235448, + 0.054004095, + 0.08022169, + -0.010992806, + 0.029295033, + -0.0672064, + -0.00021147476, + -0.050584126, + -0.0095251575, + 0.04616498, + 0.078677796, + 0.01416309, + -0.033226117, + 0.0018380182, + -0.06667651, + -0.020977372, + -0.017116925, + -0.04396714, + -0.05969979, + -0.07344942, + -0.03985366, + -0.030863814, + -0.019918729, + -0.1075161, + -0.026654154, + 0.0689854, + -0.0049292273, + 0.026645623, + 0.018879393, + 0.022113768, + 0.064208575, + -0.053153764, + 0.06160797, + 0.014026719, + 0.11772326, + -0.051769163, + -0.07634968, + 0.03090975, + -0.038558383, + -0.025260162, + 0.039262023, + -0.061449137, + 0.008389126, + 0.016175874, + 0.032293033, + 0.06679397, + -0.06503257, + 0.014676881, + -0.038542666, + 0.018718671, + -0.030111106, + -0.028481327, + -0.14707623, + -3.455443e-33, + -0.048577547, + -0.024983348, + 0.071679614, + 0.035652317, + 0.07931413, + -0.07811974, + 0.023085583, + -0.047467884, + 0.08872273, + -0.0010074769, + -0.11320135, + 0.091322996, + 0.023978539, + 0.11368158, + 0.042203873, + -0.05773289, + -0.074543044, + -0.0021036167, + -0.051522236, + -0.050925426, + -0.0016557347, + 0.030671587, + 0.045119714, + -0.03974729, + -0.05871358, + -0.030611658, + 0.0017253247, + 0.009114429, + -0.013763352, + 0.023424039, + 0.0017495834, + 0.046633217, + -0.07230643, + -0.027882291, + 0.016182518, + 0.044456217, + -0.004326421, + -0.061798126, + 0.0697968, + 0.031249145, + -0.013697079, + -0.007417679, + 0.031665757, + -0.02367961, + 0.07153089, + 0.023938214, + 0.009729952, + 0.0071919435, + -0.03235391, + -0.04955071, + -0.050248373, + 0.02151118, + 0.015327139, + -0.0674203, + 0.06544387, + -0.025547959, + 0.03207046, + 0.02038825, + 0.0112230005, + 0.00019493286, + -0.023462659, + -0.004949742, + -0.014066955, + 0.0014178518, + 0.059315395, + 0.039931085, + -0.032498423, + -0.023698896, + 0.05445033, + 0.064231694, + -0.034013335, + 0.08745776, + -0.080473825, + -0.090545714, + -0.065398656, + -8.2386265e-05, + -0.021441188, + -0.0684535, + -0.029121745, + 0.034134887, + -0.07799698, + -0.05388711, + -0.035591345, + 0.044826802, + -0.040090464, + 0.07972004, + 0.026058797, + -0.08184859, + 0.0018106091, + -0.027676936, + -0.04312832, + -0.042090744, + 0.08336437, + -0.049453646, + -0.0902778, + 2.6716498e-33, + -0.091911495, + 0.02641473, + -0.07022486, + 0.075562105, + 0.03900905, + 0.027913846, + -0.05444872, + -0.036666486, + -0.048225258, + 0.07551892, + 0.046452336, + 0.025874302, + 0.052248206, + -0.00018527219, + 0.010575236, + -0.040591337, + -0.028484622, + -0.020559357, + 0.08882296, + -0.06755767, + 0.04941752, + 0.13231009, + -0.06998129, + -0.040112328, + 0.044030365, + 0.034218542, + -0.08650528, + 0.05746921, + -0.0075130556, + 0.049070083, + -0.0148686, + -0.018103259, + -0.020280316, + 0.038828347, + 0.022253176, + 0.13486238, + 0.06899369, + -0.002589861, + -0.016430879, + 0.0033818923, + 0.017275693, + 0.013614936, + 0.044220798, + 0.049155377, + -0.008259856, + -0.046575654, + -0.043921605, + 0.04156687, + -0.035468902, + 0.042837795, + 0.03131579, + 0.017961076, + -0.026213305, + -0.05458616, + -0.04259084, + -0.004110002, + 0.029035388, + 0.0010451805, + 0.09044077, + 0.014110149, + -0.068820216, + -0.07098938, + 0.020328037, + 0.00433692, + -0.046977337, + 0.016492791, + -0.028396707, + 0.104340956, + 0.002814702, + -0.08339559, + 0.037326302, + 0.058929898, + 0.0376423, + 0.09580634, + -0.12376848, + -0.054060236, + -0.014485116, + 0.0013106487, + -0.04537336, + -0.0899294, + 0.001730278, + -0.05520831, + 0.000568523, + 0.00053380145, + 0.07856981, + 0.104590714, + 0.00355283, + 0.008365939, + 0.04291482, + 0.010064388, + 0.025177509, + 0.05732803, + -0.023061136, + 0.054399785, + -0.049828697, + -1.3290186e-08, + -0.0539168, + 0.08074109, + 0.03397028, + 0.024365881, + 0.0906225, + -0.07162824, + 0.07550329, + 0.017278913, + -0.061226364, + -0.03298407, + 0.07829606, + 0.03967995, + -0.036696997, + 0.02665964, + 0.1000655, + -0.014426734, + 0.020708792, + -0.039230846, + 0.0085029, + -0.0012509917, + 0.06740856, + 0.013992665, + -0.054007422, + -0.016785627, + 0.07651403, + -0.035508703, + -0.050085396, + 0.08382383, + -0.009957674, + 0.08140875, + 0.019287178, + 0.049911316, + 0.0022236605, + -0.07807412, + 0.019454133, + 0.111560374, + -0.01269702, + -0.06466137, + -0.09346588, + -0.050038446, + -0.042178612, + 0.0599713, + 0.034831088, + -0.014957726, + 0.014484159, + -0.022619838, + 0.06916277, + -0.088544875, + 0.021478733, + 0.01378541, + -0.0075770007, + 0.027888266, + 0.015526889, + 0.0052174823, + 0.010616002, + -0.022908956, + -0.02535865, + -0.04139556, + -0.08375561, + 0.092626974, + 0.051755503, + 0.09296614, + 0.011223383, + -0.016759252 ], "index": 0, "object": "embedding" diff --git a/tests/integration/recordings/responses/6906a6e71988.json b/tests/integration/recordings/responses/6906a6e71988.json index 9d4125823..6574cab53 100644 --- a/tests/integration/recordings/responses/6906a6e71988.json +++ b/tests/integration/recordings/responses/6906a6e71988.json @@ -20,15 +20,15 @@ "__type__": "ollama._types.GenerateResponse", "__data__": { "model": "llama-guard3:1b", - "created_at": "2025-08-01T23:14:18.886381Z", + "created_at": "2025-09-03T17:38:00.98692Z", "done": true, "done_reason": "stop", - "total_duration": 488566500, - "load_duration": 113477291, + "total_duration": 332473583, + "load_duration": 90611333, "prompt_eval_count": 317, - "prompt_eval_duration": 361000000, + "prompt_eval_duration": 229691000, "eval_count": 2, - "eval_duration": 12000000, + "eval_duration": 11571291, "response": "safe", "thinking": null, "context": null diff --git a/tests/integration/recordings/responses/6cc063bbd7d3.json b/tests/integration/recordings/responses/6cc063bbd7d3.json index 2e7841626..ab6e12602 100644 --- a/tests/integration/recordings/responses/6cc063bbd7d3.json +++ b/tests/integration/recordings/responses/6cc063bbd7d3.json @@ -21,7 +21,7 @@ "__type__": "ollama._types.GenerateResponse", "__data__": { "model": "llama3.2:3b-instruct-fp16", - "created_at": "2025-08-04T22:55:55.9885Z", + "created_at": "2025-09-03T17:42:17.402486Z", "done": false, "done_reason": null, "total_duration": null, @@ -39,7 +39,7 @@ "__type__": "ollama._types.GenerateResponse", "__data__": { "model": "llama3.2:3b-instruct-fp16", - "created_at": "2025-08-04T22:55:56.054143Z", + "created_at": "2025-09-03T17:42:17.444334Z", "done": false, "done_reason": null, "total_duration": null, @@ -57,7 +57,7 @@ "__type__": "ollama._types.GenerateResponse", "__data__": { "model": "llama3.2:3b-instruct-fp16", - "created_at": "2025-08-04T22:55:56.117658Z", + "created_at": "2025-09-03T17:42:17.484625Z", "done": false, "done_reason": null, "total_duration": null, @@ -75,7 +75,7 @@ "__type__": "ollama._types.GenerateResponse", "__data__": { "model": "llama3.2:3b-instruct-fp16", - "created_at": "2025-08-04T22:55:56.179422Z", + "created_at": "2025-09-03T17:42:17.525063Z", "done": false, "done_reason": null, "total_duration": null, @@ -93,7 +93,7 @@ "__type__": "ollama._types.GenerateResponse", "__data__": { "model": "llama3.2:3b-instruct-fp16", - "created_at": "2025-08-04T22:55:56.240328Z", + "created_at": "2025-09-03T17:42:17.565015Z", "done": false, "done_reason": null, "total_duration": null, @@ -111,7 +111,7 @@ "__type__": "ollama._types.GenerateResponse", "__data__": { "model": "llama3.2:3b-instruct-fp16", - "created_at": "2025-08-04T22:55:56.295992Z", + "created_at": "2025-09-03T17:42:17.60499Z", "done": false, "done_reason": null, "total_duration": null, @@ -129,7 +129,7 @@ "__type__": "ollama._types.GenerateResponse", "__data__": { "model": "llama3.2:3b-instruct-fp16", - "created_at": "2025-08-04T22:55:56.355683Z", + "created_at": "2025-09-03T17:42:17.64509Z", "done": false, "done_reason": null, "total_duration": null, @@ -147,7 +147,7 @@ "__type__": "ollama._types.GenerateResponse", "__data__": { "model": "llama3.2:3b-instruct-fp16", - "created_at": "2025-08-04T22:55:56.412176Z", + "created_at": "2025-09-03T17:42:17.685566Z", "done": false, "done_reason": null, "total_duration": null, @@ -165,7 +165,7 @@ "__type__": "ollama._types.GenerateResponse", "__data__": { "model": "llama3.2:3b-instruct-fp16", - "created_at": "2025-08-04T22:55:56.466952Z", + "created_at": "2025-09-03T17:42:17.725855Z", "done": false, "done_reason": null, "total_duration": null, @@ -183,7 +183,7 @@ "__type__": "ollama._types.GenerateResponse", "__data__": { "model": "llama3.2:3b-instruct-fp16", - "created_at": "2025-08-04T22:55:56.517222Z", + "created_at": "2025-09-03T17:42:17.766056Z", "done": false, "done_reason": null, "total_duration": null, @@ -201,7 +201,7 @@ "__type__": "ollama._types.GenerateResponse", "__data__": { "model": "llama3.2:3b-instruct-fp16", - "created_at": "2025-08-04T22:55:56.570491Z", + "created_at": "2025-09-03T17:42:17.806415Z", "done": false, "done_reason": null, "total_duration": null, @@ -219,7 +219,7 @@ "__type__": "ollama._types.GenerateResponse", "__data__": { "model": "llama3.2:3b-instruct-fp16", - "created_at": "2025-08-04T22:55:56.623189Z", + "created_at": "2025-09-03T17:42:17.847273Z", "done": false, "done_reason": null, "total_duration": null, @@ -237,7 +237,7 @@ "__type__": "ollama._types.GenerateResponse", "__data__": { "model": "llama3.2:3b-instruct-fp16", - "created_at": "2025-08-04T22:55:56.679221Z", + "created_at": "2025-09-03T17:42:17.888576Z", "done": false, "done_reason": null, "total_duration": null, @@ -255,7 +255,7 @@ "__type__": "ollama._types.GenerateResponse", "__data__": { "model": "llama3.2:3b-instruct-fp16", - "created_at": "2025-08-04T22:55:56.731373Z", + "created_at": "2025-09-03T17:42:17.928952Z", "done": false, "done_reason": null, "total_duration": null, @@ -273,7 +273,7 @@ "__type__": "ollama._types.GenerateResponse", "__data__": { "model": "llama3.2:3b-instruct-fp16", - "created_at": "2025-08-04T22:55:56.781364Z", + "created_at": "2025-09-03T17:42:17.969744Z", "done": false, "done_reason": null, "total_duration": null, @@ -291,7 +291,7 @@ "__type__": "ollama._types.GenerateResponse", "__data__": { "model": "llama3.2:3b-instruct-fp16", - "created_at": "2025-08-04T22:55:56.831951Z", + "created_at": "2025-09-03T17:42:18.010869Z", "done": false, "done_reason": null, "total_duration": null, @@ -309,7 +309,7 @@ "__type__": "ollama._types.GenerateResponse", "__data__": { "model": "llama3.2:3b-instruct-fp16", - "created_at": "2025-08-04T22:55:56.888381Z", + "created_at": "2025-09-03T17:42:18.051109Z", "done": false, "done_reason": null, "total_duration": null, @@ -327,7 +327,7 @@ "__type__": "ollama._types.GenerateResponse", "__data__": { "model": "llama3.2:3b-instruct-fp16", - "created_at": "2025-08-04T22:55:56.943539Z", + "created_at": "2025-09-03T17:42:18.093266Z", "done": false, "done_reason": null, "total_duration": null, @@ -345,7 +345,7 @@ "__type__": "ollama._types.GenerateResponse", "__data__": { "model": "llama3.2:3b-instruct-fp16", - "created_at": "2025-08-04T22:55:56.997422Z", + "created_at": "2025-09-03T17:42:18.135749Z", "done": false, "done_reason": null, "total_duration": null, @@ -363,15 +363,15 @@ "__type__": "ollama._types.GenerateResponse", "__data__": { "model": "llama3.2:3b-instruct-fp16", - "created_at": "2025-08-04T22:55:57.056259Z", + "created_at": "2025-09-03T17:42:18.176649Z", "done": true, "done_reason": "stop", - "total_duration": 1289815458, - "load_duration": 119745583, + "total_duration": 907420000, + "load_duration": 66756750, "prompt_eval_count": 26, - "prompt_eval_duration": 98000000, + "prompt_eval_duration": 62900875, "eval_count": 20, - "eval_duration": 1071000000, + "eval_duration": 777306958, "response": "", "thinking": null, "context": null diff --git a/tests/integration/recordings/responses/6d35c91287e2.json b/tests/integration/recordings/responses/6d35c91287e2.json index 699493f45..a7af894e8 100644 --- a/tests/integration/recordings/responses/6d35c91287e2.json +++ b/tests/integration/recordings/responses/6d35c91287e2.json @@ -22,7 +22,7 @@ "__type__": "ollama._types.GenerateResponse", "__data__": { "model": "llama3.2:3b-instruct-fp16", - "created_at": "2025-08-01T23:14:22.362667Z", + "created_at": "2025-09-03T17:38:03.549266Z", "done": false, "done_reason": null, "total_duration": null, @@ -40,7 +40,7 @@ "__type__": "ollama._types.GenerateResponse", "__data__": { "model": "llama3.2:3b-instruct-fp16", - "created_at": "2025-08-01T23:14:22.427435Z", + "created_at": "2025-09-03T17:38:03.592203Z", "done": false, "done_reason": null, "total_duration": null, @@ -58,7 +58,7 @@ "__type__": "ollama._types.GenerateResponse", "__data__": { "model": "llama3.2:3b-instruct-fp16", - "created_at": "2025-08-01T23:14:22.484198Z", + "created_at": "2025-09-03T17:38:03.63417Z", "done": false, "done_reason": null, "total_duration": null, @@ -76,7 +76,7 @@ "__type__": "ollama._types.GenerateResponse", "__data__": { "model": "llama3.2:3b-instruct-fp16", - "created_at": "2025-08-01T23:14:22.537031Z", + "created_at": "2025-09-03T17:38:03.677268Z", "done": false, "done_reason": null, "total_duration": null, @@ -94,7 +94,7 @@ "__type__": "ollama._types.GenerateResponse", "__data__": { "model": "llama3.2:3b-instruct-fp16", - "created_at": "2025-08-01T23:14:22.591198Z", + "created_at": "2025-09-03T17:38:03.719768Z", "done": false, "done_reason": null, "total_duration": null, @@ -112,7 +112,7 @@ "__type__": "ollama._types.GenerateResponse", "__data__": { "model": "llama3.2:3b-instruct-fp16", - "created_at": "2025-08-01T23:14:22.643336Z", + "created_at": "2025-09-03T17:38:03.762204Z", "done": false, "done_reason": null, "total_duration": null, @@ -130,7 +130,7 @@ "__type__": "ollama._types.GenerateResponse", "__data__": { "model": "llama3.2:3b-instruct-fp16", - "created_at": "2025-08-01T23:14:22.698589Z", + "created_at": "2025-09-03T17:38:03.80404Z", "done": false, "done_reason": null, "total_duration": null, @@ -148,7 +148,7 @@ "__type__": "ollama._types.GenerateResponse", "__data__": { "model": "llama3.2:3b-instruct-fp16", - "created_at": "2025-08-01T23:14:22.752904Z", + "created_at": "2025-09-03T17:38:03.845678Z", "done": false, "done_reason": null, "total_duration": null, @@ -166,7 +166,7 @@ "__type__": "ollama._types.GenerateResponse", "__data__": { "model": "llama3.2:3b-instruct-fp16", - "created_at": "2025-08-01T23:14:22.804Z", + "created_at": "2025-09-03T17:38:03.887086Z", "done": false, "done_reason": null, "total_duration": null, @@ -184,7 +184,7 @@ "__type__": "ollama._types.GenerateResponse", "__data__": { "model": "llama3.2:3b-instruct-fp16", - "created_at": "2025-08-01T23:14:22.855633Z", + "created_at": "2025-09-03T17:38:03.928422Z", "done": false, "done_reason": null, "total_duration": null, @@ -202,7 +202,7 @@ "__type__": "ollama._types.GenerateResponse", "__data__": { "model": "llama3.2:3b-instruct-fp16", - "created_at": "2025-08-01T23:14:22.906918Z", + "created_at": "2025-09-03T17:38:03.969641Z", "done": false, "done_reason": null, "total_duration": null, @@ -220,7 +220,7 @@ "__type__": "ollama._types.GenerateResponse", "__data__": { "model": "llama3.2:3b-instruct-fp16", - "created_at": "2025-08-01T23:14:22.958729Z", + "created_at": "2025-09-03T17:38:04.011212Z", "done": false, "done_reason": null, "total_duration": null, @@ -238,15 +238,15 @@ "__type__": "ollama._types.GenerateResponse", "__data__": { "model": "llama3.2:3b-instruct-fp16", - "created_at": "2025-08-01T23:14:23.011279Z", + "created_at": "2025-09-03T17:38:04.052626Z", "done": true, "done_reason": "stop", - "total_duration": 793500292, - "load_duration": 55339750, + "total_duration": 731936583, + "load_duration": 147334791, "prompt_eval_count": 417, - "prompt_eval_duration": 83000000, + "prompt_eval_duration": 79443792, "eval_count": 13, - "eval_duration": 653000000, + "eval_duration": 504352750, "response": "", "thinking": null, "context": null diff --git a/tests/integration/recordings/responses/6f96090aa955.json b/tests/integration/recordings/responses/6f96090aa955.json index d5131d389..d0ac20442 100644 --- a/tests/integration/recordings/responses/6f96090aa955.json +++ b/tests/integration/recordings/responses/6f96090aa955.json @@ -1,7 +1,7 @@ { "request": { "method": "POST", - "url": "http://localhost:11434/v1/v1/chat/completions", + "url": "http://0.0.0.0:11434/v1/v1/chat/completions", "headers": {}, "body": { "model": "llama3.2:3b-instruct-fp16", @@ -21,7 +21,7 @@ { "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", "__data__": { - "id": "chatcmpl-333", + "id": "chatcmpl-698", "choices": [ { "delta": { @@ -36,7 +36,7 @@ "logprobs": null } ], - "created": 1754081849, + "created": 1756921359, "model": "llama3.2:3b-instruct-fp16", "object": "chat.completion.chunk", "service_tier": null, @@ -47,7 +47,7 @@ { "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", "__data__": { - "id": "chatcmpl-333", + "id": "chatcmpl-698", "choices": [ { "delta": { @@ -62,7 +62,7 @@ "logprobs": null } ], - "created": 1754081849, + "created": 1756921359, "model": "llama3.2:3b-instruct-fp16", "object": "chat.completion.chunk", "service_tier": null, @@ -73,11 +73,11 @@ { "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", "__data__": { - "id": "chatcmpl-333", + "id": "chatcmpl-698", "choices": [ { "delta": { - "content": " Welcome", + "content": " It", "function_call": null, "refusal": null, "role": "assistant", @@ -88,7 +88,7 @@ "logprobs": null } ], - "created": 1754081849, + "created": 1756921359, "model": "llama3.2:3b-instruct-fp16", "object": "chat.completion.chunk", "service_tier": null, @@ -99,7 +99,59 @@ { "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", "__data__": { - "id": "chatcmpl-333", + "id": "chatcmpl-698", + "choices": [ + { + "delta": { + "content": "'s", + "function_call": null, + "refusal": null, + "role": "assistant", + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null + } + ], + "created": 1756921359, + "model": "llama3.2:3b-instruct-fp16", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": "fp_ollama", + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "chatcmpl-698", + "choices": [ + { + "delta": { + "content": " nice", + "function_call": null, + "refusal": null, + "role": "assistant", + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null + } + ], + "created": 1756921359, + "model": "llama3.2:3b-instruct-fp16", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": "fp_ollama", + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "chatcmpl-698", "choices": [ { "delta": { @@ -114,7 +166,7 @@ "logprobs": null } ], - "created": 1754081849, + "created": 1756921359, "model": "llama3.2:3b-instruct-fp16", "object": "chat.completion.chunk", "service_tier": null, @@ -125,11 +177,11 @@ { "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", "__data__": { - "id": "chatcmpl-333", + "id": "chatcmpl-698", "choices": [ { "delta": { - "content": " our", + "content": " meet", "function_call": null, "refusal": null, "role": "assistant", @@ -140,7 +192,7 @@ "logprobs": null } ], - "created": 1754081849, + "created": 1756921359, "model": "llama3.2:3b-instruct-fp16", "object": "chat.completion.chunk", "service_tier": null, @@ -151,11 +203,11 @@ { "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", "__data__": { - "id": "chatcmpl-333", + "id": "chatcmpl-698", "choices": [ { "delta": { - "content": " conversation", + "content": " you", "function_call": null, "refusal": null, "role": "assistant", @@ -166,7 +218,7 @@ "logprobs": null } ], - "created": 1754081849, + "created": 1756921359, "model": "llama3.2:3b-instruct-fp16", "object": "chat.completion.chunk", "service_tier": null, @@ -177,7 +229,7 @@ { "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", "__data__": { - "id": "chatcmpl-333", + "id": "chatcmpl-698", "choices": [ { "delta": { @@ -192,7 +244,7 @@ "logprobs": null } ], - "created": 1754081849, + "created": 1756921359, "model": "llama3.2:3b-instruct-fp16", "object": "chat.completion.chunk", "service_tier": null, @@ -203,7 +255,7 @@ { "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", "__data__": { - "id": "chatcmpl-333", + "id": "chatcmpl-698", "choices": [ { "delta": { @@ -218,7 +270,7 @@ "logprobs": null } ], - "created": 1754081850, + "created": 1756921359, "model": "llama3.2:3b-instruct-fp16", "object": "chat.completion.chunk", "service_tier": null, @@ -229,7 +281,7 @@ { "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", "__data__": { - "id": "chatcmpl-333", + "id": "chatcmpl-698", "choices": [ { "delta": { @@ -244,7 +296,7 @@ "logprobs": null } ], - "created": 1754081850, + "created": 1756921359, "model": "llama3.2:3b-instruct-fp16", "object": "chat.completion.chunk", "service_tier": null, @@ -255,7 +307,7 @@ { "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", "__data__": { - "id": "chatcmpl-333", + "id": "chatcmpl-698", "choices": [ { "delta": { @@ -270,7 +322,7 @@ "logprobs": null } ], - "created": 1754081850, + "created": 1756921359, "model": "llama3.2:3b-instruct-fp16", "object": "chat.completion.chunk", "service_tier": null, @@ -281,7 +333,7 @@ { "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", "__data__": { - "id": "chatcmpl-333", + "id": "chatcmpl-698", "choices": [ { "delta": { @@ -296,7 +348,7 @@ "logprobs": null } ], - "created": 1754081850, + "created": 1756921359, "model": "llama3.2:3b-instruct-fp16", "object": "chat.completion.chunk", "service_tier": null, @@ -307,7 +359,7 @@ { "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", "__data__": { - "id": "chatcmpl-333", + "id": "chatcmpl-698", "choices": [ { "delta": { @@ -322,7 +374,7 @@ "logprobs": null } ], - "created": 1754081850, + "created": 1756921359, "model": "llama3.2:3b-instruct-fp16", "object": "chat.completion.chunk", "service_tier": null, @@ -333,7 +385,7 @@ { "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", "__data__": { - "id": "chatcmpl-333", + "id": "chatcmpl-698", "choices": [ { "delta": { @@ -348,7 +400,7 @@ "logprobs": null } ], - "created": 1754081850, + "created": 1756921359, "model": "llama3.2:3b-instruct-fp16", "object": "chat.completion.chunk", "service_tier": null, @@ -359,7 +411,7 @@ { "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", "__data__": { - "id": "chatcmpl-333", + "id": "chatcmpl-698", "choices": [ { "delta": { @@ -374,7 +426,7 @@ "logprobs": null } ], - "created": 1754081850, + "created": 1756921359, "model": "llama3.2:3b-instruct-fp16", "object": "chat.completion.chunk", "service_tier": null, @@ -385,7 +437,7 @@ { "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", "__data__": { - "id": "chatcmpl-333", + "id": "chatcmpl-698", "choices": [ { "delta": { @@ -400,7 +452,7 @@ "logprobs": null } ], - "created": 1754081850, + "created": 1756921359, "model": "llama3.2:3b-instruct-fp16", "object": "chat.completion.chunk", "service_tier": null, @@ -411,33 +463,7 @@ { "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", "__data__": { - "id": "chatcmpl-333", - "choices": [ - { - "delta": { - "content": ",", - "function_call": null, - "refusal": null, - "role": "assistant", - "tool_calls": null - }, - "finish_reason": null, - "index": 0, - "logprobs": null - } - ], - "created": 1754081850, - "model": "llama3.2:3b-instruct-fp16", - "object": "chat.completion.chunk", - "service_tier": null, - "system_fingerprint": "fp_ollama", - "usage": null - } - }, - { - "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", - "__data__": { - "id": "chatcmpl-333", + "id": "chatcmpl-698", "choices": [ { "delta": { @@ -452,7 +478,7 @@ "logprobs": null } ], - "created": 1754081850, + "created": 1756921359, "model": "llama3.2:3b-instruct-fp16", "object": "chat.completion.chunk", "service_tier": null, @@ -463,7 +489,7 @@ { "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", "__data__": { - "id": "chatcmpl-333", + "id": "chatcmpl-698", "choices": [ { "delta": { @@ -478,7 +504,7 @@ "logprobs": null } ], - "created": 1754081850, + "created": 1756921359, "model": "llama3.2:3b-instruct-fp16", "object": "chat.completion.chunk", "service_tier": null, @@ -489,7 +515,7 @@ { "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", "__data__": { - "id": "chatcmpl-333", + "id": "chatcmpl-698", "choices": [ { "delta": { @@ -504,7 +530,7 @@ "logprobs": null } ], - "created": 1754081850, + "created": 1756921360, "model": "llama3.2:3b-instruct-fp16", "object": "chat.completion.chunk", "service_tier": null, @@ -515,7 +541,7 @@ { "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", "__data__": { - "id": "chatcmpl-333", + "id": "chatcmpl-698", "choices": [ { "delta": { @@ -530,7 +556,7 @@ "logprobs": null } ], - "created": 1754081850, + "created": 1756921360, "model": "llama3.2:3b-instruct-fp16", "object": "chat.completion.chunk", "service_tier": null, @@ -541,7 +567,7 @@ { "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", "__data__": { - "id": "chatcmpl-333", + "id": "chatcmpl-698", "choices": [ { "delta": { @@ -556,7 +582,7 @@ "logprobs": null } ], - "created": 1754081850, + "created": 1756921360, "model": "llama3.2:3b-instruct-fp16", "object": "chat.completion.chunk", "service_tier": null, @@ -567,7 +593,7 @@ { "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", "__data__": { - "id": "chatcmpl-333", + "id": "chatcmpl-698", "choices": [ { "delta": { @@ -582,7 +608,7 @@ "logprobs": null } ], - "created": 1754081850, + "created": 1756921360, "model": "llama3.2:3b-instruct-fp16", "object": "chat.completion.chunk", "service_tier": null, @@ -593,7 +619,7 @@ { "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", "__data__": { - "id": "chatcmpl-333", + "id": "chatcmpl-698", "choices": [ { "delta": { @@ -608,7 +634,7 @@ "logprobs": null } ], - "created": 1754081850, + "created": 1756921360, "model": "llama3.2:3b-instruct-fp16", "object": "chat.completion.chunk", "service_tier": null, @@ -619,7 +645,7 @@ { "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", "__data__": { - "id": "chatcmpl-333", + "id": "chatcmpl-698", "choices": [ { "delta": { @@ -634,7 +660,7 @@ "logprobs": null } ], - "created": 1754081850, + "created": 1756921360, "model": "llama3.2:3b-instruct-fp16", "object": "chat.completion.chunk", "service_tier": null, diff --git a/tests/integration/recordings/responses/6fbea1abca7c.json b/tests/integration/recordings/responses/6fbea1abca7c.json index 576fc7de1..c16fe1268 100644 --- a/tests/integration/recordings/responses/6fbea1abca7c.json +++ b/tests/integration/recordings/responses/6fbea1abca7c.json @@ -22,7 +22,7 @@ "__type__": "ollama._types.GenerateResponse", "__data__": { "model": "llama3.2:3b-instruct-fp16", - "created_at": "2025-08-01T23:14:20.337763Z", + "created_at": "2025-09-03T17:38:01.89965Z", "done": false, "done_reason": null, "total_duration": null, @@ -40,7 +40,7 @@ "__type__": "ollama._types.GenerateResponse", "__data__": { "model": "llama3.2:3b-instruct-fp16", - "created_at": "2025-08-01T23:14:20.394358Z", + "created_at": "2025-09-03T17:38:01.941253Z", "done": false, "done_reason": null, "total_duration": null, @@ -58,7 +58,7 @@ "__type__": "ollama._types.GenerateResponse", "__data__": { "model": "llama3.2:3b-instruct-fp16", - "created_at": "2025-08-01T23:14:20.451349Z", + "created_at": "2025-09-03T17:38:01.982621Z", "done": false, "done_reason": null, "total_duration": null, @@ -76,7 +76,7 @@ "__type__": "ollama._types.GenerateResponse", "__data__": { "model": "llama3.2:3b-instruct-fp16", - "created_at": "2025-08-01T23:14:20.504443Z", + "created_at": "2025-09-03T17:38:02.024144Z", "done": false, "done_reason": null, "total_duration": null, @@ -94,7 +94,7 @@ "__type__": "ollama._types.GenerateResponse", "__data__": { "model": "llama3.2:3b-instruct-fp16", - "created_at": "2025-08-01T23:14:20.555779Z", + "created_at": "2025-09-03T17:38:02.065495Z", "done": false, "done_reason": null, "total_duration": null, @@ -112,7 +112,7 @@ "__type__": "ollama._types.GenerateResponse", "__data__": { "model": "llama3.2:3b-instruct-fp16", - "created_at": "2025-08-01T23:14:20.607807Z", + "created_at": "2025-09-03T17:38:02.107529Z", "done": false, "done_reason": null, "total_duration": null, @@ -130,7 +130,7 @@ "__type__": "ollama._types.GenerateResponse", "__data__": { "model": "llama3.2:3b-instruct-fp16", - "created_at": "2025-08-01T23:14:20.660627Z", + "created_at": "2025-09-03T17:38:02.149217Z", "done": false, "done_reason": null, "total_duration": null, @@ -148,7 +148,7 @@ "__type__": "ollama._types.GenerateResponse", "__data__": { "model": "llama3.2:3b-instruct-fp16", - "created_at": "2025-08-01T23:14:20.711562Z", + "created_at": "2025-09-03T17:38:02.190357Z", "done": false, "done_reason": null, "total_duration": null, @@ -166,7 +166,7 @@ "__type__": "ollama._types.GenerateResponse", "__data__": { "model": "llama3.2:3b-instruct-fp16", - "created_at": "2025-08-01T23:14:20.761822Z", + "created_at": "2025-09-03T17:38:02.231501Z", "done": false, "done_reason": null, "total_duration": null, @@ -184,7 +184,7 @@ "__type__": "ollama._types.GenerateResponse", "__data__": { "model": "llama3.2:3b-instruct-fp16", - "created_at": "2025-08-01T23:14:20.81712Z", + "created_at": "2025-09-03T17:38:02.272546Z", "done": false, "done_reason": null, "total_duration": null, @@ -202,7 +202,7 @@ "__type__": "ollama._types.GenerateResponse", "__data__": { "model": "llama3.2:3b-instruct-fp16", - "created_at": "2025-08-01T23:14:20.868755Z", + "created_at": "2025-09-03T17:38:02.313561Z", "done": false, "done_reason": null, "total_duration": null, @@ -220,7 +220,7 @@ "__type__": "ollama._types.GenerateResponse", "__data__": { "model": "llama3.2:3b-instruct-fp16", - "created_at": "2025-08-01T23:14:20.921049Z", + "created_at": "2025-09-03T17:38:02.354563Z", "done": false, "done_reason": null, "total_duration": null, @@ -238,7 +238,7 @@ "__type__": "ollama._types.GenerateResponse", "__data__": { "model": "llama3.2:3b-instruct-fp16", - "created_at": "2025-08-01T23:14:20.973584Z", + "created_at": "2025-09-03T17:38:02.395585Z", "done": false, "done_reason": null, "total_duration": null, @@ -256,7 +256,7 @@ "__type__": "ollama._types.GenerateResponse", "__data__": { "model": "llama3.2:3b-instruct-fp16", - "created_at": "2025-08-01T23:14:21.030707Z", + "created_at": "2025-09-03T17:38:02.436854Z", "done": false, "done_reason": null, "total_duration": null, @@ -274,7 +274,7 @@ "__type__": "ollama._types.GenerateResponse", "__data__": { "model": "llama3.2:3b-instruct-fp16", - "created_at": "2025-08-01T23:14:21.082015Z", + "created_at": "2025-09-03T17:38:02.47814Z", "done": false, "done_reason": null, "total_duration": null, @@ -292,7 +292,7 @@ "__type__": "ollama._types.GenerateResponse", "__data__": { "model": "llama3.2:3b-instruct-fp16", - "created_at": "2025-08-01T23:14:21.132945Z", + "created_at": "2025-09-03T17:38:02.519661Z", "done": false, "done_reason": null, "total_duration": null, @@ -310,7 +310,7 @@ "__type__": "ollama._types.GenerateResponse", "__data__": { "model": "llama3.2:3b-instruct-fp16", - "created_at": "2025-08-01T23:14:21.187452Z", + "created_at": "2025-09-03T17:38:02.561119Z", "done": false, "done_reason": null, "total_duration": null, @@ -328,7 +328,7 @@ "__type__": "ollama._types.GenerateResponse", "__data__": { "model": "llama3.2:3b-instruct-fp16", - "created_at": "2025-08-01T23:14:21.239827Z", + "created_at": "2025-09-03T17:38:02.602821Z", "done": false, "done_reason": null, "total_duration": null, @@ -346,15 +346,15 @@ "__type__": "ollama._types.GenerateResponse", "__data__": { "model": "llama3.2:3b-instruct-fp16", - "created_at": "2025-08-01T23:14:21.294154Z", + "created_at": "2025-09-03T17:38:02.644633Z", "done": true, "done_reason": "stop", - "total_duration": 1929211666, - "load_duration": 61298666, + "total_duration": 1375629459, + "load_duration": 94090250, "prompt_eval_count": 386, - "prompt_eval_duration": 908000000, + "prompt_eval_duration": 535119167, "eval_count": 19, - "eval_duration": 959000000, + "eval_duration": 745684041, "response": "", "thinking": null, "context": null diff --git a/tests/integration/recordings/responses/6fe1d4fedf12.json b/tests/integration/recordings/responses/6fe1d4fedf12.json index 733c7bd55..8fd079a85 100644 --- a/tests/integration/recordings/responses/6fe1d4fedf12.json +++ b/tests/integration/recordings/responses/6fe1d4fedf12.json @@ -1,7 +1,7 @@ { "request": { "method": "POST", - "url": "http://localhost:11434/v1/v1/chat/completions", + "url": "http://0.0.0.0:11434/v1/v1/chat/completions", "headers": {}, "body": { "model": "llama3.2:3b-instruct-fp16", @@ -24,7 +24,7 @@ { "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", "__data__": { - "id": "chatcmpl-381", + "id": "chatcmpl-358", "choices": [ { "delta": { @@ -39,7 +39,7 @@ "logprobs": null } ], - "created": 1755228961, + "created": 1756921324, "model": "llama3.2:3b-instruct-fp16", "object": "chat.completion.chunk", "service_tier": null, @@ -50,11 +50,11 @@ { "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", "__data__": { - "id": "chatcmpl-381", + "id": "chatcmpl-358", "choices": [ { "delta": { - "content": " don", + "content": "'m", "function_call": null, "refusal": null, "role": "assistant", @@ -65,7 +65,7 @@ "logprobs": null } ], - "created": 1755228961, + "created": 1756921324, "model": "llama3.2:3b-instruct-fp16", "object": "chat.completion.chunk", "service_tier": null, @@ -76,11 +76,11 @@ { "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", "__data__": { - "id": "chatcmpl-381", + "id": "chatcmpl-358", "choices": [ { "delta": { - "content": "'t", + "content": " not", "function_call": null, "refusal": null, "role": "assistant", @@ -91,7 +91,7 @@ "logprobs": null } ], - "created": 1755228961, + "created": 1756921324, "model": "llama3.2:3b-instruct-fp16", "object": "chat.completion.chunk", "service_tier": null, @@ -102,11 +102,11 @@ { "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", "__data__": { - "id": "chatcmpl-381", + "id": "chatcmpl-358", "choices": [ { "delta": { - "content": " have", + "content": " able", "function_call": null, "refusal": null, "role": "assistant", @@ -117,7 +117,7 @@ "logprobs": null } ], - "created": 1755228961, + "created": 1756921324, "model": "llama3.2:3b-instruct-fp16", "object": "chat.completion.chunk", "service_tier": null, @@ -128,85 +128,7 @@ { "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", "__data__": { - "id": "chatcmpl-381", - "choices": [ - { - "delta": { - "content": " real", - "function_call": null, - "refusal": null, - "role": "assistant", - "tool_calls": null - }, - "finish_reason": null, - "index": 0, - "logprobs": null - } - ], - "created": 1755228961, - "model": "llama3.2:3b-instruct-fp16", - "object": "chat.completion.chunk", - "service_tier": null, - "system_fingerprint": "fp_ollama", - "usage": null - } - }, - { - "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", - "__data__": { - "id": "chatcmpl-381", - "choices": [ - { - "delta": { - "content": "-time", - "function_call": null, - "refusal": null, - "role": "assistant", - "tool_calls": null - }, - "finish_reason": null, - "index": 0, - "logprobs": null - } - ], - "created": 1755228961, - "model": "llama3.2:3b-instruct-fp16", - "object": "chat.completion.chunk", - "service_tier": null, - "system_fingerprint": "fp_ollama", - "usage": null - } - }, - { - "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", - "__data__": { - "id": "chatcmpl-381", - "choices": [ - { - "delta": { - "content": " access", - "function_call": null, - "refusal": null, - "role": "assistant", - "tool_calls": null - }, - "finish_reason": null, - "index": 0, - "logprobs": null - } - ], - "created": 1755228961, - "model": "llama3.2:3b-instruct-fp16", - "object": "chat.completion.chunk", - "service_tier": null, - "system_fingerprint": "fp_ollama", - "usage": null - } - }, - { - "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", - "__data__": { - "id": "chatcmpl-381", + "id": "chatcmpl-358", "choices": [ { "delta": { @@ -221,7 +143,7 @@ "logprobs": null } ], - "created": 1755228962, + "created": 1756921324, "model": "llama3.2:3b-instruct-fp16", "object": "chat.completion.chunk", "service_tier": null, @@ -232,215 +154,7 @@ { "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", "__data__": { - "id": "chatcmpl-381", - "choices": [ - { - "delta": { - "content": " current", - "function_call": null, - "refusal": null, - "role": "assistant", - "tool_calls": null - }, - "finish_reason": null, - "index": 0, - "logprobs": null - } - ], - "created": 1755228962, - "model": "llama3.2:3b-instruct-fp16", - "object": "chat.completion.chunk", - "service_tier": null, - "system_fingerprint": "fp_ollama", - "usage": null - } - }, - { - "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", - "__data__": { - "id": "chatcmpl-381", - "choices": [ - { - "delta": { - "content": " weather", - "function_call": null, - "refusal": null, - "role": "assistant", - "tool_calls": null - }, - "finish_reason": null, - "index": 0, - "logprobs": null - } - ], - "created": 1755228962, - "model": "llama3.2:3b-instruct-fp16", - "object": "chat.completion.chunk", - "service_tier": null, - "system_fingerprint": "fp_ollama", - "usage": null - } - }, - { - "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", - "__data__": { - "id": "chatcmpl-381", - "choices": [ - { - "delta": { - "content": " conditions", - "function_call": null, - "refusal": null, - "role": "assistant", - "tool_calls": null - }, - "finish_reason": null, - "index": 0, - "logprobs": null - } - ], - "created": 1755228962, - "model": "llama3.2:3b-instruct-fp16", - "object": "chat.completion.chunk", - "service_tier": null, - "system_fingerprint": "fp_ollama", - "usage": null - } - }, - { - "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", - "__data__": { - "id": "chatcmpl-381", - "choices": [ - { - "delta": { - "content": ".", - "function_call": null, - "refusal": null, - "role": "assistant", - "tool_calls": null - }, - "finish_reason": null, - "index": 0, - "logprobs": null - } - ], - "created": 1755228962, - "model": "llama3.2:3b-instruct-fp16", - "object": "chat.completion.chunk", - "service_tier": null, - "system_fingerprint": "fp_ollama", - "usage": null - } - }, - { - "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", - "__data__": { - "id": "chatcmpl-381", - "choices": [ - { - "delta": { - "content": " However", - "function_call": null, - "refusal": null, - "role": "assistant", - "tool_calls": null - }, - "finish_reason": null, - "index": 0, - "logprobs": null - } - ], - "created": 1755228962, - "model": "llama3.2:3b-instruct-fp16", - "object": "chat.completion.chunk", - "service_tier": null, - "system_fingerprint": "fp_ollama", - "usage": null - } - }, - { - "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", - "__data__": { - "id": "chatcmpl-381", - "choices": [ - { - "delta": { - "content": ",", - "function_call": null, - "refusal": null, - "role": "assistant", - "tool_calls": null - }, - "finish_reason": null, - "index": 0, - "logprobs": null - } - ], - "created": 1755228962, - "model": "llama3.2:3b-instruct-fp16", - "object": "chat.completion.chunk", - "service_tier": null, - "system_fingerprint": "fp_ollama", - "usage": null - } - }, - { - "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", - "__data__": { - "id": "chatcmpl-381", - "choices": [ - { - "delta": { - "content": " I", - "function_call": null, - "refusal": null, - "role": "assistant", - "tool_calls": null - }, - "finish_reason": null, - "index": 0, - "logprobs": null - } - ], - "created": 1755228962, - "model": "llama3.2:3b-instruct-fp16", - "object": "chat.completion.chunk", - "service_tier": null, - "system_fingerprint": "fp_ollama", - "usage": null - } - }, - { - "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", - "__data__": { - "id": "chatcmpl-381", - "choices": [ - { - "delta": { - "content": " can", - "function_call": null, - "refusal": null, - "role": "assistant", - "tool_calls": null - }, - "finish_reason": null, - "index": 0, - "logprobs": null - } - ], - "created": 1755228962, - "model": "llama3.2:3b-instruct-fp16", - "object": "chat.completion.chunk", - "service_tier": null, - "system_fingerprint": "fp_ollama", - "usage": null - } - }, - { - "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", - "__data__": { - "id": "chatcmpl-381", + "id": "chatcmpl-358", "choices": [ { "delta": { @@ -455,7 +169,7 @@ "logprobs": null } ], - "created": 1755228962, + "created": 1756921324, "model": "llama3.2:3b-instruct-fp16", "object": "chat.completion.chunk", "service_tier": null, @@ -466,11 +180,11 @@ { "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", "__data__": { - "id": "chatcmpl-381", + "id": "chatcmpl-358", "choices": [ { "delta": { - "content": " you", + "content": " real", "function_call": null, "refusal": null, "role": "assistant", @@ -481,7 +195,7 @@ "logprobs": null } ], - "created": 1755228962, + "created": 1756921324, "model": "llama3.2:3b-instruct-fp16", "object": "chat.completion.chunk", "service_tier": null, @@ -492,11 +206,11 @@ { "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", "__data__": { - "id": "chatcmpl-381", + "id": "chatcmpl-358", "choices": [ { "delta": { - "content": " with", + "content": "-time", "function_call": null, "refusal": null, "role": "assistant", @@ -507,7 +221,7 @@ "logprobs": null } ], - "created": 1755228962, + "created": 1756921324, "model": "llama3.2:3b-instruct-fp16", "object": "chat.completion.chunk", "service_tier": null, @@ -518,189 +232,7 @@ { "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", "__data__": { - "id": "chatcmpl-381", - "choices": [ - { - "delta": { - "content": " information", - "function_call": null, - "refusal": null, - "role": "assistant", - "tool_calls": null - }, - "finish_reason": null, - "index": 0, - "logprobs": null - } - ], - "created": 1755228962, - "model": "llama3.2:3b-instruct-fp16", - "object": "chat.completion.chunk", - "service_tier": null, - "system_fingerprint": "fp_ollama", - "usage": null - } - }, - { - "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", - "__data__": { - "id": "chatcmpl-381", - "choices": [ - { - "delta": { - "content": " on", - "function_call": null, - "refusal": null, - "role": "assistant", - "tool_calls": null - }, - "finish_reason": null, - "index": 0, - "logprobs": null - } - ], - "created": 1755228962, - "model": "llama3.2:3b-instruct-fp16", - "object": "chat.completion.chunk", - "service_tier": null, - "system_fingerprint": "fp_ollama", - "usage": null - } - }, - { - "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", - "__data__": { - "id": "chatcmpl-381", - "choices": [ - { - "delta": { - "content": " the", - "function_call": null, - "refusal": null, - "role": "assistant", - "tool_calls": null - }, - "finish_reason": null, - "index": 0, - "logprobs": null - } - ], - "created": 1755228962, - "model": "llama3.2:3b-instruct-fp16", - "object": "chat.completion.chunk", - "service_tier": null, - "system_fingerprint": "fp_ollama", - "usage": null - } - }, - { - "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", - "__data__": { - "id": "chatcmpl-381", - "choices": [ - { - "delta": { - "content": " typical", - "function_call": null, - "refusal": null, - "role": "assistant", - "tool_calls": null - }, - "finish_reason": null, - "index": 0, - "logprobs": null - } - ], - "created": 1755228962, - "model": "llama3.2:3b-instruct-fp16", - "object": "chat.completion.chunk", - "service_tier": null, - "system_fingerprint": "fp_ollama", - "usage": null - } - }, - { - "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", - "__data__": { - "id": "chatcmpl-381", - "choices": [ - { - "delta": { - "content": " climate", - "function_call": null, - "refusal": null, - "role": "assistant", - "tool_calls": null - }, - "finish_reason": null, - "index": 0, - "logprobs": null - } - ], - "created": 1755228962, - "model": "llama3.2:3b-instruct-fp16", - "object": "chat.completion.chunk", - "service_tier": null, - "system_fingerprint": "fp_ollama", - "usage": null - } - }, - { - "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", - "__data__": { - "id": "chatcmpl-381", - "choices": [ - { - "delta": { - "content": " of", - "function_call": null, - "refusal": null, - "role": "assistant", - "tool_calls": null - }, - "finish_reason": null, - "index": 0, - "logprobs": null - } - ], - "created": 1755228962, - "model": "llama3.2:3b-instruct-fp16", - "object": "chat.completion.chunk", - "service_tier": null, - "system_fingerprint": "fp_ollama", - "usage": null - } - }, - { - "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", - "__data__": { - "id": "chatcmpl-381", - "choices": [ - { - "delta": { - "content": " Tokyo", - "function_call": null, - "refusal": null, - "role": "assistant", - "tool_calls": null - }, - "finish_reason": null, - "index": 0, - "logprobs": null - } - ], - "created": 1755228962, - "model": "llama3.2:3b-instruct-fp16", - "object": "chat.completion.chunk", - "service_tier": null, - "system_fingerprint": "fp_ollama", - "usage": null - } - }, - { - "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", - "__data__": { - "id": "chatcmpl-381", + "id": "chatcmpl-358", "choices": [ { "delta": { @@ -715,7 +247,7 @@ "logprobs": null } ], - "created": 1755228962, + "created": 1756921324, "model": "llama3.2:3b-instruct-fp16", "object": "chat.completion.chunk", "service_tier": null, @@ -726,215 +258,7 @@ { "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", "__data__": { - "id": "chatcmpl-381", - "choices": [ - { - "delta": { - "content": " suggest", - "function_call": null, - "refusal": null, - "role": "assistant", - "tool_calls": null - }, - "finish_reason": null, - "index": 0, - "logprobs": null - } - ], - "created": 1755228962, - "model": "llama3.2:3b-instruct-fp16", - "object": "chat.completion.chunk", - "service_tier": null, - "system_fingerprint": "fp_ollama", - "usage": null - } - }, - { - "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", - "__data__": { - "id": "chatcmpl-381", - "choices": [ - { - "delta": { - "content": " ways", - "function_call": null, - "refusal": null, - "role": "assistant", - "tool_calls": null - }, - "finish_reason": null, - "index": 0, - "logprobs": null - } - ], - "created": 1755228962, - "model": "llama3.2:3b-instruct-fp16", - "object": "chat.completion.chunk", - "service_tier": null, - "system_fingerprint": "fp_ollama", - "usage": null - } - }, - { - "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", - "__data__": { - "id": "chatcmpl-381", - "choices": [ - { - "delta": { - "content": " for", - "function_call": null, - "refusal": null, - "role": "assistant", - "tool_calls": null - }, - "finish_reason": null, - "index": 0, - "logprobs": null - } - ], - "created": 1755228962, - "model": "llama3.2:3b-instruct-fp16", - "object": "chat.completion.chunk", - "service_tier": null, - "system_fingerprint": "fp_ollama", - "usage": null - } - }, - { - "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", - "__data__": { - "id": "chatcmpl-381", - "choices": [ - { - "delta": { - "content": " you", - "function_call": null, - "refusal": null, - "role": "assistant", - "tool_calls": null - }, - "finish_reason": null, - "index": 0, - "logprobs": null - } - ], - "created": 1755228962, - "model": "llama3.2:3b-instruct-fp16", - "object": "chat.completion.chunk", - "service_tier": null, - "system_fingerprint": "fp_ollama", - "usage": null - } - }, - { - "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", - "__data__": { - "id": "chatcmpl-381", - "choices": [ - { - "delta": { - "content": " to", - "function_call": null, - "refusal": null, - "role": "assistant", - "tool_calls": null - }, - "finish_reason": null, - "index": 0, - "logprobs": null - } - ], - "created": 1755228963, - "model": "llama3.2:3b-instruct-fp16", - "object": "chat.completion.chunk", - "service_tier": null, - "system_fingerprint": "fp_ollama", - "usage": null - } - }, - { - "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", - "__data__": { - "id": "chatcmpl-381", - "choices": [ - { - "delta": { - "content": " find", - "function_call": null, - "refusal": null, - "role": "assistant", - "tool_calls": null - }, - "finish_reason": null, - "index": 0, - "logprobs": null - } - ], - "created": 1755228963, - "model": "llama3.2:3b-instruct-fp16", - "object": "chat.completion.chunk", - "service_tier": null, - "system_fingerprint": "fp_ollama", - "usage": null - } - }, - { - "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", - "__data__": { - "id": "chatcmpl-381", - "choices": [ - { - "delta": { - "content": " out", - "function_call": null, - "refusal": null, - "role": "assistant", - "tool_calls": null - }, - "finish_reason": null, - "index": 0, - "logprobs": null - } - ], - "created": 1755228963, - "model": "llama3.2:3b-instruct-fp16", - "object": "chat.completion.chunk", - "service_tier": null, - "system_fingerprint": "fp_ollama", - "usage": null - } - }, - { - "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", - "__data__": { - "id": "chatcmpl-381", - "choices": [ - { - "delta": { - "content": " the", - "function_call": null, - "refusal": null, - "role": "assistant", - "tool_calls": null - }, - "finish_reason": null, - "index": 0, - "logprobs": null - } - ], - "created": 1755228963, - "model": "llama3.2:3b-instruct-fp16", - "object": "chat.completion.chunk", - "service_tier": null, - "system_fingerprint": "fp_ollama", - "usage": null - } - }, - { - "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", - "__data__": { - "id": "chatcmpl-381", + "id": "chatcmpl-358", "choices": [ { "delta": { @@ -949,7 +273,7 @@ "logprobs": null } ], - "created": 1755228963, + "created": 1756921324, "model": "llama3.2:3b-instruct-fp16", "object": "chat.completion.chunk", "service_tier": null, @@ -960,7 +284,7 @@ { "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", "__data__": { - "id": "chatcmpl-381", + "id": "chatcmpl-358", "choices": [ { "delta": { @@ -975,7 +299,7 @@ "logprobs": null } ], - "created": 1755228963, + "created": 1756921324, "model": "llama3.2:3b-instruct-fp16", "object": "chat.completion.chunk", "service_tier": null, @@ -986,11 +310,11 @@ { "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", "__data__": { - "id": "chatcmpl-381", + "id": "chatcmpl-358", "choices": [ { "delta": { - "content": ".\n\n", + "content": " information", "function_call": null, "refusal": null, "role": "assistant", @@ -1001,7 +325,7 @@ "logprobs": null } ], - "created": 1755228963, + "created": 1756921325, "model": "llama3.2:3b-instruct-fp16", "object": "chat.completion.chunk", "service_tier": null, @@ -1012,657 +336,7 @@ { "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", "__data__": { - "id": "chatcmpl-381", - "choices": [ - { - "delta": { - "content": "Tok", - "function_call": null, - "refusal": null, - "role": "assistant", - "tool_calls": null - }, - "finish_reason": null, - "index": 0, - "logprobs": null - } - ], - "created": 1755228963, - "model": "llama3.2:3b-instruct-fp16", - "object": "chat.completion.chunk", - "service_tier": null, - "system_fingerprint": "fp_ollama", - "usage": null - } - }, - { - "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", - "__data__": { - "id": "chatcmpl-381", - "choices": [ - { - "delta": { - "content": "yo", - "function_call": null, - "refusal": null, - "role": "assistant", - "tool_calls": null - }, - "finish_reason": null, - "index": 0, - "logprobs": null - } - ], - "created": 1755228963, - "model": "llama3.2:3b-instruct-fp16", - "object": "chat.completion.chunk", - "service_tier": null, - "system_fingerprint": "fp_ollama", - "usage": null - } - }, - { - "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", - "__data__": { - "id": "chatcmpl-381", - "choices": [ - { - "delta": { - "content": " has", - "function_call": null, - "refusal": null, - "role": "assistant", - "tool_calls": null - }, - "finish_reason": null, - "index": 0, - "logprobs": null - } - ], - "created": 1755228963, - "model": "llama3.2:3b-instruct-fp16", - "object": "chat.completion.chunk", - "service_tier": null, - "system_fingerprint": "fp_ollama", - "usage": null - } - }, - { - "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", - "__data__": { - "id": "chatcmpl-381", - "choices": [ - { - "delta": { - "content": " a", - "function_call": null, - "refusal": null, - "role": "assistant", - "tool_calls": null - }, - "finish_reason": null, - "index": 0, - "logprobs": null - } - ], - "created": 1755228963, - "model": "llama3.2:3b-instruct-fp16", - "object": "chat.completion.chunk", - "service_tier": null, - "system_fingerprint": "fp_ollama", - "usage": null - } - }, - { - "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", - "__data__": { - "id": "chatcmpl-381", - "choices": [ - { - "delta": { - "content": " humid", - "function_call": null, - "refusal": null, - "role": "assistant", - "tool_calls": null - }, - "finish_reason": null, - "index": 0, - "logprobs": null - } - ], - "created": 1755228963, - "model": "llama3.2:3b-instruct-fp16", - "object": "chat.completion.chunk", - "service_tier": null, - "system_fingerprint": "fp_ollama", - "usage": null - } - }, - { - "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", - "__data__": { - "id": "chatcmpl-381", - "choices": [ - { - "delta": { - "content": " subt", - "function_call": null, - "refusal": null, - "role": "assistant", - "tool_calls": null - }, - "finish_reason": null, - "index": 0, - "logprobs": null - } - ], - "created": 1755228963, - "model": "llama3.2:3b-instruct-fp16", - "object": "chat.completion.chunk", - "service_tier": null, - "system_fingerprint": "fp_ollama", - "usage": null - } - }, - { - "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", - "__data__": { - "id": "chatcmpl-381", - "choices": [ - { - "delta": { - "content": "ropical", - "function_call": null, - "refusal": null, - "role": "assistant", - "tool_calls": null - }, - "finish_reason": null, - "index": 0, - "logprobs": null - } - ], - "created": 1755228963, - "model": "llama3.2:3b-instruct-fp16", - "object": "chat.completion.chunk", - "service_tier": null, - "system_fingerprint": "fp_ollama", - "usage": null - } - }, - { - "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", - "__data__": { - "id": "chatcmpl-381", - "choices": [ - { - "delta": { - "content": " climate", - "function_call": null, - "refusal": null, - "role": "assistant", - "tool_calls": null - }, - "finish_reason": null, - "index": 0, - "logprobs": null - } - ], - "created": 1755228963, - "model": "llama3.2:3b-instruct-fp16", - "object": "chat.completion.chunk", - "service_tier": null, - "system_fingerprint": "fp_ollama", - "usage": null - } - }, - { - "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", - "__data__": { - "id": "chatcmpl-381", - "choices": [ - { - "delta": { - "content": ",", - "function_call": null, - "refusal": null, - "role": "assistant", - "tool_calls": null - }, - "finish_reason": null, - "index": 0, - "logprobs": null - } - ], - "created": 1755228963, - "model": "llama3.2:3b-instruct-fp16", - "object": "chat.completion.chunk", - "service_tier": null, - "system_fingerprint": "fp_ollama", - "usage": null - } - }, - { - "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", - "__data__": { - "id": "chatcmpl-381", - "choices": [ - { - "delta": { - "content": " characterized", - "function_call": null, - "refusal": null, - "role": "assistant", - "tool_calls": null - }, - "finish_reason": null, - "index": 0, - "logprobs": null - } - ], - "created": 1755228963, - "model": "llama3.2:3b-instruct-fp16", - "object": "chat.completion.chunk", - "service_tier": null, - "system_fingerprint": "fp_ollama", - "usage": null - } - }, - { - "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", - "__data__": { - "id": "chatcmpl-381", - "choices": [ - { - "delta": { - "content": " by", - "function_call": null, - "refusal": null, - "role": "assistant", - "tool_calls": null - }, - "finish_reason": null, - "index": 0, - "logprobs": null - } - ], - "created": 1755228963, - "model": "llama3.2:3b-instruct-fp16", - "object": "chat.completion.chunk", - "service_tier": null, - "system_fingerprint": "fp_ollama", - "usage": null - } - }, - { - "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", - "__data__": { - "id": "chatcmpl-381", - "choices": [ - { - "delta": { - "content": " hot", - "function_call": null, - "refusal": null, - "role": "assistant", - "tool_calls": null - }, - "finish_reason": null, - "index": 0, - "logprobs": null - } - ], - "created": 1755228963, - "model": "llama3.2:3b-instruct-fp16", - "object": "chat.completion.chunk", - "service_tier": null, - "system_fingerprint": "fp_ollama", - "usage": null - } - }, - { - "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", - "__data__": { - "id": "chatcmpl-381", - "choices": [ - { - "delta": { - "content": " and", - "function_call": null, - "refusal": null, - "role": "assistant", - "tool_calls": null - }, - "finish_reason": null, - "index": 0, - "logprobs": null - } - ], - "created": 1755228963, - "model": "llama3.2:3b-instruct-fp16", - "object": "chat.completion.chunk", - "service_tier": null, - "system_fingerprint": "fp_ollama", - "usage": null - } - }, - { - "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", - "__data__": { - "id": "chatcmpl-381", - "choices": [ - { - "delta": { - "content": " humid", - "function_call": null, - "refusal": null, - "role": "assistant", - "tool_calls": null - }, - "finish_reason": null, - "index": 0, - "logprobs": null - } - ], - "created": 1755228963, - "model": "llama3.2:3b-instruct-fp16", - "object": "chat.completion.chunk", - "service_tier": null, - "system_fingerprint": "fp_ollama", - "usage": null - } - }, - { - "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", - "__data__": { - "id": "chatcmpl-381", - "choices": [ - { - "delta": { - "content": " summers", - "function_call": null, - "refusal": null, - "role": "assistant", - "tool_calls": null - }, - "finish_reason": null, - "index": 0, - "logprobs": null - } - ], - "created": 1755228963, - "model": "llama3.2:3b-instruct-fp16", - "object": "chat.completion.chunk", - "service_tier": null, - "system_fingerprint": "fp_ollama", - "usage": null - } - }, - { - "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", - "__data__": { - "id": "chatcmpl-381", - "choices": [ - { - "delta": { - "content": ",", - "function_call": null, - "refusal": null, - "role": "assistant", - "tool_calls": null - }, - "finish_reason": null, - "index": 0, - "logprobs": null - } - ], - "created": 1755228963, - "model": "llama3.2:3b-instruct-fp16", - "object": "chat.completion.chunk", - "service_tier": null, - "system_fingerprint": "fp_ollama", - "usage": null - } - }, - { - "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", - "__data__": { - "id": "chatcmpl-381", - "choices": [ - { - "delta": { - "content": " mild", - "function_call": null, - "refusal": null, - "role": "assistant", - "tool_calls": null - }, - "finish_reason": null, - "index": 0, - "logprobs": null - } - ], - "created": 1755228963, - "model": "llama3.2:3b-instruct-fp16", - "object": "chat.completion.chunk", - "service_tier": null, - "system_fingerprint": "fp_ollama", - "usage": null - } - }, - { - "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", - "__data__": { - "id": "chatcmpl-381", - "choices": [ - { - "delta": { - "content": " winters", - "function_call": null, - "refusal": null, - "role": "assistant", - "tool_calls": null - }, - "finish_reason": null, - "index": 0, - "logprobs": null - } - ], - "created": 1755228964, - "model": "llama3.2:3b-instruct-fp16", - "object": "chat.completion.chunk", - "service_tier": null, - "system_fingerprint": "fp_ollama", - "usage": null - } - }, - { - "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", - "__data__": { - "id": "chatcmpl-381", - "choices": [ - { - "delta": { - "content": ",", - "function_call": null, - "refusal": null, - "role": "assistant", - "tool_calls": null - }, - "finish_reason": null, - "index": 0, - "logprobs": null - } - ], - "created": 1755228964, - "model": "llama3.2:3b-instruct-fp16", - "object": "chat.completion.chunk", - "service_tier": null, - "system_fingerprint": "fp_ollama", - "usage": null - } - }, - { - "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", - "__data__": { - "id": "chatcmpl-381", - "choices": [ - { - "delta": { - "content": " and", - "function_call": null, - "refusal": null, - "role": "assistant", - "tool_calls": null - }, - "finish_reason": null, - "index": 0, - "logprobs": null - } - ], - "created": 1755228964, - "model": "llama3.2:3b-instruct-fp16", - "object": "chat.completion.chunk", - "service_tier": null, - "system_fingerprint": "fp_ollama", - "usage": null - } - }, - { - "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", - "__data__": { - "id": "chatcmpl-381", - "choices": [ - { - "delta": { - "content": " moderate", - "function_call": null, - "refusal": null, - "role": "assistant", - "tool_calls": null - }, - "finish_reason": null, - "index": 0, - "logprobs": null - } - ], - "created": 1755228964, - "model": "llama3.2:3b-instruct-fp16", - "object": "chat.completion.chunk", - "service_tier": null, - "system_fingerprint": "fp_ollama", - "usage": null - } - }, - { - "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", - "__data__": { - "id": "chatcmpl-381", - "choices": [ - { - "delta": { - "content": " spring", - "function_call": null, - "refusal": null, - "role": "assistant", - "tool_calls": null - }, - "finish_reason": null, - "index": 0, - "logprobs": null - } - ], - "created": 1755228964, - "model": "llama3.2:3b-instruct-fp16", - "object": "chat.completion.chunk", - "service_tier": null, - "system_fingerprint": "fp_ollama", - "usage": null - } - }, - { - "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", - "__data__": { - "id": "chatcmpl-381", - "choices": [ - { - "delta": { - "content": " and", - "function_call": null, - "refusal": null, - "role": "assistant", - "tool_calls": null - }, - "finish_reason": null, - "index": 0, - "logprobs": null - } - ], - "created": 1755228964, - "model": "llama3.2:3b-instruct-fp16", - "object": "chat.completion.chunk", - "service_tier": null, - "system_fingerprint": "fp_ollama", - "usage": null - } - }, - { - "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", - "__data__": { - "id": "chatcmpl-381", - "choices": [ - { - "delta": { - "content": " autumn", - "function_call": null, - "refusal": null, - "role": "assistant", - "tool_calls": null - }, - "finish_reason": null, - "index": 0, - "logprobs": null - } - ], - "created": 1755228964, - "model": "llama3.2:3b-instruct-fp16", - "object": "chat.completion.chunk", - "service_tier": null, - "system_fingerprint": "fp_ollama", - "usage": null - } - }, - { - "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", - "__data__": { - "id": "chatcmpl-381", - "choices": [ - { - "delta": { - "content": " seasons", - "function_call": null, - "refusal": null, - "role": "assistant", - "tool_calls": null - }, - "finish_reason": null, - "index": 0, - "logprobs": null - } - ], - "created": 1755228964, - "model": "llama3.2:3b-instruct-fp16", - "object": "chat.completion.chunk", - "service_tier": null, - "system_fingerprint": "fp_ollama", - "usage": null - } - }, - { - "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", - "__data__": { - "id": "chatcmpl-381", + "id": "chatcmpl-358", "choices": [ { "delta": { @@ -1677,7 +351,7 @@ "logprobs": null } ], - "created": 1755228964, + "created": 1756921325, "model": "llama3.2:3b-instruct-fp16", "object": "chat.completion.chunk", "service_tier": null, @@ -1688,11 +362,11 @@ { "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", "__data__": { - "id": "chatcmpl-381", + "id": "chatcmpl-358", "choices": [ { "delta": { - "content": " Here", + "content": " However", "function_call": null, "refusal": null, "role": "assistant", @@ -1703,7 +377,7 @@ "logprobs": null } ], - "created": 1755228964, + "created": 1756921325, "model": "llama3.2:3b-instruct-fp16", "object": "chat.completion.chunk", "service_tier": null, @@ -1714,527 +388,7 @@ { "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", "__data__": { - "id": "chatcmpl-381", - "choices": [ - { - "delta": { - "content": "'s", - "function_call": null, - "refusal": null, - "role": "assistant", - "tool_calls": null - }, - "finish_reason": null, - "index": 0, - "logprobs": null - } - ], - "created": 1755228964, - "model": "llama3.2:3b-instruct-fp16", - "object": "chat.completion.chunk", - "service_tier": null, - "system_fingerprint": "fp_ollama", - "usage": null - } - }, - { - "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", - "__data__": { - "id": "chatcmpl-381", - "choices": [ - { - "delta": { - "content": " a", - "function_call": null, - "refusal": null, - "role": "assistant", - "tool_calls": null - }, - "finish_reason": null, - "index": 0, - "logprobs": null - } - ], - "created": 1755228964, - "model": "llama3.2:3b-instruct-fp16", - "object": "chat.completion.chunk", - "service_tier": null, - "system_fingerprint": "fp_ollama", - "usage": null - } - }, - { - "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", - "__data__": { - "id": "chatcmpl-381", - "choices": [ - { - "delta": { - "content": " general", - "function_call": null, - "refusal": null, - "role": "assistant", - "tool_calls": null - }, - "finish_reason": null, - "index": 0, - "logprobs": null - } - ], - "created": 1755228964, - "model": "llama3.2:3b-instruct-fp16", - "object": "chat.completion.chunk", - "service_tier": null, - "system_fingerprint": "fp_ollama", - "usage": null - } - }, - { - "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", - "__data__": { - "id": "chatcmpl-381", - "choices": [ - { - "delta": { - "content": " idea", - "function_call": null, - "refusal": null, - "role": "assistant", - "tool_calls": null - }, - "finish_reason": null, - "index": 0, - "logprobs": null - } - ], - "created": 1755228964, - "model": "llama3.2:3b-instruct-fp16", - "object": "chat.completion.chunk", - "service_tier": null, - "system_fingerprint": "fp_ollama", - "usage": null - } - }, - { - "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", - "__data__": { - "id": "chatcmpl-381", - "choices": [ - { - "delta": { - "content": " of", - "function_call": null, - "refusal": null, - "role": "assistant", - "tool_calls": null - }, - "finish_reason": null, - "index": 0, - "logprobs": null - } - ], - "created": 1755228964, - "model": "llama3.2:3b-instruct-fp16", - "object": "chat.completion.chunk", - "service_tier": null, - "system_fingerprint": "fp_ollama", - "usage": null - } - }, - { - "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", - "__data__": { - "id": "chatcmpl-381", - "choices": [ - { - "delta": { - "content": " what", - "function_call": null, - "refusal": null, - "role": "assistant", - "tool_calls": null - }, - "finish_reason": null, - "index": 0, - "logprobs": null - } - ], - "created": 1755228964, - "model": "llama3.2:3b-instruct-fp16", - "object": "chat.completion.chunk", - "service_tier": null, - "system_fingerprint": "fp_ollama", - "usage": null - } - }, - { - "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", - "__data__": { - "id": "chatcmpl-381", - "choices": [ - { - "delta": { - "content": " you", - "function_call": null, - "refusal": null, - "role": "assistant", - "tool_calls": null - }, - "finish_reason": null, - "index": 0, - "logprobs": null - } - ], - "created": 1755228964, - "model": "llama3.2:3b-instruct-fp16", - "object": "chat.completion.chunk", - "service_tier": null, - "system_fingerprint": "fp_ollama", - "usage": null - } - }, - { - "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", - "__data__": { - "id": "chatcmpl-381", - "choices": [ - { - "delta": { - "content": " might", - "function_call": null, - "refusal": null, - "role": "assistant", - "tool_calls": null - }, - "finish_reason": null, - "index": 0, - "logprobs": null - } - ], - "created": 1755228964, - "model": "llama3.2:3b-instruct-fp16", - "object": "chat.completion.chunk", - "service_tier": null, - "system_fingerprint": "fp_ollama", - "usage": null - } - }, - { - "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", - "__data__": { - "id": "chatcmpl-381", - "choices": [ - { - "delta": { - "content": " expect", - "function_call": null, - "refusal": null, - "role": "assistant", - "tool_calls": null - }, - "finish_reason": null, - "index": 0, - "logprobs": null - } - ], - "created": 1755228964, - "model": "llama3.2:3b-instruct-fp16", - "object": "chat.completion.chunk", - "service_tier": null, - "system_fingerprint": "fp_ollama", - "usage": null - } - }, - { - "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", - "__data__": { - "id": "chatcmpl-381", - "choices": [ - { - "delta": { - "content": ":\n\n", - "function_call": null, - "refusal": null, - "role": "assistant", - "tool_calls": null - }, - "finish_reason": null, - "index": 0, - "logprobs": null - } - ], - "created": 1755228964, - "model": "llama3.2:3b-instruct-fp16", - "object": "chat.completion.chunk", - "service_tier": null, - "system_fingerprint": "fp_ollama", - "usage": null - } - }, - { - "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", - "__data__": { - "id": "chatcmpl-381", - "choices": [ - { - "delta": { - "content": "*", - "function_call": null, - "refusal": null, - "role": "assistant", - "tool_calls": null - }, - "finish_reason": null, - "index": 0, - "logprobs": null - } - ], - "created": 1755228964, - "model": "llama3.2:3b-instruct-fp16", - "object": "chat.completion.chunk", - "service_tier": null, - "system_fingerprint": "fp_ollama", - "usage": null - } - }, - { - "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", - "__data__": { - "id": "chatcmpl-381", - "choices": [ - { - "delta": { - "content": " Summer", - "function_call": null, - "refusal": null, - "role": "assistant", - "tool_calls": null - }, - "finish_reason": null, - "index": 0, - "logprobs": null - } - ], - "created": 1755228964, - "model": "llama3.2:3b-instruct-fp16", - "object": "chat.completion.chunk", - "service_tier": null, - "system_fingerprint": "fp_ollama", - "usage": null - } - }, - { - "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", - "__data__": { - "id": "chatcmpl-381", - "choices": [ - { - "delta": { - "content": " (", - "function_call": null, - "refusal": null, - "role": "assistant", - "tool_calls": null - }, - "finish_reason": null, - "index": 0, - "logprobs": null - } - ], - "created": 1755228964, - "model": "llama3.2:3b-instruct-fp16", - "object": "chat.completion.chunk", - "service_tier": null, - "system_fingerprint": "fp_ollama", - "usage": null - } - }, - { - "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", - "__data__": { - "id": "chatcmpl-381", - "choices": [ - { - "delta": { - "content": "June", - "function_call": null, - "refusal": null, - "role": "assistant", - "tool_calls": null - }, - "finish_reason": null, - "index": 0, - "logprobs": null - } - ], - "created": 1755228964, - "model": "llama3.2:3b-instruct-fp16", - "object": "chat.completion.chunk", - "service_tier": null, - "system_fingerprint": "fp_ollama", - "usage": null - } - }, - { - "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", - "__data__": { - "id": "chatcmpl-381", - "choices": [ - { - "delta": { - "content": " to", - "function_call": null, - "refusal": null, - "role": "assistant", - "tool_calls": null - }, - "finish_reason": null, - "index": 0, - "logprobs": null - } - ], - "created": 1755228964, - "model": "llama3.2:3b-instruct-fp16", - "object": "chat.completion.chunk", - "service_tier": null, - "system_fingerprint": "fp_ollama", - "usage": null - } - }, - { - "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", - "__data__": { - "id": "chatcmpl-381", - "choices": [ - { - "delta": { - "content": " August", - "function_call": null, - "refusal": null, - "role": "assistant", - "tool_calls": null - }, - "finish_reason": null, - "index": 0, - "logprobs": null - } - ], - "created": 1755228965, - "model": "llama3.2:3b-instruct-fp16", - "object": "chat.completion.chunk", - "service_tier": null, - "system_fingerprint": "fp_ollama", - "usage": null - } - }, - { - "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", - "__data__": { - "id": "chatcmpl-381", - "choices": [ - { - "delta": { - "content": "):", - "function_call": null, - "refusal": null, - "role": "assistant", - "tool_calls": null - }, - "finish_reason": null, - "index": 0, - "logprobs": null - } - ], - "created": 1755228965, - "model": "llama3.2:3b-instruct-fp16", - "object": "chat.completion.chunk", - "service_tier": null, - "system_fingerprint": "fp_ollama", - "usage": null - } - }, - { - "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", - "__data__": { - "id": "chatcmpl-381", - "choices": [ - { - "delta": { - "content": " Hot", - "function_call": null, - "refusal": null, - "role": "assistant", - "tool_calls": null - }, - "finish_reason": null, - "index": 0, - "logprobs": null - } - ], - "created": 1755228965, - "model": "llama3.2:3b-instruct-fp16", - "object": "chat.completion.chunk", - "service_tier": null, - "system_fingerprint": "fp_ollama", - "usage": null - } - }, - { - "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", - "__data__": { - "id": "chatcmpl-381", - "choices": [ - { - "delta": { - "content": " and", - "function_call": null, - "refusal": null, - "role": "assistant", - "tool_calls": null - }, - "finish_reason": null, - "index": 0, - "logprobs": null - } - ], - "created": 1755228965, - "model": "llama3.2:3b-instruct-fp16", - "object": "chat.completion.chunk", - "service_tier": null, - "system_fingerprint": "fp_ollama", - "usage": null - } - }, - { - "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", - "__data__": { - "id": "chatcmpl-381", - "choices": [ - { - "delta": { - "content": " humid", - "function_call": null, - "refusal": null, - "role": "assistant", - "tool_calls": null - }, - "finish_reason": null, - "index": 0, - "logprobs": null - } - ], - "created": 1755228965, - "model": "llama3.2:3b-instruct-fp16", - "object": "chat.completion.chunk", - "service_tier": null, - "system_fingerprint": "fp_ollama", - "usage": null - } - }, - { - "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", - "__data__": { - "id": "chatcmpl-381", + "id": "chatcmpl-358", "choices": [ { "delta": { @@ -2249,7 +403,7 @@ "logprobs": null } ], - "created": 1755228965, + "created": 1756921325, "model": "llama3.2:3b-instruct-fp16", "object": "chat.completion.chunk", "service_tier": null, @@ -2260,1957 +414,7 @@ { "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", "__data__": { - "id": "chatcmpl-381", - "choices": [ - { - "delta": { - "content": " with", - "function_call": null, - "refusal": null, - "role": "assistant", - "tool_calls": null - }, - "finish_reason": null, - "index": 0, - "logprobs": null - } - ], - "created": 1755228965, - "model": "llama3.2:3b-instruct-fp16", - "object": "chat.completion.chunk", - "service_tier": null, - "system_fingerprint": "fp_ollama", - "usage": null - } - }, - { - "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", - "__data__": { - "id": "chatcmpl-381", - "choices": [ - { - "delta": { - "content": " temperatures", - "function_call": null, - "refusal": null, - "role": "assistant", - "tool_calls": null - }, - "finish_reason": null, - "index": 0, - "logprobs": null - } - ], - "created": 1755228965, - "model": "llama3.2:3b-instruct-fp16", - "object": "chat.completion.chunk", - "service_tier": null, - "system_fingerprint": "fp_ollama", - "usage": null - } - }, - { - "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", - "__data__": { - "id": "chatcmpl-381", - "choices": [ - { - "delta": { - "content": " often", - "function_call": null, - "refusal": null, - "role": "assistant", - "tool_calls": null - }, - "finish_reason": null, - "index": 0, - "logprobs": null - } - ], - "created": 1755228965, - "model": "llama3.2:3b-instruct-fp16", - "object": "chat.completion.chunk", - "service_tier": null, - "system_fingerprint": "fp_ollama", - "usage": null - } - }, - { - "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", - "__data__": { - "id": "chatcmpl-381", - "choices": [ - { - "delta": { - "content": " reaching", - "function_call": null, - "refusal": null, - "role": "assistant", - "tool_calls": null - }, - "finish_reason": null, - "index": 0, - "logprobs": null - } - ], - "created": 1755228965, - "model": "llama3.2:3b-instruct-fp16", - "object": "chat.completion.chunk", - "service_tier": null, - "system_fingerprint": "fp_ollama", - "usage": null - } - }, - { - "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", - "__data__": { - "id": "chatcmpl-381", - "choices": [ - { - "delta": { - "content": " ", - "function_call": null, - "refusal": null, - "role": "assistant", - "tool_calls": null - }, - "finish_reason": null, - "index": 0, - "logprobs": null - } - ], - "created": 1755228965, - "model": "llama3.2:3b-instruct-fp16", - "object": "chat.completion.chunk", - "service_tier": null, - "system_fingerprint": "fp_ollama", - "usage": null - } - }, - { - "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", - "__data__": { - "id": "chatcmpl-381", - "choices": [ - { - "delta": { - "content": "30", - "function_call": null, - "refusal": null, - "role": "assistant", - "tool_calls": null - }, - "finish_reason": null, - "index": 0, - "logprobs": null - } - ], - "created": 1755228965, - "model": "llama3.2:3b-instruct-fp16", - "object": "chat.completion.chunk", - "service_tier": null, - "system_fingerprint": "fp_ollama", - "usage": null - } - }, - { - "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", - "__data__": { - "id": "chatcmpl-381", - "choices": [ - { - "delta": { - "content": "\u00b0C", - "function_call": null, - "refusal": null, - "role": "assistant", - "tool_calls": null - }, - "finish_reason": null, - "index": 0, - "logprobs": null - } - ], - "created": 1755228965, - "model": "llama3.2:3b-instruct-fp16", - "object": "chat.completion.chunk", - "service_tier": null, - "system_fingerprint": "fp_ollama", - "usage": null - } - }, - { - "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", - "__data__": { - "id": "chatcmpl-381", - "choices": [ - { - "delta": { - "content": " (", - "function_call": null, - "refusal": null, - "role": "assistant", - "tool_calls": null - }, - "finish_reason": null, - "index": 0, - "logprobs": null - } - ], - "created": 1755228965, - "model": "llama3.2:3b-instruct-fp16", - "object": "chat.completion.chunk", - "service_tier": null, - "system_fingerprint": "fp_ollama", - "usage": null - } - }, - { - "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", - "__data__": { - "id": "chatcmpl-381", - "choices": [ - { - "delta": { - "content": "86", - "function_call": null, - "refusal": null, - "role": "assistant", - "tool_calls": null - }, - "finish_reason": null, - "index": 0, - "logprobs": null - } - ], - "created": 1755228965, - "model": "llama3.2:3b-instruct-fp16", - "object": "chat.completion.chunk", - "service_tier": null, - "system_fingerprint": "fp_ollama", - "usage": null - } - }, - { - "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", - "__data__": { - "id": "chatcmpl-381", - "choices": [ - { - "delta": { - "content": "\u00b0F", - "function_call": null, - "refusal": null, - "role": "assistant", - "tool_calls": null - }, - "finish_reason": null, - "index": 0, - "logprobs": null - } - ], - "created": 1755228965, - "model": "llama3.2:3b-instruct-fp16", - "object": "chat.completion.chunk", - "service_tier": null, - "system_fingerprint": "fp_ollama", - "usage": null - } - }, - { - "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", - "__data__": { - "id": "chatcmpl-381", - "choices": [ - { - "delta": { - "content": ")", - "function_call": null, - "refusal": null, - "role": "assistant", - "tool_calls": null - }, - "finish_reason": null, - "index": 0, - "logprobs": null - } - ], - "created": 1755228965, - "model": "llama3.2:3b-instruct-fp16", - "object": "chat.completion.chunk", - "service_tier": null, - "system_fingerprint": "fp_ollama", - "usage": null - } - }, - { - "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", - "__data__": { - "id": "chatcmpl-381", - "choices": [ - { - "delta": { - "content": " or", - "function_call": null, - "refusal": null, - "role": "assistant", - "tool_calls": null - }, - "finish_reason": null, - "index": 0, - "logprobs": null - } - ], - "created": 1755228965, - "model": "llama3.2:3b-instruct-fp16", - "object": "chat.completion.chunk", - "service_tier": null, - "system_fingerprint": "fp_ollama", - "usage": null - } - }, - { - "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", - "__data__": { - "id": "chatcmpl-381", - "choices": [ - { - "delta": { - "content": " higher", - "function_call": null, - "refusal": null, - "role": "assistant", - "tool_calls": null - }, - "finish_reason": null, - "index": 0, - "logprobs": null - } - ], - "created": 1755228965, - "model": "llama3.2:3b-instruct-fp16", - "object": "chat.completion.chunk", - "service_tier": null, - "system_fingerprint": "fp_ollama", - "usage": null - } - }, - { - "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", - "__data__": { - "id": "chatcmpl-381", - "choices": [ - { - "delta": { - "content": ".\n", - "function_call": null, - "refusal": null, - "role": "assistant", - "tool_calls": null - }, - "finish_reason": null, - "index": 0, - "logprobs": null - } - ], - "created": 1755228965, - "model": "llama3.2:3b-instruct-fp16", - "object": "chat.completion.chunk", - "service_tier": null, - "system_fingerprint": "fp_ollama", - "usage": null - } - }, - { - "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", - "__data__": { - "id": "chatcmpl-381", - "choices": [ - { - "delta": { - "content": "*", - "function_call": null, - "refusal": null, - "role": "assistant", - "tool_calls": null - }, - "finish_reason": null, - "index": 0, - "logprobs": null - } - ], - "created": 1755228965, - "model": "llama3.2:3b-instruct-fp16", - "object": "chat.completion.chunk", - "service_tier": null, - "system_fingerprint": "fp_ollama", - "usage": null - } - }, - { - "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", - "__data__": { - "id": "chatcmpl-381", - "choices": [ - { - "delta": { - "content": " Autumn", - "function_call": null, - "refusal": null, - "role": "assistant", - "tool_calls": null - }, - "finish_reason": null, - "index": 0, - "logprobs": null - } - ], - "created": 1755228965, - "model": "llama3.2:3b-instruct-fp16", - "object": "chat.completion.chunk", - "service_tier": null, - "system_fingerprint": "fp_ollama", - "usage": null - } - }, - { - "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", - "__data__": { - "id": "chatcmpl-381", - "choices": [ - { - "delta": { - "content": " (", - "function_call": null, - "refusal": null, - "role": "assistant", - "tool_calls": null - }, - "finish_reason": null, - "index": 0, - "logprobs": null - } - ], - "created": 1755228965, - "model": "llama3.2:3b-instruct-fp16", - "object": "chat.completion.chunk", - "service_tier": null, - "system_fingerprint": "fp_ollama", - "usage": null - } - }, - { - "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", - "__data__": { - "id": "chatcmpl-381", - "choices": [ - { - "delta": { - "content": "September", - "function_call": null, - "refusal": null, - "role": "assistant", - "tool_calls": null - }, - "finish_reason": null, - "index": 0, - "logprobs": null - } - ], - "created": 1755228965, - "model": "llama3.2:3b-instruct-fp16", - "object": "chat.completion.chunk", - "service_tier": null, - "system_fingerprint": "fp_ollama", - "usage": null - } - }, - { - "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", - "__data__": { - "id": "chatcmpl-381", - "choices": [ - { - "delta": { - "content": " to", - "function_call": null, - "refusal": null, - "role": "assistant", - "tool_calls": null - }, - "finish_reason": null, - "index": 0, - "logprobs": null - } - ], - "created": 1755228966, - "model": "llama3.2:3b-instruct-fp16", - "object": "chat.completion.chunk", - "service_tier": null, - "system_fingerprint": "fp_ollama", - "usage": null - } - }, - { - "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", - "__data__": { - "id": "chatcmpl-381", - "choices": [ - { - "delta": { - "content": " November", - "function_call": null, - "refusal": null, - "role": "assistant", - "tool_calls": null - }, - "finish_reason": null, - "index": 0, - "logprobs": null - } - ], - "created": 1755228966, - "model": "llama3.2:3b-instruct-fp16", - "object": "chat.completion.chunk", - "service_tier": null, - "system_fingerprint": "fp_ollama", - "usage": null - } - }, - { - "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", - "__data__": { - "id": "chatcmpl-381", - "choices": [ - { - "delta": { - "content": "):", - "function_call": null, - "refusal": null, - "role": "assistant", - "tool_calls": null - }, - "finish_reason": null, - "index": 0, - "logprobs": null - } - ], - "created": 1755228966, - "model": "llama3.2:3b-instruct-fp16", - "object": "chat.completion.chunk", - "service_tier": null, - "system_fingerprint": "fp_ollama", - "usage": null - } - }, - { - "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", - "__data__": { - "id": "chatcmpl-381", - "choices": [ - { - "delta": { - "content": " Mild", - "function_call": null, - "refusal": null, - "role": "assistant", - "tool_calls": null - }, - "finish_reason": null, - "index": 0, - "logprobs": null - } - ], - "created": 1755228966, - "model": "llama3.2:3b-instruct-fp16", - "object": "chat.completion.chunk", - "service_tier": null, - "system_fingerprint": "fp_ollama", - "usage": null - } - }, - { - "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", - "__data__": { - "id": "chatcmpl-381", - "choices": [ - { - "delta": { - "content": ",", - "function_call": null, - "refusal": null, - "role": "assistant", - "tool_calls": null - }, - "finish_reason": null, - "index": 0, - "logprobs": null - } - ], - "created": 1755228966, - "model": "llama3.2:3b-instruct-fp16", - "object": "chat.completion.chunk", - "service_tier": null, - "system_fingerprint": "fp_ollama", - "usage": null - } - }, - { - "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", - "__data__": { - "id": "chatcmpl-381", - "choices": [ - { - "delta": { - "content": " with", - "function_call": null, - "refusal": null, - "role": "assistant", - "tool_calls": null - }, - "finish_reason": null, - "index": 0, - "logprobs": null - } - ], - "created": 1755228966, - "model": "llama3.2:3b-instruct-fp16", - "object": "chat.completion.chunk", - "service_tier": null, - "system_fingerprint": "fp_ollama", - "usage": null - } - }, - { - "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", - "__data__": { - "id": "chatcmpl-381", - "choices": [ - { - "delta": { - "content": " temperatures", - "function_call": null, - "refusal": null, - "role": "assistant", - "tool_calls": null - }, - "finish_reason": null, - "index": 0, - "logprobs": null - } - ], - "created": 1755228966, - "model": "llama3.2:3b-instruct-fp16", - "object": "chat.completion.chunk", - "service_tier": null, - "system_fingerprint": "fp_ollama", - "usage": null - } - }, - { - "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", - "__data__": { - "id": "chatcmpl-381", - "choices": [ - { - "delta": { - "content": " ranging", - "function_call": null, - "refusal": null, - "role": "assistant", - "tool_calls": null - }, - "finish_reason": null, - "index": 0, - "logprobs": null - } - ], - "created": 1755228966, - "model": "llama3.2:3b-instruct-fp16", - "object": "chat.completion.chunk", - "service_tier": null, - "system_fingerprint": "fp_ollama", - "usage": null - } - }, - { - "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", - "__data__": { - "id": "chatcmpl-381", - "choices": [ - { - "delta": { - "content": " from", - "function_call": null, - "refusal": null, - "role": "assistant", - "tool_calls": null - }, - "finish_reason": null, - "index": 0, - "logprobs": null - } - ], - "created": 1755228966, - "model": "llama3.2:3b-instruct-fp16", - "object": "chat.completion.chunk", - "service_tier": null, - "system_fingerprint": "fp_ollama", - "usage": null - } - }, - { - "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", - "__data__": { - "id": "chatcmpl-381", - "choices": [ - { - "delta": { - "content": " ", - "function_call": null, - "refusal": null, - "role": "assistant", - "tool_calls": null - }, - "finish_reason": null, - "index": 0, - "logprobs": null - } - ], - "created": 1755228966, - "model": "llama3.2:3b-instruct-fp16", - "object": "chat.completion.chunk", - "service_tier": null, - "system_fingerprint": "fp_ollama", - "usage": null - } - }, - { - "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", - "__data__": { - "id": "chatcmpl-381", - "choices": [ - { - "delta": { - "content": "10", - "function_call": null, - "refusal": null, - "role": "assistant", - "tool_calls": null - }, - "finish_reason": null, - "index": 0, - "logprobs": null - } - ], - "created": 1755228966, - "model": "llama3.2:3b-instruct-fp16", - "object": "chat.completion.chunk", - "service_tier": null, - "system_fingerprint": "fp_ollama", - "usage": null - } - }, - { - "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", - "__data__": { - "id": "chatcmpl-381", - "choices": [ - { - "delta": { - "content": "\u00b0C", - "function_call": null, - "refusal": null, - "role": "assistant", - "tool_calls": null - }, - "finish_reason": null, - "index": 0, - "logprobs": null - } - ], - "created": 1755228966, - "model": "llama3.2:3b-instruct-fp16", - "object": "chat.completion.chunk", - "service_tier": null, - "system_fingerprint": "fp_ollama", - "usage": null - } - }, - { - "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", - "__data__": { - "id": "chatcmpl-381", - "choices": [ - { - "delta": { - "content": " (", - "function_call": null, - "refusal": null, - "role": "assistant", - "tool_calls": null - }, - "finish_reason": null, - "index": 0, - "logprobs": null - } - ], - "created": 1755228966, - "model": "llama3.2:3b-instruct-fp16", - "object": "chat.completion.chunk", - "service_tier": null, - "system_fingerprint": "fp_ollama", - "usage": null - } - }, - { - "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", - "__data__": { - "id": "chatcmpl-381", - "choices": [ - { - "delta": { - "content": "50", - "function_call": null, - "refusal": null, - "role": "assistant", - "tool_calls": null - }, - "finish_reason": null, - "index": 0, - "logprobs": null - } - ], - "created": 1755228966, - "model": "llama3.2:3b-instruct-fp16", - "object": "chat.completion.chunk", - "service_tier": null, - "system_fingerprint": "fp_ollama", - "usage": null - } - }, - { - "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", - "__data__": { - "id": "chatcmpl-381", - "choices": [ - { - "delta": { - "content": "\u00b0F", - "function_call": null, - "refusal": null, - "role": "assistant", - "tool_calls": null - }, - "finish_reason": null, - "index": 0, - "logprobs": null - } - ], - "created": 1755228966, - "model": "llama3.2:3b-instruct-fp16", - "object": "chat.completion.chunk", - "service_tier": null, - "system_fingerprint": "fp_ollama", - "usage": null - } - }, - { - "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", - "__data__": { - "id": "chatcmpl-381", - "choices": [ - { - "delta": { - "content": ")", - "function_call": null, - "refusal": null, - "role": "assistant", - "tool_calls": null - }, - "finish_reason": null, - "index": 0, - "logprobs": null - } - ], - "created": 1755228966, - "model": "llama3.2:3b-instruct-fp16", - "object": "chat.completion.chunk", - "service_tier": null, - "system_fingerprint": "fp_ollama", - "usage": null - } - }, - { - "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", - "__data__": { - "id": "chatcmpl-381", - "choices": [ - { - "delta": { - "content": " to", - "function_call": null, - "refusal": null, - "role": "assistant", - "tool_calls": null - }, - "finish_reason": null, - "index": 0, - "logprobs": null - } - ], - "created": 1755228966, - "model": "llama3.2:3b-instruct-fp16", - "object": "chat.completion.chunk", - "service_tier": null, - "system_fingerprint": "fp_ollama", - "usage": null - } - }, - { - "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", - "__data__": { - "id": "chatcmpl-381", - "choices": [ - { - "delta": { - "content": " ", - "function_call": null, - "refusal": null, - "role": "assistant", - "tool_calls": null - }, - "finish_reason": null, - "index": 0, - "logprobs": null - } - ], - "created": 1755228966, - "model": "llama3.2:3b-instruct-fp16", - "object": "chat.completion.chunk", - "service_tier": null, - "system_fingerprint": "fp_ollama", - "usage": null - } - }, - { - "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", - "__data__": { - "id": "chatcmpl-381", - "choices": [ - { - "delta": { - "content": "20", - "function_call": null, - "refusal": null, - "role": "assistant", - "tool_calls": null - }, - "finish_reason": null, - "index": 0, - "logprobs": null - } - ], - "created": 1755228966, - "model": "llama3.2:3b-instruct-fp16", - "object": "chat.completion.chunk", - "service_tier": null, - "system_fingerprint": "fp_ollama", - "usage": null - } - }, - { - "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", - "__data__": { - "id": "chatcmpl-381", - "choices": [ - { - "delta": { - "content": "\u00b0C", - "function_call": null, - "refusal": null, - "role": "assistant", - "tool_calls": null - }, - "finish_reason": null, - "index": 0, - "logprobs": null - } - ], - "created": 1755228966, - "model": "llama3.2:3b-instruct-fp16", - "object": "chat.completion.chunk", - "service_tier": null, - "system_fingerprint": "fp_ollama", - "usage": null - } - }, - { - "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", - "__data__": { - "id": "chatcmpl-381", - "choices": [ - { - "delta": { - "content": " (", - "function_call": null, - "refusal": null, - "role": "assistant", - "tool_calls": null - }, - "finish_reason": null, - "index": 0, - "logprobs": null - } - ], - "created": 1755228966, - "model": "llama3.2:3b-instruct-fp16", - "object": "chat.completion.chunk", - "service_tier": null, - "system_fingerprint": "fp_ollama", - "usage": null - } - }, - { - "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", - "__data__": { - "id": "chatcmpl-381", - "choices": [ - { - "delta": { - "content": "68", - "function_call": null, - "refusal": null, - "role": "assistant", - "tool_calls": null - }, - "finish_reason": null, - "index": 0, - "logprobs": null - } - ], - "created": 1755228966, - "model": "llama3.2:3b-instruct-fp16", - "object": "chat.completion.chunk", - "service_tier": null, - "system_fingerprint": "fp_ollama", - "usage": null - } - }, - { - "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", - "__data__": { - "id": "chatcmpl-381", - "choices": [ - { - "delta": { - "content": "\u00b0F", - "function_call": null, - "refusal": null, - "role": "assistant", - "tool_calls": null - }, - "finish_reason": null, - "index": 0, - "logprobs": null - } - ], - "created": 1755228966, - "model": "llama3.2:3b-instruct-fp16", - "object": "chat.completion.chunk", - "service_tier": null, - "system_fingerprint": "fp_ollama", - "usage": null - } - }, - { - "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", - "__data__": { - "id": "chatcmpl-381", - "choices": [ - { - "delta": { - "content": ").\n", - "function_call": null, - "refusal": null, - "role": "assistant", - "tool_calls": null - }, - "finish_reason": null, - "index": 0, - "logprobs": null - } - ], - "created": 1755228966, - "model": "llama3.2:3b-instruct-fp16", - "object": "chat.completion.chunk", - "service_tier": null, - "system_fingerprint": "fp_ollama", - "usage": null - } - }, - { - "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", - "__data__": { - "id": "chatcmpl-381", - "choices": [ - { - "delta": { - "content": "*", - "function_call": null, - "refusal": null, - "role": "assistant", - "tool_calls": null - }, - "finish_reason": null, - "index": 0, - "logprobs": null - } - ], - "created": 1755228967, - "model": "llama3.2:3b-instruct-fp16", - "object": "chat.completion.chunk", - "service_tier": null, - "system_fingerprint": "fp_ollama", - "usage": null - } - }, - { - "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", - "__data__": { - "id": "chatcmpl-381", - "choices": [ - { - "delta": { - "content": " Spring", - "function_call": null, - "refusal": null, - "role": "assistant", - "tool_calls": null - }, - "finish_reason": null, - "index": 0, - "logprobs": null - } - ], - "created": 1755228967, - "model": "llama3.2:3b-instruct-fp16", - "object": "chat.completion.chunk", - "service_tier": null, - "system_fingerprint": "fp_ollama", - "usage": null - } - }, - { - "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", - "__data__": { - "id": "chatcmpl-381", - "choices": [ - { - "delta": { - "content": " (", - "function_call": null, - "refusal": null, - "role": "assistant", - "tool_calls": null - }, - "finish_reason": null, - "index": 0, - "logprobs": null - } - ], - "created": 1755228967, - "model": "llama3.2:3b-instruct-fp16", - "object": "chat.completion.chunk", - "service_tier": null, - "system_fingerprint": "fp_ollama", - "usage": null - } - }, - { - "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", - "__data__": { - "id": "chatcmpl-381", - "choices": [ - { - "delta": { - "content": "March", - "function_call": null, - "refusal": null, - "role": "assistant", - "tool_calls": null - }, - "finish_reason": null, - "index": 0, - "logprobs": null - } - ], - "created": 1755228967, - "model": "llama3.2:3b-instruct-fp16", - "object": "chat.completion.chunk", - "service_tier": null, - "system_fingerprint": "fp_ollama", - "usage": null - } - }, - { - "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", - "__data__": { - "id": "chatcmpl-381", - "choices": [ - { - "delta": { - "content": " to", - "function_call": null, - "refusal": null, - "role": "assistant", - "tool_calls": null - }, - "finish_reason": null, - "index": 0, - "logprobs": null - } - ], - "created": 1755228967, - "model": "llama3.2:3b-instruct-fp16", - "object": "chat.completion.chunk", - "service_tier": null, - "system_fingerprint": "fp_ollama", - "usage": null - } - }, - { - "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", - "__data__": { - "id": "chatcmpl-381", - "choices": [ - { - "delta": { - "content": " May", - "function_call": null, - "refusal": null, - "role": "assistant", - "tool_calls": null - }, - "finish_reason": null, - "index": 0, - "logprobs": null - } - ], - "created": 1755228967, - "model": "llama3.2:3b-instruct-fp16", - "object": "chat.completion.chunk", - "service_tier": null, - "system_fingerprint": "fp_ollama", - "usage": null - } - }, - { - "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", - "__data__": { - "id": "chatcmpl-381", - "choices": [ - { - "delta": { - "content": ")", - "function_call": null, - "refusal": null, - "role": "assistant", - "tool_calls": null - }, - "finish_reason": null, - "index": 0, - "logprobs": null - } - ], - "created": 1755228967, - "model": "llama3.2:3b-instruct-fp16", - "object": "chat.completion.chunk", - "service_tier": null, - "system_fingerprint": "fp_ollama", - "usage": null - } - }, - { - "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", - "__data__": { - "id": "chatcmpl-381", - "choices": [ - { - "delta": { - "content": " and", - "function_call": null, - "refusal": null, - "role": "assistant", - "tool_calls": null - }, - "finish_reason": null, - "index": 0, - "logprobs": null - } - ], - "created": 1755228967, - "model": "llama3.2:3b-instruct-fp16", - "object": "chat.completion.chunk", - "service_tier": null, - "system_fingerprint": "fp_ollama", - "usage": null - } - }, - { - "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", - "__data__": { - "id": "chatcmpl-381", - "choices": [ - { - "delta": { - "content": " Winter", - "function_call": null, - "refusal": null, - "role": "assistant", - "tool_calls": null - }, - "finish_reason": null, - "index": 0, - "logprobs": null - } - ], - "created": 1755228967, - "model": "llama3.2:3b-instruct-fp16", - "object": "chat.completion.chunk", - "service_tier": null, - "system_fingerprint": "fp_ollama", - "usage": null - } - }, - { - "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", - "__data__": { - "id": "chatcmpl-381", - "choices": [ - { - "delta": { - "content": " (", - "function_call": null, - "refusal": null, - "role": "assistant", - "tool_calls": null - }, - "finish_reason": null, - "index": 0, - "logprobs": null - } - ], - "created": 1755228967, - "model": "llama3.2:3b-instruct-fp16", - "object": "chat.completion.chunk", - "service_tier": null, - "system_fingerprint": "fp_ollama", - "usage": null - } - }, - { - "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", - "__data__": { - "id": "chatcmpl-381", - "choices": [ - { - "delta": { - "content": "December", - "function_call": null, - "refusal": null, - "role": "assistant", - "tool_calls": null - }, - "finish_reason": null, - "index": 0, - "logprobs": null - } - ], - "created": 1755228967, - "model": "llama3.2:3b-instruct-fp16", - "object": "chat.completion.chunk", - "service_tier": null, - "system_fingerprint": "fp_ollama", - "usage": null - } - }, - { - "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", - "__data__": { - "id": "chatcmpl-381", - "choices": [ - { - "delta": { - "content": " to", - "function_call": null, - "refusal": null, - "role": "assistant", - "tool_calls": null - }, - "finish_reason": null, - "index": 0, - "logprobs": null - } - ], - "created": 1755228967, - "model": "llama3.2:3b-instruct-fp16", - "object": "chat.completion.chunk", - "service_tier": null, - "system_fingerprint": "fp_ollama", - "usage": null - } - }, - { - "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", - "__data__": { - "id": "chatcmpl-381", - "choices": [ - { - "delta": { - "content": " February", - "function_call": null, - "refusal": null, - "role": "assistant", - "tool_calls": null - }, - "finish_reason": null, - "index": 0, - "logprobs": null - } - ], - "created": 1755228967, - "model": "llama3.2:3b-instruct-fp16", - "object": "chat.completion.chunk", - "service_tier": null, - "system_fingerprint": "fp_ollama", - "usage": null - } - }, - { - "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", - "__data__": { - "id": "chatcmpl-381", - "choices": [ - { - "delta": { - "content": "):", - "function_call": null, - "refusal": null, - "role": "assistant", - "tool_calls": null - }, - "finish_reason": null, - "index": 0, - "logprobs": null - } - ], - "created": 1755228967, - "model": "llama3.2:3b-instruct-fp16", - "object": "chat.completion.chunk", - "service_tier": null, - "system_fingerprint": "fp_ollama", - "usage": null - } - }, - { - "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", - "__data__": { - "id": "chatcmpl-381", - "choices": [ - { - "delta": { - "content": " Cool", - "function_call": null, - "refusal": null, - "role": "assistant", - "tool_calls": null - }, - "finish_reason": null, - "index": 0, - "logprobs": null - } - ], - "created": 1755228967, - "model": "llama3.2:3b-instruct-fp16", - "object": "chat.completion.chunk", - "service_tier": null, - "system_fingerprint": "fp_ollama", - "usage": null - } - }, - { - "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", - "__data__": { - "id": "chatcmpl-381", - "choices": [ - { - "delta": { - "content": " and", - "function_call": null, - "refusal": null, - "role": "assistant", - "tool_calls": null - }, - "finish_reason": null, - "index": 0, - "logprobs": null - } - ], - "created": 1755228967, - "model": "llama3.2:3b-instruct-fp16", - "object": "chat.completion.chunk", - "service_tier": null, - "system_fingerprint": "fp_ollama", - "usage": null - } - }, - { - "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", - "__data__": { - "id": "chatcmpl-381", - "choices": [ - { - "delta": { - "content": " sometimes", - "function_call": null, - "refusal": null, - "role": "assistant", - "tool_calls": null - }, - "finish_reason": null, - "index": 0, - "logprobs": null - } - ], - "created": 1755228967, - "model": "llama3.2:3b-instruct-fp16", - "object": "chat.completion.chunk", - "service_tier": null, - "system_fingerprint": "fp_ollama", - "usage": null - } - }, - { - "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", - "__data__": { - "id": "chatcmpl-381", - "choices": [ - { - "delta": { - "content": " rainy", - "function_call": null, - "refusal": null, - "role": "assistant", - "tool_calls": null - }, - "finish_reason": null, - "index": 0, - "logprobs": null - } - ], - "created": 1755228967, - "model": "llama3.2:3b-instruct-fp16", - "object": "chat.completion.chunk", - "service_tier": null, - "system_fingerprint": "fp_ollama", - "usage": null - } - }, - { - "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", - "__data__": { - "id": "chatcmpl-381", - "choices": [ - { - "delta": { - "content": ".\n\n", - "function_call": null, - "refusal": null, - "role": "assistant", - "tool_calls": null - }, - "finish_reason": null, - "index": 0, - "logprobs": null - } - ], - "created": 1755228967, - "model": "llama3.2:3b-instruct-fp16", - "object": "chat.completion.chunk", - "service_tier": null, - "system_fingerprint": "fp_ollama", - "usage": null - } - }, - { - "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", - "__data__": { - "id": "chatcmpl-381", - "choices": [ - { - "delta": { - "content": "If", - "function_call": null, - "refusal": null, - "role": "assistant", - "tool_calls": null - }, - "finish_reason": null, - "index": 0, - "logprobs": null - } - ], - "created": 1755228967, - "model": "llama3.2:3b-instruct-fp16", - "object": "chat.completion.chunk", - "service_tier": null, - "system_fingerprint": "fp_ollama", - "usage": null - } - }, - { - "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", - "__data__": { - "id": "chatcmpl-381", - "choices": [ - { - "delta": { - "content": " you", - "function_call": null, - "refusal": null, - "role": "assistant", - "tool_calls": null - }, - "finish_reason": null, - "index": 0, - "logprobs": null - } - ], - "created": 1755228967, - "model": "llama3.2:3b-instruct-fp16", - "object": "chat.completion.chunk", - "service_tier": null, - "system_fingerprint": "fp_ollama", - "usage": null - } - }, - { - "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", - "__data__": { - "id": "chatcmpl-381", - "choices": [ - { - "delta": { - "content": " need", - "function_call": null, - "refusal": null, - "role": "assistant", - "tool_calls": null - }, - "finish_reason": null, - "index": 0, - "logprobs": null - } - ], - "created": 1755228967, - "model": "llama3.2:3b-instruct-fp16", - "object": "chat.completion.chunk", - "service_tier": null, - "system_fingerprint": "fp_ollama", - "usage": null - } - }, - { - "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", - "__data__": { - "id": "chatcmpl-381", - "choices": [ - { - "delta": { - "content": " up", - "function_call": null, - "refusal": null, - "role": "assistant", - "tool_calls": null - }, - "finish_reason": null, - "index": 0, - "logprobs": null - } - ], - "created": 1755228967, - "model": "llama3.2:3b-instruct-fp16", - "object": "chat.completion.chunk", - "service_tier": null, - "system_fingerprint": "fp_ollama", - "usage": null - } - }, - { - "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", - "__data__": { - "id": "chatcmpl-381", - "choices": [ - { - "delta": { - "content": "-to", - "function_call": null, - "refusal": null, - "role": "assistant", - "tool_calls": null - }, - "finish_reason": null, - "index": 0, - "logprobs": null - } - ], - "created": 1755228967, - "model": "llama3.2:3b-instruct-fp16", - "object": "chat.completion.chunk", - "service_tier": null, - "system_fingerprint": "fp_ollama", - "usage": null - } - }, - { - "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", - "__data__": { - "id": "chatcmpl-381", - "choices": [ - { - "delta": { - "content": "-date", - "function_call": null, - "refusal": null, - "role": "assistant", - "tool_calls": null - }, - "finish_reason": null, - "index": 0, - "logprobs": null - } - ], - "created": 1755228968, - "model": "llama3.2:3b-instruct-fp16", - "object": "chat.completion.chunk", - "service_tier": null, - "system_fingerprint": "fp_ollama", - "usage": null - } - }, - { - "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", - "__data__": { - "id": "chatcmpl-381", - "choices": [ - { - "delta": { - "content": " information", - "function_call": null, - "refusal": null, - "role": "assistant", - "tool_calls": null - }, - "finish_reason": null, - "index": 0, - "logprobs": null - } - ], - "created": 1755228968, - "model": "llama3.2:3b-instruct-fp16", - "object": "chat.completion.chunk", - "service_tier": null, - "system_fingerprint": "fp_ollama", - "usage": null - } - }, - { - "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", - "__data__": { - "id": "chatcmpl-381", - "choices": [ - { - "delta": { - "content": " on", - "function_call": null, - "refusal": null, - "role": "assistant", - "tool_calls": null - }, - "finish_reason": null, - "index": 0, - "logprobs": null - } - ], - "created": 1755228968, - "model": "llama3.2:3b-instruct-fp16", - "object": "chat.completion.chunk", - "service_tier": null, - "system_fingerprint": "fp_ollama", - "usage": null - } - }, - { - "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", - "__data__": { - "id": "chatcmpl-381", - "choices": [ - { - "delta": { - "content": " the", - "function_call": null, - "refusal": null, - "role": "assistant", - "tool_calls": null - }, - "finish_reason": null, - "index": 0, - "logprobs": null - } - ], - "created": 1755228968, - "model": "llama3.2:3b-instruct-fp16", - "object": "chat.completion.chunk", - "service_tier": null, - "system_fingerprint": "fp_ollama", - "usage": null - } - }, - { - "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", - "__data__": { - "id": "chatcmpl-381", - "choices": [ - { - "delta": { - "content": " current", - "function_call": null, - "refusal": null, - "role": "assistant", - "tool_calls": null - }, - "finish_reason": null, - "index": 0, - "logprobs": null - } - ], - "created": 1755228968, - "model": "llama3.2:3b-instruct-fp16", - "object": "chat.completion.chunk", - "service_tier": null, - "system_fingerprint": "fp_ollama", - "usage": null - } - }, - { - "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", - "__data__": { - "id": "chatcmpl-381", - "choices": [ - { - "delta": { - "content": " weather", - "function_call": null, - "refusal": null, - "role": "assistant", - "tool_calls": null - }, - "finish_reason": null, - "index": 0, - "logprobs": null - } - ], - "created": 1755228968, - "model": "llama3.2:3b-instruct-fp16", - "object": "chat.completion.chunk", - "service_tier": null, - "system_fingerprint": "fp_ollama", - "usage": null - } - }, - { - "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", - "__data__": { - "id": "chatcmpl-381", - "choices": [ - { - "delta": { - "content": " in", - "function_call": null, - "refusal": null, - "role": "assistant", - "tool_calls": null - }, - "finish_reason": null, - "index": 0, - "logprobs": null - } - ], - "created": 1755228968, - "model": "llama3.2:3b-instruct-fp16", - "object": "chat.completion.chunk", - "service_tier": null, - "system_fingerprint": "fp_ollama", - "usage": null - } - }, - { - "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", - "__data__": { - "id": "chatcmpl-381", - "choices": [ - { - "delta": { - "content": " Tokyo", - "function_call": null, - "refusal": null, - "role": "assistant", - "tool_calls": null - }, - "finish_reason": null, - "index": 0, - "logprobs": null - } - ], - "created": 1755228968, - "model": "llama3.2:3b-instruct-fp16", - "object": "chat.completion.chunk", - "service_tier": null, - "system_fingerprint": "fp_ollama", - "usage": null - } - }, - { - "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", - "__data__": { - "id": "chatcmpl-381", - "choices": [ - { - "delta": { - "content": ",", - "function_call": null, - "refusal": null, - "role": "assistant", - "tool_calls": null - }, - "finish_reason": null, - "index": 0, - "logprobs": null - } - ], - "created": 1755228968, - "model": "llama3.2:3b-instruct-fp16", - "object": "chat.completion.chunk", - "service_tier": null, - "system_fingerprint": "fp_ollama", - "usage": null - } - }, - { - "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", - "__data__": { - "id": "chatcmpl-381", + "id": "chatcmpl-358", "choices": [ { "delta": { @@ -4225,7 +429,7 @@ "logprobs": null } ], - "created": 1755228968, + "created": 1756921325, "model": "llama3.2:3b-instruct-fp16", "object": "chat.completion.chunk", "service_tier": null, @@ -4236,683 +440,7 @@ { "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", "__data__": { - "id": "chatcmpl-381", - "choices": [ - { - "delta": { - "content": " recommend", - "function_call": null, - "refusal": null, - "role": "assistant", - "tool_calls": null - }, - "finish_reason": null, - "index": 0, - "logprobs": null - } - ], - "created": 1755228968, - "model": "llama3.2:3b-instruct-fp16", - "object": "chat.completion.chunk", - "service_tier": null, - "system_fingerprint": "fp_ollama", - "usage": null - } - }, - { - "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", - "__data__": { - "id": "chatcmpl-381", - "choices": [ - { - "delta": { - "content": " checking", - "function_call": null, - "refusal": null, - "role": "assistant", - "tool_calls": null - }, - "finish_reason": null, - "index": 0, - "logprobs": null - } - ], - "created": 1755228968, - "model": "llama3.2:3b-instruct-fp16", - "object": "chat.completion.chunk", - "service_tier": null, - "system_fingerprint": "fp_ollama", - "usage": null - } - }, - { - "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", - "__data__": { - "id": "chatcmpl-381", - "choices": [ - { - "delta": { - "content": " a", - "function_call": null, - "refusal": null, - "role": "assistant", - "tool_calls": null - }, - "finish_reason": null, - "index": 0, - "logprobs": null - } - ], - "created": 1755228968, - "model": "llama3.2:3b-instruct-fp16", - "object": "chat.completion.chunk", - "service_tier": null, - "system_fingerprint": "fp_ollama", - "usage": null - } - }, - { - "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", - "__data__": { - "id": "chatcmpl-381", - "choices": [ - { - "delta": { - "content": " reliable", - "function_call": null, - "refusal": null, - "role": "assistant", - "tool_calls": null - }, - "finish_reason": null, - "index": 0, - "logprobs": null - } - ], - "created": 1755228968, - "model": "llama3.2:3b-instruct-fp16", - "object": "chat.completion.chunk", - "service_tier": null, - "system_fingerprint": "fp_ollama", - "usage": null - } - }, - { - "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", - "__data__": { - "id": "chatcmpl-381", - "choices": [ - { - "delta": { - "content": " online", - "function_call": null, - "refusal": null, - "role": "assistant", - "tool_calls": null - }, - "finish_reason": null, - "index": 0, - "logprobs": null - } - ], - "created": 1755228968, - "model": "llama3.2:3b-instruct-fp16", - "object": "chat.completion.chunk", - "service_tier": null, - "system_fingerprint": "fp_ollama", - "usage": null - } - }, - { - "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", - "__data__": { - "id": "chatcmpl-381", - "choices": [ - { - "delta": { - "content": " weather", - "function_call": null, - "refusal": null, - "role": "assistant", - "tool_calls": null - }, - "finish_reason": null, - "index": 0, - "logprobs": null - } - ], - "created": 1755228968, - "model": "llama3.2:3b-instruct-fp16", - "object": "chat.completion.chunk", - "service_tier": null, - "system_fingerprint": "fp_ollama", - "usage": null - } - }, - { - "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", - "__data__": { - "id": "chatcmpl-381", - "choices": [ - { - "delta": { - "content": " source", - "function_call": null, - "refusal": null, - "role": "assistant", - "tool_calls": null - }, - "finish_reason": null, - "index": 0, - "logprobs": null - } - ], - "created": 1755228968, - "model": "llama3.2:3b-instruct-fp16", - "object": "chat.completion.chunk", - "service_tier": null, - "system_fingerprint": "fp_ollama", - "usage": null - } - }, - { - "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", - "__data__": { - "id": "chatcmpl-381", - "choices": [ - { - "delta": { - "content": " such", - "function_call": null, - "refusal": null, - "role": "assistant", - "tool_calls": null - }, - "finish_reason": null, - "index": 0, - "logprobs": null - } - ], - "created": 1755228968, - "model": "llama3.2:3b-instruct-fp16", - "object": "chat.completion.chunk", - "service_tier": null, - "system_fingerprint": "fp_ollama", - "usage": null - } - }, - { - "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", - "__data__": { - "id": "chatcmpl-381", - "choices": [ - { - "delta": { - "content": " as", - "function_call": null, - "refusal": null, - "role": "assistant", - "tool_calls": null - }, - "finish_reason": null, - "index": 0, - "logprobs": null - } - ], - "created": 1755228968, - "model": "llama3.2:3b-instruct-fp16", - "object": "chat.completion.chunk", - "service_tier": null, - "system_fingerprint": "fp_ollama", - "usage": null - } - }, - { - "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", - "__data__": { - "id": "chatcmpl-381", - "choices": [ - { - "delta": { - "content": ":\n\n", - "function_call": null, - "refusal": null, - "role": "assistant", - "tool_calls": null - }, - "finish_reason": null, - "index": 0, - "logprobs": null - } - ], - "created": 1755228968, - "model": "llama3.2:3b-instruct-fp16", - "object": "chat.completion.chunk", - "service_tier": null, - "system_fingerprint": "fp_ollama", - "usage": null - } - }, - { - "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", - "__data__": { - "id": "chatcmpl-381", - "choices": [ - { - "delta": { - "content": "-", - "function_call": null, - "refusal": null, - "role": "assistant", - "tool_calls": null - }, - "finish_reason": null, - "index": 0, - "logprobs": null - } - ], - "created": 1755228968, - "model": "llama3.2:3b-instruct-fp16", - "object": "chat.completion.chunk", - "service_tier": null, - "system_fingerprint": "fp_ollama", - "usage": null - } - }, - { - "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", - "__data__": { - "id": "chatcmpl-381", - "choices": [ - { - "delta": { - "content": " Acc", - "function_call": null, - "refusal": null, - "role": "assistant", - "tool_calls": null - }, - "finish_reason": null, - "index": 0, - "logprobs": null - } - ], - "created": 1755228968, - "model": "llama3.2:3b-instruct-fp16", - "object": "chat.completion.chunk", - "service_tier": null, - "system_fingerprint": "fp_ollama", - "usage": null - } - }, - { - "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", - "__data__": { - "id": "chatcmpl-381", - "choices": [ - { - "delta": { - "content": "u", - "function_call": null, - "refusal": null, - "role": "assistant", - "tool_calls": null - }, - "finish_reason": null, - "index": 0, - "logprobs": null - } - ], - "created": 1755228968, - "model": "llama3.2:3b-instruct-fp16", - "object": "chat.completion.chunk", - "service_tier": null, - "system_fingerprint": "fp_ollama", - "usage": null - } - }, - { - "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", - "__data__": { - "id": "chatcmpl-381", - "choices": [ - { - "delta": { - "content": "Weather", - "function_call": null, - "refusal": null, - "role": "assistant", - "tool_calls": null - }, - "finish_reason": null, - "index": 0, - "logprobs": null - } - ], - "created": 1755228968, - "model": "llama3.2:3b-instruct-fp16", - "object": "chat.completion.chunk", - "service_tier": null, - "system_fingerprint": "fp_ollama", - "usage": null - } - }, - { - "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", - "__data__": { - "id": "chatcmpl-381", - "choices": [ - { - "delta": { - "content": "\n", - "function_call": null, - "refusal": null, - "role": "assistant", - "tool_calls": null - }, - "finish_reason": null, - "index": 0, - "logprobs": null - } - ], - "created": 1755228969, - "model": "llama3.2:3b-instruct-fp16", - "object": "chat.completion.chunk", - "service_tier": null, - "system_fingerprint": "fp_ollama", - "usage": null - } - }, - { - "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", - "__data__": { - "id": "chatcmpl-381", - "choices": [ - { - "delta": { - "content": "-", - "function_call": null, - "refusal": null, - "role": "assistant", - "tool_calls": null - }, - "finish_reason": null, - "index": 0, - "logprobs": null - } - ], - "created": 1755228969, - "model": "llama3.2:3b-instruct-fp16", - "object": "chat.completion.chunk", - "service_tier": null, - "system_fingerprint": "fp_ollama", - "usage": null - } - }, - { - "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", - "__data__": { - "id": "chatcmpl-381", - "choices": [ - { - "delta": { - "content": " BBC", - "function_call": null, - "refusal": null, - "role": "assistant", - "tool_calls": null - }, - "finish_reason": null, - "index": 0, - "logprobs": null - } - ], - "created": 1755228969, - "model": "llama3.2:3b-instruct-fp16", - "object": "chat.completion.chunk", - "service_tier": null, - "system_fingerprint": "fp_ollama", - "usage": null - } - }, - { - "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", - "__data__": { - "id": "chatcmpl-381", - "choices": [ - { - "delta": { - "content": " Weather", - "function_call": null, - "refusal": null, - "role": "assistant", - "tool_calls": null - }, - "finish_reason": null, - "index": 0, - "logprobs": null - } - ], - "created": 1755228969, - "model": "llama3.2:3b-instruct-fp16", - "object": "chat.completion.chunk", - "service_tier": null, - "system_fingerprint": "fp_ollama", - "usage": null - } - }, - { - "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", - "__data__": { - "id": "chatcmpl-381", - "choices": [ - { - "delta": { - "content": "\n", - "function_call": null, - "refusal": null, - "role": "assistant", - "tool_calls": null - }, - "finish_reason": null, - "index": 0, - "logprobs": null - } - ], - "created": 1755228969, - "model": "llama3.2:3b-instruct-fp16", - "object": "chat.completion.chunk", - "service_tier": null, - "system_fingerprint": "fp_ollama", - "usage": null - } - }, - { - "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", - "__data__": { - "id": "chatcmpl-381", - "choices": [ - { - "delta": { - "content": "-", - "function_call": null, - "refusal": null, - "role": "assistant", - "tool_calls": null - }, - "finish_reason": null, - "index": 0, - "logprobs": null - } - ], - "created": 1755228969, - "model": "llama3.2:3b-instruct-fp16", - "object": "chat.completion.chunk", - "service_tier": null, - "system_fingerprint": "fp_ollama", - "usage": null - } - }, - { - "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", - "__data__": { - "id": "chatcmpl-381", - "choices": [ - { - "delta": { - "content": " The", - "function_call": null, - "refusal": null, - "role": "assistant", - "tool_calls": null - }, - "finish_reason": null, - "index": 0, - "logprobs": null - } - ], - "created": 1755228969, - "model": "llama3.2:3b-instruct-fp16", - "object": "chat.completion.chunk", - "service_tier": null, - "system_fingerprint": "fp_ollama", - "usage": null - } - }, - { - "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", - "__data__": { - "id": "chatcmpl-381", - "choices": [ - { - "delta": { - "content": " Weather", - "function_call": null, - "refusal": null, - "role": "assistant", - "tool_calls": null - }, - "finish_reason": null, - "index": 0, - "logprobs": null - } - ], - "created": 1755228969, - "model": "llama3.2:3b-instruct-fp16", - "object": "chat.completion.chunk", - "service_tier": null, - "system_fingerprint": "fp_ollama", - "usage": null - } - }, - { - "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", - "__data__": { - "id": "chatcmpl-381", - "choices": [ - { - "delta": { - "content": " Channel", - "function_call": null, - "refusal": null, - "role": "assistant", - "tool_calls": null - }, - "finish_reason": null, - "index": 0, - "logprobs": null - } - ], - "created": 1755228969, - "model": "llama3.2:3b-instruct-fp16", - "object": "chat.completion.chunk", - "service_tier": null, - "system_fingerprint": "fp_ollama", - "usage": null - } - }, - { - "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", - "__data__": { - "id": "chatcmpl-381", - "choices": [ - { - "delta": { - "content": "\n\n", - "function_call": null, - "refusal": null, - "role": "assistant", - "tool_calls": null - }, - "finish_reason": null, - "index": 0, - "logprobs": null - } - ], - "created": 1755228969, - "model": "llama3.2:3b-instruct-fp16", - "object": "chat.completion.chunk", - "service_tier": null, - "system_fingerprint": "fp_ollama", - "usage": null - } - }, - { - "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", - "__data__": { - "id": "chatcmpl-381", - "choices": [ - { - "delta": { - "content": "Or", - "function_call": null, - "refusal": null, - "role": "assistant", - "tool_calls": null - }, - "finish_reason": null, - "index": 0, - "logprobs": null - } - ], - "created": 1755228969, - "model": "llama3.2:3b-instruct-fp16", - "object": "chat.completion.chunk", - "service_tier": null, - "system_fingerprint": "fp_ollama", - "usage": null - } - }, - { - "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", - "__data__": { - "id": "chatcmpl-381", - "choices": [ - { - "delta": { - "content": " you", - "function_call": null, - "refusal": null, - "role": "assistant", - "tool_calls": null - }, - "finish_reason": null, - "index": 0, - "logprobs": null - } - ], - "created": 1755228969, - "model": "llama3.2:3b-instruct-fp16", - "object": "chat.completion.chunk", - "service_tier": null, - "system_fingerprint": "fp_ollama", - "usage": null - } - }, - { - "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", - "__data__": { - "id": "chatcmpl-381", + "id": "chatcmpl-358", "choices": [ { "delta": { @@ -4927,7 +455,7 @@ "logprobs": null } ], - "created": 1755228969, + "created": 1756921325, "model": "llama3.2:3b-instruct-fp16", "object": "chat.completion.chunk", "service_tier": null, @@ -4938,11 +466,11 @@ { "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", "__data__": { - "id": "chatcmpl-381", + "id": "chatcmpl-358", "choices": [ { "delta": { - "content": " check", + "content": " tell", "function_call": null, "refusal": null, "role": "assistant", @@ -4953,7 +481,7 @@ "logprobs": null } ], - "created": 1755228969, + "created": 1756921325, "model": "llama3.2:3b-instruct-fp16", "object": "chat.completion.chunk", "service_tier": null, @@ -4964,11 +492,11 @@ { "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", "__data__": { - "id": "chatcmpl-381", + "id": "chatcmpl-358", "choices": [ { "delta": { - "content": " local", + "content": " you", "function_call": null, "refusal": null, "role": "assistant", @@ -4979,7 +507,7 @@ "logprobs": null } ], - "created": 1755228969, + "created": 1756921325, "model": "llama3.2:3b-instruct-fp16", "object": "chat.completion.chunk", "service_tier": null, @@ -4990,11 +518,11 @@ { "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", "__data__": { - "id": "chatcmpl-381", + "id": "chatcmpl-358", "choices": [ { "delta": { - "content": " news", + "content": " that", "function_call": null, "refusal": null, "role": "assistant", @@ -5005,7 +533,7 @@ "logprobs": null } ], - "created": 1755228969, + "created": 1756921325, "model": "llama3.2:3b-instruct-fp16", "object": "chat.completion.chunk", "service_tier": null, @@ -5016,11 +544,11 @@ { "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", "__data__": { - "id": "chatcmpl-381", + "id": "chatcmpl-358", "choices": [ { "delta": { - "content": " websites", + "content": " Tokyo", "function_call": null, "refusal": null, "role": "assistant", @@ -5031,7 +559,7 @@ "logprobs": null } ], - "created": 1755228969, + "created": 1756921325, "model": "llama3.2:3b-instruct-fp16", "object": "chat.completion.chunk", "service_tier": null, @@ -5042,11 +570,11 @@ { "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", "__data__": { - "id": "chatcmpl-381", + "id": "chatcmpl-358", "choices": [ { "delta": { - "content": " or", + "content": " has", "function_call": null, "refusal": null, "role": "assistant", @@ -5057,7 +585,7 @@ "logprobs": null } ], - "created": 1755228969, + "created": 1756921325, "model": "llama3.2:3b-instruct-fp16", "object": "chat.completion.chunk", "service_tier": null, @@ -5068,11 +596,11 @@ { "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", "__data__": { - "id": "chatcmpl-381", + "id": "chatcmpl-358", "choices": [ { "delta": { - "content": " mobile", + "content": " a", "function_call": null, "refusal": null, "role": "assistant", @@ -5083,7 +611,7 @@ "logprobs": null } ], - "created": 1755228969, + "created": 1756921325, "model": "llama3.2:3b-instruct-fp16", "object": "chat.completion.chunk", "service_tier": null, @@ -5094,11 +622,11 @@ { "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", "__data__": { - "id": "chatcmpl-381", + "id": "chatcmpl-358", "choices": [ { "delta": { - "content": " apps", + "content": " humid", "function_call": null, "refusal": null, "role": "assistant", @@ -5109,7 +637,7 @@ "logprobs": null } ], - "created": 1755228969, + "created": 1756921325, "model": "llama3.2:3b-instruct-fp16", "object": "chat.completion.chunk", "service_tier": null, @@ -5120,11 +648,11 @@ { "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", "__data__": { - "id": "chatcmpl-381", + "id": "chatcmpl-358", "choices": [ { "delta": { - "content": " for", + "content": " subt", "function_call": null, "refusal": null, "role": "assistant", @@ -5135,7 +663,7 @@ "logprobs": null } ], - "created": 1755228969, + "created": 1756921325, "model": "llama3.2:3b-instruct-fp16", "object": "chat.completion.chunk", "service_tier": null, @@ -5146,11 +674,11 @@ { "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", "__data__": { - "id": "chatcmpl-381", + "id": "chatcmpl-358", "choices": [ { "delta": { - "content": " the", + "content": "ropical", "function_call": null, "refusal": null, "role": "assistant", @@ -5161,7 +689,7 @@ "logprobs": null } ], - "created": 1755228969, + "created": 1756921325, "model": "llama3.2:3b-instruct-fp16", "object": "chat.completion.chunk", "service_tier": null, @@ -5172,11 +700,11 @@ { "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", "__data__": { - "id": "chatcmpl-381", + "id": "chatcmpl-358", "choices": [ { "delta": { - "content": " latest", + "content": " climate", "function_call": null, "refusal": null, "role": "assistant", @@ -5187,7 +715,7 @@ "logprobs": null } ], - "created": 1755228969, + "created": 1756921325, "model": "llama3.2:3b-instruct-fp16", "object": "chat.completion.chunk", "service_tier": null, @@ -5198,11 +726,11 @@ { "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", "__data__": { - "id": "chatcmpl-381", + "id": "chatcmpl-358", "choices": [ { "delta": { - "content": " forecast", + "content": " with", "function_call": null, "refusal": null, "role": "assistant", @@ -5213,7 +741,7 @@ "logprobs": null } ], - "created": 1755228969, + "created": 1756921325, "model": "llama3.2:3b-instruct-fp16", "object": "chat.completion.chunk", "service_tier": null, @@ -5224,7 +752,111 @@ { "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", "__data__": { - "id": "chatcmpl-381", + "id": "chatcmpl-358", + "choices": [ + { + "delta": { + "content": " hot", + "function_call": null, + "refusal": null, + "role": "assistant", + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null + } + ], + "created": 1756921325, + "model": "llama3.2:3b-instruct-fp16", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": "fp_ollama", + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "chatcmpl-358", + "choices": [ + { + "delta": { + "content": " and", + "function_call": null, + "refusal": null, + "role": "assistant", + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null + } + ], + "created": 1756921325, + "model": "llama3.2:3b-instruct-fp16", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": "fp_ollama", + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "chatcmpl-358", + "choices": [ + { + "delta": { + "content": " humid", + "function_call": null, + "refusal": null, + "role": "assistant", + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null + } + ], + "created": 1756921325, + "model": "llama3.2:3b-instruct-fp16", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": "fp_ollama", + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "chatcmpl-358", + "choices": [ + { + "delta": { + "content": " summers", + "function_call": null, + "refusal": null, + "role": "assistant", + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null + } + ], + "created": 1756921325, + "model": "llama3.2:3b-instruct-fp16", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": "fp_ollama", + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "chatcmpl-358", "choices": [ { "delta": { @@ -5239,7 +871,7 @@ "logprobs": null } ], - "created": 1755228970, + "created": 1756921325, "model": "llama3.2:3b-instruct-fp16", "object": "chat.completion.chunk", "service_tier": null, @@ -5250,7 +882,4843 @@ { "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", "__data__": { - "id": "chatcmpl-381", + "id": "chatcmpl-358", + "choices": [ + { + "delta": { + "content": " Here", + "function_call": null, + "refusal": null, + "role": "assistant", + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null + } + ], + "created": 1756921325, + "model": "llama3.2:3b-instruct-fp16", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": "fp_ollama", + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "chatcmpl-358", + "choices": [ + { + "delta": { + "content": "'s", + "function_call": null, + "refusal": null, + "role": "assistant", + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null + } + ], + "created": 1756921325, + "model": "llama3.2:3b-instruct-fp16", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": "fp_ollama", + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "chatcmpl-358", + "choices": [ + { + "delta": { + "content": " an", + "function_call": null, + "refusal": null, + "role": "assistant", + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null + } + ], + "created": 1756921326, + "model": "llama3.2:3b-instruct-fp16", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": "fp_ollama", + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "chatcmpl-358", + "choices": [ + { + "delta": { + "content": " overview", + "function_call": null, + "refusal": null, + "role": "assistant", + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null + } + ], + "created": 1756921326, + "model": "llama3.2:3b-instruct-fp16", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": "fp_ollama", + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "chatcmpl-358", + "choices": [ + { + "delta": { + "content": " of", + "function_call": null, + "refusal": null, + "role": "assistant", + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null + } + ], + "created": 1756921326, + "model": "llama3.2:3b-instruct-fp16", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": "fp_ollama", + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "chatcmpl-358", + "choices": [ + { + "delta": { + "content": " typical", + "function_call": null, + "refusal": null, + "role": "assistant", + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null + } + ], + "created": 1756921326, + "model": "llama3.2:3b-instruct-fp16", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": "fp_ollama", + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "chatcmpl-358", + "choices": [ + { + "delta": { + "content": " seasonal", + "function_call": null, + "refusal": null, + "role": "assistant", + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null + } + ], + "created": 1756921326, + "model": "llama3.2:3b-instruct-fp16", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": "fp_ollama", + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "chatcmpl-358", + "choices": [ + { + "delta": { + "content": " weather", + "function_call": null, + "refusal": null, + "role": "assistant", + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null + } + ], + "created": 1756921326, + "model": "llama3.2:3b-instruct-fp16", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": "fp_ollama", + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "chatcmpl-358", + "choices": [ + { + "delta": { + "content": " patterns", + "function_call": null, + "refusal": null, + "role": "assistant", + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null + } + ], + "created": 1756921326, + "model": "llama3.2:3b-instruct-fp16", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": "fp_ollama", + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "chatcmpl-358", + "choices": [ + { + "delta": { + "content": ":\n\n", + "function_call": null, + "refusal": null, + "role": "assistant", + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null + } + ], + "created": 1756921326, + "model": "llama3.2:3b-instruct-fp16", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": "fp_ollama", + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "chatcmpl-358", + "choices": [ + { + "delta": { + "content": "1", + "function_call": null, + "refusal": null, + "role": "assistant", + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null + } + ], + "created": 1756921326, + "model": "llama3.2:3b-instruct-fp16", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": "fp_ollama", + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "chatcmpl-358", + "choices": [ + { + "delta": { + "content": ".", + "function_call": null, + "refusal": null, + "role": "assistant", + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null + } + ], + "created": 1756921326, + "model": "llama3.2:3b-instruct-fp16", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": "fp_ollama", + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "chatcmpl-358", + "choices": [ + { + "delta": { + "content": " **", + "function_call": null, + "refusal": null, + "role": "assistant", + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null + } + ], + "created": 1756921326, + "model": "llama3.2:3b-instruct-fp16", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": "fp_ollama", + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "chatcmpl-358", + "choices": [ + { + "delta": { + "content": "Spring", + "function_call": null, + "refusal": null, + "role": "assistant", + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null + } + ], + "created": 1756921326, + "model": "llama3.2:3b-instruct-fp16", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": "fp_ollama", + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "chatcmpl-358", + "choices": [ + { + "delta": { + "content": " (", + "function_call": null, + "refusal": null, + "role": "assistant", + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null + } + ], + "created": 1756921326, + "model": "llama3.2:3b-instruct-fp16", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": "fp_ollama", + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "chatcmpl-358", + "choices": [ + { + "delta": { + "content": "March", + "function_call": null, + "refusal": null, + "role": "assistant", + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null + } + ], + "created": 1756921326, + "model": "llama3.2:3b-instruct-fp16", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": "fp_ollama", + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "chatcmpl-358", + "choices": [ + { + "delta": { + "content": " to", + "function_call": null, + "refusal": null, + "role": "assistant", + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null + } + ], + "created": 1756921326, + "model": "llama3.2:3b-instruct-fp16", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": "fp_ollama", + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "chatcmpl-358", + "choices": [ + { + "delta": { + "content": " May", + "function_call": null, + "refusal": null, + "role": "assistant", + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null + } + ], + "created": 1756921326, + "model": "llama3.2:3b-instruct-fp16", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": "fp_ollama", + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "chatcmpl-358", + "choices": [ + { + "delta": { + "content": ")**", + "function_call": null, + "refusal": null, + "role": "assistant", + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null + } + ], + "created": 1756921326, + "model": "llama3.2:3b-instruct-fp16", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": "fp_ollama", + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "chatcmpl-358", + "choices": [ + { + "delta": { + "content": ":", + "function_call": null, + "refusal": null, + "role": "assistant", + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null + } + ], + "created": 1756921326, + "model": "llama3.2:3b-instruct-fp16", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": "fp_ollama", + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "chatcmpl-358", + "choices": [ + { + "delta": { + "content": " Mild", + "function_call": null, + "refusal": null, + "role": "assistant", + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null + } + ], + "created": 1756921326, + "model": "llama3.2:3b-instruct-fp16", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": "fp_ollama", + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "chatcmpl-358", + "choices": [ + { + "delta": { + "content": " temperatures", + "function_call": null, + "refusal": null, + "role": "assistant", + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null + } + ], + "created": 1756921326, + "model": "llama3.2:3b-instruct-fp16", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": "fp_ollama", + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "chatcmpl-358", + "choices": [ + { + "delta": { + "content": ",", + "function_call": null, + "refusal": null, + "role": "assistant", + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null + } + ], + "created": 1756921326, + "model": "llama3.2:3b-instruct-fp16", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": "fp_ollama", + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "chatcmpl-358", + "choices": [ + { + "delta": { + "content": " ranging", + "function_call": null, + "refusal": null, + "role": "assistant", + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null + } + ], + "created": 1756921326, + "model": "llama3.2:3b-instruct-fp16", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": "fp_ollama", + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "chatcmpl-358", + "choices": [ + { + "delta": { + "content": " from", + "function_call": null, + "refusal": null, + "role": "assistant", + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null + } + ], + "created": 1756921326, + "model": "llama3.2:3b-instruct-fp16", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": "fp_ollama", + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "chatcmpl-358", + "choices": [ + { + "delta": { + "content": " ", + "function_call": null, + "refusal": null, + "role": "assistant", + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null + } + ], + "created": 1756921326, + "model": "llama3.2:3b-instruct-fp16", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": "fp_ollama", + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "chatcmpl-358", + "choices": [ + { + "delta": { + "content": "15", + "function_call": null, + "refusal": null, + "role": "assistant", + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null + } + ], + "created": 1756921327, + "model": "llama3.2:3b-instruct-fp16", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": "fp_ollama", + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "chatcmpl-358", + "choices": [ + { + "delta": { + "content": "\u00b0C", + "function_call": null, + "refusal": null, + "role": "assistant", + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null + } + ], + "created": 1756921327, + "model": "llama3.2:3b-instruct-fp16", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": "fp_ollama", + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "chatcmpl-358", + "choices": [ + { + "delta": { + "content": " (", + "function_call": null, + "refusal": null, + "role": "assistant", + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null + } + ], + "created": 1756921327, + "model": "llama3.2:3b-instruct-fp16", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": "fp_ollama", + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "chatcmpl-358", + "choices": [ + { + "delta": { + "content": "59", + "function_call": null, + "refusal": null, + "role": "assistant", + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null + } + ], + "created": 1756921327, + "model": "llama3.2:3b-instruct-fp16", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": "fp_ollama", + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "chatcmpl-358", + "choices": [ + { + "delta": { + "content": "\u00b0F", + "function_call": null, + "refusal": null, + "role": "assistant", + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null + } + ], + "created": 1756921327, + "model": "llama3.2:3b-instruct-fp16", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": "fp_ollama", + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "chatcmpl-358", + "choices": [ + { + "delta": { + "content": ")", + "function_call": null, + "refusal": null, + "role": "assistant", + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null + } + ], + "created": 1756921327, + "model": "llama3.2:3b-instruct-fp16", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": "fp_ollama", + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "chatcmpl-358", + "choices": [ + { + "delta": { + "content": " to", + "function_call": null, + "refusal": null, + "role": "assistant", + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null + } + ], + "created": 1756921327, + "model": "llama3.2:3b-instruct-fp16", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": "fp_ollama", + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "chatcmpl-358", + "choices": [ + { + "delta": { + "content": " ", + "function_call": null, + "refusal": null, + "role": "assistant", + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null + } + ], + "created": 1756921327, + "model": "llama3.2:3b-instruct-fp16", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": "fp_ollama", + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "chatcmpl-358", + "choices": [ + { + "delta": { + "content": "20", + "function_call": null, + "refusal": null, + "role": "assistant", + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null + } + ], + "created": 1756921327, + "model": "llama3.2:3b-instruct-fp16", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": "fp_ollama", + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "chatcmpl-358", + "choices": [ + { + "delta": { + "content": "\u00b0C", + "function_call": null, + "refusal": null, + "role": "assistant", + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null + } + ], + "created": 1756921327, + "model": "llama3.2:3b-instruct-fp16", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": "fp_ollama", + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "chatcmpl-358", + "choices": [ + { + "delta": { + "content": " (", + "function_call": null, + "refusal": null, + "role": "assistant", + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null + } + ], + "created": 1756921327, + "model": "llama3.2:3b-instruct-fp16", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": "fp_ollama", + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "chatcmpl-358", + "choices": [ + { + "delta": { + "content": "68", + "function_call": null, + "refusal": null, + "role": "assistant", + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null + } + ], + "created": 1756921327, + "model": "llama3.2:3b-instruct-fp16", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": "fp_ollama", + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "chatcmpl-358", + "choices": [ + { + "delta": { + "content": "\u00b0F", + "function_call": null, + "refusal": null, + "role": "assistant", + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null + } + ], + "created": 1756921327, + "model": "llama3.2:3b-instruct-fp16", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": "fp_ollama", + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "chatcmpl-358", + "choices": [ + { + "delta": { + "content": "),", + "function_call": null, + "refusal": null, + "role": "assistant", + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null + } + ], + "created": 1756921327, + "model": "llama3.2:3b-instruct-fp16", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": "fp_ollama", + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "chatcmpl-358", + "choices": [ + { + "delta": { + "content": " with", + "function_call": null, + "refusal": null, + "role": "assistant", + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null + } + ], + "created": 1756921327, + "model": "llama3.2:3b-instruct-fp16", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": "fp_ollama", + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "chatcmpl-358", + "choices": [ + { + "delta": { + "content": " gentle", + "function_call": null, + "refusal": null, + "role": "assistant", + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null + } + ], + "created": 1756921327, + "model": "llama3.2:3b-instruct-fp16", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": "fp_ollama", + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "chatcmpl-358", + "choices": [ + { + "delta": { + "content": " humidity", + "function_call": null, + "refusal": null, + "role": "assistant", + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null + } + ], + "created": 1756921327, + "model": "llama3.2:3b-instruct-fp16", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": "fp_ollama", + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "chatcmpl-358", + "choices": [ + { + "delta": { + "content": ".\n\n", + "function_call": null, + "refusal": null, + "role": "assistant", + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null + } + ], + "created": 1756921327, + "model": "llama3.2:3b-instruct-fp16", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": "fp_ollama", + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "chatcmpl-358", + "choices": [ + { + "delta": { + "content": "2", + "function_call": null, + "refusal": null, + "role": "assistant", + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null + } + ], + "created": 1756921327, + "model": "llama3.2:3b-instruct-fp16", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": "fp_ollama", + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "chatcmpl-358", + "choices": [ + { + "delta": { + "content": ".", + "function_call": null, + "refusal": null, + "role": "assistant", + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null + } + ], + "created": 1756921327, + "model": "llama3.2:3b-instruct-fp16", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": "fp_ollama", + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "chatcmpl-358", + "choices": [ + { + "delta": { + "content": " **", + "function_call": null, + "refusal": null, + "role": "assistant", + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null + } + ], + "created": 1756921327, + "model": "llama3.2:3b-instruct-fp16", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": "fp_ollama", + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "chatcmpl-358", + "choices": [ + { + "delta": { + "content": "Summer", + "function_call": null, + "refusal": null, + "role": "assistant", + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null + } + ], + "created": 1756921327, + "model": "llama3.2:3b-instruct-fp16", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": "fp_ollama", + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "chatcmpl-358", + "choices": [ + { + "delta": { + "content": " (", + "function_call": null, + "refusal": null, + "role": "assistant", + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null + } + ], + "created": 1756921327, + "model": "llama3.2:3b-instruct-fp16", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": "fp_ollama", + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "chatcmpl-358", + "choices": [ + { + "delta": { + "content": "June", + "function_call": null, + "refusal": null, + "role": "assistant", + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null + } + ], + "created": 1756921327, + "model": "llama3.2:3b-instruct-fp16", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": "fp_ollama", + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "chatcmpl-358", + "choices": [ + { + "delta": { + "content": " to", + "function_call": null, + "refusal": null, + "role": "assistant", + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null + } + ], + "created": 1756921327, + "model": "llama3.2:3b-instruct-fp16", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": "fp_ollama", + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "chatcmpl-358", + "choices": [ + { + "delta": { + "content": " August", + "function_call": null, + "refusal": null, + "role": "assistant", + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null + } + ], + "created": 1756921328, + "model": "llama3.2:3b-instruct-fp16", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": "fp_ollama", + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "chatcmpl-358", + "choices": [ + { + "delta": { + "content": ")**", + "function_call": null, + "refusal": null, + "role": "assistant", + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null + } + ], + "created": 1756921328, + "model": "llama3.2:3b-instruct-fp16", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": "fp_ollama", + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "chatcmpl-358", + "choices": [ + { + "delta": { + "content": ":", + "function_call": null, + "refusal": null, + "role": "assistant", + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null + } + ], + "created": 1756921328, + "model": "llama3.2:3b-instruct-fp16", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": "fp_ollama", + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "chatcmpl-358", + "choices": [ + { + "delta": { + "content": " Hot", + "function_call": null, + "refusal": null, + "role": "assistant", + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null + } + ], + "created": 1756921328, + "model": "llama3.2:3b-instruct-fp16", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": "fp_ollama", + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "chatcmpl-358", + "choices": [ + { + "delta": { + "content": " and", + "function_call": null, + "refusal": null, + "role": "assistant", + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null + } + ], + "created": 1756921328, + "model": "llama3.2:3b-instruct-fp16", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": "fp_ollama", + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "chatcmpl-358", + "choices": [ + { + "delta": { + "content": " humid", + "function_call": null, + "refusal": null, + "role": "assistant", + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null + } + ], + "created": 1756921328, + "model": "llama3.2:3b-instruct-fp16", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": "fp_ollama", + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "chatcmpl-358", + "choices": [ + { + "delta": { + "content": ",", + "function_call": null, + "refusal": null, + "role": "assistant", + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null + } + ], + "created": 1756921328, + "model": "llama3.2:3b-instruct-fp16", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": "fp_ollama", + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "chatcmpl-358", + "choices": [ + { + "delta": { + "content": " with", + "function_call": null, + "refusal": null, + "role": "assistant", + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null + } + ], + "created": 1756921328, + "model": "llama3.2:3b-instruct-fp16", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": "fp_ollama", + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "chatcmpl-358", + "choices": [ + { + "delta": { + "content": " temperatures", + "function_call": null, + "refusal": null, + "role": "assistant", + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null + } + ], + "created": 1756921328, + "model": "llama3.2:3b-instruct-fp16", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": "fp_ollama", + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "chatcmpl-358", + "choices": [ + { + "delta": { + "content": " generally", + "function_call": null, + "refusal": null, + "role": "assistant", + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null + } + ], + "created": 1756921328, + "model": "llama3.2:3b-instruct-fp16", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": "fp_ollama", + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "chatcmpl-358", + "choices": [ + { + "delta": { + "content": " between", + "function_call": null, + "refusal": null, + "role": "assistant", + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null + } + ], + "created": 1756921328, + "model": "llama3.2:3b-instruct-fp16", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": "fp_ollama", + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "chatcmpl-358", + "choices": [ + { + "delta": { + "content": " ", + "function_call": null, + "refusal": null, + "role": "assistant", + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null + } + ], + "created": 1756921328, + "model": "llama3.2:3b-instruct-fp16", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": "fp_ollama", + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "chatcmpl-358", + "choices": [ + { + "delta": { + "content": "25", + "function_call": null, + "refusal": null, + "role": "assistant", + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null + } + ], + "created": 1756921328, + "model": "llama3.2:3b-instruct-fp16", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": "fp_ollama", + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "chatcmpl-358", + "choices": [ + { + "delta": { + "content": "\u00b0C", + "function_call": null, + "refusal": null, + "role": "assistant", + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null + } + ], + "created": 1756921328, + "model": "llama3.2:3b-instruct-fp16", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": "fp_ollama", + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "chatcmpl-358", + "choices": [ + { + "delta": { + "content": " (", + "function_call": null, + "refusal": null, + "role": "assistant", + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null + } + ], + "created": 1756921328, + "model": "llama3.2:3b-instruct-fp16", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": "fp_ollama", + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "chatcmpl-358", + "choices": [ + { + "delta": { + "content": "77", + "function_call": null, + "refusal": null, + "role": "assistant", + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null + } + ], + "created": 1756921328, + "model": "llama3.2:3b-instruct-fp16", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": "fp_ollama", + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "chatcmpl-358", + "choices": [ + { + "delta": { + "content": "\u00b0F", + "function_call": null, + "refusal": null, + "role": "assistant", + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null + } + ], + "created": 1756921328, + "model": "llama3.2:3b-instruct-fp16", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": "fp_ollama", + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "chatcmpl-358", + "choices": [ + { + "delta": { + "content": ")", + "function_call": null, + "refusal": null, + "role": "assistant", + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null + } + ], + "created": 1756921328, + "model": "llama3.2:3b-instruct-fp16", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": "fp_ollama", + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "chatcmpl-358", + "choices": [ + { + "delta": { + "content": " and", + "function_call": null, + "refusal": null, + "role": "assistant", + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null + } + ], + "created": 1756921328, + "model": "llama3.2:3b-instruct-fp16", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": "fp_ollama", + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "chatcmpl-358", + "choices": [ + { + "delta": { + "content": " ", + "function_call": null, + "refusal": null, + "role": "assistant", + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null + } + ], + "created": 1756921328, + "model": "llama3.2:3b-instruct-fp16", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": "fp_ollama", + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "chatcmpl-358", + "choices": [ + { + "delta": { + "content": "35", + "function_call": null, + "refusal": null, + "role": "assistant", + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null + } + ], + "created": 1756921328, + "model": "llama3.2:3b-instruct-fp16", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": "fp_ollama", + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "chatcmpl-358", + "choices": [ + { + "delta": { + "content": "\u00b0C", + "function_call": null, + "refusal": null, + "role": "assistant", + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null + } + ], + "created": 1756921328, + "model": "llama3.2:3b-instruct-fp16", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": "fp_ollama", + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "chatcmpl-358", + "choices": [ + { + "delta": { + "content": " (", + "function_call": null, + "refusal": null, + "role": "assistant", + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null + } + ], + "created": 1756921328, + "model": "llama3.2:3b-instruct-fp16", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": "fp_ollama", + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "chatcmpl-358", + "choices": [ + { + "delta": { + "content": "95", + "function_call": null, + "refusal": null, + "role": "assistant", + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null + } + ], + "created": 1756921328, + "model": "llama3.2:3b-instruct-fp16", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": "fp_ollama", + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "chatcmpl-358", + "choices": [ + { + "delta": { + "content": "\u00b0F", + "function_call": null, + "refusal": null, + "role": "assistant", + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null + } + ], + "created": 1756921329, + "model": "llama3.2:3b-instruct-fp16", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": "fp_ollama", + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "chatcmpl-358", + "choices": [ + { + "delta": { + "content": ").", + "function_call": null, + "refusal": null, + "role": "assistant", + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null + } + ], + "created": 1756921329, + "model": "llama3.2:3b-instruct-fp16", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": "fp_ollama", + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "chatcmpl-358", + "choices": [ + { + "delta": { + "content": " Heat", + "function_call": null, + "refusal": null, + "role": "assistant", + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null + } + ], + "created": 1756921329, + "model": "llama3.2:3b-instruct-fp16", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": "fp_ollama", + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "chatcmpl-358", + "choices": [ + { + "delta": { + "content": "waves", + "function_call": null, + "refusal": null, + "role": "assistant", + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null + } + ], + "created": 1756921329, + "model": "llama3.2:3b-instruct-fp16", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": "fp_ollama", + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "chatcmpl-358", + "choices": [ + { + "delta": { + "content": " are", + "function_call": null, + "refusal": null, + "role": "assistant", + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null + } + ], + "created": 1756921329, + "model": "llama3.2:3b-instruct-fp16", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": "fp_ollama", + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "chatcmpl-358", + "choices": [ + { + "delta": { + "content": " common", + "function_call": null, + "refusal": null, + "role": "assistant", + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null + } + ], + "created": 1756921329, + "model": "llama3.2:3b-instruct-fp16", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": "fp_ollama", + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "chatcmpl-358", + "choices": [ + { + "delta": { + "content": " during", + "function_call": null, + "refusal": null, + "role": "assistant", + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null + } + ], + "created": 1756921329, + "model": "llama3.2:3b-instruct-fp16", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": "fp_ollama", + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "chatcmpl-358", + "choices": [ + { + "delta": { + "content": " this", + "function_call": null, + "refusal": null, + "role": "assistant", + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null + } + ], + "created": 1756921329, + "model": "llama3.2:3b-instruct-fp16", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": "fp_ollama", + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "chatcmpl-358", + "choices": [ + { + "delta": { + "content": " period", + "function_call": null, + "refusal": null, + "role": "assistant", + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null + } + ], + "created": 1756921329, + "model": "llama3.2:3b-instruct-fp16", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": "fp_ollama", + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "chatcmpl-358", + "choices": [ + { + "delta": { + "content": ".\n\n", + "function_call": null, + "refusal": null, + "role": "assistant", + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null + } + ], + "created": 1756921329, + "model": "llama3.2:3b-instruct-fp16", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": "fp_ollama", + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "chatcmpl-358", + "choices": [ + { + "delta": { + "content": "3", + "function_call": null, + "refusal": null, + "role": "assistant", + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null + } + ], + "created": 1756921329, + "model": "llama3.2:3b-instruct-fp16", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": "fp_ollama", + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "chatcmpl-358", + "choices": [ + { + "delta": { + "content": ".", + "function_call": null, + "refusal": null, + "role": "assistant", + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null + } + ], + "created": 1756921329, + "model": "llama3.2:3b-instruct-fp16", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": "fp_ollama", + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "chatcmpl-358", + "choices": [ + { + "delta": { + "content": " **", + "function_call": null, + "refusal": null, + "role": "assistant", + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null + } + ], + "created": 1756921329, + "model": "llama3.2:3b-instruct-fp16", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": "fp_ollama", + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "chatcmpl-358", + "choices": [ + { + "delta": { + "content": "Aut", + "function_call": null, + "refusal": null, + "role": "assistant", + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null + } + ], + "created": 1756921329, + "model": "llama3.2:3b-instruct-fp16", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": "fp_ollama", + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "chatcmpl-358", + "choices": [ + { + "delta": { + "content": "umn", + "function_call": null, + "refusal": null, + "role": "assistant", + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null + } + ], + "created": 1756921329, + "model": "llama3.2:3b-instruct-fp16", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": "fp_ollama", + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "chatcmpl-358", + "choices": [ + { + "delta": { + "content": " (", + "function_call": null, + "refusal": null, + "role": "assistant", + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null + } + ], + "created": 1756921329, + "model": "llama3.2:3b-instruct-fp16", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": "fp_ollama", + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "chatcmpl-358", + "choices": [ + { + "delta": { + "content": "September", + "function_call": null, + "refusal": null, + "role": "assistant", + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null + } + ], + "created": 1756921329, + "model": "llama3.2:3b-instruct-fp16", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": "fp_ollama", + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "chatcmpl-358", + "choices": [ + { + "delta": { + "content": " to", + "function_call": null, + "refusal": null, + "role": "assistant", + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null + } + ], + "created": 1756921329, + "model": "llama3.2:3b-instruct-fp16", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": "fp_ollama", + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "chatcmpl-358", + "choices": [ + { + "delta": { + "content": " November", + "function_call": null, + "refusal": null, + "role": "assistant", + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null + } + ], + "created": 1756921329, + "model": "llama3.2:3b-instruct-fp16", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": "fp_ollama", + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "chatcmpl-358", + "choices": [ + { + "delta": { + "content": ")**", + "function_call": null, + "refusal": null, + "role": "assistant", + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null + } + ], + "created": 1756921329, + "model": "llama3.2:3b-instruct-fp16", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": "fp_ollama", + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "chatcmpl-358", + "choices": [ + { + "delta": { + "content": ":", + "function_call": null, + "refusal": null, + "role": "assistant", + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null + } + ], + "created": 1756921329, + "model": "llama3.2:3b-instruct-fp16", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": "fp_ollama", + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "chatcmpl-358", + "choices": [ + { + "delta": { + "content": " Comfort", + "function_call": null, + "refusal": null, + "role": "assistant", + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null + } + ], + "created": 1756921329, + "model": "llama3.2:3b-instruct-fp16", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": "fp_ollama", + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "chatcmpl-358", + "choices": [ + { + "delta": { + "content": "able", + "function_call": null, + "refusal": null, + "role": "assistant", + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null + } + ], + "created": 1756921329, + "model": "llama3.2:3b-instruct-fp16", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": "fp_ollama", + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "chatcmpl-358", + "choices": [ + { + "delta": { + "content": " temperatures", + "function_call": null, + "refusal": null, + "role": "assistant", + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null + } + ], + "created": 1756921329, + "model": "llama3.2:3b-instruct-fp16", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": "fp_ollama", + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "chatcmpl-358", + "choices": [ + { + "delta": { + "content": " of", + "function_call": null, + "refusal": null, + "role": "assistant", + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null + } + ], + "created": 1756921329, + "model": "llama3.2:3b-instruct-fp16", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": "fp_ollama", + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "chatcmpl-358", + "choices": [ + { + "delta": { + "content": " about", + "function_call": null, + "refusal": null, + "role": "assistant", + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null + } + ], + "created": 1756921330, + "model": "llama3.2:3b-instruct-fp16", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": "fp_ollama", + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "chatcmpl-358", + "choices": [ + { + "delta": { + "content": " ", + "function_call": null, + "refusal": null, + "role": "assistant", + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null + } + ], + "created": 1756921330, + "model": "llama3.2:3b-instruct-fp16", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": "fp_ollama", + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "chatcmpl-358", + "choices": [ + { + "delta": { + "content": "15", + "function_call": null, + "refusal": null, + "role": "assistant", + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null + } + ], + "created": 1756921330, + "model": "llama3.2:3b-instruct-fp16", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": "fp_ollama", + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "chatcmpl-358", + "choices": [ + { + "delta": { + "content": "\u00b0C", + "function_call": null, + "refusal": null, + "role": "assistant", + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null + } + ], + "created": 1756921330, + "model": "llama3.2:3b-instruct-fp16", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": "fp_ollama", + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "chatcmpl-358", + "choices": [ + { + "delta": { + "content": " (", + "function_call": null, + "refusal": null, + "role": "assistant", + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null + } + ], + "created": 1756921330, + "model": "llama3.2:3b-instruct-fp16", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": "fp_ollama", + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "chatcmpl-358", + "choices": [ + { + "delta": { + "content": "59", + "function_call": null, + "refusal": null, + "role": "assistant", + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null + } + ], + "created": 1756921330, + "model": "llama3.2:3b-instruct-fp16", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": "fp_ollama", + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "chatcmpl-358", + "choices": [ + { + "delta": { + "content": "\u00b0F", + "function_call": null, + "refusal": null, + "role": "assistant", + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null + } + ], + "created": 1756921330, + "model": "llama3.2:3b-instruct-fp16", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": "fp_ollama", + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "chatcmpl-358", + "choices": [ + { + "delta": { + "content": ")", + "function_call": null, + "refusal": null, + "role": "assistant", + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null + } + ], + "created": 1756921330, + "model": "llama3.2:3b-instruct-fp16", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": "fp_ollama", + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "chatcmpl-358", + "choices": [ + { + "delta": { + "content": " to", + "function_call": null, + "refusal": null, + "role": "assistant", + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null + } + ], + "created": 1756921330, + "model": "llama3.2:3b-instruct-fp16", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": "fp_ollama", + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "chatcmpl-358", + "choices": [ + { + "delta": { + "content": " ", + "function_call": null, + "refusal": null, + "role": "assistant", + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null + } + ], + "created": 1756921330, + "model": "llama3.2:3b-instruct-fp16", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": "fp_ollama", + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "chatcmpl-358", + "choices": [ + { + "delta": { + "content": "20", + "function_call": null, + "refusal": null, + "role": "assistant", + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null + } + ], + "created": 1756921330, + "model": "llama3.2:3b-instruct-fp16", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": "fp_ollama", + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "chatcmpl-358", + "choices": [ + { + "delta": { + "content": "\u00b0C", + "function_call": null, + "refusal": null, + "role": "assistant", + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null + } + ], + "created": 1756921330, + "model": "llama3.2:3b-instruct-fp16", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": "fp_ollama", + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "chatcmpl-358", + "choices": [ + { + "delta": { + "content": " (", + "function_call": null, + "refusal": null, + "role": "assistant", + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null + } + ], + "created": 1756921330, + "model": "llama3.2:3b-instruct-fp16", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": "fp_ollama", + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "chatcmpl-358", + "choices": [ + { + "delta": { + "content": "68", + "function_call": null, + "refusal": null, + "role": "assistant", + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null + } + ], + "created": 1756921330, + "model": "llama3.2:3b-instruct-fp16", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": "fp_ollama", + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "chatcmpl-358", + "choices": [ + { + "delta": { + "content": "\u00b0F", + "function_call": null, + "refusal": null, + "role": "assistant", + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null + } + ], + "created": 1756921330, + "model": "llama3.2:3b-instruct-fp16", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": "fp_ollama", + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "chatcmpl-358", + "choices": [ + { + "delta": { + "content": "),", + "function_call": null, + "refusal": null, + "role": "assistant", + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null + } + ], + "created": 1756921330, + "model": "llama3.2:3b-instruct-fp16", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": "fp_ollama", + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "chatcmpl-358", + "choices": [ + { + "delta": { + "content": " making", + "function_call": null, + "refusal": null, + "role": "assistant", + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null + } + ], + "created": 1756921330, + "model": "llama3.2:3b-instruct-fp16", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": "fp_ollama", + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "chatcmpl-358", + "choices": [ + { + "delta": { + "content": " it", + "function_call": null, + "refusal": null, + "role": "assistant", + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null + } + ], + "created": 1756921330, + "model": "llama3.2:3b-instruct-fp16", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": "fp_ollama", + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "chatcmpl-358", + "choices": [ + { + "delta": { + "content": " a", + "function_call": null, + "refusal": null, + "role": "assistant", + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null + } + ], + "created": 1756921330, + "model": "llama3.2:3b-instruct-fp16", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": "fp_ollama", + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "chatcmpl-358", + "choices": [ + { + "delta": { + "content": " lovely", + "function_call": null, + "refusal": null, + "role": "assistant", + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null + } + ], + "created": 1756921330, + "model": "llama3.2:3b-instruct-fp16", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": "fp_ollama", + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "chatcmpl-358", + "choices": [ + { + "delta": { + "content": " season", + "function_call": null, + "refusal": null, + "role": "assistant", + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null + } + ], + "created": 1756921330, + "model": "llama3.2:3b-instruct-fp16", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": "fp_ollama", + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "chatcmpl-358", + "choices": [ + { + "delta": { + "content": " for", + "function_call": null, + "refusal": null, + "role": "assistant", + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null + } + ], + "created": 1756921330, + "model": "llama3.2:3b-instruct-fp16", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": "fp_ollama", + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "chatcmpl-358", + "choices": [ + { + "delta": { + "content": " sight", + "function_call": null, + "refusal": null, + "role": "assistant", + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null + } + ], + "created": 1756921330, + "model": "llama3.2:3b-instruct-fp16", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": "fp_ollama", + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "chatcmpl-358", + "choices": [ + { + "delta": { + "content": "seeing", + "function_call": null, + "refusal": null, + "role": "assistant", + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null + } + ], + "created": 1756921330, + "model": "llama3.2:3b-instruct-fp16", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": "fp_ollama", + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "chatcmpl-358", + "choices": [ + { + "delta": { + "content": ".\n\n", + "function_call": null, + "refusal": null, + "role": "assistant", + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null + } + ], + "created": 1756921331, + "model": "llama3.2:3b-instruct-fp16", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": "fp_ollama", + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "chatcmpl-358", + "choices": [ + { + "delta": { + "content": "4", + "function_call": null, + "refusal": null, + "role": "assistant", + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null + } + ], + "created": 1756921331, + "model": "llama3.2:3b-instruct-fp16", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": "fp_ollama", + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "chatcmpl-358", + "choices": [ + { + "delta": { + "content": ".", + "function_call": null, + "refusal": null, + "role": "assistant", + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null + } + ], + "created": 1756921331, + "model": "llama3.2:3b-instruct-fp16", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": "fp_ollama", + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "chatcmpl-358", + "choices": [ + { + "delta": { + "content": " **", + "function_call": null, + "refusal": null, + "role": "assistant", + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null + } + ], + "created": 1756921331, + "model": "llama3.2:3b-instruct-fp16", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": "fp_ollama", + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "chatcmpl-358", + "choices": [ + { + "delta": { + "content": "Winter", + "function_call": null, + "refusal": null, + "role": "assistant", + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null + } + ], + "created": 1756921331, + "model": "llama3.2:3b-instruct-fp16", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": "fp_ollama", + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "chatcmpl-358", + "choices": [ + { + "delta": { + "content": " (", + "function_call": null, + "refusal": null, + "role": "assistant", + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null + } + ], + "created": 1756921331, + "model": "llama3.2:3b-instruct-fp16", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": "fp_ollama", + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "chatcmpl-358", + "choices": [ + { + "delta": { + "content": "December", + "function_call": null, + "refusal": null, + "role": "assistant", + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null + } + ], + "created": 1756921331, + "model": "llama3.2:3b-instruct-fp16", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": "fp_ollama", + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "chatcmpl-358", + "choices": [ + { + "delta": { + "content": " to", + "function_call": null, + "refusal": null, + "role": "assistant", + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null + } + ], + "created": 1756921331, + "model": "llama3.2:3b-instruct-fp16", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": "fp_ollama", + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "chatcmpl-358", + "choices": [ + { + "delta": { + "content": " February", + "function_call": null, + "refusal": null, + "role": "assistant", + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null + } + ], + "created": 1756921331, + "model": "llama3.2:3b-instruct-fp16", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": "fp_ollama", + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "chatcmpl-358", + "choices": [ + { + "delta": { + "content": ")**", + "function_call": null, + "refusal": null, + "role": "assistant", + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null + } + ], + "created": 1756921331, + "model": "llama3.2:3b-instruct-fp16", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": "fp_ollama", + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "chatcmpl-358", + "choices": [ + { + "delta": { + "content": ":", + "function_call": null, + "refusal": null, + "role": "assistant", + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null + } + ], + "created": 1756921331, + "model": "llama3.2:3b-instruct-fp16", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": "fp_ollama", + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "chatcmpl-358", + "choices": [ + { + "delta": { + "content": " Cool", + "function_call": null, + "refusal": null, + "role": "assistant", + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null + } + ], + "created": 1756921331, + "model": "llama3.2:3b-instruct-fp16", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": "fp_ollama", + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "chatcmpl-358", + "choices": [ + { + "delta": { + "content": " and", + "function_call": null, + "refusal": null, + "role": "assistant", + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null + } + ], + "created": 1756921331, + "model": "llama3.2:3b-instruct-fp16", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": "fp_ollama", + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "chatcmpl-358", + "choices": [ + { + "delta": { + "content": " relatively", + "function_call": null, + "refusal": null, + "role": "assistant", + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null + } + ], + "created": 1756921331, + "model": "llama3.2:3b-instruct-fp16", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": "fp_ollama", + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "chatcmpl-358", + "choices": [ + { + "delta": { + "content": " dry", + "function_call": null, + "refusal": null, + "role": "assistant", + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null + } + ], + "created": 1756921331, + "model": "llama3.2:3b-instruct-fp16", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": "fp_ollama", + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "chatcmpl-358", + "choices": [ + { + "delta": { + "content": ",", + "function_call": null, + "refusal": null, + "role": "assistant", + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null + } + ], + "created": 1756921331, + "model": "llama3.2:3b-instruct-fp16", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": "fp_ollama", + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "chatcmpl-358", + "choices": [ + { + "delta": { + "content": " with", + "function_call": null, + "refusal": null, + "role": "assistant", + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null + } + ], + "created": 1756921331, + "model": "llama3.2:3b-instruct-fp16", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": "fp_ollama", + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "chatcmpl-358", + "choices": [ + { + "delta": { + "content": " average", + "function_call": null, + "refusal": null, + "role": "assistant", + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null + } + ], + "created": 1756921331, + "model": "llama3.2:3b-instruct-fp16", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": "fp_ollama", + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "chatcmpl-358", + "choices": [ + { + "delta": { + "content": " temperatures", + "function_call": null, + "refusal": null, + "role": "assistant", + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null + } + ], + "created": 1756921331, + "model": "llama3.2:3b-instruct-fp16", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": "fp_ollama", + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "chatcmpl-358", + "choices": [ + { + "delta": { + "content": " ranging", + "function_call": null, + "refusal": null, + "role": "assistant", + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null + } + ], + "created": 1756921331, + "model": "llama3.2:3b-instruct-fp16", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": "fp_ollama", + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "chatcmpl-358", + "choices": [ + { + "delta": { + "content": " from", + "function_call": null, + "refusal": null, + "role": "assistant", + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null + } + ], + "created": 1756921331, + "model": "llama3.2:3b-instruct-fp16", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": "fp_ollama", + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "chatcmpl-358", + "choices": [ + { + "delta": { + "content": " -", + "function_call": null, + "refusal": null, + "role": "assistant", + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null + } + ], + "created": 1756921331, + "model": "llama3.2:3b-instruct-fp16", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": "fp_ollama", + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "chatcmpl-358", + "choices": [ + { + "delta": { + "content": "2", + "function_call": null, + "refusal": null, + "role": "assistant", + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null + } + ], + "created": 1756921331, + "model": "llama3.2:3b-instruct-fp16", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": "fp_ollama", + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "chatcmpl-358", + "choices": [ + { + "delta": { + "content": "\u00b0C", + "function_call": null, + "refusal": null, + "role": "assistant", + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null + } + ], + "created": 1756921331, + "model": "llama3.2:3b-instruct-fp16", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": "fp_ollama", + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "chatcmpl-358", + "choices": [ + { + "delta": { + "content": " (", + "function_call": null, + "refusal": null, + "role": "assistant", + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null + } + ], + "created": 1756921332, + "model": "llama3.2:3b-instruct-fp16", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": "fp_ollama", + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "chatcmpl-358", + "choices": [ + { + "delta": { + "content": "28", + "function_call": null, + "refusal": null, + "role": "assistant", + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null + } + ], + "created": 1756921332, + "model": "llama3.2:3b-instruct-fp16", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": "fp_ollama", + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "chatcmpl-358", + "choices": [ + { + "delta": { + "content": "\u00b0F", + "function_call": null, + "refusal": null, + "role": "assistant", + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null + } + ], + "created": 1756921332, + "model": "llama3.2:3b-instruct-fp16", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": "fp_ollama", + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "chatcmpl-358", + "choices": [ + { + "delta": { + "content": ")", + "function_call": null, + "refusal": null, + "role": "assistant", + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null + } + ], + "created": 1756921332, + "model": "llama3.2:3b-instruct-fp16", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": "fp_ollama", + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "chatcmpl-358", + "choices": [ + { + "delta": { + "content": " to", + "function_call": null, + "refusal": null, + "role": "assistant", + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null + } + ], + "created": 1756921332, + "model": "llama3.2:3b-instruct-fp16", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": "fp_ollama", + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "chatcmpl-358", + "choices": [ + { + "delta": { + "content": " ", + "function_call": null, + "refusal": null, + "role": "assistant", + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null + } + ], + "created": 1756921332, + "model": "llama3.2:3b-instruct-fp16", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": "fp_ollama", + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "chatcmpl-358", + "choices": [ + { + "delta": { + "content": "10", + "function_call": null, + "refusal": null, + "role": "assistant", + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null + } + ], + "created": 1756921332, + "model": "llama3.2:3b-instruct-fp16", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": "fp_ollama", + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "chatcmpl-358", + "choices": [ + { + "delta": { + "content": "\u00b0C", + "function_call": null, + "refusal": null, + "role": "assistant", + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null + } + ], + "created": 1756921332, + "model": "llama3.2:3b-instruct-fp16", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": "fp_ollama", + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "chatcmpl-358", + "choices": [ + { + "delta": { + "content": " (", + "function_call": null, + "refusal": null, + "role": "assistant", + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null + } + ], + "created": 1756921332, + "model": "llama3.2:3b-instruct-fp16", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": "fp_ollama", + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "chatcmpl-358", + "choices": [ + { + "delta": { + "content": "50", + "function_call": null, + "refusal": null, + "role": "assistant", + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null + } + ], + "created": 1756921332, + "model": "llama3.2:3b-instruct-fp16", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": "fp_ollama", + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "chatcmpl-358", + "choices": [ + { + "delta": { + "content": "\u00b0F", + "function_call": null, + "refusal": null, + "role": "assistant", + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null + } + ], + "created": 1756921332, + "model": "llama3.2:3b-instruct-fp16", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": "fp_ollama", + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "chatcmpl-358", + "choices": [ + { + "delta": { + "content": ").\n\n", + "function_call": null, + "refusal": null, + "role": "assistant", + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null + } + ], + "created": 1756921332, + "model": "llama3.2:3b-instruct-fp16", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": "fp_ollama", + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "chatcmpl-358", + "choices": [ + { + "delta": { + "content": "To", + "function_call": null, + "refusal": null, + "role": "assistant", + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null + } + ], + "created": 1756921332, + "model": "llama3.2:3b-instruct-fp16", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": "fp_ollama", + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "chatcmpl-358", + "choices": [ + { + "delta": { + "content": " get", + "function_call": null, + "refusal": null, + "role": "assistant", + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null + } + ], + "created": 1756921332, + "model": "llama3.2:3b-instruct-fp16", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": "fp_ollama", + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "chatcmpl-358", + "choices": [ + { + "delta": { + "content": " the", + "function_call": null, + "refusal": null, + "role": "assistant", + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null + } + ], + "created": 1756921332, + "model": "llama3.2:3b-instruct-fp16", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": "fp_ollama", + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "chatcmpl-358", + "choices": [ + { + "delta": { + "content": " current", + "function_call": null, + "refusal": null, + "role": "assistant", + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null + } + ], + "created": 1756921332, + "model": "llama3.2:3b-instruct-fp16", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": "fp_ollama", + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "chatcmpl-358", + "choices": [ + { + "delta": { + "content": " weather", + "function_call": null, + "refusal": null, + "role": "assistant", + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null + } + ], + "created": 1756921332, + "model": "llama3.2:3b-instruct-fp16", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": "fp_ollama", + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "chatcmpl-358", + "choices": [ + { + "delta": { + "content": " in", + "function_call": null, + "refusal": null, + "role": "assistant", + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null + } + ], + "created": 1756921332, + "model": "llama3.2:3b-instruct-fp16", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": "fp_ollama", + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "chatcmpl-358", + "choices": [ + { + "delta": { + "content": " Tokyo", + "function_call": null, + "refusal": null, + "role": "assistant", + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null + } + ], + "created": 1756921332, + "model": "llama3.2:3b-instruct-fp16", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": "fp_ollama", + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "chatcmpl-358", + "choices": [ + { + "delta": { + "content": ",", + "function_call": null, + "refusal": null, + "role": "assistant", + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null + } + ], + "created": 1756921332, + "model": "llama3.2:3b-instruct-fp16", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": "fp_ollama", + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "chatcmpl-358", + "choices": [ + { + "delta": { + "content": " I", + "function_call": null, + "refusal": null, + "role": "assistant", + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null + } + ], + "created": 1756921332, + "model": "llama3.2:3b-instruct-fp16", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": "fp_ollama", + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "chatcmpl-358", + "choices": [ + { + "delta": { + "content": " recommend", + "function_call": null, + "refusal": null, + "role": "assistant", + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null + } + ], + "created": 1756921332, + "model": "llama3.2:3b-instruct-fp16", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": "fp_ollama", + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "chatcmpl-358", + "choices": [ + { + "delta": { + "content": " checking", + "function_call": null, + "refusal": null, + "role": "assistant", + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null + } + ], + "created": 1756921332, + "model": "llama3.2:3b-instruct-fp16", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": "fp_ollama", + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "chatcmpl-358", + "choices": [ + { + "delta": { + "content": " online", + "function_call": null, + "refusal": null, + "role": "assistant", + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null + } + ], + "created": 1756921332, + "model": "llama3.2:3b-instruct-fp16", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": "fp_ollama", + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "chatcmpl-358", + "choices": [ + { + "delta": { + "content": " resources", + "function_call": null, + "refusal": null, + "role": "assistant", + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null + } + ], + "created": 1756921332, + "model": "llama3.2:3b-instruct-fp16", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": "fp_ollama", + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "chatcmpl-358", + "choices": [ + { + "delta": { + "content": " such", + "function_call": null, + "refusal": null, + "role": "assistant", + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null + } + ], + "created": 1756921333, + "model": "llama3.2:3b-instruct-fp16", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": "fp_ollama", + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "chatcmpl-358", + "choices": [ + { + "delta": { + "content": " as", + "function_call": null, + "refusal": null, + "role": "assistant", + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null + } + ], + "created": 1756921333, + "model": "llama3.2:3b-instruct-fp16", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": "fp_ollama", + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "chatcmpl-358", + "choices": [ + { + "delta": { + "content": " Acc", + "function_call": null, + "refusal": null, + "role": "assistant", + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null + } + ], + "created": 1756921333, + "model": "llama3.2:3b-instruct-fp16", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": "fp_ollama", + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "chatcmpl-358", + "choices": [ + { + "delta": { + "content": "u", + "function_call": null, + "refusal": null, + "role": "assistant", + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null + } + ], + "created": 1756921333, + "model": "llama3.2:3b-instruct-fp16", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": "fp_ollama", + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "chatcmpl-358", + "choices": [ + { + "delta": { + "content": "Weather", + "function_call": null, + "refusal": null, + "role": "assistant", + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null + } + ], + "created": 1756921333, + "model": "llama3.2:3b-instruct-fp16", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": "fp_ollama", + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "chatcmpl-358", + "choices": [ + { + "delta": { + "content": ",", + "function_call": null, + "refusal": null, + "role": "assistant", + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null + } + ], + "created": 1756921333, + "model": "llama3.2:3b-instruct-fp16", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": "fp_ollama", + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "chatcmpl-358", + "choices": [ + { + "delta": { + "content": " Weather", + "function_call": null, + "refusal": null, + "role": "assistant", + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null + } + ], + "created": 1756921333, + "model": "llama3.2:3b-instruct-fp16", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": "fp_ollama", + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "chatcmpl-358", + "choices": [ + { + "delta": { + "content": ".com", + "function_call": null, + "refusal": null, + "role": "assistant", + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null + } + ], + "created": 1756921333, + "model": "llama3.2:3b-instruct-fp16", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": "fp_ollama", + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "chatcmpl-358", + "choices": [ + { + "delta": { + "content": " or", + "function_call": null, + "refusal": null, + "role": "assistant", + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null + } + ], + "created": 1756921333, + "model": "llama3.2:3b-instruct-fp16", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": "fp_ollama", + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "chatcmpl-358", + "choices": [ + { + "delta": { + "content": " Met", + "function_call": null, + "refusal": null, + "role": "assistant", + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null + } + ], + "created": 1756921333, + "model": "llama3.2:3b-instruct-fp16", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": "fp_ollama", + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "chatcmpl-358", + "choices": [ + { + "delta": { + "content": "e", + "function_call": null, + "refusal": null, + "role": "assistant", + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null + } + ], + "created": 1756921333, + "model": "llama3.2:3b-instruct-fp16", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": "fp_ollama", + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "chatcmpl-358", + "choices": [ + { + "delta": { + "content": "ors", + "function_call": null, + "refusal": null, + "role": "assistant", + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null + } + ], + "created": 1756921333, + "model": "llama3.2:3b-instruct-fp16", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": "fp_ollama", + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "chatcmpl-358", + "choices": [ + { + "delta": { + "content": ".", + "function_call": null, + "refusal": null, + "role": "assistant", + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null + } + ], + "created": 1756921333, + "model": "llama3.2:3b-instruct-fp16", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": "fp_ollama", + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "chatcmpl-358", "choices": [ { "delta": { @@ -5265,7 +5733,7 @@ "logprobs": null } ], - "created": 1755228970, + "created": 1756921333, "model": "llama3.2:3b-instruct-fp16", "object": "chat.completion.chunk", "service_tier": null, diff --git a/tests/integration/recordings/responses/70adef2c30c4.json b/tests/integration/recordings/responses/70adef2c30c4.json index c17f21631..f8f3ce7df 100644 --- a/tests/integration/recordings/responses/70adef2c30c4.json +++ b/tests/integration/recordings/responses/70adef2c30c4.json @@ -20,15 +20,15 @@ "__type__": "ollama._types.GenerateResponse", "__data__": { "model": "llama3.2:3b-instruct-fp16", - "created_at": "2025-08-04T22:55:55.720345Z", + "created_at": "2025-09-03T17:42:17.227488Z", "done": true, "done_reason": "stop", - "total_duration": 3865701084, - "load_duration": 52435459, + "total_duration": 3003964916, + "load_duration": 111221916, "prompt_eval_count": 30, - "prompt_eval_duration": 99000000, + "prompt_eval_duration": 72578583, "eval_count": 70, - "eval_duration": 3712000000, + "eval_duration": 2819555375, "response": "The answer is Saturn! Saturn's ring system is one of the most iconic and well-known in our solar system. The rings are made up of ice particles, rock debris, and dust that orbit around the planet due to its gravitational pull.\n\nWould you like to know more about Saturn's rings or is there something else I can help you with?", "thinking": null, "context": null diff --git a/tests/integration/recordings/responses/72c1126ff2f9.json b/tests/integration/recordings/responses/72c1126ff2f9.json index b474c7e21..f50c68953 100644 --- a/tests/integration/recordings/responses/72c1126ff2f9.json +++ b/tests/integration/recordings/responses/72c1126ff2f9.json @@ -20,390 +20,390 @@ "data": [ { "embedding": [ - -0.024362812, - 0.016713308, - 0.03763492, - -0.009156733, - -0.030551745, - -0.017125947, - 0.07426094, - 0.045657348, - -0.0093097305, - 0.009920903, - -0.005690781, - 0.0076895193, - 0.039548296, - 0.015248784, - -0.083151944, - 0.019454934, - -0.02207085, - -0.033246633, - -0.1810784, - -0.1302997, - -0.0022484967, - 0.013480844, - -0.024304103, - -0.03698983, - 0.001961629, - 0.08568096, - 0.004767316, - -0.0034146819, - -0.0060834372, - -0.11571087, - 0.06683183, - -0.01873301, - 0.08783993, - -0.0074664783, - -0.09357002, - 0.061450087, - -0.0810802, - 0.012219781, - 0.039706405, - -0.002647126, - -0.046620198, - -0.081851535, - 0.039566126, - 0.015464555, - 0.043695353, - 0.10368333, - -0.058397062, - 0.03668824, - -0.052697357, - 0.04057381, - -0.12580334, - 0.0065060873, - -0.035828654, - -0.010048116, - -0.023825277, - 0.045975305, - 0.014622974, - 0.019410197, - 0.028452095, - -0.05502182, - 0.024185732, - -0.052869923, - 0.015245502, - -0.00438015, - 0.09234898, - 0.033873633, - -0.047367375, - 0.032001555, - 0.0013095026, - -0.051196218, - 0.025864813, - 0.081560105, - 0.040911082, - 0.019192263, - 0.056467537, - -0.052748967, - 0.030553715, - -0.016636984, - 0.07878182, - -0.054208696, - -0.042150352, - -0.045420144, - -0.05269096, - 0.11224785, - 0.019874783, - -0.0423623, - -0.011692426, - 0.024343297, - 0.01916104, - -0.016559148, - -0.010328452, - -0.085476756, - 0.02384857, - -0.042118136, - -0.024980163, - 0.062104426, - -0.004581602, - -0.15367238, - 0.001102325, - 0.19421555, - -0.03386706, - 0.026160223, - -0.020320892, - 0.0012947157, - -0.0010485641, - -0.024099724, - 0.017537115, - -0.009841853, - 0.070402764, - -0.13768643, - -0.111146465, - -0.017362772, - 0.06603636, - -0.051869333, - 0.0019475558, - 0.014572362, - 0.060779307, - 0.09626945, - 0.0135371, - 0.019355945, - -8.543184e-05, - -0.026694054, - -0.009353406, - 0.07085975, - -0.0034419452, - -0.062405273, - -0.044579133, - -8.80938e-34, - -0.11187708, - -0.04253664, - 0.027483786, - 0.06572092, - 0.0028295182, - -0.044070996, - 0.0052582966, - -0.036901183, - -0.015558772, - 0.020610636, - -0.059269626, - 0.0072413837, - -0.028733822, - 0.04047375, - 0.13381885, - 0.0068082553, - -0.016386433, - 0.08218299, - -0.022658324, - -0.036435697, - 0.06526089, - 0.021031637, - -0.0054843347, - -0.038373824, - 0.0014984249, - 0.007331966, - 0.01677609, - -0.06269722, - 0.035417397, - -0.014398793, - 0.027875954, - 0.08376195, - -0.02777757, - -0.0036516306, - 0.03904687, - -0.026841529, - -0.018736342, - 0.01903094, - 0.0651818, - 0.0070574977, - 0.0047951937, - -0.002987134, - 0.04006833, - 0.028001927, - -0.004688176, - 0.012248329, - 0.08704812, - -0.0070376135, - -0.037495255, - 0.011267182, - 0.015406452, - 0.013771707, - 0.017957818, - -0.009838073, - 0.09011513, - 0.051697087, - -0.034220304, - 0.0043991045, - -0.018898288, - -0.031457234, - 0.08212252, - 0.016876385, - -0.022177191, - 0.06844393, - 0.015856383, - 0.0203176, - 0.0063723125, - 0.016462969, - 0.12720266, - 0.014975143, - -0.010839063, - 0.0017705995, - 0.031662926, - -0.04433757, - -0.052297786, - 0.022821713, - 0.050960623, - -0.018954914, - 0.0027527376, - -0.033637978, - -0.13569047, - -0.027035592, - -0.035660848, - -0.03351404, - 0.047857523, - -0.0054172846, - 0.02130265, - -0.040015485, - 0.019387608, - 0.012020892, - -0.043413315, - 0.0005315479, - 0.03484659, - 0.017950043, - -0.062462628, - 8.226272e-34, - -0.09449095, - 0.013739951, - -0.025383765, - 0.09899241, - 0.04552389, - -0.020521628, - -0.029724384, - -0.059252843, - 0.042447623, - 0.08444559, - -0.043226957, - -0.0077667157, - 0.049366944, - 0.042077936, - -0.03653644, - 0.014414636, - 0.04032418, - -0.05892782, - 0.010031362, - 0.059879642, - -0.02792402, - 0.03490713, - -0.08760264, - -0.060620386, - -0.0048639597, - 0.087776646, - -0.005353071, - -0.02175546, - -0.048133314, - 0.046915755, - 0.008341115, - -0.05175852, - -0.02040021, - 0.085782945, - -0.0226071, - 0.034415677, - -0.014505325, - 0.0030903826, - -0.046515204, - 0.030268563, - 0.039748456, - 0.029745733, - -0.093127884, - 0.051514212, - 0.007829255, - -0.057012733, - -0.041812178, - 0.089898124, - -0.008121904, - -0.040828798, - -0.05349857, - -0.034339238, - -0.045287646, - -0.097146384, - -0.058177214, - 0.060921844, - -0.009064236, - 0.0069495556, - 0.012338063, - 0.062054638, - -0.0060062264, - -0.08641508, - 0.058708947, - 0.053361338, - -0.05353899, - 0.03950934, - -0.044963278, - 0.07279474, - -0.0396003, - -0.051377922, - 0.10337406, - 0.021824561, - 0.00013547574, - 0.009485335, - 0.021997929, - -0.0069047622, - -0.12891105, - -0.009861611, - -0.03639449, - -0.04249355, - 0.0044484157, - -0.04767584, - 0.0065166815, - 0.1026327, - -0.053176586, - 0.073318355, - 0.015824493, - -0.029136809, - 0.02512151, - -0.06307736, - -0.043478984, - 0.067193694, - 0.014923451, - -0.0011417158, - -0.098718524, - -1.4681537e-08, - 0.00463343, - -0.06712206, - 0.076443635, - -0.019814128, - 0.0673915, - 0.044810813, - -0.051008355, - -0.0077217882, - -0.02932436, - 0.028841449, - 0.018885555, - -0.024309436, - 0.044141307, - 0.044167083, - 0.03432404, - 0.046535607, - 0.021588394, - -0.0017551337, - -0.0029986037, - 0.014399799, - 0.12530664, - 0.034310702, - -0.0146423085, - 0.03919942, - -0.002325517, - -0.014395083, - 0.0100815315, - 0.024295514, - -0.04172604, - 0.08835341, - -0.031463772, - 0.030068664, - -0.0029138532, - 0.0048975134, - 0.09590149, - 0.09393541, - 0.0141605595, - -0.07715167, - -0.039247666, - -0.010700626, - -0.008573732, - 0.06410113, - -0.03301776, - -0.030493528, - 0.09457071, - -0.008976579, - -0.029922878, - -0.13298088, - 0.059931017, - -0.011697307, - 0.007152748, - 0.03558696, - 0.0040925406, - 0.056160007, - 0.07656515, - -0.010041294, - 0.0567585, - 0.023536174, - -0.06379649, - 0.08937482, - 0.04375676, - 0.043407574, - 0.04633825, - -0.07037851 + -0.024330618, + 0.016706783, + 0.037677176, + -0.00915746, + -0.030534461, + -0.017140884, + 0.074272, + 0.0456916, + -0.009377196, + 0.009883053, + -0.0056895507, + 0.007668296, + 0.039537333, + 0.015226257, + -0.083189555, + 0.019439526, + -0.022046678, + -0.033254813, + -0.18105465, + -0.13025087, + -0.0022671346, + 0.013451522, + -0.024325468, + -0.0370128, + 0.0020083552, + 0.08566712, + 0.0047639925, + -0.0033431018, + -0.006082307, + -0.11575565, + 0.06682902, + -0.018777572, + 0.08786827, + -0.0074177794, + -0.093573004, + 0.06146399, + -0.08110609, + 0.012222862, + 0.03971064, + -0.0026197461, + -0.04657111, + -0.08183902, + 0.03959615, + 0.015451151, + 0.04370617, + 0.103643835, + -0.058421485, + 0.036699355, + -0.052699573, + 0.040590122, + -0.12578927, + 0.006500531, + -0.03583627, + -0.010050973, + -0.023851713, + 0.045972254, + 0.014605586, + 0.019414552, + 0.028465148, + -0.055030964, + 0.024210233, + -0.052867457, + 0.015230711, + -0.0043921247, + 0.092372045, + 0.033849865, + -0.04737281, + 0.03204496, + 0.001322036, + -0.051211488, + 0.025862284, + 0.08155327, + 0.04092595, + 0.019154705, + 0.056453932, + -0.052758913, + 0.030533386, + -0.01663434, + 0.07877244, + -0.054262977, + -0.042149354, + -0.045443602, + -0.052689902, + 0.11225497, + 0.01989102, + -0.042375352, + -0.01168115, + 0.024315914, + 0.01915792, + -0.016550383, + -0.01030883, + -0.08545277, + 0.023834355, + -0.042181373, + -0.02503509, + 0.062114798, + -0.0045557353, + -0.15369569, + 0.001106691, + 0.19423288, + -0.0338511, + 0.026152972, + -0.02032091, + 0.0012884078, + -0.0010269672, + -0.02411262, + 0.017495485, + -0.009808713, + 0.07037937, + -0.13769862, + -0.11118059, + -0.01736481, + 0.06603106, + -0.05188892, + 0.0019610007, + 0.014606686, + 0.060775463, + 0.096280165, + 0.013551965, + 0.019343173, + -0.00010512453, + -0.026652312, + -0.009341819, + 0.07083247, + -0.0034617546, + -0.062412772, + -0.044611085, + -8.796679e-34, + -0.111884, + -0.04256611, + 0.027425196, + 0.06574074, + 0.002830377, + -0.044104468, + 0.005238822, + -0.036899913, + -0.015583552, + 0.0206543, + -0.059225976, + 0.007236511, + -0.028716031, + 0.040467348, + 0.13387093, + 0.006795838, + -0.01636956, + 0.082198486, + -0.02261007, + -0.03641293, + 0.06524453, + 0.021011814, + -0.005472363, + -0.038433436, + 0.001462021, + 0.0073671984, + 0.016773427, + -0.062663026, + 0.035388503, + -0.014395795, + 0.027888605, + 0.0837546, + -0.027772024, + -0.0036210797, + 0.03903557, + -0.026879627, + -0.018737236, + 0.019059159, + 0.06522148, + 0.0070414003, + 0.004749159, + -0.0030224407, + 0.040062208, + 0.028016094, + -0.004660955, + 0.012264517, + 0.08708117, + -0.0070171114, + -0.03749808, + 0.011326775, + 0.015419708, + 0.013775354, + 0.017958472, + -0.009817919, + 0.09011542, + 0.05170552, + -0.034259036, + 0.0043903207, + -0.01884889, + -0.031481344, + 0.08216297, + 0.016875258, + -0.022163702, + 0.06844141, + 0.01581623, + 0.020322658, + 0.0063856863, + 0.016461994, + 0.12718283, + 0.014996434, + -0.010813858, + 0.0017669421, + 0.03166716, + -0.044353984, + -0.05225622, + 0.022843942, + 0.050988898, + -0.018916955, + 0.0027930918, + -0.033645593, + -0.13571611, + -0.027015164, + -0.035672266, + -0.033537813, + 0.047864296, + -0.0054381513, + 0.021346755, + -0.040034927, + 0.019374551, + 0.012011466, + -0.04336231, + 0.00054701004, + 0.034879614, + 0.017960642, + -0.062501945, + 8.224154e-34, + -0.09450138, + 0.013776636, + -0.025351105, + 0.098992504, + 0.045503527, + -0.02053458, + -0.029694881, + -0.059200566, + 0.042453792, + 0.0844487, + -0.043211546, + -0.0077362363, + 0.049354795, + 0.04203366, + -0.036539596, + 0.014424774, + 0.040357023, + -0.058971472, + 0.010022987, + 0.059877146, + -0.02790864, + 0.034927685, + -0.087597504, + -0.060616262, + -0.0048867166, + 0.08776906, + -0.0053599468, + -0.021816833, + -0.048162397, + 0.046919785, + 0.0083988905, + -0.0517289, + -0.020422187, + 0.08581073, + -0.022597926, + 0.034425046, + -0.014506674, + 0.0031332907, + -0.04651877, + 0.030281488, + 0.039713897, + 0.02969227, + -0.09310218, + 0.051527865, + 0.007809, + -0.05700871, + -0.041792583, + 0.08987064, + -0.00813404, + -0.04082285, + -0.053487595, + -0.034378976, + -0.045253906, + -0.09715307, + -0.058194414, + 0.06093547, + -0.009079956, + 0.006918499, + 0.012345728, + 0.062036473, + -0.0060238577, + -0.0864295, + 0.05872831, + 0.053304974, + -0.05352623, + 0.039521407, + -0.04498403, + 0.0727911, + -0.039616212, + -0.05134442, + 0.10334881, + 0.02176773, + 0.00016648973, + 0.009423309, + 0.022016358, + -0.006902813, + -0.128883, + -0.009864072, + -0.036396757, + -0.042481646, + 0.004420737, + -0.047660243, + 0.0065179355, + 0.102602735, + -0.053166825, + 0.07328581, + 0.015810944, + -0.029149039, + 0.025130944, + -0.063055776, + -0.043462534, + 0.06719971, + 0.014921177, + -0.0010985207, + -0.09869465, + -1.4682753e-08, + 0.004611013, + -0.06715223, + 0.07644809, + -0.019802453, + 0.06737909, + 0.044783685, + -0.050963327, + -0.0077186874, + -0.029319718, + 0.028867716, + 0.018877175, + -0.024279349, + 0.04412064, + 0.04416273, + 0.03432814, + 0.046517964, + 0.02158077, + -0.001748483, + -0.0029956794, + 0.014355785, + 0.12525895, + 0.03431845, + -0.014617591, + 0.039184693, + -0.0023036227, + -0.014352919, + 0.01010173, + 0.02430961, + -0.041730728, + 0.08832413, + -0.031459343, + 0.030073628, + -0.0029376182, + 0.0049478672, + 0.09588392, + 0.09396655, + 0.01412568, + -0.077148266, + -0.039246846, + -0.01064901, + -0.008556093, + 0.06409403, + -0.033037152, + -0.03049978, + 0.0945846, + -0.008954658, + -0.029921891, + -0.132985, + 0.059934624, + -0.011668423, + 0.0071737366, + 0.035627652, + 0.0041028745, + 0.056198087, + 0.07656151, + -0.010067092, + 0.05678312, + 0.023536043, + -0.063770495, + 0.08934554, + 0.043756966, + 0.04337246, + 0.046287052, + -0.07039028 ], "index": 0, "object": "embedding" diff --git a/tests/integration/recordings/responses/7354ec181984.json b/tests/integration/recordings/responses/7354ec181984.json index 0404c6a6a..b73a7cd50 100644 --- a/tests/integration/recordings/responses/7354ec181984.json +++ b/tests/integration/recordings/responses/7354ec181984.json @@ -20,15 +20,15 @@ "__type__": "ollama._types.GenerateResponse", "__data__": { "model": "llama3.2:3b-instruct-fp16", - "created_at": "2025-07-31T17:51:16.201313167Z", + "created_at": "2025-09-03T17:39:54.374714Z", "done": true, "done_reason": "stop", - "total_duration": 27475921912, - "load_duration": 40564716, + "total_duration": 6321793333, + "load_duration": 182255958, "prompt_eval_count": 25, - "prompt_eval_duration": 964907432, + "prompt_eval_duration": 67964459, "eval_count": 150, - "eval_duration": 26469935419, + "eval_duration": 6070867875, "response": "The smallest country in the world is the Vatican City, which has a total area of approximately 0.44 km\u00b2 (0.17 sq mi). It is an independent city-state located within Rome, Italy, and is home to the Pope and the central government of the Catholic Church.\n\nTo put that into perspective, the Vatican City is smaller than a golf course! Despite its tiny size, it has its own government, currency, postal system, and even its own police force. It's also home to numerous iconic landmarks like St. Peter's Basilica and the Sistine Chapel.\n\nInterestingly, the Vatican City is not only the smallest country in the world but also the most densely populated, with a population of just over 800 people!", "thinking": null, "context": null diff --git a/tests/integration/recordings/responses/75d0dd9d0fa3.json b/tests/integration/recordings/responses/75d0dd9d0fa3.json index 52c5d574d..561fa1e67 100644 --- a/tests/integration/recordings/responses/75d0dd9d0fa3.json +++ b/tests/integration/recordings/responses/75d0dd9d0fa3.json @@ -45,15 +45,15 @@ "__type__": "ollama._types.GenerateResponse", "__data__": { "model": "llama3.2:3b-instruct-fp16", - "created_at": "2025-08-04T22:55:10.58267Z", + "created_at": "2025-09-03T17:36:17.508028Z", "done": true, "done_reason": "stop", - "total_duration": 1981967792, - "load_duration": 63184458, + "total_duration": 1529591917, + "load_duration": 84990667, "prompt_eval_count": 119, - "prompt_eval_duration": 259000000, + "prompt_eval_duration": 189045583, "eval_count": 29, - "eval_duration": 1582000000, + "eval_duration": 1254813583, "response": "{ \"name\": \"Michael Jordan\", \"year_born\": \"1963\", \"year_retired\": \"2003\"}\n ", "thinking": null, "context": null diff --git a/tests/integration/recordings/responses/7b25b702ea18.json b/tests/integration/recordings/responses/7b25b702ea18.json index bf8fb73d9..29a978e07 100644 --- a/tests/integration/recordings/responses/7b25b702ea18.json +++ b/tests/integration/recordings/responses/7b25b702ea18.json @@ -20,390 +20,390 @@ "data": [ { "embedding": [ - 0.06829144, - 0.061772227, - -0.0064161597, - 0.082678765, - -0.07824987, - 0.026521353, - 0.13125585, - 0.041369338, - -0.019540362, - -0.02709599, - 0.0887907, - -0.10275329, - 0.050712623, - -0.07134879, - -0.009282846, - -0.039247703, - 0.028860288, - -0.01049117, - -0.024684245, - -0.035460133, - -0.04094595, - -0.009883736, - -0.026154075, - 0.057957783, - -0.00061253883, - 0.0076184087, - 0.013905776, - -0.0016500223, - 0.044650607, - -0.05900644, - -0.037936445, - 0.037789088, - -0.03326097, - 0.07172011, - 0.09720765, - -0.082623295, - 0.027609807, - -0.014166528, - 0.018201344, - -0.0026497827, - -0.024251994, - -0.114919275, - 0.08516042, - -0.01674906, - -0.0063111004, - 0.06525075, - -0.058014978, - 0.09666779, - -0.014186084, - -0.006836795, - -0.09889106, - -0.015126775, - -0.0783394, - -0.03557229, - -0.008273864, - -0.013632112, - -0.07621237, - -0.03039195, - -0.0135569805, - 0.050146695, - -0.01059567, - -0.03840819, - 0.0674032, - 0.035650622, - 0.010801949, - -0.07822949, - -0.0068962453, - -0.03009482, - 0.055947337, - -0.07680802, - -0.009078504, - -0.002788809, - -0.02937109, - 0.06879565, - 0.013748122, - 0.030850956, - -0.03644146, - -0.07147028, - 0.05473256, - -0.028970802, - -0.064664625, - -0.059753876, - -0.067655295, - 0.022762805, - 0.07949517, - 0.051779337, - 0.14793634, - -0.0025083658, - -0.05545431, - -0.027768994, - 0.019383226, - 0.06685648, - -0.0795505, - 0.01904091, - -0.00094253226, - 0.0134609025, - 0.03820869, - -0.040206373, - 0.0649827, - 0.13925305, - 0.059302386, - 0.018050361, - -0.049063586, - -0.057463937, - -0.17034325, - 0.0098234955, - 0.04479311, - -0.08709996, - 0.046848226, - -0.02031104, - -0.062256135, - 0.030291956, - 0.04995267, - -0.03062274, - -0.007244306, - -0.06063938, - -0.0057327296, - 0.028709931, - -0.055921447, - -0.006099839, - 0.07552849, - 0.073059924, - -0.031967085, - -0.027995033, - -0.0013227675, - 0.0237769, - 0.08236448, - -2.0790976e-33, - 0.014696224, - -0.0849667, - 0.05938996, - -0.007827523, - -0.015969144, - 0.025970377, - 0.03762491, - 0.1256464, - -0.04001108, - 0.024740757, - 0.014459392, - -0.063038975, - 0.0340931, - -0.0076668505, - 0.008167134, - 0.10462719, - 0.018821232, - -0.021525906, - -0.04383254, - 0.05684103, - 0.016244315, - -0.07351815, - 0.02012839, - 0.05243149, - 0.015002977, - -0.06589196, - -0.032537818, - 0.024986163, - 0.018428918, - -0.0003134351, - -0.06270619, - -0.0061910586, - -0.16043852, - 0.028163772, - 0.033009354, - 0.03727067, - 0.05406701, - -0.007932531, - -0.008608034, - 0.054109853, - -0.046951395, - -0.03869324, - 0.084930494, - -0.005905675, - 0.021937586, - -0.052074514, - -0.047481276, - -0.054886986, - 0.034032077, - -0.02832154, - -0.032060325, - -0.0013834401, - -0.040383566, - -0.017775834, - 0.05222146, - 0.0038051854, - 0.008726582, - 0.032692313, - 0.010791591, - 0.11194475, - -0.019752404, - -0.045764305, - -0.0020202047, - 0.020939285, - -0.006159919, - -0.0017409867, - -0.0068266885, - -0.081341885, - 0.091841556, - 0.048661314, - 0.07770758, - -0.058719456, - 0.0063417573, - 0.0036042097, - -0.071244255, - 0.022036737, - 0.019486615, - 0.101281255, - 0.0066442927, - -0.044674896, - 0.06144362, - -0.09196092, - -0.0133002605, - 0.014585881, - -0.017600225, - 0.007354116, - 0.006177494, - -0.048051644, - 0.013157643, - -0.07767093, - 0.014147597, - 0.035391673, - -0.026176892, - 0.002718191, - 0.08641935, - 9.148517e-34, - -0.022012252, - 0.05088286, - -0.02727955, - 0.028613139, - 0.013718326, - -0.07109317, - 0.09039982, - -0.090625234, - -0.06567498, - 0.06685471, - 0.066993244, - -0.05015442, - 0.019033352, - -0.041487213, - 0.012605603, - 0.06907699, - 0.0281946, - -0.070972204, - -0.061149873, - 0.031668104, - -0.09625139, - 0.13133687, - -0.0035538, - -0.027149519, - -0.06298852, - -0.0009207272, - -0.008693039, - -0.031348817, - -0.018568903, - 0.011527607, - 0.07185478, - -0.071952716, - -0.0059043416, - 0.09352268, - 0.046653684, - -0.031974927, - 0.069581434, - -0.045875963, - 0.010133493, - 0.064104505, - 0.07243221, - 0.04723149, - 0.04880478, - 0.06762142, - 0.005496453, - 0.035764992, - 0.01831371, - -0.038210426, - 0.050088413, - 0.041379653, - -0.02544787, - 0.021565115, - 0.014279919, - -0.0071081445, - -0.014286643, - -0.010122217, - -0.091654085, - 0.009356054, - 0.0043320316, - -0.009591156, - -0.029850187, - 0.17471492, - -0.0045922897, - 0.05783941, - -0.044838578, - -0.051453117, - -0.045911513, - 0.007451434, - 0.0054590874, - 0.039563954, - -0.05625489, - -0.0022330268, - 0.047820278, - -0.039598763, - 0.027334856, - 0.039694488, - -0.07971524, - 0.03508072, - 0.029276432, - 0.010155507, - -0.039020576, - -0.027874392, - -0.040846046, - 0.046112783, - -0.069308, - 0.061977327, - 0.039240442, - 0.025863856, - 0.0064374707, - 0.053631745, - 0.06962397, - -0.008001055, - -0.03827026, - -0.10952415, - 0.018512232, - -1.3332562e-08, - -0.025684418, - -0.07470214, - -0.019860886, - 0.0385072, - 0.027302178, - -0.010903615, - -0.03522558, - 0.036009304, - -0.06320341, - 0.011506822, - 0.03339635, - -0.012044345, - 0.004013396, - 0.016582591, - -0.007978201, - -0.041656163, - -0.07090684, - 0.008757652, - 0.004474724, - -0.038768765, - -0.05130229, - 0.017759493, - -0.018255858, - 0.043951545, - -0.04284978, - 0.08247418, - 0.015467272, - 0.022083104, - 0.044421837, - 0.022857197, - 0.08298176, - -0.012647776, - 0.013097686, - -0.06692538, - 0.047861587, - -0.04503364, - 0.006510086, - 0.0056154854, - -0.019552445, - -0.017313117, - -0.038419757, - -0.00048296133, - -0.008638455, - -0.026783587, - -0.06596831, - -0.14337558, - 0.041494913, - -0.04859091, - 0.012739855, - -0.085007615, - -0.010923813, - -0.03816371, - 0.03006815, - -0.03887654, - -0.036665756, - 0.046499304, - 0.036260363, - 0.052359663, - -0.09627654, - -0.041531097, - 0.05020932, - -7.9168685e-06, - 0.0019163007, - 0.0195528 + 0.06829306, + 0.061738, + -0.0064223274, + 0.08267553, + -0.07827752, + 0.026546001, + 0.13129343, + 0.041391023, + -0.01950488, + -0.027131394, + 0.08875853, + -0.10276945, + 0.05070562, + -0.07138499, + -0.0092889285, + -0.039247777, + 0.028884362, + -0.010484688, + -0.02469515, + -0.0354649, + -0.04093021, + -0.009903105, + -0.026185337, + 0.057967436, + -0.00060980336, + 0.007659294, + 0.013928803, + -0.0016587646, + 0.044655163, + -0.058990903, + -0.037958965, + 0.037799176, + -0.033270117, + 0.071682036, + 0.09722083, + -0.08261939, + 0.027622383, + -0.014190519, + 0.01816939, + -0.002717151, + -0.02426505, + -0.11493204, + 0.0851599, + -0.016752614, + -0.006310121, + 0.065255314, + -0.058001935, + 0.096675195, + -0.01419834, + -0.0068260576, + -0.09889976, + -0.015109596, + -0.07833432, + -0.035589334, + -0.008278154, + -0.013655421, + -0.07625151, + -0.030405698, + -0.013589333, + 0.050117858, + -0.010591754, + -0.038398717, + 0.067407176, + 0.03565695, + 0.010748793, + -0.0782303, + -0.006898065, + -0.03009224, + 0.05595709, + -0.076849714, + -0.009063107, + -0.0028242348, + -0.02941444, + 0.06881705, + 0.013745148, + 0.03078439, + -0.036471423, + -0.07147355, + 0.054742936, + -0.028959772, + -0.06466119, + -0.05974295, + -0.06766193, + 0.022777116, + 0.079530336, + 0.051767077, + 0.14789894, + -0.0024908637, + -0.05542459, + -0.027760198, + 0.019384151, + 0.06692773, + -0.07952434, + 0.019047031, + -0.00097613735, + 0.013479467, + 0.038207904, + -0.040212464, + 0.06499357, + 0.13929029, + 0.0592868, + 0.018087199, + -0.04910378, + -0.057469312, + -0.17034933, + 0.009854021, + 0.04478709, + -0.08707103, + 0.046889827, + -0.020303966, + -0.062274974, + 0.030287566, + 0.04991786, + -0.030625034, + -0.007196787, + -0.060630832, + -0.0057445914, + 0.028697284, + -0.055902485, + -0.0060850815, + 0.075516894, + 0.07304865, + -0.03200336, + -0.027994294, + -0.0013179975, + 0.02373418, + 0.082337655, + -2.0787389e-33, + 0.014712573, + -0.084956154, + 0.059368864, + -0.00785449, + -0.015981624, + 0.02598549, + 0.037614744, + 0.12561654, + -0.04002324, + 0.02472032, + 0.014450717, + -0.06304021, + 0.034111217, + -0.00766782, + 0.008186535, + 0.10461876, + 0.018852819, + -0.021535609, + -0.04381762, + 0.05679568, + 0.01621111, + -0.0734938, + 0.020150887, + 0.05246773, + 0.015011716, + -0.06588331, + -0.03257114, + 0.025002314, + 0.018430108, + -0.00030111038, + -0.06266604, + -0.006196726, + -0.16044672, + 0.028114004, + 0.032982383, + 0.037261836, + 0.0540566, + -0.0079226745, + -0.008597091, + 0.054075282, + -0.046998158, + -0.03870267, + 0.08493371, + -0.005938313, + 0.021924777, + -0.05206361, + -0.047436308, + -0.054906387, + 0.03400277, + -0.028335828, + -0.032045983, + -0.0013805287, + -0.04042137, + -0.017744336, + 0.052251115, + 0.0038320236, + 0.008692022, + 0.03270182, + 0.010805367, + 0.11194987, + -0.019722551, + -0.04577441, + -0.002028829, + 0.020897591, + -0.006168528, + -0.0017238662, + -0.006808375, + -0.08133367, + 0.091827765, + 0.048646383, + 0.07771223, + -0.05870435, + 0.006373254, + 0.0036029797, + -0.071249805, + 0.022061123, + 0.019477166, + 0.10132688, + 0.006618212, + -0.044631813, + 0.06139753, + -0.09197761, + -0.013284173, + 0.014608393, + -0.01761416, + 0.0073858253, + 0.0062043094, + -0.048021033, + 0.013127433, + -0.077592075, + 0.014133566, + 0.035386372, + -0.02616333, + 0.0027075391, + 0.08635036, + 9.132231e-34, + -0.022040669, + 0.05085595, + -0.027267562, + 0.02862394, + 0.0137278, + -0.07108621, + 0.09040417, + -0.09064723, + -0.0656353, + 0.06688156, + 0.06701843, + -0.05015593, + 0.01906404, + -0.04147956, + 0.012601856, + 0.06909683, + 0.028203059, + -0.0709644, + -0.061153468, + 0.031663477, + -0.09626921, + 0.13134153, + -0.003593543, + -0.027185699, + -0.06297406, + -0.00092433795, + -0.008680087, + -0.031325806, + -0.018586429, + 0.011512126, + 0.071864344, + -0.071975954, + -0.005884031, + 0.09355209, + 0.046686243, + -0.031970512, + 0.06956754, + -0.045880646, + 0.010095539, + 0.064092614, + 0.07247815, + 0.04723167, + 0.048781574, + 0.06763336, + 0.0054456857, + 0.035764687, + 0.018254038, + -0.03819517, + 0.050082564, + 0.04140595, + -0.025459196, + 0.021584416, + 0.014274055, + -0.007126868, + -0.014268015, + -0.010105026, + -0.09164537, + 0.009354007, + 0.004333732, + -0.009582354, + -0.029860867, + 0.17471065, + -0.0045884773, + 0.05782756, + -0.044819925, + -0.051430847, + -0.045887176, + 0.0074449414, + 0.0054387357, + 0.039599653, + -0.056232683, + -0.002221041, + 0.047835752, + -0.039582185, + 0.027316216, + 0.039718047, + -0.07969795, + 0.03511298, + 0.029242206, + 0.010144028, + -0.03904501, + -0.027879883, + -0.040858228, + 0.04611512, + -0.06931006, + 0.061977647, + 0.03922111, + 0.025860278, + 0.0064425017, + 0.053613506, + 0.069628745, + -0.007990142, + -0.038263973, + -0.10954397, + 0.018542184, + -1.33346125e-08, + -0.025668526, + -0.07473254, + -0.019855365, + 0.0384919, + 0.027314084, + -0.010875396, + -0.035207637, + 0.036075134, + -0.063237526, + 0.011492366, + 0.03342596, + -0.012063488, + 0.0039839908, + 0.016522188, + -0.008002217, + -0.04168924, + -0.07092195, + 0.008746656, + 0.004452133, + -0.03877822, + -0.051253635, + 0.01774984, + -0.018253444, + 0.04394154, + -0.042883426, + 0.08245372, + 0.015452854, + 0.022076968, + 0.04442366, + 0.022832815, + 0.08296971, + -0.01261236, + 0.013092747, + -0.06689178, + 0.0478462, + -0.04507667, + 0.006519156, + 0.0055980994, + -0.019575223, + -0.01730519, + -0.03837497, + -0.00043787624, + -0.008650636, + -0.026787039, + -0.06598753, + -0.14336495, + 0.041543495, + -0.048590284, + 0.012749011, + -0.08499328, + -0.010950221, + -0.038154602, + 0.030090204, + -0.03886871, + -0.03670644, + 0.046492297, + 0.03623469, + 0.052362714, + -0.09623828, + -0.04149126, + 0.050219554, + -2.084757e-05, + 0.0019338154, + 0.019553935 ], "index": 0, "object": "embedding" diff --git a/tests/integration/recordings/responses/7b4815aba6c5.json b/tests/integration/recordings/responses/7b4815aba6c5.json index 2843b8a9c..f1e8e7165 100644 --- a/tests/integration/recordings/responses/7b4815aba6c5.json +++ b/tests/integration/recordings/responses/7b4815aba6c5.json @@ -22,7 +22,7 @@ "__type__": "ollama._types.GenerateResponse", "__data__": { "model": "llama3.2:3b-instruct-fp16", - "created_at": "2025-08-01T23:13:59.222059Z", + "created_at": "2025-09-03T17:37:48.840898Z", "done": false, "done_reason": null, "total_duration": null, @@ -40,7 +40,7 @@ "__type__": "ollama._types.GenerateResponse", "__data__": { "model": "llama3.2:3b-instruct-fp16", - "created_at": "2025-08-01T23:13:59.273466Z", + "created_at": "2025-09-03T17:37:48.883619Z", "done": false, "done_reason": null, "total_duration": null, @@ -58,7 +58,7 @@ "__type__": "ollama._types.GenerateResponse", "__data__": { "model": "llama3.2:3b-instruct-fp16", - "created_at": "2025-08-01T23:13:59.325562Z", + "created_at": "2025-09-03T17:37:48.92504Z", "done": false, "done_reason": null, "total_duration": null, @@ -76,7 +76,7 @@ "__type__": "ollama._types.GenerateResponse", "__data__": { "model": "llama3.2:3b-instruct-fp16", - "created_at": "2025-08-01T23:13:59.379223Z", + "created_at": "2025-09-03T17:37:48.966274Z", "done": false, "done_reason": null, "total_duration": null, @@ -94,7 +94,7 @@ "__type__": "ollama._types.GenerateResponse", "__data__": { "model": "llama3.2:3b-instruct-fp16", - "created_at": "2025-08-01T23:13:59.436435Z", + "created_at": "2025-09-03T17:37:49.007525Z", "done": false, "done_reason": null, "total_duration": null, @@ -112,7 +112,7 @@ "__type__": "ollama._types.GenerateResponse", "__data__": { "model": "llama3.2:3b-instruct-fp16", - "created_at": "2025-08-01T23:13:59.48928Z", + "created_at": "2025-09-03T17:37:49.049125Z", "done": false, "done_reason": null, "total_duration": null, @@ -130,7 +130,7 @@ "__type__": "ollama._types.GenerateResponse", "__data__": { "model": "llama3.2:3b-instruct-fp16", - "created_at": "2025-08-01T23:13:59.547102Z", + "created_at": "2025-09-03T17:37:49.090893Z", "done": false, "done_reason": null, "total_duration": null, @@ -148,7 +148,7 @@ "__type__": "ollama._types.GenerateResponse", "__data__": { "model": "llama3.2:3b-instruct-fp16", - "created_at": "2025-08-01T23:13:59.60579Z", + "created_at": "2025-09-03T17:37:49.132101Z", "done": false, "done_reason": null, "total_duration": null, @@ -166,7 +166,7 @@ "__type__": "ollama._types.GenerateResponse", "__data__": { "model": "llama3.2:3b-instruct-fp16", - "created_at": "2025-08-01T23:13:59.660149Z", + "created_at": "2025-09-03T17:37:49.17401Z", "done": false, "done_reason": null, "total_duration": null, @@ -184,7 +184,7 @@ "__type__": "ollama._types.GenerateResponse", "__data__": { "model": "llama3.2:3b-instruct-fp16", - "created_at": "2025-08-01T23:13:59.719166Z", + "created_at": "2025-09-03T17:37:49.216115Z", "done": false, "done_reason": null, "total_duration": null, @@ -202,7 +202,7 @@ "__type__": "ollama._types.GenerateResponse", "__data__": { "model": "llama3.2:3b-instruct-fp16", - "created_at": "2025-08-01T23:13:59.773893Z", + "created_at": "2025-09-03T17:37:49.257109Z", "done": false, "done_reason": null, "total_duration": null, @@ -220,7 +220,7 @@ "__type__": "ollama._types.GenerateResponse", "__data__": { "model": "llama3.2:3b-instruct-fp16", - "created_at": "2025-08-01T23:13:59.827636Z", + "created_at": "2025-09-03T17:37:49.298731Z", "done": false, "done_reason": null, "total_duration": null, @@ -238,7 +238,7 @@ "__type__": "ollama._types.GenerateResponse", "__data__": { "model": "llama3.2:3b-instruct-fp16", - "created_at": "2025-08-01T23:13:59.905205Z", + "created_at": "2025-09-03T17:37:49.338833Z", "done": false, "done_reason": null, "total_duration": null, @@ -256,7 +256,7 @@ "__type__": "ollama._types.GenerateResponse", "__data__": { "model": "llama3.2:3b-instruct-fp16", - "created_at": "2025-08-01T23:13:59.959347Z", + "created_at": "2025-09-03T17:37:49.38053Z", "done": false, "done_reason": null, "total_duration": null, @@ -274,7 +274,7 @@ "__type__": "ollama._types.GenerateResponse", "__data__": { "model": "llama3.2:3b-instruct-fp16", - "created_at": "2025-08-01T23:14:00.037904Z", + "created_at": "2025-09-03T17:37:49.421378Z", "done": false, "done_reason": null, "total_duration": null, @@ -292,7 +292,7 @@ "__type__": "ollama._types.GenerateResponse", "__data__": { "model": "llama3.2:3b-instruct-fp16", - "created_at": "2025-08-01T23:14:00.093527Z", + "created_at": "2025-09-03T17:37:49.462646Z", "done": false, "done_reason": null, "total_duration": null, @@ -310,7 +310,7 @@ "__type__": "ollama._types.GenerateResponse", "__data__": { "model": "llama3.2:3b-instruct-fp16", - "created_at": "2025-08-01T23:14:00.151329Z", + "created_at": "2025-09-03T17:37:49.503814Z", "done": false, "done_reason": null, "total_duration": null, @@ -328,7 +328,7 @@ "__type__": "ollama._types.GenerateResponse", "__data__": { "model": "llama3.2:3b-instruct-fp16", - "created_at": "2025-08-01T23:14:00.209463Z", + "created_at": "2025-09-03T17:37:49.545397Z", "done": false, "done_reason": null, "total_duration": null, @@ -346,15 +346,15 @@ "__type__": "ollama._types.GenerateResponse", "__data__": { "model": "llama3.2:3b-instruct-fp16", - "created_at": "2025-08-01T23:14:00.268012Z", + "created_at": "2025-09-03T17:37:49.586834Z", "done": true, "done_reason": "stop", - "total_duration": 1981034959, - "load_duration": 53445084, + "total_duration": 1409239209, + "load_duration": 118889250, "prompt_eval_count": 368, - "prompt_eval_duration": 880000000, + "prompt_eval_duration": 543077166, "eval_count": 19, - "eval_duration": 1046000000, + "eval_duration": 746733584, "response": "", "thinking": null, "context": null diff --git a/tests/integration/recordings/responses/7e6806cba34a.json b/tests/integration/recordings/responses/7e6806cba34a.json index 7b1d5261e..e2e32da73 100644 --- a/tests/integration/recordings/responses/7e6806cba34a.json +++ b/tests/integration/recordings/responses/7e6806cba34a.json @@ -21,7 +21,7 @@ "__type__": "ollama._types.GenerateResponse", "__data__": { "model": "llama3.2:3b-instruct-fp16", - "created_at": "2025-07-31T17:59:14.382398152Z", + "created_at": "2025-09-03T17:41:43.22891Z", "done": false, "done_reason": null, "total_duration": null, @@ -39,7 +39,7 @@ "__type__": "ollama._types.GenerateResponse", "__data__": { "model": "llama3.2:3b-instruct-fp16", - "created_at": "2025-07-31T17:59:14.561084788Z", + "created_at": "2025-09-03T17:41:43.268911Z", "done": false, "done_reason": null, "total_duration": null, @@ -57,7 +57,7 @@ "__type__": "ollama._types.GenerateResponse", "__data__": { "model": "llama3.2:3b-instruct-fp16", - "created_at": "2025-07-31T17:59:14.743154167Z", + "created_at": "2025-09-03T17:41:43.310121Z", "done": false, "done_reason": null, "total_duration": null, @@ -75,7 +75,7 @@ "__type__": "ollama._types.GenerateResponse", "__data__": { "model": "llama3.2:3b-instruct-fp16", - "created_at": "2025-07-31T17:59:14.920818124Z", + "created_at": "2025-09-03T17:41:43.35053Z", "done": false, "done_reason": null, "total_duration": null, @@ -93,7 +93,7 @@ "__type__": "ollama._types.GenerateResponse", "__data__": { "model": "llama3.2:3b-instruct-fp16", - "created_at": "2025-07-31T17:59:15.099067906Z", + "created_at": "2025-09-03T17:41:43.391033Z", "done": false, "done_reason": null, "total_duration": null, @@ -111,7 +111,7 @@ "__type__": "ollama._types.GenerateResponse", "__data__": { "model": "llama3.2:3b-instruct-fp16", - "created_at": "2025-07-31T17:59:15.274401879Z", + "created_at": "2025-09-03T17:41:43.431414Z", "done": false, "done_reason": null, "total_duration": null, @@ -129,7 +129,7 @@ "__type__": "ollama._types.GenerateResponse", "__data__": { "model": "llama3.2:3b-instruct-fp16", - "created_at": "2025-07-31T17:59:15.449669669Z", + "created_at": "2025-09-03T17:41:43.471553Z", "done": false, "done_reason": null, "total_duration": null, @@ -147,7 +147,7 @@ "__type__": "ollama._types.GenerateResponse", "__data__": { "model": "llama3.2:3b-instruct-fp16", - "created_at": "2025-07-31T17:59:15.626501213Z", + "created_at": "2025-09-03T17:41:43.512029Z", "done": false, "done_reason": null, "total_duration": null, @@ -165,7 +165,7 @@ "__type__": "ollama._types.GenerateResponse", "__data__": { "model": "llama3.2:3b-instruct-fp16", - "created_at": "2025-07-31T17:59:15.802614623Z", + "created_at": "2025-09-03T17:41:43.55268Z", "done": false, "done_reason": null, "total_duration": null, @@ -183,7 +183,7 @@ "__type__": "ollama._types.GenerateResponse", "__data__": { "model": "llama3.2:3b-instruct-fp16", - "created_at": "2025-07-31T17:59:15.978698104Z", + "created_at": "2025-09-03T17:41:43.594309Z", "done": false, "done_reason": null, "total_duration": null, @@ -201,7 +201,7 @@ "__type__": "ollama._types.GenerateResponse", "__data__": { "model": "llama3.2:3b-instruct-fp16", - "created_at": "2025-07-31T17:59:16.160654179Z", + "created_at": "2025-09-03T17:41:43.635445Z", "done": false, "done_reason": null, "total_duration": null, @@ -219,7 +219,7 @@ "__type__": "ollama._types.GenerateResponse", "__data__": { "model": "llama3.2:3b-instruct-fp16", - "created_at": "2025-07-31T17:59:16.338412914Z", + "created_at": "2025-09-03T17:41:43.676541Z", "done": false, "done_reason": null, "total_duration": null, @@ -237,15 +237,15 @@ "__type__": "ollama._types.GenerateResponse", "__data__": { "model": "llama3.2:3b-instruct-fp16", - "created_at": "2025-07-31T17:59:16.521646436Z", + "created_at": "2025-09-03T17:41:43.717809Z", "done": true, "done_reason": "stop", - "total_duration": 4555044563, - "load_duration": 43101307, + "total_duration": 820540625, + "load_duration": 111045959, "prompt_eval_count": 29, - "prompt_eval_duration": 2371036213, + "prompt_eval_duration": 219693291, "eval_count": 13, - "eval_duration": 2140342701, + "eval_duration": 489282542, "response": "", "thinking": null, "context": null diff --git a/tests/integration/recordings/responses/802f60021837.json b/tests/integration/recordings/responses/802f60021837.json index 7ba0466c4..a17aa4af3 100644 --- a/tests/integration/recordings/responses/802f60021837.json +++ b/tests/integration/recordings/responses/802f60021837.json @@ -20,390 +20,390 @@ "data": [ { "embedding": [ - -0.0623061, - 0.043155346, - -0.056864023, - 0.03486763, - -0.045145836, - -0.13253546, - 0.021805322, - 0.039048277, - -0.04841761, - -0.031872153, - -0.039334167, - 0.0063758655, - 0.07872078, - -0.0042740484, - 0.023612525, - -0.02170506, - -0.055740308, - -0.0094528515, - 0.039697133, - -0.11445638, - -0.011568856, - 0.06161228, - -0.02625024, - 0.024374798, - 0.029430348, - -0.0035586308, - -0.0014398397, - -0.00313635, - 0.013770647, - -0.0002185752, - -0.014788754, - 0.084392585, - 0.06679723, - 0.042302314, - 0.007701145, - 0.073157564, - -0.008342027, - -0.09463514, - -0.09247907, - 0.00763349, - -0.07390047, - 0.015466744, - -0.04406345, - -0.044970937, - -0.041317657, - 0.06967893, - -0.02747757, - 0.014388817, - -0.036104802, - -0.006673772, - -0.08029175, - -6.000176e-05, - -0.038977537, - -0.049003445, - 0.017844146, - -0.0064918958, - 0.059797343, - -0.003170151, - -0.024797099, - -0.11498058, - -0.047404848, - 0.0185016, - -0.009826349, - 0.09572491, - -0.009429792, - -0.03576324, - -0.031269584, - -0.0032131649, - 0.07714364, - -0.07617566, - -0.118788, - -0.06321078, - -0.0046245204, - 0.06524506, - 0.04577385, - -0.13796814, - 0.04598187, - -0.03355735, - -0.013584839, - 0.0045000566, - 0.017061453, - -0.0016859988, - -0.051290352, - 0.102515854, - 0.015375054, - -0.053396687, - 0.046739385, - 0.11428208, - -0.0060018655, - 0.010324239, - -0.031606395, - -0.051939677, - 0.020962074, - 0.008873621, - -0.06903091, - 0.08133413, - 0.012089255, - -0.06411361, - -0.03635769, - 0.046689924, - 0.011246541, - -0.05031814, - 0.073784724, - -0.021187203, - 0.03246321, - -0.026193537, - 0.06816752, - -0.03795416, - 0.030822705, - -0.0371306, - -0.03693002, - -0.029442247, - -0.032879222, - -0.005807539, - 0.04255175, - 0.054692194, - -0.0192783, - 0.12276652, - 0.0037922377, - 0.0320851, - 0.023700258, - 0.019210111, - 0.019973421, - -0.012249867, - -0.03246148, - -0.0044806604, - -0.035679862, - -6.954278e-33, - -0.0220099, - -0.06862265, - -0.03537707, - 0.008910154, - 0.071089186, - -0.025226729, - 0.091465496, - -0.009329111, - -0.05951072, - -0.034704443, - 0.04334736, - 0.03334519, - 0.024234882, - 0.08795047, - 0.020609507, - -0.0008948477, - -0.013011299, - 0.08836162, - 0.045687113, - 0.025813619, - 0.0542986, - 0.09676311, - 0.023140479, - 0.024307383, - 0.014198938, - -0.018661225, - -0.024505567, - -0.03258764, - 0.025222383, - 0.016810626, - -0.07629099, - 0.012676406, - -0.021304907, - 0.006898141, - 0.030808464, - -0.000315505, - 0.0005437531, - -0.08589918, - 0.04053157, - 0.006305948, - -0.010008999, - 0.0015841384, - 0.012631508, - -0.036505677, - -0.023090534, - 0.012400456, - -0.00514819, - 0.020243159, - -0.08760989, - 0.045204975, - -0.0012632157, - -0.06573619, - 0.07478642, - 0.08402555, - -0.013935989, - 0.05592361, - 0.019318154, - -0.019661061, - -0.016006675, - -0.02916137, - 0.0373911, - 0.06808347, - 0.06916834, - -0.0076644514, - 0.02114384, - 0.04043145, - 0.03511955, - 0.08206532, - 0.08808922, - 0.050526854, - -0.059352025, - 0.04576268, - -0.025140414, - 0.03584363, - -0.02806783, - 0.019853832, - 0.033893492, - -0.07974513, - 0.023001093, - 0.062465888, - -0.034909748, - -0.05390039, - -0.016120961, - -0.0057214363, - -0.030499708, - -0.02269443, - -0.010363369, - 0.067623645, - -0.010582917, - -0.09608072, - -0.07854503, - -0.085294046, - 0.029974943, - -0.005945623, - -0.039578382, - 2.9788035e-33, - 0.0114961, - 0.010420429, - -0.06988839, - 0.019277215, - -0.08453786, - -0.085693836, - 0.06625677, - 0.063027605, - 0.050445113, - 0.033733714, - -0.0058911345, - -0.06960736, - 0.12548403, - 0.021376437, - 0.07414455, - 0.034223642, - -0.045840543, - 0.014842206, - -0.0126910545, - 0.003648386, - -0.08023818, - 0.06729063, - -0.056022517, - -0.08669063, - -0.027885731, - -0.033907417, - -0.038715098, - -0.07791038, - -0.017792802, - 0.061793778, - 0.014706543, - 0.020005805, - -0.08145671, - 0.05236086, - 0.06286303, - -0.0015804858, - 0.040509794, - -0.027593212, - -0.009631841, - -0.017296297, - 0.11391202, - 0.04420345, - 0.03534961, - 0.12113969, - 0.018799841, - 0.049258087, - -0.036080077, - 0.07791577, - -0.029658308, - -0.070674755, - -0.0067282193, - 0.006079021, - 0.04225839, - -0.039644253, - -0.04860991, - -0.039792407, - 0.032389786, - 0.033703297, - -0.0924961, - -0.04988354, - -0.06596082, - -0.04236528, - 0.03126068, - 0.011825378, - -0.044250805, - 0.046862055, - -0.123014495, - -0.034661833, - -0.01387497, - -0.13120808, - 0.14482524, - 0.0056040953, - -0.0031055296, - 0.022885982, - -0.07644984, - 0.016439024, - -0.019532247, - -0.024956707, - -0.0685838, - 0.07072798, - 0.026639467, - -0.0351677, - -0.0015660838, - 0.02932653, - -0.089445055, - -0.022545021, - -0.03112053, - 0.053812344, - 0.007873327, - 0.023094172, - -0.0043896562, - 0.05380028, - 0.017278776, - 0.056359384, - -0.05330339, - -1.3478282e-08, - -0.039658625, - 0.013374887, - 0.03682183, - 0.009698332, - 0.0046835328, - 0.06660773, - 0.022911774, - -0.047426622, - -0.040507935, - 0.006813708, - 0.0086692255, - -0.0063030533, - -0.04566467, - -0.06387448, - -0.013173488, - 0.11698006, - 0.016895978, - -0.0013877428, - 0.02321246, - 0.022267532, - 0.078508325, - -0.045089863, - -0.009183129, - 0.066403426, - -0.06653049, - -0.0154824555, - 0.054102156, - 0.07644729, - 0.008254354, - -0.124090366, - 0.012699053, - -0.017593145, - -0.020621033, - 0.032500766, - -0.012999753, - 0.022328354, - 0.010528125, - -0.08832318, - 0.02148152, - -0.0029870127, - -0.03183275, - 0.07181985, - 0.01038717, - 0.0036043858, - 0.048932884, - 0.07041019, - -0.036562778, - -0.03517641, - -0.03654687, - -0.07017274, - -0.03033558, - 0.02860758, - -0.019075464, - -0.002551204, - 0.02127327, - 0.074368805, - -0.11424493, - -0.027312418, - -0.010811127, - 0.010405173, - -0.02275616, - 0.11514236, - 0.18532485, - -0.026541265 + -0.062304743, + 0.04315718, + -0.056847535, + 0.03486019, + -0.045148205, + -0.1325256, + 0.021795923, + 0.039035086, + -0.048403695, + -0.03187157, + -0.03934502, + 0.006355416, + 0.07870429, + -0.004275144, + 0.023635335, + -0.02171452, + -0.055756103, + -0.009452624, + 0.03968397, + -0.11446917, + -0.011574315, + 0.06161675, + -0.026243819, + 0.024376081, + 0.029439807, + -0.0035745306, + -0.0014413354, + -0.0031348146, + 0.0137771955, + -0.00021878166, + -0.0148119675, + 0.08438267, + 0.06679146, + 0.042289164, + 0.0077238376, + 0.073178865, + -0.008341517, + -0.094652176, + -0.09245101, + 0.0075944075, + -0.07389992, + 0.015481098, + -0.04405396, + -0.04497366, + -0.041315924, + 0.06968346, + -0.027464444, + 0.014380017, + -0.036109854, + -0.006690219, + -0.080297194, + -5.8296577e-05, + -0.03897778, + -0.049029846, + 0.017797105, + -0.0064906515, + 0.05977029, + -0.0031445406, + -0.024804324, + -0.114971094, + -0.047434244, + 0.018489277, + -0.009801151, + 0.09573786, + -0.009445709, + -0.035714474, + -0.031265706, + -0.0032087746, + 0.07714283, + -0.076175354, + -0.11878057, + -0.06322687, + -0.0045974515, + 0.06524851, + 0.045755487, + -0.13797933, + 0.045973603, + -0.03356543, + -0.013575197, + 0.004536992, + 0.01706251, + -0.0016689816, + -0.051292486, + 0.10251468, + 0.015364908, + -0.05339754, + 0.046751976, + 0.11428272, + -0.0060051866, + 0.010296865, + -0.03160346, + -0.051935352, + 0.02092994, + 0.008887596, + -0.069010794, + 0.08132733, + 0.012102074, + -0.06409327, + -0.036342084, + 0.046690084, + 0.011248327, + -0.050334014, + 0.073782355, + -0.02119414, + 0.0324611, + -0.026148362, + 0.06814877, + -0.03795885, + 0.030811384, + -0.037118603, + -0.036956605, + -0.02943471, + -0.0328876, + -0.00579801, + 0.04255975, + 0.05469473, + -0.01927437, + 0.12277417, + 0.0037985598, + 0.032079652, + 0.023717156, + 0.019211154, + 0.019987307, + -0.012261412, + -0.032464176, + -0.004472998, + -0.03568547, + -6.953471e-33, + -0.02200053, + -0.06861985, + -0.035355665, + 0.008892092, + 0.07110619, + -0.02524488, + 0.091491714, + -0.009333656, + -0.059515916, + -0.03471947, + 0.04331791, + 0.033350475, + 0.02423151, + 0.08795865, + 0.020580785, + -0.00087637454, + -0.012995603, + 0.088356934, + 0.04568453, + 0.025818799, + 0.054319557, + 0.09676607, + 0.02314351, + 0.024316499, + 0.014192086, + -0.01867069, + -0.024500258, + -0.032566376, + 0.025218401, + 0.016804473, + -0.07628905, + 0.012665322, + -0.021314982, + 0.006895667, + 0.030793479, + -0.00033363912, + 0.0005291749, + -0.08589274, + 0.040542576, + 0.0062958263, + -0.009977536, + 0.0016065374, + 0.012649728, + -0.036491103, + -0.023085777, + 0.012404348, + -0.0051287347, + 0.020217113, + -0.08761001, + 0.0451902, + -0.0012827619, + -0.06574815, + 0.07477121, + 0.08403992, + -0.01390955, + 0.05589554, + 0.019330526, + -0.019641383, + -0.016001293, + -0.02915193, + 0.037374426, + 0.068089314, + 0.069200926, + -0.007668733, + 0.021160824, + 0.040417258, + 0.035068225, + 0.082075246, + 0.08809441, + 0.05050193, + -0.059343174, + 0.04576526, + -0.025118835, + 0.03583576, + -0.028081506, + 0.019838363, + 0.033905286, + -0.07977674, + 0.023003135, + 0.062460173, + -0.034886148, + -0.05390937, + -0.016114287, + -0.0057315156, + -0.03051132, + -0.02269694, + -0.010376983, + 0.06762264, + -0.010560655, + -0.09605588, + -0.07854035, + -0.08528194, + 0.029969428, + -0.0059528793, + -0.039581347, + 2.9781768e-33, + 0.011482255, + 0.010417832, + -0.0698601, + 0.019292813, + -0.08453582, + -0.08570265, + 0.06624837, + 0.063025005, + 0.050434116, + 0.033736084, + -0.0058885855, + -0.069622226, + 0.12551048, + 0.021380005, + 0.07413853, + 0.0342258, + -0.045818888, + 0.014834041, + -0.012672501, + 0.0036430089, + -0.08024709, + 0.06730083, + -0.056032285, + -0.086702436, + -0.027874194, + -0.03391202, + -0.03872441, + -0.07792124, + -0.017794719, + 0.061800934, + 0.014696384, + 0.019996569, + -0.08146178, + 0.052340467, + 0.06287676, + -0.0015751559, + 0.040512506, + -0.027605608, + -0.009630798, + -0.017303543, + 0.11392578, + 0.044186074, + 0.035317622, + 0.12113664, + 0.018812222, + 0.049269576, + -0.036081262, + 0.07789768, + -0.0296637, + -0.07068735, + -0.006731622, + 0.0060941395, + 0.042274125, + -0.039680813, + -0.048600707, + -0.03980193, + 0.032409266, + 0.03371183, + -0.092499994, + -0.049876206, + -0.06597403, + -0.042388365, + 0.031259395, + 0.011791109, + -0.04424881, + 0.04685171, + -0.12302249, + -0.034650978, + -0.01387166, + -0.13122807, + 0.1448325, + 0.0056148693, + -0.0031096544, + 0.022904772, + -0.07642485, + 0.016454488, + -0.019540928, + -0.024970472, + -0.068574235, + 0.07073104, + 0.026643677, + -0.035163663, + -0.0015607082, + 0.029314166, + -0.08943546, + -0.022545528, + -0.031130569, + 0.053781237, + 0.007896568, + 0.023091432, + -0.0043701245, + 0.05380369, + 0.01729408, + 0.05636822, + -0.05328019, + -1.3478804e-08, + -0.039678477, + 0.013365443, + 0.036817312, + 0.009736139, + 0.004703614, + 0.06661744, + 0.02291141, + -0.047423527, + -0.04049001, + 0.0068159057, + 0.008662143, + -0.006292634, + -0.045681197, + -0.06387613, + -0.013174571, + 0.11696965, + 0.016895585, + -0.0013498863, + 0.023227682, + 0.022274282, + 0.07852807, + -0.04508963, + -0.009177306, + 0.06640095, + -0.06651727, + -0.015498115, + 0.054094598, + 0.07642527, + 0.0082470365, + -0.12409585, + 0.01265297, + -0.017635401, + -0.020622984, + 0.03250185, + -0.012997484, + 0.022324847, + 0.010529934, + -0.0883164, + 0.021471445, + -0.0029947716, + -0.03183814, + 0.0718419, + 0.010377949, + 0.0035974192, + 0.048932698, + 0.07039089, + -0.03657371, + -0.035186097, + -0.03655875, + -0.07017832, + -0.030322824, + 0.028595895, + -0.019070871, + -0.0025186248, + 0.021279149, + 0.07436103, + -0.114249244, + -0.027311146, + -0.0107884705, + 0.010422842, + -0.022787437, + 0.11515081, + 0.18532182, + -0.026544156 ], "index": 0, "object": "embedding" diff --git a/tests/integration/recordings/responses/80e4404d8987.json b/tests/integration/recordings/responses/80e4404d8987.json index 8cfe1836d..7eabfc363 100644 --- a/tests/integration/recordings/responses/80e4404d8987.json +++ b/tests/integration/recordings/responses/80e4404d8987.json @@ -22,7 +22,7 @@ "__type__": "ollama._types.GenerateResponse", "__data__": { "model": "llama3.2:3b-instruct-fp16", - "created_at": "2025-08-01T23:13:56.463658Z", + "created_at": "2025-09-03T17:37:46.708948Z", "done": false, "done_reason": null, "total_duration": null, @@ -40,7 +40,7 @@ "__type__": "ollama._types.GenerateResponse", "__data__": { "model": "llama3.2:3b-instruct-fp16", - "created_at": "2025-08-01T23:13:56.51846Z", + "created_at": "2025-09-03T17:37:46.749031Z", "done": false, "done_reason": null, "total_duration": null, @@ -58,7 +58,7 @@ "__type__": "ollama._types.GenerateResponse", "__data__": { "model": "llama3.2:3b-instruct-fp16", - "created_at": "2025-08-01T23:13:56.569676Z", + "created_at": "2025-09-03T17:37:46.790192Z", "done": false, "done_reason": null, "total_duration": null, @@ -76,7 +76,7 @@ "__type__": "ollama._types.GenerateResponse", "__data__": { "model": "llama3.2:3b-instruct-fp16", - "created_at": "2025-08-01T23:13:56.621666Z", + "created_at": "2025-09-03T17:37:46.831093Z", "done": false, "done_reason": null, "total_duration": null, @@ -94,7 +94,7 @@ "__type__": "ollama._types.GenerateResponse", "__data__": { "model": "llama3.2:3b-instruct-fp16", - "created_at": "2025-08-01T23:13:56.675114Z", + "created_at": "2025-09-03T17:37:46.873135Z", "done": false, "done_reason": null, "total_duration": null, @@ -112,7 +112,7 @@ "__type__": "ollama._types.GenerateResponse", "__data__": { "model": "llama3.2:3b-instruct-fp16", - "created_at": "2025-08-01T23:13:56.727649Z", + "created_at": "2025-09-03T17:37:46.91375Z", "done": false, "done_reason": null, "total_duration": null, @@ -130,7 +130,7 @@ "__type__": "ollama._types.GenerateResponse", "__data__": { "model": "llama3.2:3b-instruct-fp16", - "created_at": "2025-08-01T23:13:56.780249Z", + "created_at": "2025-09-03T17:37:46.95439Z", "done": false, "done_reason": null, "total_duration": null, @@ -148,7 +148,7 @@ "__type__": "ollama._types.GenerateResponse", "__data__": { "model": "llama3.2:3b-instruct-fp16", - "created_at": "2025-08-01T23:13:56.834148Z", + "created_at": "2025-09-03T17:37:46.995224Z", "done": false, "done_reason": null, "total_duration": null, @@ -166,7 +166,7 @@ "__type__": "ollama._types.GenerateResponse", "__data__": { "model": "llama3.2:3b-instruct-fp16", - "created_at": "2025-08-01T23:13:56.885509Z", + "created_at": "2025-09-03T17:37:47.035887Z", "done": false, "done_reason": null, "total_duration": null, @@ -184,15 +184,15 @@ "__type__": "ollama._types.GenerateResponse", "__data__": { "model": "llama3.2:3b-instruct-fp16", - "created_at": "2025-08-01T23:13:56.936635Z", + "created_at": "2025-09-03T17:37:47.076806Z", "done": true, "done_reason": "stop", - "total_duration": 1572591291, - "load_duration": 77121041, + "total_duration": 2069654958, + "load_duration": 177579833, "prompt_eval_count": 31, - "prompt_eval_duration": 1019000000, + "prompt_eval_duration": 1521851250, "eval_count": 10, - "eval_duration": 474000000, + "eval_duration": 369478042, "response": "", "thinking": null, "context": null diff --git a/tests/integration/recordings/responses/8295382a8e7c.json b/tests/integration/recordings/responses/8295382a8e7c.json index 6e1dc793d..6a38dde20 100644 --- a/tests/integration/recordings/responses/8295382a8e7c.json +++ b/tests/integration/recordings/responses/8295382a8e7c.json @@ -1,7 +1,7 @@ { "request": { "method": "POST", - "url": "http://localhost:11434/v1/v1/chat/completions", + "url": "http://0.0.0.0:11434/v1/v1/chat/completions", "headers": {}, "body": { "model": "llama3.2:3b-instruct-fp16", @@ -20,14 +20,14 @@ "body": { "__type__": "openai.types.chat.chat_completion.ChatCompletion", "__data__": { - "id": "chatcmpl-99", + "id": "chatcmpl-713", "choices": [ { "finish_reason": "stop", "index": 0, "logprobs": null, "message": { - "content": "I'd be happy to help you test the OpenAI 2 architecture!\n\nOpenAI 2 is a neural network model developed by OpenAI, and it's not exactly possible for me to directly \"test\" it. However, I can guide you through a simplified example of how to verify if OpenAI 2 has been implemented correctly in a specific codebase.\n\nHere's an outline of the steps:\n\n1. **Understand the basics**: Before we dive into testing, make sure you understand the architectural and functional details of OpenAI 2.\n2. **Get access to the model**: You'll need to obtain a trained OpenAI 2 model or implement it from scratch using a language like PyTorch or TensorFlow.\n3. **Implement a validation framework**: Create a simple validation framework that uses common tasks, such as classification on the GLUE benchmark, to evaluate the performance of your OpenAI 2 model.\n\nHere's a simplified code example in PyTorch:\n```python\nimport torch\nfrom transformers import AutoModelForSequenceClassification, AutoTokenizer\n\n# Load pre-trained OpenAI 2 Model(s)\nmodel_name = \"github/openai/OpenAIAccelerated-Text-To-Speech\"\nmodel_class = AutoModelForSequenceClassification\ntokenizer = AutoTokenizer.from_pretrained(model_name)\n\n# Initialize the model and tokenizer\nmodel = model_class(pretrained=True, num_labels=8) # adjust label number according to your task\ntokenizer = tokenizer\n\ndef evaluate_model():\n batch_size = 100\n device = torch.device(\"cuda\" if torch.cuda.is_available() else \"cpu\")\n\n # Create a validation dataset from the GLUE benchmark\n glue_datasets = [ datasets[\"glue\"][\"sst2\"], datasets[\"glue\"][\"mnli\"] ]\n val_dataset = []\n for i, gds in enumerate(glue_datasets):\n data = gds[:10000] # take only first few examples to speed up evaluation\n input_ids = tokenizer encodings(data[\"sentence1\"], \n attention_mask=data[\"attention_mask\"],\n max_length=512,\n padding=\"max_length\",\n truncation=True,\n return_tensors=\"pt\")\n\n for example in data:\n for sentence in [example['sentence1'], example['sentence2']]:\n input_ids = input_ids.to(device)\n outputs = model(input_ids, labels=None) # adjust label to empty\n \n\n # Compute evaluation metrics\n predictions = []\n labels = []\n accuracy = torch.zeros(8).to(device)\n\n for sentence in data.values():\n sentenceids = [input_ids[\"input_ids\"].flatten()]\n _, pred_labels = model(sentenceids)\n if len(predictions) == 0:\n labels.extend([1, 2])\n else:\n assert len(labels)==len(sentences), 'error'\n labels.append(preds[-1]) \n\n # Append the prediction to the list\n predictions.append(pred)\n\n return accuracy\n\naccuracy = evaluate_model()\nprint(\"Accuracy:\", accuracy)\n```\n\nAfter running this code, you should get an estimate of the model's performance on the GLUE benchmark. Keep in mind that this is a simplified example and real-world openai 2 testing may require more involved validation processes.\n\nI hope this helps! Let me know if you have any further questions or if there are any specific areas where you'd like more information.", + "content": "I'd be happy to help you test the Transformer-XL (denoted as \"Test Trace OpenAI 2\") model, but first I need to clarify a few things:\n\n1. **Transformer-XL** is not an official name from OpenAI. It's actually a variant of the Transformer model proposed in the paper \"Long-Short Term Memory Are General: A Study on The Curvature of Time\" (2017) by Jinyu Chen, et al.\n2. **Trace OpenAI 2** sounds like a specific version or configuration of the Transformer-XL model, possibly developed by OpenAI.\n\nGiven these clarifications, I'll provide you with a general idea of how to test the Transformer-XL (or \"Test Trace OpenAI 2\") model using popular frameworks and libraries. Please note that this is not an exhaustive or definitive guide.\n\nTo test the Transformer-XL model, you can follow these steps:\n\n1. **Install the necessary dependencies**: You'll need a deep learning framework like TensorFlow or PyTorch, as well as a library for natural language processing (NLP) like Hugging Face's transformers.\n2. **Load the pre-trained weights**: You can use a pre-trained model checkpoint from Hugging Face's Transformers library or load your own weights trained on a specific task or dataset.\n3. **Prepare your data**: Load your text data into tokens, such as words or characters, and preprocess it according to the specific requirements of the Transformer-XL architecture (e.g., tokenization, padding, etc.).\n4. **Configure the model**: Adjust the hyperparameters to suit your specific test case, including the model's configuration, batch size, learning rate, etc.\n5. **Run the inference**: Use the loaded pre-trained weights to perform inference on your test data.\n\nHere's some sample Python code using PyTorch and Hugging Face's Transformers library to get you started:\n```python\nimport torch\nfrom transformers import LongformerForSequenceClassification, LongformerTokenizer\n\n# Load pre-trained weights\nmodel = LongformerForSequenceClassification.from_pretrained('test-trace-openai-2')\n\n# Prepare data\ntokenizer = model.tokenizer\ntext = \"This is a test sentence\"\ninputs = tokenizer(text, return_tensors='pt')\noutput = model(inputs['input_ids'], attention_mask=inputs['attention_mask'])\n\n# Print the results\nprint(output.logits)\n```\nPlease note that this code snippet is just an example and may not work as-is. You'll need to adapt it to your specific requirements and test data.\n\nKeep in mind that testing a model's performance on a specific task or dataset requires careful consideration of factors like:\n\n* **Test data quality**: Your test data should accurately represent the underlying distribution of your target dataset.\n* **Model evaluation metrics**: Choose relevant evaluation metrics that measure the model's performance on your specific task, such as accuracy, precision, recall, F1-score, etc.\n\nFeel free to ask if you have any further questions or need more guidance!", "refusal": null, "role": "assistant", "annotations": null, @@ -37,15 +37,15 @@ } } ], - "created": 1754510064, + "created": 1756921250, "model": "llama3.2:3b-instruct-fp16", "object": "chat.completion", "service_tier": null, "system_fingerprint": "fp_ollama", "usage": { - "completion_tokens": 694, + "completion_tokens": 614, "prompt_tokens": 31, - "total_tokens": 725, + "total_tokens": 645, "completion_tokens_details": null, "prompt_tokens_details": null } diff --git a/tests/integration/recordings/responses/836f51dfb3c5.json b/tests/integration/recordings/responses/836f51dfb3c5.json index 833545737..85f3aff00 100644 --- a/tests/integration/recordings/responses/836f51dfb3c5.json +++ b/tests/integration/recordings/responses/836f51dfb3c5.json @@ -20,15 +20,15 @@ "__type__": "ollama._types.GenerateResponse", "__data__": { "model": "llama-guard3:1b", - "created_at": "2025-08-01T23:14:03.770002Z", + "created_at": "2025-09-03T17:37:51.562847Z", "done": true, "done_reason": "stop", - "total_duration": 395965875, - "load_duration": 178888708, + "total_duration": 272296250, + "load_duration": 131747125, "prompt_eval_count": 214, - "prompt_eval_duration": 170000000, + "prompt_eval_duration": 124006709, "eval_count": 2, - "eval_duration": 44000000, + "eval_duration": 15572291, "response": "safe", "thinking": null, "context": null diff --git a/tests/integration/recordings/responses/840fbb380b73.json b/tests/integration/recordings/responses/840fbb380b73.json index a3fb7ccd8..4367d8788 100644 --- a/tests/integration/recordings/responses/840fbb380b73.json +++ b/tests/integration/recordings/responses/840fbb380b73.json @@ -20,15 +20,15 @@ "__type__": "ollama._types.GenerateResponse", "__data__": { "model": "llama-guard3:1b", - "created_at": "2025-08-01T23:13:57.935921Z", + "created_at": "2025-09-03T17:37:47.871962Z", "done": true, "done_reason": "stop", - "total_duration": 313787333, - "load_duration": 89797542, + "total_duration": 301629042, + "load_duration": 102832917, "prompt_eval_count": 233, - "prompt_eval_duration": 167000000, + "prompt_eval_duration": 154806625, "eval_count": 5, - "eval_duration": 55000000, + "eval_duration": 43361542, "response": "unsafe\nS1", "thinking": null, "context": null diff --git a/tests/integration/recordings/responses/84cab42e1f5c.json b/tests/integration/recordings/responses/84cab42e1f5c.json index 423dd16da..611e67218 100644 --- a/tests/integration/recordings/responses/84cab42e1f5c.json +++ b/tests/integration/recordings/responses/84cab42e1f5c.json @@ -17,7 +17,7 @@ { "__type__": "openai.types.completion.Completion", "__data__": { - "id": "cmpl-905", + "id": "cmpl-374", "choices": [ { "finish_reason": null, @@ -26,7 +26,7 @@ "text": "Blue" } ], - "created": 1754348148, + "created": 1756921025, "model": "llama3.2:3b-instruct-fp16", "object": "text_completion", "system_fingerprint": "fp_ollama", @@ -36,7 +36,7 @@ { "__type__": "openai.types.completion.Completion", "__data__": { - "id": "cmpl-905", + "id": "cmpl-374", "choices": [ { "finish_reason": null, @@ -45,7 +45,7 @@ "text": ".\n\n" } ], - "created": 1754348148, + "created": 1756921025, "model": "llama3.2:3b-instruct-fp16", "object": "text_completion", "system_fingerprint": "fp_ollama", @@ -55,7 +55,7 @@ { "__type__": "openai.types.completion.Completion", "__data__": { - "id": "cmpl-905", + "id": "cmpl-374", "choices": [ { "finish_reason": null, @@ -64,7 +64,7 @@ "text": "My" } ], - "created": 1754348148, + "created": 1756921025, "model": "llama3.2:3b-instruct-fp16", "object": "text_completion", "system_fingerprint": "fp_ollama", @@ -74,16 +74,16 @@ { "__type__": "openai.types.completion.Completion", "__data__": { - "id": "cmpl-905", + "id": "cmpl-374", "choices": [ { "finish_reason": null, "index": 0, "logprobs": null, - "text": " response" + "text": " answer" } ], - "created": 1754348148, + "created": 1756921025, "model": "llama3.2:3b-instruct-fp16", "object": "text_completion", "system_fingerprint": "fp_ollama", @@ -93,7 +93,7 @@ { "__type__": "openai.types.completion.Completion", "__data__": { - "id": "cmpl-905", + "id": "cmpl-374", "choices": [ { "finish_reason": null, @@ -102,7 +102,7 @@ "text": " is" } ], - "created": 1754348148, + "created": 1756921025, "model": "llama3.2:3b-instruct-fp16", "object": "text_completion", "system_fingerprint": "fp_ollama", @@ -112,634 +112,7 @@ { "__type__": "openai.types.completion.Completion", "__data__": { - "id": "cmpl-905", - "choices": [ - { - "finish_reason": null, - "index": 0, - "logprobs": null, - "text": " based" - } - ], - "created": 1754348149, - "model": "llama3.2:3b-instruct-fp16", - "object": "text_completion", - "system_fingerprint": "fp_ollama", - "usage": null - } - }, - { - "__type__": "openai.types.completion.Completion", - "__data__": { - "id": "cmpl-905", - "choices": [ - { - "finish_reason": null, - "index": 0, - "logprobs": null, - "text": " on" - } - ], - "created": 1754348149, - "model": "llama3.2:3b-instruct-fp16", - "object": "text_completion", - "system_fingerprint": "fp_ollama", - "usage": null - } - }, - { - "__type__": "openai.types.completion.Completion", - "__data__": { - "id": "cmpl-905", - "choices": [ - { - "finish_reason": null, - "index": 0, - "logprobs": null, - "text": " a" - } - ], - "created": 1754348149, - "model": "llama3.2:3b-instruct-fp16", - "object": "text_completion", - "system_fingerprint": "fp_ollama", - "usage": null - } - }, - { - "__type__": "openai.types.completion.Completion", - "__data__": { - "id": "cmpl-905", - "choices": [ - { - "finish_reason": null, - "index": 0, - "logprobs": null, - "text": " common" - } - ], - "created": 1754348149, - "model": "llama3.2:3b-instruct-fp16", - "object": "text_completion", - "system_fingerprint": "fp_ollama", - "usage": null - } - }, - { - "__type__": "openai.types.completion.Completion", - "__data__": { - "id": "cmpl-905", - "choices": [ - { - "finish_reason": null, - "index": 0, - "logprobs": null, - "text": " English" - } - ], - "created": 1754348149, - "model": "llama3.2:3b-instruct-fp16", - "object": "text_completion", - "system_fingerprint": "fp_ollama", - "usage": null - } - }, - { - "__type__": "openai.types.completion.Completion", - "__data__": { - "id": "cmpl-905", - "choices": [ - { - "finish_reason": null, - "index": 0, - "logprobs": null, - "text": " rhyme" - } - ], - "created": 1754348149, - "model": "llama3.2:3b-instruct-fp16", - "object": "text_completion", - "system_fingerprint": "fp_ollama", - "usage": null - } - }, - { - "__type__": "openai.types.completion.Completion", - "__data__": { - "id": "cmpl-905", - "choices": [ - { - "finish_reason": null, - "index": 0, - "logprobs": null, - "text": " or" - } - ], - "created": 1754348149, - "model": "llama3.2:3b-instruct-fp16", - "object": "text_completion", - "system_fingerprint": "fp_ollama", - "usage": null - } - }, - { - "__type__": "openai.types.completion.Completion", - "__data__": { - "id": "cmpl-905", - "choices": [ - { - "finish_reason": null, - "index": 0, - "logprobs": null, - "text": " poem" - } - ], - "created": 1754348149, - "model": "llama3.2:3b-instruct-fp16", - "object": "text_completion", - "system_fingerprint": "fp_ollama", - "usage": null - } - }, - { - "__type__": "openai.types.completion.Completion", - "__data__": { - "id": "cmpl-905", - "choices": [ - { - "finish_reason": null, - "index": 0, - "logprobs": null, - "text": " that" - } - ], - "created": 1754348149, - "model": "llama3.2:3b-instruct-fp16", - "object": "text_completion", - "system_fingerprint": "fp_ollama", - "usage": null - } - }, - { - "__type__": "openai.types.completion.Completion", - "__data__": { - "id": "cmpl-905", - "choices": [ - { - "finish_reason": null, - "index": 0, - "logprobs": null, - "text": " completes" - } - ], - "created": 1754348149, - "model": "llama3.2:3b-instruct-fp16", - "object": "text_completion", - "system_fingerprint": "fp_ollama", - "usage": null - } - }, - { - "__type__": "openai.types.completion.Completion", - "__data__": { - "id": "cmpl-905", - "choices": [ - { - "finish_reason": null, - "index": 0, - "logprobs": null, - "text": " the" - } - ], - "created": 1754348149, - "model": "llama3.2:3b-instruct-fp16", - "object": "text_completion", - "system_fingerprint": "fp_ollama", - "usage": null - } - }, - { - "__type__": "openai.types.completion.Completion", - "__data__": { - "id": "cmpl-905", - "choices": [ - { - "finish_reason": null, - "index": 0, - "logprobs": null, - "text": " sentence" - } - ], - "created": 1754348149, - "model": "llama3.2:3b-instruct-fp16", - "object": "text_completion", - "system_fingerprint": "fp_ollama", - "usage": null - } - }, - { - "__type__": "openai.types.completion.Completion", - "__data__": { - "id": "cmpl-905", - "choices": [ - { - "finish_reason": null, - "index": 0, - "logprobs": null, - "text": " with" - } - ], - "created": 1754348149, - "model": "llama3.2:3b-instruct-fp16", - "object": "text_completion", - "system_fingerprint": "fp_ollama", - "usage": null - } - }, - { - "__type__": "openai.types.completion.Completion", - "__data__": { - "id": "cmpl-905", - "choices": [ - { - "finish_reason": null, - "index": 0, - "logprobs": null, - "text": " the" - } - ], - "created": 1754348149, - "model": "llama3.2:3b-instruct-fp16", - "object": "text_completion", - "system_fingerprint": "fp_ollama", - "usage": null - } - }, - { - "__type__": "openai.types.completion.Completion", - "__data__": { - "id": "cmpl-905", - "choices": [ - { - "finish_reason": null, - "index": 0, - "logprobs": null, - "text": " word" - } - ], - "created": 1754348149, - "model": "llama3.2:3b-instruct-fp16", - "object": "text_completion", - "system_fingerprint": "fp_ollama", - "usage": null - } - }, - { - "__type__": "openai.types.completion.Completion", - "__data__": { - "id": "cmpl-905", - "choices": [ - { - "finish_reason": null, - "index": 0, - "logprobs": null, - "text": " \"" - } - ], - "created": 1754348149, - "model": "llama3.2:3b-instruct-fp16", - "object": "text_completion", - "system_fingerprint": "fp_ollama", - "usage": null - } - }, - { - "__type__": "openai.types.completion.Completion", - "__data__": { - "id": "cmpl-905", - "choices": [ - { - "finish_reason": null, - "index": 0, - "logprobs": null, - "text": "blue" - } - ], - "created": 1754348149, - "model": "llama3.2:3b-instruct-fp16", - "object": "text_completion", - "system_fingerprint": "fp_ollama", - "usage": null - } - }, - { - "__type__": "openai.types.completion.Completion", - "__data__": { - "id": "cmpl-905", - "choices": [ - { - "finish_reason": null, - "index": 0, - "logprobs": null, - "text": "\"." - } - ], - "created": 1754348149, - "model": "llama3.2:3b-instruct-fp16", - "object": "text_completion", - "system_fingerprint": "fp_ollama", - "usage": null - } - }, - { - "__type__": "openai.types.completion.Completion", - "__data__": { - "id": "cmpl-905", - "choices": [ - { - "finish_reason": null, - "index": 0, - "logprobs": null, - "text": " The" - } - ], - "created": 1754348149, - "model": "llama3.2:3b-instruct-fp16", - "object": "text_completion", - "system_fingerprint": "fp_ollama", - "usage": null - } - }, - { - "__type__": "openai.types.completion.Completion", - "__data__": { - "id": "cmpl-905", - "choices": [ - { - "finish_reason": null, - "index": 0, - "logprobs": null, - "text": " complete" - } - ], - "created": 1754348150, - "model": "llama3.2:3b-instruct-fp16", - "object": "text_completion", - "system_fingerprint": "fp_ollama", - "usage": null - } - }, - { - "__type__": "openai.types.completion.Completion", - "__data__": { - "id": "cmpl-905", - "choices": [ - { - "finish_reason": null, - "index": 0, - "logprobs": null, - "text": " phrase" - } - ], - "created": 1754348150, - "model": "llama3.2:3b-instruct-fp16", - "object": "text_completion", - "system_fingerprint": "fp_ollama", - "usage": null - } - }, - { - "__type__": "openai.types.completion.Completion", - "__data__": { - "id": "cmpl-905", - "choices": [ - { - "finish_reason": null, - "index": 0, - "logprobs": null, - "text": " is" - } - ], - "created": 1754348150, - "model": "llama3.2:3b-instruct-fp16", - "object": "text_completion", - "system_fingerprint": "fp_ollama", - "usage": null - } - }, - { - "__type__": "openai.types.completion.Completion", - "__data__": { - "id": "cmpl-905", - "choices": [ - { - "finish_reason": null, - "index": 0, - "logprobs": null, - "text": ":" - } - ], - "created": 1754348150, - "model": "llama3.2:3b-instruct-fp16", - "object": "text_completion", - "system_fingerprint": "fp_ollama", - "usage": null - } - }, - { - "__type__": "openai.types.completion.Completion", - "__data__": { - "id": "cmpl-905", - "choices": [ - { - "finish_reason": null, - "index": 0, - "logprobs": null, - "text": " \"" - } - ], - "created": 1754348150, - "model": "llama3.2:3b-instruct-fp16", - "object": "text_completion", - "system_fingerprint": "fp_ollama", - "usage": null - } - }, - { - "__type__": "openai.types.completion.Completion", - "__data__": { - "id": "cmpl-905", - "choices": [ - { - "finish_reason": null, - "index": 0, - "logprobs": null, - "text": "R" - } - ], - "created": 1754348150, - "model": "llama3.2:3b-instruct-fp16", - "object": "text_completion", - "system_fingerprint": "fp_ollama", - "usage": null - } - }, - { - "__type__": "openai.types.completion.Completion", - "__data__": { - "id": "cmpl-905", - "choices": [ - { - "finish_reason": null, - "index": 0, - "logprobs": null, - "text": "oses" - } - ], - "created": 1754348150, - "model": "llama3.2:3b-instruct-fp16", - "object": "text_completion", - "system_fingerprint": "fp_ollama", - "usage": null - } - }, - { - "__type__": "openai.types.completion.Completion", - "__data__": { - "id": "cmpl-905", - "choices": [ - { - "finish_reason": null, - "index": 0, - "logprobs": null, - "text": " are" - } - ], - "created": 1754348150, - "model": "llama3.2:3b-instruct-fp16", - "object": "text_completion", - "system_fingerprint": "fp_ollama", - "usage": null - } - }, - { - "__type__": "openai.types.completion.Completion", - "__data__": { - "id": "cmpl-905", - "choices": [ - { - "finish_reason": null, - "index": 0, - "logprobs": null, - "text": " red" - } - ], - "created": 1754348150, - "model": "llama3.2:3b-instruct-fp16", - "object": "text_completion", - "system_fingerprint": "fp_ollama", - "usage": null - } - }, - { - "__type__": "openai.types.completion.Completion", - "__data__": { - "id": "cmpl-905", - "choices": [ - { - "finish_reason": null, - "index": 0, - "logprobs": null, - "text": "," - } - ], - "created": 1754348150, - "model": "llama3.2:3b-instruct-fp16", - "object": "text_completion", - "system_fingerprint": "fp_ollama", - "usage": null - } - }, - { - "__type__": "openai.types.completion.Completion", - "__data__": { - "id": "cmpl-905", - "choices": [ - { - "finish_reason": null, - "index": 0, - "logprobs": null, - "text": " v" - } - ], - "created": 1754348150, - "model": "llama3.2:3b-instruct-fp16", - "object": "text_completion", - "system_fingerprint": "fp_ollama", - "usage": null - } - }, - { - "__type__": "openai.types.completion.Completion", - "__data__": { - "id": "cmpl-905", - "choices": [ - { - "finish_reason": null, - "index": 0, - "logprobs": null, - "text": "io" - } - ], - "created": 1754348150, - "model": "llama3.2:3b-instruct-fp16", - "object": "text_completion", - "system_fingerprint": "fp_ollama", - "usage": null - } - }, - { - "__type__": "openai.types.completion.Completion", - "__data__": { - "id": "cmpl-905", - "choices": [ - { - "finish_reason": null, - "index": 0, - "logprobs": null, - "text": "lets" - } - ], - "created": 1754348150, - "model": "llama3.2:3b-instruct-fp16", - "object": "text_completion", - "system_fingerprint": "fp_ollama", - "usage": null - } - }, - { - "__type__": "openai.types.completion.Completion", - "__data__": { - "id": "cmpl-905", - "choices": [ - { - "finish_reason": null, - "index": 0, - "logprobs": null, - "text": " are" - } - ], - "created": 1754348150, - "model": "llama3.2:3b-instruct-fp16", - "object": "text_completion", - "system_fingerprint": "fp_ollama", - "usage": null - } - }, - { - "__type__": "openai.types.completion.Completion", - "__data__": { - "id": "cmpl-905", + "id": "cmpl-374", "choices": [ { "finish_reason": null, @@ -748,7 +121,7 @@ "text": " blue" } ], - "created": 1754348150, + "created": 1756921025, "model": "llama3.2:3b-instruct-fp16", "object": "text_completion", "system_fingerprint": "fp_ollama", @@ -758,16 +131,16 @@ { "__type__": "openai.types.completion.Completion", "__data__": { - "id": "cmpl-905", + "id": "cmpl-374", "choices": [ { "finish_reason": null, "index": 0, "logprobs": null, - "text": "\".\n\n" + "text": " because" } ], - "created": 1754348150, + "created": 1756921025, "model": "llama3.2:3b-instruct-fp16", "object": "text_completion", "system_fingerprint": "fp_ollama", @@ -777,16 +150,16 @@ { "__type__": "openai.types.completion.Completion", "__data__": { - "id": "cmpl-905", + "id": "cmpl-374", "choices": [ { "finish_reason": null, "index": 0, "logprobs": null, - "text": "The" + "text": " it" } ], - "created": 1754348150, + "created": 1756921025, "model": "llama3.2:3b-instruct-fp16", "object": "text_completion", "system_fingerprint": "fp_ollama", @@ -796,16 +169,16 @@ { "__type__": "openai.types.completion.Completion", "__data__": { - "id": "cmpl-905", + "id": "cmpl-374", "choices": [ { "finish_reason": null, "index": 0, "logprobs": null, - "text": " use" + "text": "'s" } ], - "created": 1754348150, + "created": 1756921025, "model": "llama3.2:3b-instruct-fp16", "object": "text_completion", "system_fingerprint": "fp_ollama", @@ -815,7 +188,121 @@ { "__type__": "openai.types.completion.Completion", "__data__": { - "id": "cmpl-905", + "id": "cmpl-374", + "choices": [ + { + "finish_reason": null, + "index": 0, + "logprobs": null, + "text": " a" + } + ], + "created": 1756921025, + "model": "llama3.2:3b-instruct-fp16", + "object": "text_completion", + "system_fingerprint": "fp_ollama", + "usage": null + } + }, + { + "__type__": "openai.types.completion.Completion", + "__data__": { + "id": "cmpl-374", + "choices": [ + { + "finish_reason": null, + "index": 0, + "logprobs": null, + "text": " common" + } + ], + "created": 1756921025, + "model": "llama3.2:3b-instruct-fp16", + "object": "text_completion", + "system_fingerprint": "fp_ollama", + "usage": null + } + }, + { + "__type__": "openai.types.completion.Completion", + "__data__": { + "id": "cmpl-374", + "choices": [ + { + "finish_reason": null, + "index": 0, + "logprobs": null, + "text": " and" + } + ], + "created": 1756921025, + "model": "llama3.2:3b-instruct-fp16", + "object": "text_completion", + "system_fingerprint": "fp_ollama", + "usage": null + } + }, + { + "__type__": "openai.types.completion.Completion", + "__data__": { + "id": "cmpl-374", + "choices": [ + { + "finish_reason": null, + "index": 0, + "logprobs": null, + "text": " well" + } + ], + "created": 1756921025, + "model": "llama3.2:3b-instruct-fp16", + "object": "text_completion", + "system_fingerprint": "fp_ollama", + "usage": null + } + }, + { + "__type__": "openai.types.completion.Completion", + "__data__": { + "id": "cmpl-374", + "choices": [ + { + "finish_reason": null, + "index": 0, + "logprobs": null, + "text": "-known" + } + ], + "created": 1756921025, + "model": "llama3.2:3b-instruct-fp16", + "object": "text_completion", + "system_fingerprint": "fp_ollama", + "usage": null + } + }, + { + "__type__": "openai.types.completion.Completion", + "__data__": { + "id": "cmpl-374", + "choices": [ + { + "finish_reason": null, + "index": 0, + "logprobs": null, + "text": " completion" + } + ], + "created": 1756921025, + "model": "llama3.2:3b-instruct-fp16", + "object": "text_completion", + "system_fingerprint": "fp_ollama", + "usage": null + } + }, + { + "__type__": "openai.types.completion.Completion", + "__data__": { + "id": "cmpl-374", "choices": [ { "finish_reason": null, @@ -824,7 +311,7 @@ "text": " of" } ], - "created": 1754348151, + "created": 1756921026, "model": "llama3.2:3b-instruct-fp16", "object": "text_completion", "system_fingerprint": "fp_ollama", @@ -834,7 +321,7 @@ { "__type__": "openai.types.completion.Completion", "__data__": { - "id": "cmpl-905", + "id": "cmpl-374", "choices": [ { "finish_reason": null, @@ -843,7 +330,7 @@ "text": " the" } ], - "created": 1754348151, + "created": 1756921026, "model": "llama3.2:3b-instruct-fp16", "object": "text_completion", "system_fingerprint": "fp_ollama", @@ -853,16 +340,16 @@ { "__type__": "openai.types.completion.Completion", "__data__": { - "id": "cmpl-905", + "id": "cmpl-374", "choices": [ { "finish_reason": null, "index": 0, "logprobs": null, - "text": " word" + "text": " classic" } ], - "created": 1754348151, + "created": 1756921026, "model": "llama3.2:3b-instruct-fp16", "object": "text_completion", "system_fingerprint": "fp_ollama", @@ -872,7 +359,64 @@ { "__type__": "openai.types.completion.Completion", "__data__": { - "id": "cmpl-905", + "id": "cmpl-374", + "choices": [ + { + "finish_reason": null, + "index": 0, + "logprobs": null, + "text": " tongue" + } + ], + "created": 1756921026, + "model": "llama3.2:3b-instruct-fp16", + "object": "text_completion", + "system_fingerprint": "fp_ollama", + "usage": null + } + }, + { + "__type__": "openai.types.completion.Completion", + "__data__": { + "id": "cmpl-374", + "choices": [ + { + "finish_reason": null, + "index": 0, + "logprobs": null, + "text": "-tw" + } + ], + "created": 1756921026, + "model": "llama3.2:3b-instruct-fp16", + "object": "text_completion", + "system_fingerprint": "fp_ollama", + "usage": null + } + }, + { + "__type__": "openai.types.completion.Completion", + "__data__": { + "id": "cmpl-374", + "choices": [ + { + "finish_reason": null, + "index": 0, + "logprobs": null, + "text": "ister" + } + ], + "created": 1756921026, + "model": "llama3.2:3b-instruct-fp16", + "object": "text_completion", + "system_fingerprint": "fp_ollama", + "usage": null + } + }, + { + "__type__": "openai.types.completion.Completion", + "__data__": { + "id": "cmpl-374", "choices": [ { "finish_reason": null, @@ -881,7 +425,7 @@ "text": " \"" } ], - "created": 1754348151, + "created": 1756921026, "model": "llama3.2:3b-instruct-fp16", "object": "text_completion", "system_fingerprint": "fp_ollama", @@ -891,16 +435,16 @@ { "__type__": "openai.types.completion.Completion", "__data__": { - "id": "cmpl-905", + "id": "cmpl-374", "choices": [ { "finish_reason": null, "index": 0, "logprobs": null, - "text": "blue" + "text": "R" } ], - "created": 1754348151, + "created": 1756921026, "model": "llama3.2:3b-instruct-fp16", "object": "text_completion", "system_fingerprint": "fp_ollama", @@ -910,7 +454,159 @@ { "__type__": "openai.types.completion.Completion", "__data__": { - "id": "cmpl-905", + "id": "cmpl-374", + "choices": [ + { + "finish_reason": null, + "index": 0, + "logprobs": null, + "text": "oses" + } + ], + "created": 1756921026, + "model": "llama3.2:3b-instruct-fp16", + "object": "text_completion", + "system_fingerprint": "fp_ollama", + "usage": null + } + }, + { + "__type__": "openai.types.completion.Completion", + "__data__": { + "id": "cmpl-374", + "choices": [ + { + "finish_reason": null, + "index": 0, + "logprobs": null, + "text": " are" + } + ], + "created": 1756921026, + "model": "llama3.2:3b-instruct-fp16", + "object": "text_completion", + "system_fingerprint": "fp_ollama", + "usage": null + } + }, + { + "__type__": "openai.types.completion.Completion", + "__data__": { + "id": "cmpl-374", + "choices": [ + { + "finish_reason": null, + "index": 0, + "logprobs": null, + "text": " red" + } + ], + "created": 1756921026, + "model": "llama3.2:3b-instruct-fp16", + "object": "text_completion", + "system_fingerprint": "fp_ollama", + "usage": null + } + }, + { + "__type__": "openai.types.completion.Completion", + "__data__": { + "id": "cmpl-374", + "choices": [ + { + "finish_reason": null, + "index": 0, + "logprobs": null, + "text": "," + } + ], + "created": 1756921026, + "model": "llama3.2:3b-instruct-fp16", + "object": "text_completion", + "system_fingerprint": "fp_ollama", + "usage": null + } + }, + { + "__type__": "openai.types.completion.Completion", + "__data__": { + "id": "cmpl-374", + "choices": [ + { + "finish_reason": null, + "index": 0, + "logprobs": null, + "text": " v" + } + ], + "created": 1756921026, + "model": "llama3.2:3b-instruct-fp16", + "object": "text_completion", + "system_fingerprint": "fp_ollama", + "usage": null + } + }, + { + "__type__": "openai.types.completion.Completion", + "__data__": { + "id": "cmpl-374", + "choices": [ + { + "finish_reason": null, + "index": 0, + "logprobs": null, + "text": "io" + } + ], + "created": 1756921026, + "model": "llama3.2:3b-instruct-fp16", + "object": "text_completion", + "system_fingerprint": "fp_ollama", + "usage": null + } + }, + { + "__type__": "openai.types.completion.Completion", + "__data__": { + "id": "cmpl-374", + "choices": [ + { + "finish_reason": null, + "index": 0, + "logprobs": null, + "text": "lets" + } + ], + "created": 1756921026, + "model": "llama3.2:3b-instruct-fp16", + "object": "text_completion", + "system_fingerprint": "fp_ollama", + "usage": null + } + }, + { + "__type__": "openai.types.completion.Completion", + "__data__": { + "id": "cmpl-374", + "choices": [ + { + "finish_reason": null, + "index": 0, + "logprobs": null, + "text": " are" + } + ], + "created": 1756921026, + "model": "llama3.2:3b-instruct-fp16", + "object": "text_completion", + "system_fingerprint": "fp_ollama", + "usage": null + } + }, + { + "__type__": "openai.types.completion.Completion", + "__data__": { + "id": "cmpl-374", "choices": [ { "finish_reason": null, @@ -919,7 +615,7 @@ "text": "\"" } ], - "created": 1754348151, + "created": 1756921026, "model": "llama3.2:3b-instruct-fp16", "object": "text_completion", "system_fingerprint": "fp_ollama", @@ -929,7 +625,292 @@ { "__type__": "openai.types.completion.Completion", "__data__": { - "id": "cmpl-905", + "id": "cmpl-374", + "choices": [ + { + "finish_reason": null, + "index": 0, + "logprobs": null, + "text": " \u2013" + } + ], + "created": 1756921026, + "model": "llama3.2:3b-instruct-fp16", + "object": "text_completion", + "system_fingerprint": "fp_ollama", + "usage": null + } + }, + { + "__type__": "openai.types.completion.Completion", + "__data__": { + "id": "cmpl-374", + "choices": [ + { + "finish_reason": null, + "index": 0, + "logprobs": null, + "text": " often" + } + ], + "created": 1756921026, + "model": "llama3.2:3b-instruct-fp16", + "object": "text_completion", + "system_fingerprint": "fp_ollama", + "usage": null + } + }, + { + "__type__": "openai.types.completion.Completion", + "__data__": { + "id": "cmpl-374", + "choices": [ + { + "finish_reason": null, + "index": 0, + "logprobs": null, + "text": " followed" + } + ], + "created": 1756921026, + "model": "llama3.2:3b-instruct-fp16", + "object": "text_completion", + "system_fingerprint": "fp_ollama", + "usage": null + } + }, + { + "__type__": "openai.types.completion.Completion", + "__data__": { + "id": "cmpl-374", + "choices": [ + { + "finish_reason": null, + "index": 0, + "logprobs": null, + "text": " by" + } + ], + "created": 1756921026, + "model": "llama3.2:3b-instruct-fp16", + "object": "text_completion", + "system_fingerprint": "fp_ollama", + "usage": null + } + }, + { + "__type__": "openai.types.completion.Completion", + "__data__": { + "id": "cmpl-374", + "choices": [ + { + "finish_reason": null, + "index": 0, + "logprobs": null, + "text": " the" + } + ], + "created": 1756921026, + "model": "llama3.2:3b-instruct-fp16", + "object": "text_completion", + "system_fingerprint": "fp_ollama", + "usage": null + } + }, + { + "__type__": "openai.types.completion.Completion", + "__data__": { + "id": "cmpl-374", + "choices": [ + { + "finish_reason": null, + "index": 0, + "logprobs": null, + "text": " phrase" + } + ], + "created": 1756921026, + "model": "llama3.2:3b-instruct-fp16", + "object": "text_completion", + "system_fingerprint": "fp_ollama", + "usage": null + } + }, + { + "__type__": "openai.types.completion.Completion", + "__data__": { + "id": "cmpl-374", + "choices": [ + { + "finish_reason": null, + "index": 0, + "logprobs": null, + "text": " \"" + } + ], + "created": 1756921026, + "model": "llama3.2:3b-instruct-fp16", + "object": "text_completion", + "system_fingerprint": "fp_ollama", + "usage": null + } + }, + { + "__type__": "openai.types.completion.Completion", + "__data__": { + "id": "cmpl-374", + "choices": [ + { + "finish_reason": null, + "index": 0, + "logprobs": null, + "text": "blue" + } + ], + "created": 1756921027, + "model": "llama3.2:3b-instruct-fp16", + "object": "text_completion", + "system_fingerprint": "fp_ollama", + "usage": null + } + }, + { + "__type__": "openai.types.completion.Completion", + "__data__": { + "id": "cmpl-374", + "choices": [ + { + "finish_reason": null, + "index": 0, + "logprobs": null, + "text": ".\"" + } + ], + "created": 1756921027, + "model": "llama3.2:3b-instruct-fp16", + "object": "text_completion", + "system_fingerprint": "fp_ollama", + "usage": null + } + }, + { + "__type__": "openai.types.completion.Completion", + "__data__": { + "id": "cmpl-374", + "choices": [ + { + "finish_reason": null, + "index": 0, + "logprobs": null, + "text": " This" + } + ], + "created": 1756921027, + "model": "llama3.2:3b-instruct-fp16", + "object": "text_completion", + "system_fingerprint": "fp_ollama", + "usage": null + } + }, + { + "__type__": "openai.types.completion.Completion", + "__data__": { + "id": "cmpl-374", + "choices": [ + { + "finish_reason": null, + "index": 0, + "logprobs": null, + "text": " rhyme" + } + ], + "created": 1756921027, + "model": "llama3.2:3b-instruct-fp16", + "object": "text_completion", + "system_fingerprint": "fp_ollama", + "usage": null + } + }, + { + "__type__": "openai.types.completion.Completion", + "__data__": { + "id": "cmpl-374", + "choices": [ + { + "finish_reason": null, + "index": 0, + "logprobs": null, + "text": " has" + } + ], + "created": 1756921027, + "model": "llama3.2:3b-instruct-fp16", + "object": "text_completion", + "system_fingerprint": "fp_ollama", + "usage": null + } + }, + { + "__type__": "openai.types.completion.Completion", + "__data__": { + "id": "cmpl-374", + "choices": [ + { + "finish_reason": null, + "index": 0, + "logprobs": null, + "text": " been" + } + ], + "created": 1756921027, + "model": "llama3.2:3b-instruct-fp16", + "object": "text_completion", + "system_fingerprint": "fp_ollama", + "usage": null + } + }, + { + "__type__": "openai.types.completion.Completion", + "__data__": { + "id": "cmpl-374", + "choices": [ + { + "finish_reason": null, + "index": 0, + "logprobs": null, + "text": " widely" + } + ], + "created": 1756921027, + "model": "llama3.2:3b-instruct-fp16", + "object": "text_completion", + "system_fingerprint": "fp_ollama", + "usage": null + } + }, + { + "__type__": "openai.types.completion.Completion", + "__data__": { + "id": "cmpl-374", + "choices": [ + { + "finish_reason": null, + "index": 0, + "logprobs": null, + "text": " used" + } + ], + "created": 1756921027, + "model": "llama3.2:3b-instruct-fp16", + "object": "text_completion", + "system_fingerprint": "fp_ollama", + "usage": null + } + }, + { + "__type__": "openai.types.completion.Completion", + "__data__": { + "id": "cmpl-374", "choices": [ { "finish_reason": null, @@ -938,7 +919,7 @@ "text": " in" } ], - "created": 1754348151, + "created": 1756921027, "model": "llama3.2:3b-instruct-fp16", "object": "text_completion", "system_fingerprint": "fp_ollama", @@ -948,16 +929,16 @@ { "__type__": "openai.types.completion.Completion", "__data__": { - "id": "cmpl-905", + "id": "cmpl-374", "choices": [ { "finish_reason": null, "index": 0, "logprobs": null, - "text": " this" + "text": " literature" } ], - "created": 1754348151, + "created": 1756921027, "model": "llama3.2:3b-instruct-fp16", "object": "text_completion", "system_fingerprint": "fp_ollama", @@ -967,7 +948,26 @@ { "__type__": "openai.types.completion.Completion", "__data__": { - "id": "cmpl-905", + "id": "cmpl-374", + "choices": [ + { + "finish_reason": null, + "index": 0, + "logprobs": null, + "text": "," + } + ], + "created": 1756921027, + "model": "llama3.2:3b-instruct-fp16", + "object": "text_completion", + "system_fingerprint": "fp_ollama", + "usage": null + } + }, + { + "__type__": "openai.types.completion.Completion", + "__data__": { + "id": "cmpl-374", "choices": [ { "finish_reason": "length", @@ -976,7 +976,7 @@ "text": "" } ], - "created": 1754348151, + "created": 1756921027, "model": "llama3.2:3b-instruct-fp16", "object": "text_completion", "system_fingerprint": "fp_ollama", diff --git a/tests/integration/recordings/responses/85594a69d74a.json b/tests/integration/recordings/responses/85594a69d74a.json index 286b8da11..c4a01bc33 100644 --- a/tests/integration/recordings/responses/85594a69d74a.json +++ b/tests/integration/recordings/responses/85594a69d74a.json @@ -20,15 +20,15 @@ "__type__": "ollama._types.GenerateResponse", "__data__": { "model": "llama-guard3:1b", - "created_at": "2025-08-01T23:12:54.634929Z", + "created_at": "2025-09-03T17:37:36.046489Z", "done": true, "done_reason": "stop", - "total_duration": 233222375, - "load_duration": 136303125, + "total_duration": 198969250, + "load_duration": 110421000, "prompt_eval_count": 213, - "prompt_eval_duration": 78000000, + "prompt_eval_duration": 76196541, "eval_count": 2, - "eval_duration": 17000000, + "eval_duration": 11832042, "response": "safe", "thinking": null, "context": null diff --git a/tests/integration/recordings/responses/97d3812bfccb.json b/tests/integration/recordings/responses/97d3812bfccb.json index 8a9b076fd..11e0fb402 100644 --- a/tests/integration/recordings/responses/97d3812bfccb.json +++ b/tests/integration/recordings/responses/97d3812bfccb.json @@ -20,15 +20,15 @@ "__type__": "ollama._types.GenerateResponse", "__data__": { "model": "llama-guard3:1b", - "created_at": "2025-08-01T23:14:06.082832Z", + "created_at": "2025-09-03T17:37:52.965106Z", "done": true, "done_reason": "stop", - "total_duration": 421905083, - "load_duration": 88557750, + "total_duration": 376594792, + "load_duration": 158273792, "prompt_eval_count": 217, - "prompt_eval_duration": 278000000, + "prompt_eval_duration": 177001375, "eval_count": 5, - "eval_duration": 54000000, + "eval_duration": 40927500, "response": "unsafe\nS1", "thinking": null, "context": null diff --git a/tests/integration/recordings/responses/97e259c0d3e5.json b/tests/integration/recordings/responses/97e259c0d3e5.json index cd083c9a8..2e47bca80 100644 --- a/tests/integration/recordings/responses/97e259c0d3e5.json +++ b/tests/integration/recordings/responses/97e259c0d3e5.json @@ -22,7 +22,7 @@ "__type__": "ollama._types.GenerateResponse", "__data__": { "model": "llama3.2:3b-instruct-fp16", - "created_at": "2025-08-01T23:14:07.138696Z", + "created_at": "2025-09-03T17:37:53.505006Z", "done": false, "done_reason": null, "total_duration": null, @@ -40,7 +40,7 @@ "__type__": "ollama._types.GenerateResponse", "__data__": { "model": "llama3.2:3b-instruct-fp16", - "created_at": "2025-08-01T23:14:07.195013Z", + "created_at": "2025-09-03T17:37:53.547032Z", "done": false, "done_reason": null, "total_duration": null, @@ -58,7 +58,7 @@ "__type__": "ollama._types.GenerateResponse", "__data__": { "model": "llama3.2:3b-instruct-fp16", - "created_at": "2025-08-01T23:14:07.246591Z", + "created_at": "2025-09-03T17:37:53.588985Z", "done": false, "done_reason": null, "total_duration": null, @@ -76,7 +76,7 @@ "__type__": "ollama._types.GenerateResponse", "__data__": { "model": "llama3.2:3b-instruct-fp16", - "created_at": "2025-08-01T23:14:07.29736Z", + "created_at": "2025-09-03T17:37:53.631139Z", "done": false, "done_reason": null, "total_duration": null, @@ -94,7 +94,7 @@ "__type__": "ollama._types.GenerateResponse", "__data__": { "model": "llama3.2:3b-instruct-fp16", - "created_at": "2025-08-01T23:14:07.347941Z", + "created_at": "2025-09-03T17:37:53.67269Z", "done": false, "done_reason": null, "total_duration": null, @@ -112,7 +112,7 @@ "__type__": "ollama._types.GenerateResponse", "__data__": { "model": "llama3.2:3b-instruct-fp16", - "created_at": "2025-08-01T23:14:07.399151Z", + "created_at": "2025-09-03T17:37:53.714798Z", "done": false, "done_reason": null, "total_duration": null, @@ -130,7 +130,7 @@ "__type__": "ollama._types.GenerateResponse", "__data__": { "model": "llama3.2:3b-instruct-fp16", - "created_at": "2025-08-01T23:14:07.452488Z", + "created_at": "2025-09-03T17:37:53.756492Z", "done": false, "done_reason": null, "total_duration": null, @@ -148,7 +148,7 @@ "__type__": "ollama._types.GenerateResponse", "__data__": { "model": "llama3.2:3b-instruct-fp16", - "created_at": "2025-08-01T23:14:07.50538Z", + "created_at": "2025-09-03T17:37:53.798115Z", "done": false, "done_reason": null, "total_duration": null, @@ -166,7 +166,7 @@ "__type__": "ollama._types.GenerateResponse", "__data__": { "model": "llama3.2:3b-instruct-fp16", - "created_at": "2025-08-01T23:14:07.558656Z", + "created_at": "2025-09-03T17:37:53.840012Z", "done": false, "done_reason": null, "total_duration": null, @@ -184,7 +184,7 @@ "__type__": "ollama._types.GenerateResponse", "__data__": { "model": "llama3.2:3b-instruct-fp16", - "created_at": "2025-08-01T23:14:07.610408Z", + "created_at": "2025-09-03T17:37:53.882555Z", "done": false, "done_reason": null, "total_duration": null, @@ -202,7 +202,7 @@ "__type__": "ollama._types.GenerateResponse", "__data__": { "model": "llama3.2:3b-instruct-fp16", - "created_at": "2025-08-01T23:14:07.66358Z", + "created_at": "2025-09-03T17:37:53.924566Z", "done": false, "done_reason": null, "total_duration": null, @@ -220,7 +220,7 @@ "__type__": "ollama._types.GenerateResponse", "__data__": { "model": "llama3.2:3b-instruct-fp16", - "created_at": "2025-08-01T23:14:07.717638Z", + "created_at": "2025-09-03T17:37:53.966279Z", "done": false, "done_reason": null, "total_duration": null, @@ -238,7 +238,7 @@ "__type__": "ollama._types.GenerateResponse", "__data__": { "model": "llama3.2:3b-instruct-fp16", - "created_at": "2025-08-01T23:14:07.769423Z", + "created_at": "2025-09-03T17:37:54.008483Z", "done": false, "done_reason": null, "total_duration": null, @@ -256,7 +256,7 @@ "__type__": "ollama._types.GenerateResponse", "__data__": { "model": "llama3.2:3b-instruct-fp16", - "created_at": "2025-08-01T23:14:07.819395Z", + "created_at": "2025-09-03T17:37:54.050042Z", "done": false, "done_reason": null, "total_duration": null, @@ -274,7 +274,7 @@ "__type__": "ollama._types.GenerateResponse", "__data__": { "model": "llama3.2:3b-instruct-fp16", - "created_at": "2025-08-01T23:14:07.871391Z", + "created_at": "2025-09-03T17:37:54.092416Z", "done": false, "done_reason": null, "total_duration": null, @@ -292,7 +292,7 @@ "__type__": "ollama._types.GenerateResponse", "__data__": { "model": "llama3.2:3b-instruct-fp16", - "created_at": "2025-08-01T23:14:07.924892Z", + "created_at": "2025-09-03T17:37:54.134857Z", "done": false, "done_reason": null, "total_duration": null, @@ -310,7 +310,7 @@ "__type__": "ollama._types.GenerateResponse", "__data__": { "model": "llama3.2:3b-instruct-fp16", - "created_at": "2025-08-01T23:14:07.976557Z", + "created_at": "2025-09-03T17:37:54.176408Z", "done": false, "done_reason": null, "total_duration": null, @@ -328,7 +328,7 @@ "__type__": "ollama._types.GenerateResponse", "__data__": { "model": "llama3.2:3b-instruct-fp16", - "created_at": "2025-08-01T23:14:08.029579Z", + "created_at": "2025-09-03T17:37:54.217553Z", "done": false, "done_reason": null, "total_duration": null, @@ -346,15 +346,15 @@ "__type__": "ollama._types.GenerateResponse", "__data__": { "model": "llama3.2:3b-instruct-fp16", - "created_at": "2025-08-01T23:14:08.082749Z", + "created_at": "2025-09-03T17:37:54.259141Z", "done": true, "done_reason": "stop", - "total_duration": 1425800209, - "load_duration": 138858459, + "total_duration": 1008303875, + "load_duration": 119709875, "prompt_eval_count": 384, - "prompt_eval_duration": 340000000, + "prompt_eval_duration": 132645959, "eval_count": 19, - "eval_duration": 945000000, + "eval_duration": 755215708, "response": "", "thinking": null, "context": null diff --git a/tests/integration/recordings/responses/9c140a29ae09.json b/tests/integration/recordings/responses/9c140a29ae09.json index 41b070cc5..a436484d7 100644 --- a/tests/integration/recordings/responses/9c140a29ae09.json +++ b/tests/integration/recordings/responses/9c140a29ae09.json @@ -22,7 +22,7 @@ "__type__": "ollama._types.GenerateResponse", "__data__": { "model": "llama3.2:3b-instruct-fp16", - "created_at": "2025-08-01T23:14:09.83858Z", + "created_at": "2025-09-03T17:37:55.13567Z", "done": false, "done_reason": null, "total_duration": null, @@ -40,7 +40,7 @@ "__type__": "ollama._types.GenerateResponse", "__data__": { "model": "llama3.2:3b-instruct-fp16", - "created_at": "2025-08-01T23:14:09.891488Z", + "created_at": "2025-09-03T17:37:55.17774Z", "done": false, "done_reason": null, "total_duration": null, @@ -58,7 +58,7 @@ "__type__": "ollama._types.GenerateResponse", "__data__": { "model": "llama3.2:3b-instruct-fp16", - "created_at": "2025-08-01T23:14:09.945656Z", + "created_at": "2025-09-03T17:37:55.220061Z", "done": false, "done_reason": null, "total_duration": null, @@ -76,7 +76,7 @@ "__type__": "ollama._types.GenerateResponse", "__data__": { "model": "llama3.2:3b-instruct-fp16", - "created_at": "2025-08-01T23:14:09.996898Z", + "created_at": "2025-09-03T17:37:55.261406Z", "done": false, "done_reason": null, "total_duration": null, @@ -94,7 +94,7 @@ "__type__": "ollama._types.GenerateResponse", "__data__": { "model": "llama3.2:3b-instruct-fp16", - "created_at": "2025-08-01T23:14:10.053632Z", + "created_at": "2025-09-03T17:37:55.302615Z", "done": false, "done_reason": null, "total_duration": null, @@ -112,7 +112,7 @@ "__type__": "ollama._types.GenerateResponse", "__data__": { "model": "llama3.2:3b-instruct-fp16", - "created_at": "2025-08-01T23:14:10.105753Z", + "created_at": "2025-09-03T17:37:55.343879Z", "done": false, "done_reason": null, "total_duration": null, @@ -130,7 +130,7 @@ "__type__": "ollama._types.GenerateResponse", "__data__": { "model": "llama3.2:3b-instruct-fp16", - "created_at": "2025-08-01T23:14:10.157953Z", + "created_at": "2025-09-03T17:37:55.384951Z", "done": false, "done_reason": null, "total_duration": null, @@ -148,7 +148,7 @@ "__type__": "ollama._types.GenerateResponse", "__data__": { "model": "llama3.2:3b-instruct-fp16", - "created_at": "2025-08-01T23:14:10.210869Z", + "created_at": "2025-09-03T17:37:55.426563Z", "done": false, "done_reason": null, "total_duration": null, @@ -166,7 +166,7 @@ "__type__": "ollama._types.GenerateResponse", "__data__": { "model": "llama3.2:3b-instruct-fp16", - "created_at": "2025-08-01T23:14:10.263387Z", + "created_at": "2025-09-03T17:37:55.467648Z", "done": false, "done_reason": null, "total_duration": null, @@ -184,7 +184,7 @@ "__type__": "ollama._types.GenerateResponse", "__data__": { "model": "llama3.2:3b-instruct-fp16", - "created_at": "2025-08-01T23:14:10.317794Z", + "created_at": "2025-09-03T17:37:55.509469Z", "done": false, "done_reason": null, "total_duration": null, @@ -202,7 +202,7 @@ "__type__": "ollama._types.GenerateResponse", "__data__": { "model": "llama3.2:3b-instruct-fp16", - "created_at": "2025-08-01T23:14:10.373978Z", + "created_at": "2025-09-03T17:37:55.552302Z", "done": false, "done_reason": null, "total_duration": null, @@ -220,7 +220,7 @@ "__type__": "ollama._types.GenerateResponse", "__data__": { "model": "llama3.2:3b-instruct-fp16", - "created_at": "2025-08-01T23:14:10.429702Z", + "created_at": "2025-09-03T17:37:55.596236Z", "done": false, "done_reason": null, "total_duration": null, @@ -238,15 +238,15 @@ "__type__": "ollama._types.GenerateResponse", "__data__": { "model": "llama3.2:3b-instruct-fp16", - "created_at": "2025-08-01T23:14:10.483762Z", + "created_at": "2025-09-03T17:37:55.637816Z", "done": true, "done_reason": "stop", - "total_duration": 1041142084, - "load_duration": 110407459, + "total_duration": 726849208, + "load_duration": 147625750, "prompt_eval_count": 415, - "prompt_eval_duration": 283000000, + "prompt_eval_duration": 75722709, "eval_count": 13, - "eval_duration": 646000000, + "eval_duration": 502787333, "response": "", "thinking": null, "context": null diff --git a/tests/integration/recordings/responses/9c28ec9ac338.json b/tests/integration/recordings/responses/9c28ec9ac338.json index c71e798d2..45bfebee5 100644 --- a/tests/integration/recordings/responses/9c28ec9ac338.json +++ b/tests/integration/recordings/responses/9c28ec9ac338.json @@ -21,7 +21,7 @@ "__type__": "ollama._types.GenerateResponse", "__data__": { "model": "llama3.2:3b-instruct-fp16", - "created_at": "2025-07-29T23:46:36.316207Z", + "created_at": "2025-09-03T17:34:23.434819Z", "done": false, "done_reason": null, "total_duration": null, @@ -39,7 +39,7 @@ "__type__": "ollama._types.GenerateResponse", "__data__": { "model": "llama3.2:3b-instruct-fp16", - "created_at": "2025-07-29T23:46:36.358611Z", + "created_at": "2025-09-03T17:34:23.477986Z", "done": false, "done_reason": null, "total_duration": null, @@ -57,7 +57,7 @@ "__type__": "ollama._types.GenerateResponse", "__data__": { "model": "llama3.2:3b-instruct-fp16", - "created_at": "2025-07-29T23:46:36.401272Z", + "created_at": "2025-09-03T17:34:23.520282Z", "done": false, "done_reason": null, "total_duration": null, @@ -75,7 +75,7 @@ "__type__": "ollama._types.GenerateResponse", "__data__": { "model": "llama3.2:3b-instruct-fp16", - "created_at": "2025-07-29T23:46:36.444321Z", + "created_at": "2025-09-03T17:34:23.561947Z", "done": false, "done_reason": null, "total_duration": null, @@ -93,7 +93,7 @@ "__type__": "ollama._types.GenerateResponse", "__data__": { "model": "llama3.2:3b-instruct-fp16", - "created_at": "2025-07-29T23:46:36.48795Z", + "created_at": "2025-09-03T17:34:23.603986Z", "done": false, "done_reason": null, "total_duration": null, @@ -111,7 +111,7 @@ "__type__": "ollama._types.GenerateResponse", "__data__": { "model": "llama3.2:3b-instruct-fp16", - "created_at": "2025-07-29T23:46:36.530158Z", + "created_at": "2025-09-03T17:34:23.646447Z", "done": false, "done_reason": null, "total_duration": null, @@ -129,7 +129,7 @@ "__type__": "ollama._types.GenerateResponse", "__data__": { "model": "llama3.2:3b-instruct-fp16", - "created_at": "2025-07-29T23:46:36.573318Z", + "created_at": "2025-09-03T17:34:23.688452Z", "done": false, "done_reason": null, "total_duration": null, @@ -147,7 +147,7 @@ "__type__": "ollama._types.GenerateResponse", "__data__": { "model": "llama3.2:3b-instruct-fp16", - "created_at": "2025-07-29T23:46:36.616297Z", + "created_at": "2025-09-03T17:34:23.730147Z", "done": false, "done_reason": null, "total_duration": null, @@ -165,7 +165,7 @@ "__type__": "ollama._types.GenerateResponse", "__data__": { "model": "llama3.2:3b-instruct-fp16", - "created_at": "2025-07-29T23:46:36.659527Z", + "created_at": "2025-09-03T17:34:23.772004Z", "done": false, "done_reason": null, "total_duration": null, @@ -183,7 +183,7 @@ "__type__": "ollama._types.GenerateResponse", "__data__": { "model": "llama3.2:3b-instruct-fp16", - "created_at": "2025-07-29T23:46:36.702422Z", + "created_at": "2025-09-03T17:34:23.813913Z", "done": false, "done_reason": null, "total_duration": null, @@ -201,7 +201,7 @@ "__type__": "ollama._types.GenerateResponse", "__data__": { "model": "llama3.2:3b-instruct-fp16", - "created_at": "2025-07-29T23:46:36.745894Z", + "created_at": "2025-09-03T17:34:23.856Z", "done": false, "done_reason": null, "total_duration": null, @@ -219,7 +219,7 @@ "__type__": "ollama._types.GenerateResponse", "__data__": { "model": "llama3.2:3b-instruct-fp16", - "created_at": "2025-07-29T23:46:36.788811Z", + "created_at": "2025-09-03T17:34:23.897939Z", "done": false, "done_reason": null, "total_duration": null, @@ -237,7 +237,7 @@ "__type__": "ollama._types.GenerateResponse", "__data__": { "model": "llama3.2:3b-instruct-fp16", - "created_at": "2025-07-29T23:46:36.831618Z", + "created_at": "2025-09-03T17:34:23.939953Z", "done": false, "done_reason": null, "total_duration": null, @@ -255,7 +255,7 @@ "__type__": "ollama._types.GenerateResponse", "__data__": { "model": "llama3.2:3b-instruct-fp16", - "created_at": "2025-07-29T23:46:36.874469Z", + "created_at": "2025-09-03T17:34:23.982033Z", "done": false, "done_reason": null, "total_duration": null, @@ -273,7 +273,7 @@ "__type__": "ollama._types.GenerateResponse", "__data__": { "model": "llama3.2:3b-instruct-fp16", - "created_at": "2025-07-29T23:46:36.917372Z", + "created_at": "2025-09-03T17:34:24.026067Z", "done": false, "done_reason": null, "total_duration": null, @@ -291,7 +291,7 @@ "__type__": "ollama._types.GenerateResponse", "__data__": { "model": "llama3.2:3b-instruct-fp16", - "created_at": "2025-07-29T23:46:36.960558Z", + "created_at": "2025-09-03T17:34:24.069083Z", "done": false, "done_reason": null, "total_duration": null, @@ -309,7 +309,7 @@ "__type__": "ollama._types.GenerateResponse", "__data__": { "model": "llama3.2:3b-instruct-fp16", - "created_at": "2025-07-29T23:46:37.004223Z", + "created_at": "2025-09-03T17:34:24.112349Z", "done": false, "done_reason": null, "total_duration": null, @@ -327,15 +327,15 @@ "__type__": "ollama._types.GenerateResponse", "__data__": { "model": "llama3.2:3b-instruct-fp16", - "created_at": "2025-07-29T23:46:37.046563Z", + "created_at": "2025-09-03T17:34:24.155424Z", "done": true, "done_reason": "stop", - "total_duration": 845522667, - "load_duration": 47784875, + "total_duration": 896931125, + "load_duration": 89697291, "prompt_eval_count": 511, - "prompt_eval_duration": 66135292, + "prompt_eval_duration": 83876750, "eval_count": 18, - "eval_duration": 730999291, + "eval_duration": 722156292, "response": "", "thinking": null, "context": null diff --git a/tests/integration/recordings/responses/9e651e5fcfe2.json b/tests/integration/recordings/responses/9e651e5fcfe2.json index f510f3a6e..6accc38fa 100644 --- a/tests/integration/recordings/responses/9e651e5fcfe2.json +++ b/tests/integration/recordings/responses/9e651e5fcfe2.json @@ -23,1560 +23,1560 @@ "data": [ { "embedding": [ - -0.07449307, - 0.027951928, - -0.026060246, - 0.028483065, - -0.048791632, - -0.12451073, - -0.037688024, - 0.041220777, - -0.048782747, - -0.027790926, - -0.092681944, - 0.052037407, - 0.08095267, - 0.023185384, - 0.10326959, - -0.061368585, - -0.046598755, - 0.031270534, - -0.009005052, - -0.111023106, - -0.020844607, - 0.0365254, - -0.013400216, - 0.007603707, - 0.019496046, - 0.004319023, - -0.012447805, - -0.04465679, - -9.841689e-05, - 0.027754154, - -0.052329242, - 0.06209096, - 0.019665342, - 0.022347461, - -0.018723859, - 0.06644313, - -0.037004728, - -0.09444654, - -0.050066303, - -0.016110398, - -0.089189, - 0.07288855, - -0.07318861, - -0.027522061, - -0.066324726, - 0.015509758, - -0.0042457446, - -0.03252355, - -0.035831843, - -0.026272034, - -0.09124794, - 0.022858502, - -0.056080233, - -0.103500344, - -0.023473406, - -0.016338969, - 0.06030296, - -0.0120581165, - -0.009729192, - -0.15205215, - -0.07315331, - 0.022419574, - 0.08820763, - 0.062114313, - -0.04762322, - -0.05541787, - -0.036066234, - 0.017759612, - 0.08481655, - -0.05053196, - -0.09962307, - -0.029446559, - -0.0021580544, - 0.08140918, - 0.03067005, - -0.12171203, - 0.046307985, - 0.005336976, - -0.0076234527, - 0.049193826, - 0.0009906195, - 0.018153494, - -0.056338865, - 0.0908365, - 0.03551559, - -0.062860996, - 0.0518074, - 0.071721554, - -0.045374844, - 0.009667945, - 0.030433532, - -0.05885662, - 0.03727969, - 0.0041508353, - -0.014315319, - 0.062025562, - 0.026427185, - -0.054075267, - -0.04068261, - 0.010823117, - -0.0032635517, - -0.077452675, - 0.055320397, - 0.011208057, - 0.049934894, - 0.011137414, - 0.044191435, - -0.08876309, - 0.04791029, - -0.029189063, - -0.021350788, - -0.058955453, - -0.0060216836, - -0.03632618, - 0.045660086, - 0.07383026, - -0.0043607675, - 0.07589455, - -0.0005572796, - 0.0063479175, - 0.019868094, - -0.008913204, - -0.007406098, - -0.014949887, - 0.012402974, - 0.0032334107, - -0.009926773, - 1.525028e-33, - -0.03028342, - -0.05685508, - -0.009895807, - 0.022367567, - 0.05730986, - -0.018540345, - 0.078504145, - -0.0036667767, - -0.031108411, - -0.0333193, - 0.019241981, - 0.037178107, - 0.030919006, - 0.13797465, - -0.0026615814, - 0.00626278, - 0.023982357, - 0.02884277, - 0.011378185, - 0.003017119, - 0.009753849, - -0.010310673, - 0.025471263, - 0.04401538, - 0.008264411, - -0.023294613, - -0.02543755, - -0.022366447, - 0.016387654, - 0.0039752712, - -0.06696038, - -0.059061013, - -0.026061574, - 0.025640154, - -0.024006085, - -0.015399723, - -0.013001841, - -0.08129873, - 0.029804442, - -0.0047991537, - -0.021450322, - 0.025900915, - 0.0044511827, - -0.013483615, - -0.014909116, - 0.0462146, - -0.0003121182, - 0.017148994, - -0.121784754, - 0.02112702, - -0.009525965, - -0.035118576, - 0.08002826, - 0.08460527, - 0.0020599784, - 0.051269483, - 0.052960806, - 0.032629956, - -0.04172868, - -0.055450223, - 0.014603321, - 0.034458637, - 0.095163934, - 0.004940245, - 0.038055513, - 0.064066105, - 0.037084144, - 0.117337674, - 0.04749384, - 0.062727995, - -0.043873455, - 0.03940274, - -0.041489355, - 0.045208808, - -0.005673402, - 0.028298998, - 0.035084575, - -0.11161549, - 0.06762898, - 0.025535477, - -0.016374003, - -0.023129083, - 0.025620162, - -0.034770124, - -0.014257682, - -0.04390796, - -0.006200332, - 0.04474309, - -0.0072586853, - -0.038618132, - -0.06358841, - -0.05306046, - 0.044273335, - 0.024379753, - -0.013372279, - -5.162782e-33, - -0.01137177, - -0.0038401731, - -0.046551347, - 0.0008104445, - -0.09031019, - -0.06308892, - 0.009730625, - 0.00016963277, - 0.043050725, - 0.022217263, - -0.04910803, - -0.08518463, - 0.11067566, - 0.017678969, - 0.05608959, - 0.037217773, - -0.11399499, - 0.011297513, - 0.010620838, - 0.035015386, - -0.074024685, - 0.015696649, - -0.032765005, - -0.06483389, - -0.010750767, - -0.04140643, - -0.09720136, - -0.07026117, - 0.021630345, - 0.050262064, - -0.01796077, - 0.03200972, - -0.03785568, - 0.031321034, - 0.07589453, - -0.00090503925, - 0.035030376, - -0.06255562, - -0.006917408, - -0.026772378, - 0.116618186, - 0.050241243, - 0.06521753, - 0.06511879, - 0.025131317, - 0.031826124, - -0.059561018, - 0.08187109, - -0.027979838, - -0.04847714, - -0.034865912, - 0.03014605, - 0.035055622, - -0.018549602, - -0.038735136, - -0.04888224, - 0.02115399, - 0.08302824, - -0.06755719, - -0.053532355, - -0.08100928, - -0.06342726, - 0.01134464, - 0.020696267, - -0.06569805, - 0.02215437, - -0.107759416, - -0.011531022, - -0.052023083, - -0.15014696, - 0.11523642, - -0.030628026, - -0.018693298, - 0.05293893, - -0.066821866, - 0.040430665, - -0.028188393, - -0.016445817, - -0.025638778, - 0.065690935, - 0.08657344, - 0.010824949, - -0.038753588, - 0.027475704, - -0.06717005, - -0.015260354, - -0.05266386, - 0.02095537, - 0.0314708, - 0.0028445746, - 0.010277572, - 0.04829579, - 0.02202069, - 0.01687653, - -0.022683937, - -4.070874e-08, - -0.0068096938, - 0.0014505221, - 0.0538663, - 0.015128973, - 0.017920515, - 0.08120387, - 0.0054989015, - -0.037012283, - -0.018747889, - 0.051839896, - -0.01485388, - -0.04494068, - -0.092807755, - -0.07264074, - -0.0042969217, - 0.14135452, - -0.022500824, - -0.0304894, - 0.047428515, - 0.06622567, - 0.07943656, - -0.022952257, - -0.053804893, - 0.10411883, - -0.08483286, - -0.03217885, - 0.058469053, - 0.0037233643, - -0.029061304, - -0.093473285, - -0.0041507743, - -0.035646018, - 0.007173623, - 0.040360082, - 0.04552733, - 0.018294893, - 0.021491595, - -0.05992459, - -0.02806498, - 0.018094081, - -0.02130419, - -0.003922083, - 0.012168674, - -0.016664261, - 0.021637399, - 0.02437987, - -0.044396017, - -0.047764827, - -0.057788223, - -0.0577456, - -0.0060329973, - -0.010019745, - -0.016522264, - -0.049803738, - 0.020510556, - 0.07658504, - -0.1371851, - 0.008845452, - -0.032027397, - 0.035882812, - -0.0063640904, - 0.11211461, - 0.15690215, - -0.00068062195 + -0.07448108, + 0.027982691, + -0.025962545, + 0.028414156, + -0.04874927, + -0.124489374, + -0.03775365, + 0.041172747, + -0.048783444, + -0.027774421, + -0.09272271, + 0.051921174, + 0.08087506, + 0.023085767, + 0.103185095, + -0.06142812, + -0.046623003, + 0.031264473, + -0.009095788, + -0.110987656, + -0.020735977, + 0.036462996, + -0.013348663, + 0.007442654, + 0.019446686, + 0.0043880027, + -0.0123794135, + -0.04474342, + -0.00010696763, + 0.027796188, + -0.05249273, + 0.062042117, + 0.019623421, + 0.022298045, + -0.01876838, + 0.06636658, + -0.036940884, + -0.09439301, + -0.04989112, + -0.016055813, + -0.08934105, + 0.07278765, + -0.073312856, + -0.027571253, + -0.06639977, + 0.015506035, + -0.004176694, + -0.032542672, + -0.035769954, + -0.026245229, + -0.09129098, + 0.022831371, + -0.05601971, + -0.103505865, + -0.023430603, + -0.01617043, + 0.060298156, + -0.011999374, + -0.00982143, + -0.15203232, + -0.07311755, + 0.022391053, + 0.08800625, + 0.062195398, + -0.04764835, + -0.05545306, + -0.036078423, + 0.017782934, + 0.08492913, + -0.050706394, + -0.09958507, + -0.029495796, + -0.002121337, + 0.08148674, + 0.030521393, + -0.12159759, + 0.04639748, + 0.0054555144, + -0.0076237656, + 0.04930283, + 0.001018987, + 0.01823945, + -0.056388717, + 0.09080432, + 0.03544767, + -0.062846325, + 0.05177355, + 0.07175976, + -0.045391884, + 0.009686718, + 0.030302709, + -0.058896482, + 0.03719664, + 0.004174063, + -0.014313601, + 0.06214871, + 0.026443055, + -0.054081496, + -0.04056011, + 0.010876058, + -0.0033277434, + -0.07736001, + 0.055489365, + 0.011366925, + 0.049955327, + 0.011093621, + 0.044155005, + -0.08873286, + 0.04789806, + -0.029256178, + -0.021238709, + -0.059048988, + -0.006010105, + -0.036286995, + 0.045776833, + 0.07393597, + -0.0043319017, + 0.07591234, + -0.0006300352, + 0.0063326987, + 0.019833053, + -0.008920521, + -0.0074224886, + -0.014964156, + 0.012450781, + 0.003317517, + -0.009942644, + 1.525195e-33, + -0.030182399, + -0.056817565, + -0.009954876, + 0.02231213, + 0.057156544, + -0.018560076, + 0.07843683, + -0.003509288, + -0.031122614, + -0.0333474, + 0.019342642, + 0.03716782, + 0.030942772, + 0.13801146, + -0.0026788223, + 0.0060844175, + 0.024037478, + 0.028806396, + 0.0114514725, + 0.0028755309, + 0.009741409, + -0.010365574, + 0.025636459, + 0.04402703, + 0.00824972, + -0.023288164, + -0.025415357, + -0.02247272, + 0.016395057, + 0.0039686435, + -0.06683203, + -0.058984432, + -0.026139224, + 0.02571613, + -0.023981044, + -0.01542635, + -0.013025425, + -0.08132036, + 0.029904919, + -0.0048653325, + -0.02163821, + 0.025880665, + 0.004492511, + -0.013551861, + -0.014834658, + 0.046109095, + -0.00031146017, + 0.016851023, + -0.12182429, + 0.021024965, + -0.009434213, + -0.03510208, + 0.080137864, + 0.08463277, + 0.0019426581, + 0.051176246, + 0.05314091, + 0.032667853, + -0.041880205, + -0.05545038, + 0.014655727, + 0.034564327, + 0.09517278, + 0.0048721586, + 0.038064517, + 0.064016655, + 0.036886543, + 0.11732628, + 0.04750395, + 0.062849574, + -0.043793496, + 0.039535545, + -0.0414883, + 0.045276705, + -0.005626682, + 0.028326502, + 0.03510831, + -0.11158364, + 0.067508236, + 0.025473768, + -0.016454473, + -0.023138152, + 0.02560681, + -0.03489655, + -0.0143142305, + -0.043763783, + -0.006103266, + 0.044694975, + -0.007177529, + -0.038755096, + -0.06350946, + -0.05295245, + 0.044151388, + 0.024555689, + -0.01345332, + -5.1627547e-33, + -0.011461753, + -0.003969141, + -0.04658726, + 0.0008026091, + -0.090269305, + -0.0629358, + 0.009687034, + 0.00015354449, + 0.043152034, + 0.022057066, + -0.049155302, + -0.08511033, + 0.110782035, + 0.017681966, + 0.056186423, + 0.03724774, + -0.114085265, + 0.011197734, + 0.010572792, + 0.03503156, + -0.07397689, + 0.0156148635, + -0.032688703, + -0.06490581, + -0.010675779, + -0.041401856, + -0.097037986, + -0.07025277, + 0.021750104, + 0.05030694, + -0.017832309, + 0.032031614, + -0.03788665, + 0.03141082, + 0.07613352, + -0.0007763451, + 0.034961626, + -0.06256205, + -0.006801991, + -0.026741587, + 0.11656076, + 0.05023973, + 0.06515106, + 0.06511257, + 0.025219081, + 0.03180813, + -0.05966658, + 0.08190675, + -0.028054262, + -0.048548922, + -0.03486897, + 0.03020514, + 0.035033725, + -0.018610824, + -0.038684692, + -0.048875436, + 0.021133669, + 0.08319505, + -0.06746284, + -0.053462982, + -0.08098418, + -0.06340421, + 0.011191566, + 0.020785637, + -0.06575731, + 0.02211741, + -0.10775702, + -0.011597437, + -0.051947355, + -0.1501959, + 0.11516611, + -0.030521782, + -0.018723903, + 0.052845538, + -0.06679985, + 0.040416736, + -0.028146135, + -0.01644884, + -0.025731068, + 0.06570538, + 0.0866128, + 0.010937938, + -0.03865133, + 0.027389226, + -0.06712724, + -0.015267271, + -0.05265448, + 0.020899015, + 0.031420153, + 0.002802588, + 0.010436373, + 0.048363067, + 0.021981295, + 0.01690293, + -0.022728851, + -4.0744272e-08, + -0.0065167644, + 0.0014059767, + 0.05391456, + 0.015178632, + 0.018086514, + 0.08112959, + 0.005525823, + -0.037069544, + -0.01871401, + 0.051793523, + -0.014797383, + -0.044994324, + -0.09279006, + -0.07259356, + -0.004214306, + 0.14136177, + -0.022566888, + -0.030480398, + 0.047431417, + 0.06623071, + 0.07947818, + -0.023033215, + -0.05389834, + 0.10418305, + -0.08498801, + -0.032223985, + 0.058419, + 0.0036608635, + -0.02912376, + -0.09348434, + -0.004131768, + -0.035598896, + 0.007222825, + 0.040373847, + 0.04553802, + 0.018402338, + 0.021517321, + -0.06000489, + -0.028075347, + 0.018188315, + -0.021463133, + -0.003939297, + 0.012185079, + -0.016664179, + 0.021595497, + 0.02443412, + -0.044382285, + -0.047587246, + -0.057701204, + -0.057771184, + -0.0060019926, + -0.0099875815, + -0.016420204, + -0.049889106, + 0.020464808, + 0.076619074, + -0.13720629, + 0.00883673, + -0.032044746, + 0.035911836, + -0.006365476, + 0.11197782, + 0.15684035, + -0.00079191517 ], "index": 0, "object": "embedding" }, { "embedding": [ - -0.0011845493, - 0.013266878, - 0.03609042, - 0.047072034, - -0.008352954, - -0.0122682275, - 0.017132185, - -0.014473443, - -0.06756814, - 0.013247742, - -0.07102911, - 0.021882167, - 0.048140433, - -0.06663474, - -0.029968074, - 0.0146699, - 0.042884044, - 0.031221654, - -0.06519409, - -0.07393237, - 0.017278695, - -0.015300585, - -0.052712914, - 0.063471325, - 0.005261093, - 0.026454475, - 0.036750335, - 0.048913635, - -0.0043701017, - 0.010404101, - -0.00899726, - -0.07210333, - 0.0508586, - 0.017407527, - -0.06129139, - -0.010193845, - -0.06584968, - 0.06993935, - 0.028308308, - -0.037110034, - -0.05215759, - -0.07382648, - 0.023526125, - -0.025393125, - 0.061842058, - 0.115891784, - -0.08308006, - -0.088689096, - -0.045506753, - 0.021837203, - -0.12331834, - -0.02362818, - -0.0015319391, - -0.013698963, - -0.056246556, - 0.088307984, - 0.03336545, - 0.051764306, - 0.007479521, - -0.025192864, - 0.023220513, - -0.15522671, - -0.010666595, - 0.016220143, - 0.034197047, - 0.020141115, - -0.02228778, - 0.050806805, - -0.0054491716, - -0.04010184, - -0.020381475, - 0.101001725, - 0.0030050839, - 0.066215865, - 0.040159617, - -0.019853236, - -0.059809405, - -0.06364045, - 0.08465813, - 0.023686064, - -0.017249556, - -0.005799871, - -0.02653176, - 0.092887536, - 0.048390586, - -0.068729825, - -0.022274029, - -0.01541849, - -0.011106163, - -0.017558511, - 0.025275087, - -0.039419167, - -0.0013605524, - -0.040891252, - -0.03210248, - 0.04157447, - 0.009033561, - -0.1375085, - 0.0302998, - 0.058144268, - 0.010614374, - 0.09235676, - -0.035921294, - -0.0035614434, - 0.056328356, - -0.003870427, - 0.035673276, - 0.014662149, - 0.106206276, - -0.13588227, - -0.05821538, - 0.045162544, - -0.069754794, - -0.05015353, - -0.04111925, - 0.012403055, - -0.040746994, - 0.028958116, - -0.022099715, - 0.08722799, - -0.009660439, - -0.02553313, - 0.011424866, - 0.03355087, - 0.021934206, - -0.08680693, - -0.07095944, - 1.7813879e-33, - -0.041105658, - -0.10025705, - 0.0064499485, - 0.0037606815, - 0.029249465, - -0.08724099, - -0.042814564, - -0.065751046, - 0.01803772, - 0.022158695, - -0.03251517, - -0.023311423, - 0.021312106, - 0.09513294, - 0.08325624, - 0.042880148, - 0.0038685675, - 0.037857197, - 0.019852297, - -0.033418458, - 0.10195742, - -0.014400936, - 0.021739826, - -0.02148512, - -0.0074825305, - 0.046198383, - 0.06668454, - 0.064343214, - -0.010934716, - 0.016144961, - 0.030755335, - 0.017353602, - -0.07630945, - 0.02787306, - 0.053113766, - -0.061461076, - 0.0071374113, - 0.005771103, - 0.05516302, - 0.06909889, - -0.027851412, - -0.045708418, - 0.09470951, - -0.029809639, - -0.0450938, - 0.017276933, - 0.016100975, - -0.06285931, - -0.045057483, - -0.045170058, - -0.005335317, - -0.019424338, - -0.04570747, - -0.026393251, - 0.012418678, - 0.08569869, - -0.0033635902, - 0.0035900169, - -0.0119453, - 0.00669384, - 0.033529036, - -0.0011266738, - 0.042164367, - 0.055857047, - 0.017889913, - 0.07058827, - 0.1045626, - 0.06235585, - 0.044550747, - -0.0027960828, - 0.025605692, - -0.0020889128, - 0.04055551, - -0.012159332, - 0.05225918, - -0.0015176827, - 0.053381234, - -0.007923704, - -0.028188763, - 0.018261831, - -0.04613833, - -0.043358967, - -0.026370697, - -0.110958725, - 0.008541168, - 0.0056487373, - -0.034883622, - -0.05653664, - -0.030319579, - 0.0053387904, - -0.08992194, - -0.0313816, - -0.06223965, - 0.09973829, - -0.032821275, - -3.3483957e-33, - -0.027244257, - 0.0105603505, - -0.022050971, - 0.12673026, - 0.031783704, - 0.03317703, - -0.0515448, - -0.030908447, - -0.046472445, - -0.0022395607, - -0.056245685, - 0.007864777, - 0.06504396, - 0.038899444, - -0.06833807, - 0.07752775, - -0.0679177, - 0.0064592003, - -0.04089174, - 0.037315972, - -0.072344616, - 0.0632527, - 0.014409584, - -0.058710277, - 0.030982593, - -0.019495374, - -0.07455309, - 0.03753421, - -0.026329445, - 0.020833284, - -0.031074857, - 0.0059377784, - -0.047568988, - -0.010903666, - 0.0353143, - 0.054745093, - 0.070084415, - -0.056538608, - -0.017365856, - 0.07531329, - 0.05383335, - 0.0026772518, - -0.07281682, - -0.0755028, - -0.012854154, - 0.011568236, - -0.08559846, - -0.0015188414, - 0.036308214, - -0.062071785, - -0.0050686314, - 0.023929637, - -0.008095938, - -0.03611622, - -0.034135558, - 0.00030859755, - -0.057838384, - 0.021293137, - 0.056338087, - 0.10234655, - -0.076837495, - -0.096356064, - 0.029131278, - 0.001004221, - -0.010381513, - 0.055196848, - -0.021404155, - 0.048181012, - -0.009104861, - 0.0044043055, - 0.002918874, - 0.04924864, - -0.049854394, - 0.0710729, - -0.048272487, - -0.07305892, - -0.026601639, - -0.06437188, - -0.034527853, - -0.005951345, - 0.018712144, - -0.077793844, - -0.004720919, - 0.045758806, - -0.04379248, - 0.0121709565, - 0.024249863, - 0.03526606, - 0.0062171146, - -0.08686959, - -0.014602414, - 0.048708588, - -0.069689915, - 0.04758633, - -0.096403375, - -3.885784e-08, - 0.020160066, - -0.0060397363, - 0.10671191, - -0.0073609953, - 0.1113298, - 0.07655439, - -0.08989872, - 0.10998299, - -0.060445502, - -0.061076436, - 0.046950154, - -0.016442984, - 0.016685285, - -0.012291731, - 0.0034336923, - 0.031462166, - 0.018294413, - 0.037974738, - -0.00058906816, - 0.0199562, - 0.11084883, - -0.02309312, - 0.04923742, - -0.04922855, - 0.03767353, - -0.102210835, - 0.0213937, - 0.0049329796, - -0.026793618, - 0.04147558, - -0.03789522, - 0.029213108, - 0.037435144, - -0.01592795, - 0.095913775, - 0.14336638, - 0.049839716, - -0.112729535, - -0.06265318, - -0.03857694, - -0.03080216, - 0.08552668, - -0.04825808, - 0.04012672, - 0.014288913, - -0.021062234, - 0.048812427, - -0.05777949, - 0.009785274, - 0.0027342755, - 0.07962631, - 0.017954743, - 0.022360845, - 0.08985347, - 0.066461965, - 0.021893978, - 0.059404697, - -0.061141845, - 0.015304087, - 0.08356255, - -0.0017417142, - 0.08870375, - -0.027489252, - -0.060387574 + -0.0012923438, + 0.013419649, + 0.03603258, + 0.046982195, + -0.008386184, + -0.012245008, + 0.017257063, + -0.014495833, + -0.06755615, + 0.013220825, + -0.071046636, + 0.022029007, + 0.04805814, + -0.06659013, + -0.030023778, + 0.014715108, + 0.04294596, + 0.031195298, + -0.06522679, + -0.07396746, + 0.017329818, + -0.0151756415, + -0.052758723, + 0.06344977, + 0.005364444, + 0.02631366, + 0.03665044, + 0.048812985, + -0.0044375616, + 0.0103826355, + -0.0089511005, + -0.07216287, + 0.05088121, + 0.017377803, + -0.061182447, + -0.010244597, + -0.06587784, + 0.069840916, + 0.028359821, + -0.037131228, + -0.052071016, + -0.07370394, + 0.0233667, + -0.02532014, + 0.06171828, + 0.11584273, + -0.08307468, + -0.08872316, + -0.04554565, + 0.02177065, + -0.12324151, + -0.023568366, + -0.0015541487, + -0.013532973, + -0.056209136, + 0.0880576, + 0.03321554, + 0.05171784, + 0.0074756956, + -0.025275769, + 0.023162214, + -0.15517598, + -0.010777206, + 0.016303454, + 0.034188252, + 0.020134093, + -0.022240352, + 0.050957076, + -0.005396301, + -0.04007687, + -0.020301744, + 0.10113998, + 0.002977471, + 0.06617704, + 0.040134214, + -0.02005319, + -0.059682623, + -0.06369068, + 0.08473604, + 0.023557685, + -0.017191878, + -0.005820709, + -0.026404407, + 0.09280466, + 0.04844145, + -0.06875489, + -0.022161635, + -0.015402431, + -0.0111024445, + -0.017707076, + 0.025355583, + -0.039296508, + -0.001362202, + -0.040884525, + -0.03204941, + 0.04150212, + 0.008948646, + -0.13776794, + 0.030302526, + 0.058231197, + 0.010572606, + 0.09247389, + -0.035872795, + -0.0036602807, + 0.056347203, + -0.003996722, + 0.035537403, + 0.014696888, + 0.10615937, + -0.13590123, + -0.05810754, + 0.04527657, + -0.06982519, + -0.049982276, + -0.041045085, + 0.01247287, + -0.040934183, + 0.028955987, + -0.02226216, + 0.08722953, + -0.009548719, + -0.025511682, + 0.0114325285, + 0.03363939, + 0.021809513, + -0.08675585, + -0.07089411, + 1.7909231e-33, + -0.04121751, + -0.1001688, + 0.006345352, + 0.0037210584, + 0.029166285, + -0.0872215, + -0.04271259, + -0.06566409, + 0.017946582, + 0.022238955, + -0.03249184, + -0.02349789, + 0.021466883, + 0.09511927, + 0.08346572, + 0.042806614, + 0.0038908664, + 0.037915263, + 0.020043708, + -0.033399176, + 0.10208849, + -0.014397545, + 0.021684645, + -0.021582458, + -0.0074115414, + 0.046073515, + 0.06664795, + 0.06434497, + -0.010910654, + 0.016172478, + 0.030913299, + 0.017434347, + -0.0762684, + 0.027927354, + 0.053165767, + -0.061656844, + 0.007082498, + 0.0057526245, + 0.055203717, + 0.069314696, + -0.027693065, + -0.045786254, + 0.094618365, + -0.02984729, + -0.045069296, + 0.01723317, + 0.016129777, + -0.06281533, + -0.045081936, + -0.045089465, + -0.0053253355, + -0.019320533, + -0.045810748, + -0.02639149, + 0.012412514, + 0.08566385, + -0.0034776065, + 0.0035142878, + -0.012017715, + 0.006649936, + 0.033606175, + -0.0012646043, + 0.042252455, + 0.055928096, + 0.017948387, + 0.07064788, + 0.10451079, + 0.062350754, + 0.04458121, + -0.0028225682, + 0.02566386, + -0.0021405003, + 0.040477417, + -0.012259745, + 0.052335545, + -0.0017080541, + 0.05346329, + -0.007733562, + -0.028276777, + 0.018282998, + -0.046343774, + -0.043290336, + -0.026471136, + -0.11104024, + 0.008576623, + 0.005548108, + -0.034847535, + -0.056416124, + -0.030293388, + 0.0053394907, + -0.09004081, + -0.03141982, + -0.062330373, + 0.09981983, + -0.032840475, + -3.3540373e-33, + -0.027300175, + 0.010525057, + -0.021980286, + 0.12664026, + 0.031588834, + 0.033247624, + -0.05148502, + -0.03101089, + -0.0465964, + -0.0022529345, + -0.056195565, + 0.007953736, + 0.064945616, + 0.03884713, + -0.06837888, + 0.077476665, + -0.06788635, + 0.0064428714, + -0.040736765, + 0.037416343, + -0.07232494, + 0.063321635, + 0.014398016, + -0.05871896, + 0.031005096, + -0.019561818, + -0.07452502, + 0.037396118, + -0.026255993, + 0.020780139, + -0.031075457, + 0.0058948854, + -0.047562398, + -0.010866235, + 0.0352409, + 0.0549852, + 0.07012556, + -0.056673322, + -0.017415406, + 0.07528239, + 0.05387259, + 0.0028653517, + -0.07284915, + -0.07543174, + -0.012900278, + 0.011457189, + -0.08563738, + -0.0015463261, + 0.036361244, + -0.062004283, + -0.0050084046, + 0.023846988, + -0.008083734, + -0.03593437, + -0.034260865, + 0.000298229, + -0.0578704, + 0.021156322, + 0.056237947, + 0.102285825, + -0.07694436, + -0.096381366, + 0.029115336, + 0.001019501, + -0.010235284, + 0.055199094, + -0.021333022, + 0.04801045, + -0.008948923, + 0.0043332377, + 0.002985581, + 0.049172573, + -0.049805593, + 0.07117998, + -0.04823976, + -0.072981454, + -0.026498413, + -0.06437876, + -0.0346269, + -0.0060303714, + 0.018713593, + -0.07784192, + -0.0046854415, + 0.04578587, + -0.043880597, + 0.012154217, + 0.024205454, + 0.0352363, + 0.0063410155, + -0.086736806, + -0.014489626, + 0.048670504, + -0.06944819, + 0.047556538, + -0.096405424, + -3.8881783e-08, + 0.020024363, + -0.0060733794, + 0.10675529, + -0.0072445725, + 0.11130468, + 0.0766799, + -0.089739904, + 0.10989663, + -0.060538583, + -0.061066266, + 0.046883732, + -0.016365182, + 0.016547771, + -0.012390388, + 0.0035057077, + 0.031388927, + 0.018324051, + 0.038030062, + -0.0005554988, + 0.019816065, + 0.110884875, + -0.023082083, + 0.049298774, + -0.049228016, + 0.03771876, + -0.10209589, + 0.021328293, + 0.0048561115, + -0.026669646, + 0.04161308, + -0.037887473, + 0.029118432, + 0.03738528, + -0.015714107, + 0.0959638, + 0.1434109, + 0.049922757, + -0.11274395, + -0.06264596, + -0.038560014, + -0.03071335, + 0.08555022, + -0.048136428, + 0.0401538, + 0.014374478, + -0.021280114, + 0.04872567, + -0.057720494, + 0.009963986, + 0.002822142, + 0.079809405, + 0.017903175, + 0.022365756, + 0.08987974, + 0.06651197, + 0.022014199, + 0.059419304, + -0.06117766, + 0.015350715, + 0.08376493, + -0.0017018274, + 0.08864588, + -0.027652979, + -0.060420066 ], "index": 1, "object": "embedding" }, { "embedding": [ - -0.01909185, - 0.08210908, - -0.031697396, - -0.037725717, - -0.013948411, - -0.15075137, - -0.054330785, - 0.013774222, - 0.022384442, - 0.025810372, - -0.018899407, - 0.016055057, - 0.04682177, - -0.009026702, - 0.042360768, - 0.015625892, - -0.08302362, - 0.01837326, - -0.016616724, - -0.032981716, - -0.021160135, - -0.04206737, - -0.10867114, - 0.019524219, - -0.0218146, - 0.14237456, - -0.0013471643, - -0.058096632, - 0.005461365, - -0.03999384, - 0.012291773, - -0.014425554, - 0.10419223, - 0.0867777, - -0.07383953, - 0.031295475, - 0.077625275, - -0.041881, - -0.092624, - 0.01998734, - -0.095912896, - 0.063472316, - 0.003484427, - 0.038539667, - -0.022530979, - 0.04934113, - -0.026355578, - -0.049568307, - -0.013252214, - 0.012179733, - -0.11694328, - 0.045149647, - -0.029160414, - 0.025387803, - 0.042368047, - 0.070710085, - 0.070657425, - 0.0035213856, - -0.06036566, - 0.042079538, - 0.016191904, - -0.07189093, - 0.01456738, - -0.0062431092, - 0.029964449, - 0.04743292, - 0.011312341, - 0.013767268, - 0.0437025, - -0.021806497, - 0.022327632, - 0.047793407, - -0.040208474, - 0.09488345, - 0.031709157, - 0.013329832, - -0.039763663, - -0.021771243, - 0.028142115, - -0.034374766, - 0.019633956, - 0.04357714, - -0.042946506, - 0.054137547, - 0.02298205, - -0.056623355, - 0.016670695, - -0.026936218, - -0.039648514, - 0.022648802, - 0.074515395, - -0.014122732, - -0.008389847, - 0.008296867, - -0.024172261, - -0.020115776, - 0.024380524, - -0.025786858, - 0.103464104, - -0.016478091, - 0.052223783, - 0.043333497, - 0.024358233, - 0.016022986, - -0.05042404, - -0.11150191, - 0.05203884, - -0.017846802, - -0.037723143, - -0.06778183, - -0.016054656, - 0.052769117, - -0.08858154, - -0.085411474, - -0.07678483, - -0.093204886, - -0.12648286, - 0.0137771405, - -0.0304395, - 0.009822453, - 0.03967907, - -0.019339666, - -0.028843539, - 0.008771393, - 0.017766763, - -0.117280774, - -0.12130908, - 1.3469411e-33, - -0.035681557, - -0.023190562, - -0.017074129, - -1.6205338e-05, - 0.007204496, - -0.029650006, - 0.022068633, - -0.010598994, - -0.069006644, - 0.04264849, - -0.034409285, - 0.041181736, - 0.017070102, - 0.038193207, - 0.13750355, - -0.008732008, - -0.0023180074, - 0.083727285, - -0.024649868, - -0.028474895, - 0.09694714, - -0.021191066, - 0.06053226, - -0.041405093, - 0.07370928, - 0.01850027, - -0.01971475, - 0.007999736, - -0.012563452, - -0.0052131964, - -0.020111304, - -0.011468107, - 0.0026756013, - 0.036281988, - 0.12377738, - 0.02956046, - 0.026860835, - -0.06579819, - 0.02606916, - -0.062286723, - 0.03685007, - 0.030303163, - 0.034121655, - 0.035232946, - -0.06362426, - -0.016618941, - -0.020203734, - -0.007140921, - 0.004051276, - -0.07790596, - 0.06898834, - 0.012174228, - 0.02399248, - 0.07704281, - 0.027410457, - 0.03527179, - -0.045968123, - -0.061433975, - -0.026718443, - 0.08237309, - -0.06257907, - 0.009975696, - 0.03466846, - 0.023707619, - -0.005923376, - 0.021586487, - -0.026310347, - -0.021010567, - 0.113740906, - 0.03669437, - -0.008125993, - 0.0025199307, - -0.032581042, - 0.013843451, - -0.018476631, - -0.006003686, - -0.012653546, - -0.049709707, - -0.048699785, - 0.027735613, - -0.08145447, - 0.012676274, - 0.045807578, - 0.013233746, - 0.002309172, - -0.05062278, - 0.041730475, - -0.015777566, - -0.07134252, - -0.01638618, - -0.018929252, - -0.0037979293, - 0.033871777, - -0.009268418, - 0.0058128047, - -4.559954e-33, - 0.023730619, - -0.024401154, - -0.00841481, - -0.00066814705, - -0.021580337, - 0.012711025, - -0.025765585, - -0.103677936, - -0.040020734, - 0.011981005, - -0.015193463, - 0.020232921, - 0.04560608, - -0.070537254, - 0.03442731, - 0.056372125, - -0.015020648, - -0.084235705, - -0.049507406, - -0.038237974, - -0.0559059, - 0.04445899, - -0.0019443573, - -0.07633201, - 0.03479357, - -0.042617764, - -0.07321345, - -0.08922806, - 0.08394847, - 0.03421326, - -0.055690773, - -0.017199906, - -0.0023083915, - -0.01934703, - 0.034031216, - -0.006698058, - 0.070640974, - -0.01372546, - 0.03538893, - -0.011788179, - -0.011852313, - 0.08166145, - 0.011479538, - -0.049201284, - 0.04615006, - 0.029843343, - -0.03588677, - 0.13095836, - -0.072135866, - -0.053584475, - 0.047869757, - -0.03287441, - 0.03326261, - -0.053389616, - 0.11908374, - -0.013321548, - -0.08042228, - 0.018044744, - 0.028799541, - 0.012628236, - -0.08251972, - -0.079905055, - 0.036529243, - 0.048085902, - -0.045983046, - -0.03986574, - -0.019302275, - -0.11115848, - -0.12231937, - -0.08230352, - 0.014421084, - 0.04155652, - -0.054012556, - 0.120470405, - -0.1052826, - -0.033725824, - -0.04631211, - 0.015635889, - 0.031605463, - 0.08958995, - 0.06221735, - 0.023502862, - 0.013489683, - 0.043624874, - 0.017064072, - 0.030997539, - 0.052865345, - -0.056004714, - 0.015898803, - -0.043719135, - -0.039004944, - -0.020523861, - -0.01858906, - 0.08363329, - -0.017366229, - -3.8721744e-08, - -0.05206802, - -0.09438689, - 0.009355713, - -0.024583869, - 0.045587633, - 0.0018443449, - -0.01947225, - 0.14300145, - -0.0009495537, - -0.01863899, - 0.060845647, - -0.022184245, - -0.06662406, - -0.042786483, - 0.07611814, - 0.0522471, - 0.08175813, - -0.13221133, - 0.015135053, - 0.07540032, - 0.016381217, - 0.0029628049, - -0.06187796, - 0.0788501, - 0.041752115, - -0.043685306, - 0.05732324, - 0.013885361, - -0.015759919, - 0.002782697, - -0.002972652, - -0.027957972, - 0.03508128, - 0.073690735, - 0.115438506, - 0.007924459, - 0.054716144, - 0.07080589, - -0.04037572, - -0.07577974, - 0.015341726, - -0.014179411, - -0.03881855, - 0.029368779, - 0.061343305, - 0.025503315, - -0.039556272, - 0.113217, - -0.028291667, - 0.032105908, - -0.038683154, - 0.02992647, - -0.02093155, - -0.0045508672, - -0.06038734, - 0.010602616, - -0.0069765793, - -0.04628652, - 0.040670633, - 0.039827973, - -0.015934473, - 0.025722258, - 0.035333917, - -0.026775397 + -0.019089537, + 0.08206227, + -0.031629756, + -0.037748322, + -0.013907723, + -0.15086435, + -0.054227855, + 0.013812081, + 0.022318492, + 0.025760967, + -0.018970305, + 0.0159997, + 0.046886247, + -0.008989786, + 0.042260803, + 0.01563633, + -0.08306234, + 0.018418225, + -0.016524842, + -0.033054315, + -0.021094276, + -0.04198475, + -0.108629815, + 0.019558346, + -0.021839257, + 0.14248955, + -0.0012803682, + -0.058087774, + 0.005395786, + -0.040014874, + 0.012412929, + -0.014448109, + 0.10412988, + 0.08678136, + -0.07392144, + 0.031378184, + 0.077501394, + -0.04197698, + -0.092644565, + 0.019878637, + -0.09584833, + 0.06355258, + 0.0034316017, + 0.03860985, + -0.022438047, + 0.04932071, + -0.026379092, + -0.049524873, + -0.013308545, + 0.012192514, + -0.11695286, + 0.04510036, + -0.029017858, + 0.025516428, + 0.04245081, + 0.070753604, + 0.07057494, + 0.003524953, + -0.06010962, + 0.041959174, + 0.016197778, + -0.07186037, + 0.014555853, + -0.006213116, + 0.030063417, + 0.047432736, + 0.011306432, + 0.013843393, + 0.0436187, + -0.021850524, + 0.022346757, + 0.047835413, + -0.04025223, + 0.09492459, + 0.03155159, + 0.013348888, + -0.039819352, + -0.021837216, + 0.028181475, + -0.03434981, + 0.019666592, + 0.043579087, + -0.042940862, + 0.054164745, + 0.02308801, + -0.056740467, + 0.016757911, + -0.02701336, + -0.039681926, + 0.022773864, + 0.074453875, + -0.01407503, + -0.008249863, + 0.008273288, + -0.024091411, + -0.020071099, + 0.024399305, + -0.025779521, + 0.1035294, + -0.016452465, + 0.05220051, + 0.043400586, + 0.024392875, + 0.0160118, + -0.050395392, + -0.11149879, + 0.05203916, + -0.017942373, + -0.03793447, + -0.06775703, + -0.01611577, + 0.05274979, + -0.08863033, + -0.085470706, + -0.076794446, + -0.09332248, + -0.1264284, + 0.013839316, + -0.030490262, + 0.009920159, + 0.03968685, + -0.01939706, + -0.028892461, + 0.008741198, + 0.017886965, + -0.117217556, + -0.1212998, + 1.35733635e-33, + -0.035622492, + -0.023267707, + -0.017018162, + 0.00010073695, + 0.007257954, + -0.029587401, + 0.022087794, + -0.010561547, + -0.06912062, + 0.04277785, + -0.034413584, + 0.041110493, + 0.017055655, + 0.038174715, + 0.13757399, + -0.008806284, + -0.0023235404, + 0.08372674, + -0.024748268, + -0.028528849, + 0.096861266, + -0.02111509, + 0.06039901, + -0.041284908, + 0.07366366, + 0.018533891, + -0.019621244, + 0.00789655, + -0.012412154, + -0.005184189, + -0.0202234, + -0.011487718, + 0.0026882978, + 0.036282968, + 0.12384692, + 0.029563135, + 0.02673901, + -0.06578298, + 0.02610267, + -0.062275145, + 0.036926493, + 0.030272253, + 0.034105044, + 0.03516919, + -0.06365454, + -0.016557874, + -0.020214476, + -0.007219471, + 0.004009068, + -0.07774858, + 0.06894675, + 0.012156706, + 0.024095584, + 0.07716194, + 0.027376112, + 0.03524163, + -0.046042208, + -0.061379924, + -0.026633548, + 0.08248479, + -0.06261388, + 0.009910456, + 0.034668844, + 0.023772387, + -0.005869554, + 0.02162769, + -0.026385942, + -0.02100117, + 0.11375441, + 0.03666832, + -0.008121711, + 0.0026215075, + -0.032531988, + 0.01391055, + -0.018540533, + -0.0059300573, + -0.012669122, + -0.04971856, + -0.048864197, + 0.027610987, + -0.08137648, + 0.012624587, + 0.045806322, + 0.01336533, + 0.002328637, + -0.050664812, + 0.041695803, + -0.015773693, + -0.07136885, + -0.016258836, + -0.018871423, + -0.0038626953, + 0.03402061, + -0.009335479, + 0.005747506, + -4.5611018e-33, + 0.023689948, + -0.02445775, + -0.00834689, + -0.00063168275, + -0.021578811, + 0.012567475, + -0.025760869, + -0.10368349, + -0.03997725, + 0.01210385, + -0.015231519, + 0.02017564, + 0.045654193, + -0.07050829, + 0.034459736, + 0.056491707, + -0.014989821, + -0.08433123, + -0.049400527, + -0.03832157, + -0.055948768, + 0.044390477, + -0.001941214, + -0.0763155, + 0.034730915, + -0.04243297, + -0.07322386, + -0.08912488, + 0.083965875, + 0.034240186, + -0.055734336, + -0.017151177, + -0.0023456868, + -0.019274496, + 0.03401833, + -0.006712739, + 0.070724845, + -0.013663151, + 0.035358265, + -0.011840785, + -0.011920096, + 0.081632204, + 0.011438198, + -0.04905726, + 0.04624871, + 0.029794158, + -0.035954632, + 0.1309978, + -0.0722, + -0.053626865, + 0.047662914, + -0.032893717, + 0.03320312, + -0.053293463, + 0.11909418, + -0.013308413, + -0.08026765, + 0.018056376, + 0.028816566, + 0.012597203, + -0.082487956, + -0.07992265, + 0.03653938, + 0.048042614, + -0.04597376, + -0.039927375, + -0.019282784, + -0.11115308, + -0.12229221, + -0.08222088, + 0.014523922, + 0.041549023, + -0.054067343, + 0.12032739, + -0.10513437, + -0.03352011, + -0.046141136, + 0.015660388, + 0.03162219, + 0.089564346, + 0.06229127, + 0.02344754, + 0.013432015, + 0.04364802, + 0.017062847, + 0.030911682, + 0.052861545, + -0.05597565, + 0.015810143, + -0.04374839, + -0.039106574, + -0.020592151, + -0.01868341, + 0.08352379, + -0.017375095, + -3.8713683e-08, + -0.052152414, + -0.09442023, + 0.009305927, + -0.024598995, + 0.04574071, + 0.0017779457, + -0.019384999, + 0.14307584, + -0.00092140987, + -0.018639628, + 0.06094085, + -0.022180414, + -0.06670714, + -0.042788457, + 0.07614433, + 0.052368972, + 0.08171796, + -0.13214965, + 0.015069824, + 0.07545052, + 0.016364794, + 0.0030805927, + -0.06188439, + 0.07879054, + 0.04179921, + -0.043787137, + 0.05729686, + 0.013950966, + -0.01580636, + 0.002741003, + -0.002896178, + -0.027976623, + 0.0352471, + 0.07360851, + 0.11537727, + 0.008016604, + 0.054790642, + 0.070841216, + -0.040544577, + -0.07585315, + 0.015317468, + -0.014144724, + -0.03884744, + 0.029432015, + 0.061295677, + 0.025552604, + -0.03950773, + 0.1131327, + -0.028318027, + 0.031907115, + -0.038748857, + 0.029967804, + -0.020923622, + -0.0045868345, + -0.060423743, + 0.01062511, + -0.006921613, + -0.046255972, + 0.04074385, + 0.039824147, + -0.016014125, + 0.025676023, + 0.03524506, + -0.0267346 ], "index": 2, "object": "embedding" }, { "embedding": [ - -0.053183872, - -0.047788426, - 0.04972303, - -0.009334505, - -0.056231733, - -0.037002083, - 0.015224726, - 0.0033988354, - 0.04447645, - 0.016588705, - -0.06540302, - 0.04653401, - 0.012623523, - 0.025223762, - -0.11425605, - 0.027273744, - -0.052391008, - 0.06020533, - -0.045948613, - -0.022937857, - 0.016519869, - 0.014322256, - -0.07750287, - 0.016460732, - -0.06725244, - 0.120790765, - -0.0022636163, - -0.0005024785, - 0.031048942, - 0.031126363, - 0.105009794, - -0.06930837, - -0.013206138, - 0.028933082, - -0.08795337, - 0.05555298, - -0.09165988, - -0.018175907, - -0.024678476, - -0.020182805, - 0.013178067, - -0.0007228829, - 0.0018159959, - 0.006769804, - 0.0860061, - 0.06185969, - -0.077463284, - -0.047084846, - -0.0498773, - -0.008899272, - -0.08812909, - 0.00094635173, - -0.014987473, - -0.007606875, - 0.08516766, - 0.059840705, - 0.024647623, - 0.03781936, - -0.051698226, - 0.03140343, - 0.113696024, - -0.044227768, - 0.009882869, - 0.006037432, - 0.030196855, - 0.071224906, - -0.013819336, - 0.036284678, - 0.0047479654, - -0.074841194, - 0.09735655, - 0.0715865, - -0.009209204, - -0.009545715, - 0.042258147, - 0.01176989, - 0.032883737, - 0.01871987, - 0.012600867, - -0.009270322, - -0.03493854, - 0.0165816, - 0.005335793, - 0.03813737, - 0.09589841, - -0.0021022737, - -0.020831643, - 0.018148199, - -0.032354474, - 0.012446273, - -0.014385681, - -0.0669802, - -0.095483646, - -0.10348357, - -0.0010490393, - -0.0031702255, - 0.027040303, - -0.033902746, - 0.0011530715, - -0.009055597, - -0.048646227, - 0.002960075, - -0.04150261, - -0.03958488, - 0.07510442, - 0.031126844, - 0.030005287, - 0.03351958, - 0.11425093, - -0.08292283, - -0.10923656, - 0.03011645, - -0.041837137, - 0.042389642, - 0.03338184, - -0.038825653, - 0.02099903, - 0.02824791, - 0.054426163, - 0.09631318, - -0.0034680578, - -0.015158154, - -0.09265031, - -0.056172263, - -0.0032930053, - -0.029391458, - -0.11419404, - 1.5047121e-33, - -0.045322943, - -0.073544085, - 0.034601163, - -0.067317046, - 0.023250451, - -0.050395396, - -0.01739104, - -0.0057262457, - 0.05205013, - -0.018088019, - -0.10174609, - 0.016569315, - -0.005840307, - 0.08825027, - 0.04746817, - -0.06267444, - -0.037124775, - -0.04898983, - 0.061778635, - -0.11774465, - 0.015096424, - -0.071004175, - 0.073210604, - -0.01007678, - -0.004525406, - 0.0014324179, - 0.012293256, - -0.018664367, - 0.019014336, - -0.007747823, - -0.008599073, - 0.023763629, - -0.0075268243, - -0.04203368, - -0.008033764, - -0.009042761, - 0.11055124, - -0.02855999, - 0.03761048, - 0.047079824, - 0.06257789, - -0.049527515, - 0.06296901, - 0.005405868, - 0.024098972, - 0.03435228, - -0.01710498, - -0.03391623, - 0.012577585, - -0.05742578, - -0.04634173, - -0.00025635032, - 0.022637868, - -0.11001833, - 0.09246783, - 0.049007315, - -0.04402184, - 0.054414723, - -0.0058709052, - 0.04826815, - 0.035579093, - -0.015419815, - -0.008092566, - 0.09276399, - 0.11231051, - 0.04793964, - -0.01756467, - -0.009571233, - 0.062215857, - -0.003897838, - 0.0039975815, - 0.09544971, - -0.05662297, - -0.058832105, - -0.013788285, - 0.009673877, - -0.047247868, - -0.06171914, - -0.08586089, - 0.050003, - -0.027761148, - -0.007729704, - -0.068465404, - 0.03243531, - 0.015467505, - 0.08288645, - 0.063559495, - -0.005212987, - -0.011866209, - -0.051806632, - -0.008613721, - -0.031797357, - 0.04311073, - 0.00030667474, - -0.0012307463, - -2.3338469e-33, - -0.084895805, - 0.02345889, - -0.055576142, - 0.028851906, - 0.059744447, - 0.044220533, - -0.06970062, - -0.08749075, - -0.023501378, - 0.07671297, - 0.015147405, - 0.019593416, - -0.05839991, - 0.018738003, - 0.0077306163, - -0.016015125, - -0.057336047, - -0.042650495, - 0.100997806, - -0.04004008, - -0.031775918, - 0.031698614, - -0.057948347, - -0.036700245, - 0.027361931, - -0.007076578, - -0.07529461, - 0.049506873, - 0.012840347, - 0.1000292, - -0.036281507, - -0.04813614, - 0.029130226, - 0.017983682, - 0.045438614, - 0.10252733, - 0.00496251, - -0.055316452, - 0.008405219, - -0.05972534, - 0.020135194, - 0.0093700085, - -0.06655473, - -0.029796828, - 0.043222178, - -0.06824294, - -0.07651206, - 0.03997172, - -0.06478741, - 0.072208196, - 0.046655826, - -0.016924199, - -0.048682548, - -0.08449499, - -0.05253414, - 0.032000206, - 0.024684923, - 0.023903653, - 0.07640757, - -0.04118769, - -0.03387857, - -0.114066795, - 0.06797275, - 0.009583203, - -0.06417275, - 0.02440743, - 0.025039174, - -0.004076159, - 0.018739574, - -0.038113788, - 0.014584011, - 0.06845566, - 0.018653333, - 0.05947389, - 0.02376919, - -0.009693411, - -0.066522814, - 0.020966992, - -0.01941947, - 0.014822965, - 0.022724027, - -0.022646833, - 0.010568073, - 0.056872703, - 0.07259132, - 0.06503742, - -0.010027183, - 0.079110056, - 0.03518498, - -0.023728298, - 0.017138498, - 0.08788164, - 0.0060143326, - 0.0074335723, - -0.1092527, - -2.8781574e-08, - -0.05242197, - -0.087604366, - 0.06664988, - 0.014051439, - 0.0998947, - -0.022531891, - 0.062183738, - 0.027777275, - -0.064255044, - -0.03866553, - 0.024992257, - 0.007985698, - -0.024069482, - 0.012068325, - 0.087151505, - 0.012454641, - 0.06475363, - -0.027938146, - 0.03995433, - -0.01226524, - 0.023152042, - -0.032571565, - -0.04254354, - 0.10729923, - 0.037443064, - -0.06624038, - -0.05680355, - -0.005158616, - -0.069514066, - 0.10108567, - -0.03336937, - 0.02180458, - 0.017406454, - 0.018036628, - 0.026380124, - 0.06607102, - 0.059448373, - -0.06540129, - -0.11567981, - -0.07119791, - -0.023404302, - 0.04258733, - 0.04359592, - -0.03663909, - 0.050169207, - 0.0029874544, - 0.05701757, - -0.034646694, - 0.025559898, - -0.046218865, - -0.06721346, - 0.060566954, - -0.041338935, - -0.019814374, - -0.013770683, - -0.061239764, - 0.01488027, - -0.07664038, - -0.05666399, - 0.050506476, - -0.0359506, - 0.12227603, - 0.06429049, - -0.038193453 + -0.053171553, + -0.047855794, + 0.04959839, + -0.009352584, + -0.056259144, + -0.036997948, + 0.01525368, + 0.0033788579, + 0.04453428, + 0.016438372, + -0.065293424, + 0.04655176, + 0.012637792, + 0.025149647, + -0.11436081, + 0.027283441, + -0.052422393, + 0.060236752, + -0.046064522, + -0.022863738, + 0.016536511, + 0.014447978, + -0.07744467, + 0.016475804, + -0.067145765, + 0.120901324, + -0.0022643541, + -0.0005619333, + 0.03098974, + 0.03116176, + 0.10501578, + -0.06940328, + -0.013246061, + 0.029016647, + -0.08779694, + 0.055636257, + -0.09158273, + -0.018188708, + -0.024831342, + -0.020263424, + 0.013102336, + -0.0007477728, + 0.0018712403, + 0.0068353964, + 0.08601601, + 0.061896168, + -0.07733195, + -0.047134392, + -0.04994557, + -0.008955441, + -0.08808325, + 0.0011078792, + -0.015078675, + -0.007628681, + 0.08530312, + 0.059783977, + 0.024557464, + 0.037825108, + -0.05171798, + 0.03148071, + 0.11377193, + -0.04417297, + 0.009659848, + 0.0060449084, + 0.030134702, + 0.07118153, + -0.013864897, + 0.03624278, + 0.0049465275, + -0.07480586, + 0.09733932, + 0.071613275, + -0.009146446, + -0.009571701, + 0.042258315, + 0.011740325, + 0.032803785, + 0.018631615, + 0.012556345, + -0.009346388, + -0.03489368, + 0.01649207, + 0.005488214, + 0.03819102, + 0.09597803, + -0.002047146, + -0.020768773, + 0.018077927, + -0.032444023, + 0.012474241, + -0.014445184, + -0.0670006, + -0.095488854, + -0.10345397, + -0.0009862595, + -0.0030658073, + 0.027003448, + -0.033961065, + 0.0011482734, + -0.009025799, + -0.048620287, + 0.0029769312, + -0.04154341, + -0.0395945, + 0.07520094, + 0.031153427, + 0.030031031, + 0.03353441, + 0.11403943, + -0.082912125, + -0.109138384, + 0.030059446, + -0.041853014, + 0.042241115, + 0.033335667, + -0.038876496, + 0.02092849, + 0.028346559, + 0.054482125, + 0.09627962, + -0.0035115955, + -0.015083763, + -0.092599295, + -0.056257337, + -0.00332258, + -0.02934002, + -0.11417531, + 1.5075675e-33, + -0.04527847, + -0.07345357, + 0.034714583, + -0.067186035, + 0.023143126, + -0.05054431, + -0.017398916, + -0.0058387746, + 0.052131217, + -0.017985696, + -0.10168014, + 0.016505243, + -0.005961273, + 0.08834502, + 0.047341425, + -0.06262999, + -0.03724901, + -0.0490674, + 0.061806694, + -0.117662214, + 0.014966754, + -0.07085228, + 0.07317225, + -0.010064827, + -0.004601465, + 0.0014379362, + 0.0122654615, + -0.018565418, + 0.018996973, + -0.0076706754, + -0.0085447915, + 0.023833418, + -0.0074106916, + -0.04202295, + -0.008097604, + -0.0089935325, + 0.11068735, + -0.028457392, + 0.037548065, + 0.04710371, + 0.062597714, + -0.049594503, + 0.06267496, + 0.005339454, + 0.024064569, + 0.034303125, + -0.016984673, + -0.03375307, + 0.012577206, + -0.05741818, + -0.046267692, + -0.00036155691, + 0.02268587, + -0.109952465, + 0.09230675, + 0.048918508, + -0.044157643, + 0.05441931, + -0.0058244704, + 0.04833069, + 0.035635386, + -0.015495411, + -0.008146981, + 0.092891365, + 0.112310715, + 0.047900427, + -0.017513819, + -0.009520781, + 0.06212363, + -0.0040008924, + 0.00397841, + 0.09532846, + -0.05659656, + -0.058885954, + -0.013697212, + 0.009742546, + -0.04745855, + -0.061571207, + -0.085869245, + 0.05009574, + -0.027810305, + -0.007983068, + -0.06844095, + 0.032406274, + 0.015316275, + 0.0830624, + 0.063605405, + -0.005157704, + -0.011889667, + -0.05187598, + -0.0087124705, + -0.031850815, + 0.043204896, + 0.00032051498, + -0.0012597291, + -2.3328516e-33, + -0.08486178, + 0.023463517, + -0.05558325, + 0.028823433, + 0.0598007, + 0.044241305, + -0.06976774, + -0.08749109, + -0.023545535, + 0.0767821, + 0.015185076, + 0.019631226, + -0.058358442, + 0.018799065, + 0.0076146126, + -0.015977694, + -0.057259887, + -0.042667117, + 0.101026215, + -0.03983678, + -0.03180352, + 0.03177619, + -0.057957705, + -0.036778692, + 0.027305948, + -0.0069477605, + -0.0753, + 0.049428534, + 0.012732314, + 0.10010171, + -0.036260307, + -0.048061043, + 0.029081684, + 0.01795974, + 0.045303203, + 0.102590606, + 0.005036657, + -0.05526093, + 0.008327211, + -0.05970527, + 0.020131486, + 0.009408121, + -0.06648779, + -0.029893365, + 0.0434368, + -0.0683305, + -0.07649664, + 0.039999247, + -0.06477932, + 0.07227491, + 0.046653986, + -0.016773192, + -0.048649658, + -0.08454509, + -0.05255037, + 0.0319589, + 0.024662357, + 0.023793997, + 0.076360136, + -0.040995322, + -0.033935655, + -0.11416756, + 0.06787201, + 0.009610846, + -0.064101316, + 0.024561828, + 0.024906442, + -0.0041048713, + 0.018717252, + -0.038110614, + 0.0145301875, + 0.068478055, + 0.018691448, + 0.05943308, + 0.023695862, + -0.009747667, + -0.066519946, + 0.0209059, + -0.019389415, + 0.014860701, + 0.022718104, + -0.022605024, + 0.0105253365, + 0.05693715, + 0.07257885, + 0.06504599, + -0.010055237, + 0.07908256, + 0.035240322, + -0.02378674, + 0.017134566, + 0.0878081, + 0.005987074, + 0.007431842, + -0.10935983, + -2.8794002e-08, + -0.05234688, + -0.08765063, + 0.06662866, + 0.013907749, + 0.0999487, + -0.022422735, + 0.06214868, + 0.027856557, + -0.06424995, + -0.038701627, + 0.025059296, + 0.00807731, + -0.024077412, + 0.011949065, + 0.08715261, + 0.012486595, + 0.06470489, + -0.027933354, + 0.039985545, + -0.012295149, + 0.02333007, + -0.03250732, + -0.04260915, + 0.10736886, + 0.037696708, + -0.06628188, + -0.056817852, + -0.005238912, + -0.069547325, + 0.100934796, + -0.033363372, + 0.021774344, + 0.017414633, + 0.018075803, + 0.026276791, + 0.066073745, + 0.059642654, + -0.065390244, + -0.115749314, + -0.07125786, + -0.023382567, + 0.042660285, + 0.043636538, + -0.03665277, + 0.050204884, + 0.0030947176, + 0.057122562, + -0.034636553, + 0.025459053, + -0.046185397, + -0.067215376, + 0.06057241, + -0.041255984, + -0.019857686, + -0.013778329, + -0.06125949, + 0.014752149, + -0.07630465, + -0.056748062, + 0.0505062, + -0.036068004, + 0.12241577, + 0.06429002, + -0.038303368 ], "index": 3, "object": "embedding" diff --git a/tests/integration/recordings/responses/9e7a83d3d596.json b/tests/integration/recordings/responses/9e7a83d3d596.json index 4965aa3c7..a9054d729 100644 --- a/tests/integration/recordings/responses/9e7a83d3d596.json +++ b/tests/integration/recordings/responses/9e7a83d3d596.json @@ -15,23 +15,23 @@ "body": { "__type__": "openai.types.completion.Completion", "__data__": { - "id": "cmpl-43", + "id": "cmpl-775", "choices": [ { "finish_reason": "stop", "index": 0, "logprobs": null, - "text": "Blue.\n\nMy response is based on the traditional English rhyme that pairs the colors of roses (red) with violets in a poetic and somewhat whimsical way. This specific version of the rhyme goes like this:\n\n\"Roses are red,\nViolets are blue,\nSugar is sweet,\nAnd so are you.\"\n\nIn modern times, variations of this rhyme can deviate from the original \"blue\" for violets, but in my complete sentence as requested, sticking with a widely recognized completion adds an air of timelessness and familiarity to the phrase." + "text": "Blue.\n\nMy response is based on the traditional rhyme \"Roses are Red, Violets are Blue,\" which is a well-known poem or phrase often used as a greeting or way to express affection. The exact wording may vary slightly depending on the source, but the general meaning remains the same: violets are typically depicted as blue-colored flowers in this rhyme." } ], - "created": 1754348148, + "created": 1756921025, "model": "llama3.2:3b-instruct-fp16", "object": "text_completion", "system_fingerprint": "fp_ollama", "usage": { - "completion_tokens": 113, + "completion_tokens": 75, "prompt_tokens": 50, - "total_tokens": 163, + "total_tokens": 125, "completion_tokens_details": null, "prompt_tokens_details": null } diff --git a/tests/integration/recordings/responses/9fadf5a3d68f.json b/tests/integration/recordings/responses/9fadf5a3d68f.json index bc3c3ca22..aba45bcd3 100644 --- a/tests/integration/recordings/responses/9fadf5a3d68f.json +++ b/tests/integration/recordings/responses/9fadf5a3d68f.json @@ -20,15 +20,15 @@ "__type__": "ollama._types.GenerateResponse", "__data__": { "model": "llama-guard3:1b", - "created_at": "2025-08-01T23:14:22.168612Z", + "created_at": "2025-09-03T17:38:03.270261Z", "done": true, "done_reason": "stop", - "total_duration": 198446125, - "load_duration": 31859666, + "total_duration": 244051875, + "load_duration": 111239500, "prompt_eval_count": 224, - "prompt_eval_duration": 151000000, + "prompt_eval_duration": 120962791, "eval_count": 2, - "eval_duration": 13000000, + "eval_duration": 11306292, "response": "safe", "thinking": null, "context": null diff --git a/tests/integration/recordings/responses/a0c4df33879f.json b/tests/integration/recordings/responses/a0c4df33879f.json index f134e0bed..7898e5b02 100644 --- a/tests/integration/recordings/responses/a0c4df33879f.json +++ b/tests/integration/recordings/responses/a0c4df33879f.json @@ -1,7 +1,7 @@ { "request": { "method": "POST", - "url": "http://localhost:11434/v1/v1/chat/completions", + "url": "http://0.0.0.0:11434/v1/v1/chat/completions", "headers": {}, "body": { "model": "llama3.2:3b-instruct-fp16", @@ -21,7 +21,7 @@ { "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", "__data__": { - "id": "chatcmpl-458", + "id": "chatcmpl-792", "choices": [ { "delta": { @@ -36,7 +36,7 @@ "logprobs": null } ], - "created": 1754081845, + "created": 1756921356, "model": "llama3.2:3b-instruct-fp16", "object": "chat.completion.chunk", "service_tier": null, @@ -47,7 +47,7 @@ { "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", "__data__": { - "id": "chatcmpl-458", + "id": "chatcmpl-792", "choices": [ { "delta": { @@ -62,7 +62,7 @@ "logprobs": null } ], - "created": 1754081845, + "created": 1756921356, "model": "llama3.2:3b-instruct-fp16", "object": "chat.completion.chunk", "service_tier": null, @@ -73,319 +73,7 @@ { "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", "__data__": { - "id": "chatcmpl-458", - "choices": [ - { - "delta": { - "content": " word", - "function_call": null, - "refusal": null, - "role": "assistant", - "tool_calls": null - }, - "finish_reason": null, - "index": 0, - "logprobs": null - } - ], - "created": 1754081845, - "model": "llama3.2:3b-instruct-fp16", - "object": "chat.completion.chunk", - "service_tier": null, - "system_fingerprint": "fp_ollama", - "usage": null - } - }, - { - "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", - "__data__": { - "id": "chatcmpl-458", - "choices": [ - { - "delta": { - "content": " for", - "function_call": null, - "refusal": null, - "role": "assistant", - "tool_calls": null - }, - "finish_reason": null, - "index": 0, - "logprobs": null - } - ], - "created": 1754081845, - "model": "llama3.2:3b-instruct-fp16", - "object": "chat.completion.chunk", - "service_tier": null, - "system_fingerprint": "fp_ollama", - "usage": null - } - }, - { - "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", - "__data__": { - "id": "chatcmpl-458", - "choices": [ - { - "delta": { - "content": " the", - "function_call": null, - "refusal": null, - "role": "assistant", - "tool_calls": null - }, - "finish_reason": null, - "index": 0, - "logprobs": null - } - ], - "created": 1754081845, - "model": "llama3.2:3b-instruct-fp16", - "object": "chat.completion.chunk", - "service_tier": null, - "system_fingerprint": "fp_ollama", - "usage": null - } - }, - { - "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", - "__data__": { - "id": "chatcmpl-458", - "choices": [ - { - "delta": { - "content": " Sun", - "function_call": null, - "refusal": null, - "role": "assistant", - "tool_calls": null - }, - "finish_reason": null, - "index": 0, - "logprobs": null - } - ], - "created": 1754081845, - "model": "llama3.2:3b-instruct-fp16", - "object": "chat.completion.chunk", - "service_tier": null, - "system_fingerprint": "fp_ollama", - "usage": null - } - }, - { - "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", - "__data__": { - "id": "chatcmpl-458", - "choices": [ - { - "delta": { - "content": " is", - "function_call": null, - "refusal": null, - "role": "assistant", - "tool_calls": null - }, - "finish_reason": null, - "index": 0, - "logprobs": null - } - ], - "created": 1754081845, - "model": "llama3.2:3b-instruct-fp16", - "object": "chat.completion.chunk", - "service_tier": null, - "system_fingerprint": "fp_ollama", - "usage": null - } - }, - { - "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", - "__data__": { - "id": "chatcmpl-458", - "choices": [ - { - "delta": { - "content": " \"", - "function_call": null, - "refusal": null, - "role": "assistant", - "tool_calls": null - }, - "finish_reason": null, - "index": 0, - "logprobs": null - } - ], - "created": 1754081845, - "model": "llama3.2:3b-instruct-fp16", - "object": "chat.completion.chunk", - "service_tier": null, - "system_fingerprint": "fp_ollama", - "usage": null - } - }, - { - "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", - "__data__": { - "id": "chatcmpl-458", - "choices": [ - { - "delta": { - "content": "Sol", - "function_call": null, - "refusal": null, - "role": "assistant", - "tool_calls": null - }, - "finish_reason": null, - "index": 0, - "logprobs": null - } - ], - "created": 1754081845, - "model": "llama3.2:3b-instruct-fp16", - "object": "chat.completion.chunk", - "service_tier": null, - "system_fingerprint": "fp_ollama", - "usage": null - } - }, - { - "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", - "__data__": { - "id": "chatcmpl-458", - "choices": [ - { - "delta": { - "content": ".\"", - "function_call": null, - "refusal": null, - "role": "assistant", - "tool_calls": null - }, - "finish_reason": null, - "index": 0, - "logprobs": null - } - ], - "created": 1754081845, - "model": "llama3.2:3b-instruct-fp16", - "object": "chat.completion.chunk", - "service_tier": null, - "system_fingerprint": "fp_ollama", - "usage": null - } - }, - { - "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", - "__data__": { - "id": "chatcmpl-458", - "choices": [ - { - "delta": { - "content": " This", - "function_call": null, - "refusal": null, - "role": "assistant", - "tool_calls": null - }, - "finish_reason": null, - "index": 0, - "logprobs": null - } - ], - "created": 1754081845, - "model": "llama3.2:3b-instruct-fp16", - "object": "chat.completion.chunk", - "service_tier": null, - "system_fingerprint": "fp_ollama", - "usage": null - } - }, - { - "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", - "__data__": { - "id": "chatcmpl-458", - "choices": [ - { - "delta": { - "content": " is", - "function_call": null, - "refusal": null, - "role": "assistant", - "tool_calls": null - }, - "finish_reason": null, - "index": 0, - "logprobs": null - } - ], - "created": 1754081845, - "model": "llama3.2:3b-instruct-fp16", - "object": "chat.completion.chunk", - "service_tier": null, - "system_fingerprint": "fp_ollama", - "usage": null - } - }, - { - "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", - "__data__": { - "id": "chatcmpl-458", - "choices": [ - { - "delta": { - "content": " the", - "function_call": null, - "refusal": null, - "role": "assistant", - "tool_calls": null - }, - "finish_reason": null, - "index": 0, - "logprobs": null - } - ], - "created": 1754081845, - "model": "llama3.2:3b-instruct-fp16", - "object": "chat.completion.chunk", - "service_tier": null, - "system_fingerprint": "fp_ollama", - "usage": null - } - }, - { - "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", - "__data__": { - "id": "chatcmpl-458", - "choices": [ - { - "delta": { - "content": " Roman", - "function_call": null, - "refusal": null, - "role": "assistant", - "tool_calls": null - }, - "finish_reason": null, - "index": 0, - "logprobs": null - } - ], - "created": 1754081846, - "model": "llama3.2:3b-instruct-fp16", - "object": "chat.completion.chunk", - "service_tier": null, - "system_fingerprint": "fp_ollama", - "usage": null - } - }, - { - "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", - "__data__": { - "id": "chatcmpl-458", + "id": "chatcmpl-792", "choices": [ { "delta": { @@ -400,7 +88,7 @@ "logprobs": null } ], - "created": 1754081846, + "created": 1756921356, "model": "llama3.2:3b-instruct-fp16", "object": "chat.completion.chunk", "service_tier": null, @@ -411,7 +99,7 @@ { "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", "__data__": { - "id": "chatcmpl-458", + "id": "chatcmpl-792", "choices": [ { "delta": { @@ -426,7 +114,7 @@ "logprobs": null } ], - "created": 1754081846, + "created": 1756921356, "model": "llama3.2:3b-instruct-fp16", "object": "chat.completion.chunk", "service_tier": null, @@ -437,7 +125,7 @@ { "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", "__data__": { - "id": "chatcmpl-458", + "id": "chatcmpl-792", "choices": [ { "delta": { @@ -452,7 +140,7 @@ "logprobs": null } ], - "created": 1754081846, + "created": 1756921356, "model": "llama3.2:3b-instruct-fp16", "object": "chat.completion.chunk", "service_tier": null, @@ -463,7 +151,7 @@ { "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", "__data__": { - "id": "chatcmpl-458", + "id": "chatcmpl-792", "choices": [ { "delta": { @@ -478,7 +166,7 @@ "logprobs": null } ], - "created": 1754081846, + "created": 1756921356, "model": "llama3.2:3b-instruct-fp16", "object": "chat.completion.chunk", "service_tier": null, @@ -489,11 +177,11 @@ { "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", "__data__": { - "id": "chatcmpl-458", + "id": "chatcmpl-792", "choices": [ { "delta": { - "content": ",", + "content": " is", "function_call": null, "refusal": null, "role": "assistant", @@ -504,7 +192,7 @@ "logprobs": null } ], - "created": 1754081846, + "created": 1756921356, "model": "llama3.2:3b-instruct-fp16", "object": "chat.completion.chunk", "service_tier": null, @@ -515,11 +203,11 @@ { "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", "__data__": { - "id": "chatcmpl-458", + "id": "chatcmpl-792", "choices": [ { "delta": { - "content": " which", + "content": " Sol", "function_call": null, "refusal": null, "role": "assistant", @@ -530,7 +218,7 @@ "logprobs": null } ], - "created": 1754081846, + "created": 1756921356, "model": "llama3.2:3b-instruct-fp16", "object": "chat.completion.chunk", "service_tier": null, @@ -541,163 +229,7 @@ { "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", "__data__": { - "id": "chatcmpl-458", - "choices": [ - { - "delta": { - "content": " was", - "function_call": null, - "refusal": null, - "role": "assistant", - "tool_calls": null - }, - "finish_reason": null, - "index": 0, - "logprobs": null - } - ], - "created": 1754081846, - "model": "llama3.2:3b-instruct-fp16", - "object": "chat.completion.chunk", - "service_tier": null, - "system_fingerprint": "fp_ollama", - "usage": null - } - }, - { - "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", - "__data__": { - "id": "chatcmpl-458", - "choices": [ - { - "delta": { - "content": " later", - "function_call": null, - "refusal": null, - "role": "assistant", - "tool_calls": null - }, - "finish_reason": null, - "index": 0, - "logprobs": null - } - ], - "created": 1754081846, - "model": "llama3.2:3b-instruct-fp16", - "object": "chat.completion.chunk", - "service_tier": null, - "system_fingerprint": "fp_ollama", - "usage": null - } - }, - { - "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", - "__data__": { - "id": "chatcmpl-458", - "choices": [ - { - "delta": { - "content": " adopted", - "function_call": null, - "refusal": null, - "role": "assistant", - "tool_calls": null - }, - "finish_reason": null, - "index": 0, - "logprobs": null - } - ], - "created": 1754081846, - "model": "llama3.2:3b-instruct-fp16", - "object": "chat.completion.chunk", - "service_tier": null, - "system_fingerprint": "fp_ollama", - "usage": null - } - }, - { - "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", - "__data__": { - "id": "chatcmpl-458", - "choices": [ - { - "delta": { - "content": " into", - "function_call": null, - "refusal": null, - "role": "assistant", - "tool_calls": null - }, - "finish_reason": null, - "index": 0, - "logprobs": null - } - ], - "created": 1754081846, - "model": "llama3.2:3b-instruct-fp16", - "object": "chat.completion.chunk", - "service_tier": null, - "system_fingerprint": "fp_ollama", - "usage": null - } - }, - { - "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", - "__data__": { - "id": "chatcmpl-458", - "choices": [ - { - "delta": { - "content": " many", - "function_call": null, - "refusal": null, - "role": "assistant", - "tool_calls": null - }, - "finish_reason": null, - "index": 0, - "logprobs": null - } - ], - "created": 1754081846, - "model": "llama3.2:3b-instruct-fp16", - "object": "chat.completion.chunk", - "service_tier": null, - "system_fingerprint": "fp_ollama", - "usage": null - } - }, - { - "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", - "__data__": { - "id": "chatcmpl-458", - "choices": [ - { - "delta": { - "content": " languages", - "function_call": null, - "refusal": null, - "role": "assistant", - "tool_calls": null - }, - "finish_reason": null, - "index": 0, - "logprobs": null - } - ], - "created": 1754081846, - "model": "llama3.2:3b-instruct-fp16", - "object": "chat.completion.chunk", - "service_tier": null, - "system_fingerprint": "fp_ollama", - "usage": null - } - }, - { - "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", - "__data__": { - "id": "chatcmpl-458", + "id": "chatcmpl-792", "choices": [ { "delta": { @@ -712,7 +244,7 @@ "logprobs": null } ], - "created": 1754081846, + "created": 1756921356, "model": "llama3.2:3b-instruct-fp16", "object": "chat.completion.chunk", "service_tier": null, @@ -723,7 +255,7 @@ { "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", "__data__": { - "id": "chatcmpl-458", + "id": "chatcmpl-792", "choices": [ { "delta": { @@ -738,7 +270,7 @@ "logprobs": null } ], - "created": 1754081846, + "created": 1756921356, "model": "llama3.2:3b-instruct-fp16", "object": "chat.completion.chunk", "service_tier": null, @@ -749,11 +281,11 @@ { "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", "__data__": { - "id": "chatcmpl-458", + "id": "chatcmpl-792", "choices": [ { "delta": { - "content": " scientific", + "content": " ancient", "function_call": null, "refusal": null, "role": "assistant", @@ -764,7 +296,7 @@ "logprobs": null } ], - "created": 1754081846, + "created": 1756921356, "model": "llama3.2:3b-instruct-fp16", "object": "chat.completion.chunk", "service_tier": null, @@ -775,11 +307,11 @@ { "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", "__data__": { - "id": "chatcmpl-458", + "id": "chatcmpl-792", "choices": [ { "delta": { - "content": " contexts", + "content": " Roman", "function_call": null, "refusal": null, "role": "assistant", @@ -790,7 +322,7 @@ "logprobs": null } ], - "created": 1754081846, + "created": 1756921356, "model": "llama3.2:3b-instruct-fp16", "object": "chat.completion.chunk", "service_tier": null, @@ -801,7 +333,33 @@ { "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", "__data__": { - "id": "chatcmpl-458", + "id": "chatcmpl-792", + "choices": [ + { + "delta": { + "content": " mythology", + "function_call": null, + "refusal": null, + "role": "assistant", + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null + } + ], + "created": 1756921356, + "model": "llama3.2:3b-instruct-fp16", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": "fp_ollama", + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "chatcmpl-792", "choices": [ { "delta": { @@ -816,7 +374,7 @@ "logprobs": null } ], - "created": 1754081846, + "created": 1756921356, "model": "llama3.2:3b-instruct-fp16", "object": "chat.completion.chunk", "service_tier": null, @@ -827,11 +385,11 @@ { "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", "__data__": { - "id": "chatcmpl-458", + "id": "chatcmpl-792", "choices": [ { "delta": { - "content": " the", + "content": " Sol", "function_call": null, "refusal": null, "role": "assistant", @@ -842,7 +400,7 @@ "logprobs": null } ], - "created": 1754081846, + "created": 1756921356, "model": "llama3.2:3b-instruct-fp16", "object": "chat.completion.chunk", "service_tier": null, @@ -853,11 +411,11 @@ { "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", "__data__": { - "id": "chatcmpl-458", + "id": "chatcmpl-792", "choices": [ { "delta": { - "content": " official", + "content": " was", "function_call": null, "refusal": null, "role": "assistant", @@ -868,7 +426,7 @@ "logprobs": null } ], - "created": 1754081847, + "created": 1756921356, "model": "llama3.2:3b-instruct-fp16", "object": "chat.completion.chunk", "service_tier": null, @@ -879,579 +437,7 @@ { "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", "__data__": { - "id": "chatcmpl-458", - "choices": [ - { - "delta": { - "content": " name", - "function_call": null, - "refusal": null, - "role": "assistant", - "tool_calls": null - }, - "finish_reason": null, - "index": 0, - "logprobs": null - } - ], - "created": 1754081847, - "model": "llama3.2:3b-instruct-fp16", - "object": "chat.completion.chunk", - "service_tier": null, - "system_fingerprint": "fp_ollama", - "usage": null - } - }, - { - "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", - "__data__": { - "id": "chatcmpl-458", - "choices": [ - { - "delta": { - "content": " for", - "function_call": null, - "refusal": null, - "role": "assistant", - "tool_calls": null - }, - "finish_reason": null, - "index": 0, - "logprobs": null - } - ], - "created": 1754081847, - "model": "llama3.2:3b-instruct-fp16", - "object": "chat.completion.chunk", - "service_tier": null, - "system_fingerprint": "fp_ollama", - "usage": null - } - }, - { - "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", - "__data__": { - "id": "chatcmpl-458", - "choices": [ - { - "delta": { - "content": " the", - "function_call": null, - "refusal": null, - "role": "assistant", - "tool_calls": null - }, - "finish_reason": null, - "index": 0, - "logprobs": null - } - ], - "created": 1754081847, - "model": "llama3.2:3b-instruct-fp16", - "object": "chat.completion.chunk", - "service_tier": null, - "system_fingerprint": "fp_ollama", - "usage": null - } - }, - { - "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", - "__data__": { - "id": "chatcmpl-458", - "choices": [ - { - "delta": { - "content": " star", - "function_call": null, - "refusal": null, - "role": "assistant", - "tool_calls": null - }, - "finish_reason": null, - "index": 0, - "logprobs": null - } - ], - "created": 1754081847, - "model": "llama3.2:3b-instruct-fp16", - "object": "chat.completion.chunk", - "service_tier": null, - "system_fingerprint": "fp_ollama", - "usage": null - } - }, - { - "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", - "__data__": { - "id": "chatcmpl-458", - "choices": [ - { - "delta": { - "content": " at", - "function_call": null, - "refusal": null, - "role": "assistant", - "tool_calls": null - }, - "finish_reason": null, - "index": 0, - "logprobs": null - } - ], - "created": 1754081847, - "model": "llama3.2:3b-instruct-fp16", - "object": "chat.completion.chunk", - "service_tier": null, - "system_fingerprint": "fp_ollama", - "usage": null - } - }, - { - "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", - "__data__": { - "id": "chatcmpl-458", - "choices": [ - { - "delta": { - "content": " the", - "function_call": null, - "refusal": null, - "role": "assistant", - "tool_calls": null - }, - "finish_reason": null, - "index": 0, - "logprobs": null - } - ], - "created": 1754081847, - "model": "llama3.2:3b-instruct-fp16", - "object": "chat.completion.chunk", - "service_tier": null, - "system_fingerprint": "fp_ollama", - "usage": null - } - }, - { - "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", - "__data__": { - "id": "chatcmpl-458", - "choices": [ - { - "delta": { - "content": " center", - "function_call": null, - "refusal": null, - "role": "assistant", - "tool_calls": null - }, - "finish_reason": null, - "index": 0, - "logprobs": null - } - ], - "created": 1754081847, - "model": "llama3.2:3b-instruct-fp16", - "object": "chat.completion.chunk", - "service_tier": null, - "system_fingerprint": "fp_ollama", - "usage": null - } - }, - { - "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", - "__data__": { - "id": "chatcmpl-458", - "choices": [ - { - "delta": { - "content": " of", - "function_call": null, - "refusal": null, - "role": "assistant", - "tool_calls": null - }, - "finish_reason": null, - "index": 0, - "logprobs": null - } - ], - "created": 1754081847, - "model": "llama3.2:3b-instruct-fp16", - "object": "chat.completion.chunk", - "service_tier": null, - "system_fingerprint": "fp_ollama", - "usage": null - } - }, - { - "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", - "__data__": { - "id": "chatcmpl-458", - "choices": [ - { - "delta": { - "content": " our", - "function_call": null, - "refusal": null, - "role": "assistant", - "tool_calls": null - }, - "finish_reason": null, - "index": 0, - "logprobs": null - } - ], - "created": 1754081847, - "model": "llama3.2:3b-instruct-fp16", - "object": "chat.completion.chunk", - "service_tier": null, - "system_fingerprint": "fp_ollama", - "usage": null - } - }, - { - "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", - "__data__": { - "id": "chatcmpl-458", - "choices": [ - { - "delta": { - "content": " solar", - "function_call": null, - "refusal": null, - "role": "assistant", - "tool_calls": null - }, - "finish_reason": null, - "index": 0, - "logprobs": null - } - ], - "created": 1754081847, - "model": "llama3.2:3b-instruct-fp16", - "object": "chat.completion.chunk", - "service_tier": null, - "system_fingerprint": "fp_ollama", - "usage": null - } - }, - { - "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", - "__data__": { - "id": "chatcmpl-458", - "choices": [ - { - "delta": { - "content": " system", - "function_call": null, - "refusal": null, - "role": "assistant", - "tool_calls": null - }, - "finish_reason": null, - "index": 0, - "logprobs": null - } - ], - "created": 1754081847, - "model": "llama3.2:3b-instruct-fp16", - "object": "chat.completion.chunk", - "service_tier": null, - "system_fingerprint": "fp_ollama", - "usage": null - } - }, - { - "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", - "__data__": { - "id": "chatcmpl-458", - "choices": [ - { - "delta": { - "content": " is", - "function_call": null, - "refusal": null, - "role": "assistant", - "tool_calls": null - }, - "finish_reason": null, - "index": 0, - "logprobs": null - } - ], - "created": 1754081847, - "model": "llama3.2:3b-instruct-fp16", - "object": "chat.completion.chunk", - "service_tier": null, - "system_fingerprint": "fp_ollama", - "usage": null - } - }, - { - "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", - "__data__": { - "id": "chatcmpl-458", - "choices": [ - { - "delta": { - "content": " simply", - "function_call": null, - "refusal": null, - "role": "assistant", - "tool_calls": null - }, - "finish_reason": null, - "index": 0, - "logprobs": null - } - ], - "created": 1754081847, - "model": "llama3.2:3b-instruct-fp16", - "object": "chat.completion.chunk", - "service_tier": null, - "system_fingerprint": "fp_ollama", - "usage": null - } - }, - { - "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", - "__data__": { - "id": "chatcmpl-458", - "choices": [ - { - "delta": { - "content": " \"", - "function_call": null, - "refusal": null, - "role": "assistant", - "tool_calls": null - }, - "finish_reason": null, - "index": 0, - "logprobs": null - } - ], - "created": 1754081847, - "model": "llama3.2:3b-instruct-fp16", - "object": "chat.completion.chunk", - "service_tier": null, - "system_fingerprint": "fp_ollama", - "usage": null - } - }, - { - "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", - "__data__": { - "id": "chatcmpl-458", - "choices": [ - { - "delta": { - "content": "the", - "function_call": null, - "refusal": null, - "role": "assistant", - "tool_calls": null - }, - "finish_reason": null, - "index": 0, - "logprobs": null - } - ], - "created": 1754081847, - "model": "llama3.2:3b-instruct-fp16", - "object": "chat.completion.chunk", - "service_tier": null, - "system_fingerprint": "fp_ollama", - "usage": null - } - }, - { - "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", - "__data__": { - "id": "chatcmpl-458", - "choices": [ - { - "delta": { - "content": " Sun", - "function_call": null, - "refusal": null, - "role": "assistant", - "tool_calls": null - }, - "finish_reason": null, - "index": 0, - "logprobs": null - } - ], - "created": 1754081847, - "model": "llama3.2:3b-instruct-fp16", - "object": "chat.completion.chunk", - "service_tier": null, - "system_fingerprint": "fp_ollama", - "usage": null - } - }, - { - "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", - "__data__": { - "id": "chatcmpl-458", - "choices": [ - { - "delta": { - "content": ",\"", - "function_call": null, - "refusal": null, - "role": "assistant", - "tool_calls": null - }, - "finish_reason": null, - "index": 0, - "logprobs": null - } - ], - "created": 1754081847, - "model": "llama3.2:3b-instruct-fp16", - "object": "chat.completion.chunk", - "service_tier": null, - "system_fingerprint": "fp_ollama", - "usage": null - } - }, - { - "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", - "__data__": { - "id": "chatcmpl-458", - "choices": [ - { - "delta": { - "content": " but", - "function_call": null, - "refusal": null, - "role": "assistant", - "tool_calls": null - }, - "finish_reason": null, - "index": 0, - "logprobs": null - } - ], - "created": 1754081847, - "model": "llama3.2:3b-instruct-fp16", - "object": "chat.completion.chunk", - "service_tier": null, - "system_fingerprint": "fp_ollama", - "usage": null - } - }, - { - "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", - "__data__": { - "id": "chatcmpl-458", - "choices": [ - { - "delta": { - "content": " \"", - "function_call": null, - "refusal": null, - "role": "assistant", - "tool_calls": null - }, - "finish_reason": null, - "index": 0, - "logprobs": null - } - ], - "created": 1754081847, - "model": "llama3.2:3b-instruct-fp16", - "object": "chat.completion.chunk", - "service_tier": null, - "system_fingerprint": "fp_ollama", - "usage": null - } - }, - { - "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", - "__data__": { - "id": "chatcmpl-458", - "choices": [ - { - "delta": { - "content": "Sol", - "function_call": null, - "refusal": null, - "role": "assistant", - "tool_calls": null - }, - "finish_reason": null, - "index": 0, - "logprobs": null - } - ], - "created": 1754081847, - "model": "llama3.2:3b-instruct-fp16", - "object": "chat.completion.chunk", - "service_tier": null, - "system_fingerprint": "fp_ollama", - "usage": null - } - }, - { - "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", - "__data__": { - "id": "chatcmpl-458", - "choices": [ - { - "delta": { - "content": "\"", - "function_call": null, - "refusal": null, - "role": "assistant", - "tool_calls": null - }, - "finish_reason": null, - "index": 0, - "logprobs": null - } - ], - "created": 1754081847, - "model": "llama3.2:3b-instruct-fp16", - "object": "chat.completion.chunk", - "service_tier": null, - "system_fingerprint": "fp_ollama", - "usage": null - } - }, - { - "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", - "__data__": { - "id": "chatcmpl-458", - "choices": [ - { - "delta": { - "content": " remains", - "function_call": null, - "refusal": null, - "role": "assistant", - "tool_calls": null - }, - "finish_reason": null, - "index": 0, - "logprobs": null - } - ], - "created": 1754081848, - "model": "llama3.2:3b-instruct-fp16", - "object": "chat.completion.chunk", - "service_tier": null, - "system_fingerprint": "fp_ollama", - "usage": null - } - }, - { - "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", - "__data__": { - "id": "chatcmpl-458", + "id": "chatcmpl-792", "choices": [ { "delta": { @@ -1466,7 +452,7 @@ "logprobs": null } ], - "created": 1754081848, + "created": 1756921356, "model": "llama3.2:3b-instruct-fp16", "object": "chat.completion.chunk", "service_tier": null, @@ -1477,11 +463,11 @@ { "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", "__data__": { - "id": "chatcmpl-458", + "id": "chatcmpl-792", "choices": [ { "delta": { - "content": " commonly", + "content": " god", "function_call": null, "refusal": null, "role": "assistant", @@ -1492,7 +478,7 @@ "logprobs": null } ], - "created": 1754081848, + "created": 1756921356, "model": "llama3.2:3b-instruct-fp16", "object": "chat.completion.chunk", "service_tier": null, @@ -1503,11 +489,11 @@ { "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", "__data__": { - "id": "chatcmpl-458", + "id": "chatcmpl-792", "choices": [ { "delta": { - "content": " used", + "content": " equivalent", "function_call": null, "refusal": null, "role": "assistant", @@ -1518,7 +504,7 @@ "logprobs": null } ], - "created": 1754081848, + "created": 1756921356, "model": "llama3.2:3b-instruct-fp16", "object": "chat.completion.chunk", "service_tier": null, @@ -1529,11 +515,11 @@ { "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", "__data__": { - "id": "chatcmpl-458", + "id": "chatcmpl-792", "choices": [ { "delta": { - "content": " term", + "content": " to", "function_call": null, "refusal": null, "role": "assistant", @@ -1544,7 +530,7 @@ "logprobs": null } ], - "created": 1754081848, + "created": 1756921356, "model": "llama3.2:3b-instruct-fp16", "object": "chat.completion.chunk", "service_tier": null, @@ -1555,11 +541,11 @@ { "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", "__data__": { - "id": "chatcmpl-458", + "id": "chatcmpl-792", "choices": [ { "delta": { - "content": " in", + "content": " the", "function_call": null, "refusal": null, "role": "assistant", @@ -1570,7 +556,7 @@ "logprobs": null } ], - "created": 1754081848, + "created": 1756921356, "model": "llama3.2:3b-instruct-fp16", "object": "chat.completion.chunk", "service_tier": null, @@ -1581,11 +567,11 @@ { "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", "__data__": { - "id": "chatcmpl-458", + "id": "chatcmpl-792", "choices": [ { "delta": { - "content": " astronomy", + "content": " Greek", "function_call": null, "refusal": null, "role": "assistant", @@ -1596,7 +582,7 @@ "logprobs": null } ], - "created": 1754081848, + "created": 1756921356, "model": "llama3.2:3b-instruct-fp16", "object": "chat.completion.chunk", "service_tier": null, @@ -1607,7 +593,111 @@ { "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", "__data__": { - "id": "chatcmpl-458", + "id": "chatcmpl-792", + "choices": [ + { + "delta": { + "content": " god", + "function_call": null, + "refusal": null, + "role": "assistant", + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null + } + ], + "created": 1756921356, + "model": "llama3.2:3b-instruct-fp16", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": "fp_ollama", + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "chatcmpl-792", + "choices": [ + { + "delta": { + "content": " Hel", + "function_call": null, + "refusal": null, + "role": "assistant", + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null + } + ], + "created": 1756921356, + "model": "llama3.2:3b-instruct-fp16", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": "fp_ollama", + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "chatcmpl-792", + "choices": [ + { + "delta": { + "content": "ios", + "function_call": null, + "refusal": null, + "role": "assistant", + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null + } + ], + "created": 1756921357, + "model": "llama3.2:3b-instruct-fp16", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": "fp_ollama", + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "chatcmpl-792", + "choices": [ + { + "delta": { + "content": ",", + "function_call": null, + "refusal": null, + "role": "assistant", + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null + } + ], + "created": 1756921357, + "model": "llama3.2:3b-instruct-fp16", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": "fp_ollama", + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "chatcmpl-792", "choices": [ { "delta": { @@ -1622,7 +712,7 @@ "logprobs": null } ], - "created": 1754081848, + "created": 1756921357, "model": "llama3.2:3b-instruct-fp16", "object": "chat.completion.chunk", "service_tier": null, @@ -1633,11 +723,11 @@ { "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", "__data__": { - "id": "chatcmpl-458", + "id": "chatcmpl-792", "choices": [ { "delta": { - "content": " classical", + "content": " he", "function_call": null, "refusal": null, "role": "assistant", @@ -1648,7 +738,7 @@ "logprobs": null } ], - "created": 1754081848, + "created": 1756921357, "model": "llama3.2:3b-instruct-fp16", "object": "chat.completion.chunk", "service_tier": null, @@ -1659,11 +749,11 @@ { "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", "__data__": { - "id": "chatcmpl-458", + "id": "chatcmpl-792", "choices": [ { "delta": { - "content": " studies", + "content": " was", "function_call": null, "refusal": null, "role": "assistant", @@ -1674,7 +764,7 @@ "logprobs": null } ], - "created": 1754081848, + "created": 1756921357, "model": "llama3.2:3b-instruct-fp16", "object": "chat.completion.chunk", "service_tier": null, @@ -1685,7 +775,371 @@ { "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", "__data__": { - "id": "chatcmpl-458", + "id": "chatcmpl-792", + "choices": [ + { + "delta": { + "content": " often", + "function_call": null, + "refusal": null, + "role": "assistant", + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null + } + ], + "created": 1756921357, + "model": "llama3.2:3b-instruct-fp16", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": "fp_ollama", + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "chatcmpl-792", + "choices": [ + { + "delta": { + "content": " depicted", + "function_call": null, + "refusal": null, + "role": "assistant", + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null + } + ], + "created": 1756921357, + "model": "llama3.2:3b-instruct-fp16", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": "fp_ollama", + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "chatcmpl-792", + "choices": [ + { + "delta": { + "content": " as", + "function_call": null, + "refusal": null, + "role": "assistant", + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null + } + ], + "created": 1756921357, + "model": "llama3.2:3b-instruct-fp16", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": "fp_ollama", + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "chatcmpl-792", + "choices": [ + { + "delta": { + "content": " a", + "function_call": null, + "refusal": null, + "role": "assistant", + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null + } + ], + "created": 1756921357, + "model": "llama3.2:3b-instruct-fp16", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": "fp_ollama", + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "chatcmpl-792", + "choices": [ + { + "delta": { + "content": " radi", + "function_call": null, + "refusal": null, + "role": "assistant", + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null + } + ], + "created": 1756921357, + "model": "llama3.2:3b-instruct-fp16", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": "fp_ollama", + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "chatcmpl-792", + "choices": [ + { + "delta": { + "content": "ating", + "function_call": null, + "refusal": null, + "role": "assistant", + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null + } + ], + "created": 1756921357, + "model": "llama3.2:3b-instruct-fp16", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": "fp_ollama", + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "chatcmpl-792", + "choices": [ + { + "delta": { + "content": " sun", + "function_call": null, + "refusal": null, + "role": "assistant", + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null + } + ], + "created": 1756921357, + "model": "llama3.2:3b-instruct-fp16", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": "fp_ollama", + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "chatcmpl-792", + "choices": [ + { + "delta": { + "content": " with", + "function_call": null, + "refusal": null, + "role": "assistant", + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null + } + ], + "created": 1756921357, + "model": "llama3.2:3b-instruct-fp16", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": "fp_ollama", + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "chatcmpl-792", + "choices": [ + { + "delta": { + "content": " rays", + "function_call": null, + "refusal": null, + "role": "assistant", + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null + } + ], + "created": 1756921357, + "model": "llama3.2:3b-instruct-fp16", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": "fp_ollama", + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "chatcmpl-792", + "choices": [ + { + "delta": { + "content": " eman", + "function_call": null, + "refusal": null, + "role": "assistant", + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null + } + ], + "created": 1756921357, + "model": "llama3.2:3b-instruct-fp16", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": "fp_ollama", + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "chatcmpl-792", + "choices": [ + { + "delta": { + "content": "ating", + "function_call": null, + "refusal": null, + "role": "assistant", + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null + } + ], + "created": 1756921357, + "model": "llama3.2:3b-instruct-fp16", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": "fp_ollama", + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "chatcmpl-792", + "choices": [ + { + "delta": { + "content": " from", + "function_call": null, + "refusal": null, + "role": "assistant", + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null + } + ], + "created": 1756921357, + "model": "llama3.2:3b-instruct-fp16", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": "fp_ollama", + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "chatcmpl-792", + "choices": [ + { + "delta": { + "content": " his", + "function_call": null, + "refusal": null, + "role": "assistant", + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null + } + ], + "created": 1756921357, + "model": "llama3.2:3b-instruct-fp16", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": "fp_ollama", + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "chatcmpl-792", + "choices": [ + { + "delta": { + "content": " body", + "function_call": null, + "refusal": null, + "role": "assistant", + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null + } + ], + "created": 1756921357, + "model": "llama3.2:3b-instruct-fp16", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": "fp_ollama", + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "chatcmpl-792", "choices": [ { "delta": { @@ -1700,7 +1154,7 @@ "logprobs": null } ], - "created": 1754081848, + "created": 1756921357, "model": "llama3.2:3b-instruct-fp16", "object": "chat.completion.chunk", "service_tier": null, @@ -1711,7 +1165,709 @@ { "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", "__data__": { - "id": "chatcmpl-458", + "id": "chatcmpl-792", + "choices": [ + { + "delta": { + "content": " The", + "function_call": null, + "refusal": null, + "role": "assistant", + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null + } + ], + "created": 1756921357, + "model": "llama3.2:3b-instruct-fp16", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": "fp_ollama", + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "chatcmpl-792", + "choices": [ + { + "delta": { + "content": " term", + "function_call": null, + "refusal": null, + "role": "assistant", + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null + } + ], + "created": 1756921357, + "model": "llama3.2:3b-instruct-fp16", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": "fp_ollama", + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "chatcmpl-792", + "choices": [ + { + "delta": { + "content": " \"", + "function_call": null, + "refusal": null, + "role": "assistant", + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null + } + ], + "created": 1756921357, + "model": "llama3.2:3b-instruct-fp16", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": "fp_ollama", + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "chatcmpl-792", + "choices": [ + { + "delta": { + "content": "s", + "function_call": null, + "refusal": null, + "role": "assistant", + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null + } + ], + "created": 1756921357, + "model": "llama3.2:3b-instruct-fp16", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": "fp_ollama", + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "chatcmpl-792", + "choices": [ + { + "delta": { + "content": "olar", + "function_call": null, + "refusal": null, + "role": "assistant", + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null + } + ], + "created": 1756921357, + "model": "llama3.2:3b-instruct-fp16", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": "fp_ollama", + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "chatcmpl-792", + "choices": [ + { + "delta": { + "content": "\"", + "function_call": null, + "refusal": null, + "role": "assistant", + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null + } + ], + "created": 1756921358, + "model": "llama3.2:3b-instruct-fp16", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": "fp_ollama", + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "chatcmpl-792", + "choices": [ + { + "delta": { + "content": " is", + "function_call": null, + "refusal": null, + "role": "assistant", + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null + } + ], + "created": 1756921358, + "model": "llama3.2:3b-instruct-fp16", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": "fp_ollama", + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "chatcmpl-792", + "choices": [ + { + "delta": { + "content": " still", + "function_call": null, + "refusal": null, + "role": "assistant", + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null + } + ], + "created": 1756921358, + "model": "llama3.2:3b-instruct-fp16", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": "fp_ollama", + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "chatcmpl-792", + "choices": [ + { + "delta": { + "content": " used", + "function_call": null, + "refusal": null, + "role": "assistant", + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null + } + ], + "created": 1756921358, + "model": "llama3.2:3b-instruct-fp16", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": "fp_ollama", + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "chatcmpl-792", + "choices": [ + { + "delta": { + "content": " in", + "function_call": null, + "refusal": null, + "role": "assistant", + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null + } + ], + "created": 1756921358, + "model": "llama3.2:3b-instruct-fp16", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": "fp_ollama", + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "chatcmpl-792", + "choices": [ + { + "delta": { + "content": " scientific", + "function_call": null, + "refusal": null, + "role": "assistant", + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null + } + ], + "created": 1756921358, + "model": "llama3.2:3b-instruct-fp16", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": "fp_ollama", + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "chatcmpl-792", + "choices": [ + { + "delta": { + "content": " and", + "function_call": null, + "refusal": null, + "role": "assistant", + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null + } + ], + "created": 1756921358, + "model": "llama3.2:3b-instruct-fp16", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": "fp_ollama", + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "chatcmpl-792", + "choices": [ + { + "delta": { + "content": " astronomical", + "function_call": null, + "refusal": null, + "role": "assistant", + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null + } + ], + "created": 1756921358, + "model": "llama3.2:3b-instruct-fp16", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": "fp_ollama", + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "chatcmpl-792", + "choices": [ + { + "delta": { + "content": " contexts", + "function_call": null, + "refusal": null, + "role": "assistant", + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null + } + ], + "created": 1756921358, + "model": "llama3.2:3b-instruct-fp16", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": "fp_ollama", + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "chatcmpl-792", + "choices": [ + { + "delta": { + "content": " to", + "function_call": null, + "refusal": null, + "role": "assistant", + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null + } + ], + "created": 1756921358, + "model": "llama3.2:3b-instruct-fp16", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": "fp_ollama", + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "chatcmpl-792", + "choices": [ + { + "delta": { + "content": " refer", + "function_call": null, + "refusal": null, + "role": "assistant", + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null + } + ], + "created": 1756921358, + "model": "llama3.2:3b-instruct-fp16", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": "fp_ollama", + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "chatcmpl-792", + "choices": [ + { + "delta": { + "content": " to", + "function_call": null, + "refusal": null, + "role": "assistant", + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null + } + ], + "created": 1756921358, + "model": "llama3.2:3b-instruct-fp16", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": "fp_ollama", + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "chatcmpl-792", + "choices": [ + { + "delta": { + "content": " phenomena", + "function_call": null, + "refusal": null, + "role": "assistant", + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null + } + ], + "created": 1756921358, + "model": "llama3.2:3b-instruct-fp16", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": "fp_ollama", + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "chatcmpl-792", + "choices": [ + { + "delta": { + "content": " related", + "function_call": null, + "refusal": null, + "role": "assistant", + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null + } + ], + "created": 1756921358, + "model": "llama3.2:3b-instruct-fp16", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": "fp_ollama", + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "chatcmpl-792", + "choices": [ + { + "delta": { + "content": " to", + "function_call": null, + "refusal": null, + "role": "assistant", + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null + } + ], + "created": 1756921358, + "model": "llama3.2:3b-instruct-fp16", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": "fp_ollama", + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "chatcmpl-792", + "choices": [ + { + "delta": { + "content": " the", + "function_call": null, + "refusal": null, + "role": "assistant", + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null + } + ], + "created": 1756921358, + "model": "llama3.2:3b-instruct-fp16", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": "fp_ollama", + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "chatcmpl-792", + "choices": [ + { + "delta": { + "content": " Sun", + "function_call": null, + "refusal": null, + "role": "assistant", + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null + } + ], + "created": 1756921358, + "model": "llama3.2:3b-instruct-fp16", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": "fp_ollama", + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "chatcmpl-792", + "choices": [ + { + "delta": { + "content": " or", + "function_call": null, + "refusal": null, + "role": "assistant", + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null + } + ], + "created": 1756921358, + "model": "llama3.2:3b-instruct-fp16", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": "fp_ollama", + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "chatcmpl-792", + "choices": [ + { + "delta": { + "content": " the", + "function_call": null, + "refusal": null, + "role": "assistant", + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null + } + ], + "created": 1756921358, + "model": "llama3.2:3b-instruct-fp16", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": "fp_ollama", + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "chatcmpl-792", + "choices": [ + { + "delta": { + "content": " solar", + "function_call": null, + "refusal": null, + "role": "assistant", + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null + } + ], + "created": 1756921358, + "model": "llama3.2:3b-instruct-fp16", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": "fp_ollama", + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "chatcmpl-792", + "choices": [ + { + "delta": { + "content": " system", + "function_call": null, + "refusal": null, + "role": "assistant", + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null + } + ], + "created": 1756921358, + "model": "llama3.2:3b-instruct-fp16", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": "fp_ollama", + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "chatcmpl-792", + "choices": [ + { + "delta": { + "content": ".", + "function_call": null, + "refusal": null, + "role": "assistant", + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null + } + ], + "created": 1756921358, + "model": "llama3.2:3b-instruct-fp16", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": "fp_ollama", + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "chatcmpl-792", "choices": [ { "delta": { @@ -1726,7 +1882,7 @@ "logprobs": null } ], - "created": 1754081848, + "created": 1756921358, "model": "llama3.2:3b-instruct-fp16", "object": "chat.completion.chunk", "service_tier": null, diff --git a/tests/integration/recordings/responses/a4c8d19bb1eb.json b/tests/integration/recordings/responses/a4c8d19bb1eb.json index a3aba2bff..89f52f82e 100644 --- a/tests/integration/recordings/responses/a4c8d19bb1eb.json +++ b/tests/integration/recordings/responses/a4c8d19bb1eb.json @@ -1,7 +1,7 @@ { "request": { "method": "POST", - "url": "http://localhost:11434/v1/v1/chat/completions", + "url": "http://0.0.0.0:11434/v1/v1/chat/completions", "headers": {}, "body": { "model": "llama3.2:3b-instruct-fp16", @@ -20,14 +20,14 @@ "body": { "__type__": "openai.types.chat.chat_completion.ChatCompletion", "__data__": { - "id": "chatcmpl-560", + "id": "chatcmpl-715", "choices": [ { "finish_reason": "stop", "index": 0, "logprobs": null, "message": { - "content": "Hello! It's nice to meet you. How can I assist you today?", + "content": "Hello! It's nice to meet you. Is there something I can help you with or would you like to chat?", "refusal": null, "role": "assistant", "annotations": null, @@ -37,15 +37,15 @@ } } ], - "created": 1754081856, + "created": 1756921367, "model": "llama3.2:3b-instruct-fp16", "object": "chat.completion", "service_tier": null, "system_fingerprint": "fp_ollama", "usage": { - "completion_tokens": 17, + "completion_tokens": 25, "prompt_tokens": 29, - "total_tokens": 46, + "total_tokens": 54, "completion_tokens_details": null, "prompt_tokens_details": null } diff --git a/tests/integration/recordings/responses/a5187d9d5057.json b/tests/integration/recordings/responses/a5187d9d5057.json index 0dedba066..edacd5fa6 100644 --- a/tests/integration/recordings/responses/a5187d9d5057.json +++ b/tests/integration/recordings/responses/a5187d9d5057.json @@ -1,7 +1,7 @@ { "request": { "method": "POST", - "url": "http://localhost:11434/v1/v1/chat/completions", + "url": "http://0.0.0.0:11434/v1/v1/chat/completions", "headers": {}, "body": { "model": "llama3.2:3b-instruct-fp16", @@ -20,14 +20,14 @@ "body": { "__type__": "openai.types.chat.chat_completion.ChatCompletion", "__data__": { - "id": "chatcmpl-64", + "id": "chatcmpl-376", "choices": [ { "finish_reason": "stop", "index": 0, "logprobs": null, "message": { - "content": "You want to test the capabilities of the OpenAI Text-to-Text model (also known as T0).\n\nPlease note that I'll be using a pre-trained model, so my responses might not be entirely customized to your specific prompt or context. That being said, I'll do my best to mimic the behavior of the original model.\n\nWhat would you like to test or ask? Please provide a prompt or question, and I'll respond accordingly.\n\n(Note: if you'd like to run a longer experiment or try out specific models like text completion or code generation, feel free to let me know and we can figure out a way to collaborate.)", + "content": "I'll simulate a test for the LA-1030/5B linear accelerator, specifically for the H8 (High Voltage) model found in early models of the test rail. Note that this is not meant to be taken as actual test results but rather a demonstration.\n\n### Introduction:\nThe LA-1030/5B was used primarily for high-energy physics and nuclear research during the 1970s and 1980s. This linear accelerator was capable of producing proton beams with energies up to several GeV. The H8 model, also known as the 'High Voltage' component, is a series of power supplies that drive the high voltage DC (HV) accelerators.\n\n### Test Setup:\n\n- **Test Goal:** Measure the output of the LA-1030/5B H8 model linear accelerator and assess its ability to generate stable, high-voltage direct current (HVDC) to power it properly.\n \n - The setup consists of a single test rail containing one of these H8 modules. A precise DC voltage is supplied to the linear accelerator via an external DC source.\n\n### Operating Parameters:\n\n- **Input Voltage:** To ensure the linear accelerator operates within its safe operating parameters, input voltages will be varied from 20KV to 140KV.\n- **Current Delivery:** Monitoring current at these different output levels requires a precise multimeter or oscilloscope. \n- **Voltage Level and Current Stability:** The voltage should stabilize as close as possible to the desired output level.\n\n### Potential Issues\n\n1.) Over-Pressure in H8 Modules\n - During high voltage levels, there's a risk of over-pressurization in the component casing due to the vacuum properties within the modules.\n - Check for any external signs of stress or leakage.\n2.) Current Limitation and Arcing\n - High current requirements demand close monitoring of the accelerator components and associated connections.\n - An excessive arc can be detrimental to electronics connected to the system.\n3.) Interlocks and Safe Guards\n\n- **Ensure alignment:** Prevent accidental triggering.\n\n4.) Insulation integrity \n - Potential risks from faulty or non-insulated components\n\n### Results Analysis:\n\nBased on this hypothetical test, some potential results could include:\n1. Output voltage stability for the chosen input voltages\n2. Ability to exceed the accelerator's highest voltage ratings.\n3. Consistency between different current levels at various output voltage tests.\n\nThis exercise is a general simulation and might not reflect real-world conditions or performance specifications of an actual LA-1030/5B linear accelerator. The focus here was on demonstrating how one could analyze data from such a system, given typical components involved in linear accelerators at that time period.", "refusal": null, "role": "assistant", "annotations": null, @@ -37,15 +37,15 @@ } } ], - "created": 1754510052, + "created": 1756921225, "model": "llama3.2:3b-instruct-fp16", "object": "chat.completion", "service_tier": null, "system_fingerprint": "fp_ollama", "usage": { - "completion_tokens": 129, + "completion_tokens": 547, "prompt_tokens": 31, - "total_tokens": 160, + "total_tokens": 578, "completion_tokens_details": null, "prompt_tokens_details": null } diff --git a/tests/integration/recordings/responses/a59d0d7c1485.json b/tests/integration/recordings/responses/a59d0d7c1485.json index 80e2462d5..c951596ce 100644 --- a/tests/integration/recordings/responses/a59d0d7c1485.json +++ b/tests/integration/recordings/responses/a59d0d7c1485.json @@ -20,15 +20,15 @@ "__type__": "ollama._types.GenerateResponse", "__data__": { "model": "llama-guard3:1b", - "created_at": "2025-08-01T23:14:23.46316Z", + "created_at": "2025-09-03T17:38:04.367295Z", "done": true, "done_reason": "stop", - "total_duration": 270313833, - "load_duration": 71668791, + "total_duration": 276503250, + "load_duration": 125852000, "prompt_eval_count": 238, - "prompt_eval_duration": 169000000, + "prompt_eval_duration": 138575125, "eval_count": 2, - "eval_duration": 25000000, + "eval_duration": 11277208, "response": "safe", "thinking": null, "context": null diff --git a/tests/integration/recordings/responses/a6810c23eda8.json b/tests/integration/recordings/responses/a6810c23eda8.json index 6d9747d28..d5b5c5a6d 100644 --- a/tests/integration/recordings/responses/a6810c23eda8.json +++ b/tests/integration/recordings/responses/a6810c23eda8.json @@ -23,7 +23,7 @@ "__type__": "ollama._types.GenerateResponse", "__data__": { "model": "llama3.2:3b-instruct-fp16", - "created_at": "2025-08-04T22:55:05.992185Z", + "created_at": "2025-09-03T17:36:13.985194Z", "done": false, "done_reason": null, "total_duration": null, @@ -41,7 +41,7 @@ "__type__": "ollama._types.GenerateResponse", "__data__": { "model": "llama3.2:3b-instruct-fp16", - "created_at": "2025-08-04T22:55:06.047726Z", + "created_at": "2025-09-03T17:36:14.027686Z", "done": false, "done_reason": null, "total_duration": null, @@ -59,7 +59,7 @@ "__type__": "ollama._types.GenerateResponse", "__data__": { "model": "llama3.2:3b-instruct-fp16", - "created_at": "2025-08-04T22:55:06.123375Z", + "created_at": "2025-09-03T17:36:14.068694Z", "done": false, "done_reason": null, "total_duration": null, @@ -77,7 +77,7 @@ "__type__": "ollama._types.GenerateResponse", "__data__": { "model": "llama3.2:3b-instruct-fp16", - "created_at": "2025-08-04T22:55:06.182233Z", + "created_at": "2025-09-03T17:36:14.10959Z", "done": false, "done_reason": null, "total_duration": null, @@ -95,7 +95,7 @@ "__type__": "ollama._types.GenerateResponse", "__data__": { "model": "llama3.2:3b-instruct-fp16", - "created_at": "2025-08-04T22:55:06.244655Z", + "created_at": "2025-09-03T17:36:14.150266Z", "done": false, "done_reason": null, "total_duration": null, @@ -113,7 +113,7 @@ "__type__": "ollama._types.GenerateResponse", "__data__": { "model": "llama3.2:3b-instruct-fp16", - "created_at": "2025-08-04T22:55:06.304777Z", + "created_at": "2025-09-03T17:36:14.190959Z", "done": false, "done_reason": null, "total_duration": null, @@ -131,7 +131,7 @@ "__type__": "ollama._types.GenerateResponse", "__data__": { "model": "llama3.2:3b-instruct-fp16", - "created_at": "2025-08-04T22:55:06.361584Z", + "created_at": "2025-09-03T17:36:14.231689Z", "done": false, "done_reason": null, "total_duration": null, @@ -149,7 +149,7 @@ "__type__": "ollama._types.GenerateResponse", "__data__": { "model": "llama3.2:3b-instruct-fp16", - "created_at": "2025-08-04T22:55:06.419647Z", + "created_at": "2025-09-03T17:36:14.272328Z", "done": false, "done_reason": null, "total_duration": null, @@ -167,7 +167,7 @@ "__type__": "ollama._types.GenerateResponse", "__data__": { "model": "llama3.2:3b-instruct-fp16", - "created_at": "2025-08-04T22:55:06.477037Z", + "created_at": "2025-09-03T17:36:14.312774Z", "done": false, "done_reason": null, "total_duration": null, @@ -185,7 +185,7 @@ "__type__": "ollama._types.GenerateResponse", "__data__": { "model": "llama3.2:3b-instruct-fp16", - "created_at": "2025-08-04T22:55:06.534717Z", + "created_at": "2025-09-03T17:36:14.353348Z", "done": false, "done_reason": null, "total_duration": null, @@ -203,7 +203,7 @@ "__type__": "ollama._types.GenerateResponse", "__data__": { "model": "llama3.2:3b-instruct-fp16", - "created_at": "2025-08-04T22:55:06.600289Z", + "created_at": "2025-09-03T17:36:14.393886Z", "done": false, "done_reason": null, "total_duration": null, @@ -221,7 +221,7 @@ "__type__": "ollama._types.GenerateResponse", "__data__": { "model": "llama3.2:3b-instruct-fp16", - "created_at": "2025-08-04T22:55:06.658769Z", + "created_at": "2025-09-03T17:36:14.434753Z", "done": false, "done_reason": null, "total_duration": null, @@ -239,7 +239,7 @@ "__type__": "ollama._types.GenerateResponse", "__data__": { "model": "llama3.2:3b-instruct-fp16", - "created_at": "2025-08-04T22:55:06.71323Z", + "created_at": "2025-09-03T17:36:14.474992Z", "done": false, "done_reason": null, "total_duration": null, @@ -257,7 +257,7 @@ "__type__": "ollama._types.GenerateResponse", "__data__": { "model": "llama3.2:3b-instruct-fp16", - "created_at": "2025-08-04T22:55:06.764206Z", + "created_at": "2025-09-03T17:36:14.515133Z", "done": false, "done_reason": null, "total_duration": null, @@ -275,7 +275,7 @@ "__type__": "ollama._types.GenerateResponse", "__data__": { "model": "llama3.2:3b-instruct-fp16", - "created_at": "2025-08-04T22:55:06.815428Z", + "created_at": "2025-09-03T17:36:14.555579Z", "done": false, "done_reason": null, "total_duration": null, @@ -293,7 +293,7 @@ "__type__": "ollama._types.GenerateResponse", "__data__": { "model": "llama3.2:3b-instruct-fp16", - "created_at": "2025-08-04T22:55:06.86906Z", + "created_at": "2025-09-03T17:36:14.596355Z", "done": false, "done_reason": null, "total_duration": null, @@ -311,7 +311,7 @@ "__type__": "ollama._types.GenerateResponse", "__data__": { "model": "llama3.2:3b-instruct-fp16", - "created_at": "2025-08-04T22:55:06.92191Z", + "created_at": "2025-09-03T17:36:14.637241Z", "done": false, "done_reason": null, "total_duration": null, @@ -329,7 +329,7 @@ "__type__": "ollama._types.GenerateResponse", "__data__": { "model": "llama3.2:3b-instruct-fp16", - "created_at": "2025-08-04T22:55:06.97464Z", + "created_at": "2025-09-03T17:36:14.679196Z", "done": false, "done_reason": null, "total_duration": null, @@ -347,7 +347,7 @@ "__type__": "ollama._types.GenerateResponse", "__data__": { "model": "llama3.2:3b-instruct-fp16", - "created_at": "2025-08-04T22:55:07.026686Z", + "created_at": "2025-09-03T17:36:14.719878Z", "done": false, "done_reason": null, "total_duration": null, @@ -365,7 +365,7 @@ "__type__": "ollama._types.GenerateResponse", "__data__": { "model": "llama3.2:3b-instruct-fp16", - "created_at": "2025-08-04T22:55:07.078382Z", + "created_at": "2025-09-03T17:36:14.759719Z", "done": false, "done_reason": null, "total_duration": null, @@ -383,7 +383,7 @@ "__type__": "ollama._types.GenerateResponse", "__data__": { "model": "llama3.2:3b-instruct-fp16", - "created_at": "2025-08-04T22:55:07.131717Z", + "created_at": "2025-09-03T17:36:14.79997Z", "done": false, "done_reason": null, "total_duration": null, @@ -401,7 +401,7 @@ "__type__": "ollama._types.GenerateResponse", "__data__": { "model": "llama3.2:3b-instruct-fp16", - "created_at": "2025-08-04T22:55:07.188206Z", + "created_at": "2025-09-03T17:36:14.84053Z", "done": false, "done_reason": null, "total_duration": null, @@ -419,7 +419,7 @@ "__type__": "ollama._types.GenerateResponse", "__data__": { "model": "llama3.2:3b-instruct-fp16", - "created_at": "2025-08-04T22:55:07.243218Z", + "created_at": "2025-09-03T17:36:14.881964Z", "done": false, "done_reason": null, "total_duration": null, @@ -437,7 +437,7 @@ "__type__": "ollama._types.GenerateResponse", "__data__": { "model": "llama3.2:3b-instruct-fp16", - "created_at": "2025-08-04T22:55:07.298542Z", + "created_at": "2025-09-03T17:36:14.921986Z", "done": false, "done_reason": null, "total_duration": null, @@ -455,7 +455,7 @@ "__type__": "ollama._types.GenerateResponse", "__data__": { "model": "llama3.2:3b-instruct-fp16", - "created_at": "2025-08-04T22:55:07.355167Z", + "created_at": "2025-09-03T17:36:14.962551Z", "done": false, "done_reason": null, "total_duration": null, @@ -473,7 +473,7 @@ "__type__": "ollama._types.GenerateResponse", "__data__": { "model": "llama3.2:3b-instruct-fp16", - "created_at": "2025-08-04T22:55:07.41078Z", + "created_at": "2025-09-03T17:36:15.003226Z", "done": false, "done_reason": null, "total_duration": null, @@ -491,7 +491,7 @@ "__type__": "ollama._types.GenerateResponse", "__data__": { "model": "llama3.2:3b-instruct-fp16", - "created_at": "2025-08-04T22:55:07.463639Z", + "created_at": "2025-09-03T17:36:15.043676Z", "done": false, "done_reason": null, "total_duration": null, @@ -509,7 +509,7 @@ "__type__": "ollama._types.GenerateResponse", "__data__": { "model": "llama3.2:3b-instruct-fp16", - "created_at": "2025-08-04T22:55:07.515619Z", + "created_at": "2025-09-03T17:36:15.083952Z", "done": false, "done_reason": null, "total_duration": null, @@ -527,7 +527,7 @@ "__type__": "ollama._types.GenerateResponse", "__data__": { "model": "llama3.2:3b-instruct-fp16", - "created_at": "2025-08-04T22:55:07.572461Z", + "created_at": "2025-09-03T17:36:15.124797Z", "done": false, "done_reason": null, "total_duration": null, @@ -545,7 +545,7 @@ "__type__": "ollama._types.GenerateResponse", "__data__": { "model": "llama3.2:3b-instruct-fp16", - "created_at": "2025-08-04T22:55:07.626345Z", + "created_at": "2025-09-03T17:36:15.165202Z", "done": false, "done_reason": null, "total_duration": null, @@ -563,7 +563,7 @@ "__type__": "ollama._types.GenerateResponse", "__data__": { "model": "llama3.2:3b-instruct-fp16", - "created_at": "2025-08-04T22:55:07.680673Z", + "created_at": "2025-09-03T17:36:15.205416Z", "done": false, "done_reason": null, "total_duration": null, @@ -581,7 +581,7 @@ "__type__": "ollama._types.GenerateResponse", "__data__": { "model": "llama3.2:3b-instruct-fp16", - "created_at": "2025-08-04T22:55:07.736803Z", + "created_at": "2025-09-03T17:36:15.245854Z", "done": false, "done_reason": null, "total_duration": null, @@ -599,7 +599,7 @@ "__type__": "ollama._types.GenerateResponse", "__data__": { "model": "llama3.2:3b-instruct-fp16", - "created_at": "2025-08-04T22:55:07.789556Z", + "created_at": "2025-09-03T17:36:15.286352Z", "done": false, "done_reason": null, "total_duration": null, @@ -617,7 +617,7 @@ "__type__": "ollama._types.GenerateResponse", "__data__": { "model": "llama3.2:3b-instruct-fp16", - "created_at": "2025-08-04T22:55:07.841142Z", + "created_at": "2025-09-03T17:36:15.326952Z", "done": false, "done_reason": null, "total_duration": null, @@ -635,7 +635,7 @@ "__type__": "ollama._types.GenerateResponse", "__data__": { "model": "llama3.2:3b-instruct-fp16", - "created_at": "2025-08-04T22:55:07.896607Z", + "created_at": "2025-09-03T17:36:15.367575Z", "done": false, "done_reason": null, "total_duration": null, @@ -653,7 +653,7 @@ "__type__": "ollama._types.GenerateResponse", "__data__": { "model": "llama3.2:3b-instruct-fp16", - "created_at": "2025-08-04T22:55:07.953628Z", + "created_at": "2025-09-03T17:36:15.408069Z", "done": false, "done_reason": null, "total_duration": null, @@ -671,7 +671,7 @@ "__type__": "ollama._types.GenerateResponse", "__data__": { "model": "llama3.2:3b-instruct-fp16", - "created_at": "2025-08-04T22:55:08.007575Z", + "created_at": "2025-09-03T17:36:15.448413Z", "done": false, "done_reason": null, "total_duration": null, @@ -689,7 +689,7 @@ "__type__": "ollama._types.GenerateResponse", "__data__": { "model": "llama3.2:3b-instruct-fp16", - "created_at": "2025-08-04T22:55:08.061895Z", + "created_at": "2025-09-03T17:36:15.489223Z", "done": false, "done_reason": null, "total_duration": null, @@ -707,7 +707,7 @@ "__type__": "ollama._types.GenerateResponse", "__data__": { "model": "llama3.2:3b-instruct-fp16", - "created_at": "2025-08-04T22:55:08.121698Z", + "created_at": "2025-09-03T17:36:15.530477Z", "done": false, "done_reason": null, "total_duration": null, @@ -725,7 +725,7 @@ "__type__": "ollama._types.GenerateResponse", "__data__": { "model": "llama3.2:3b-instruct-fp16", - "created_at": "2025-08-04T22:55:08.175866Z", + "created_at": "2025-09-03T17:36:15.571317Z", "done": false, "done_reason": null, "total_duration": null, @@ -743,7 +743,7 @@ "__type__": "ollama._types.GenerateResponse", "__data__": { "model": "llama3.2:3b-instruct-fp16", - "created_at": "2025-08-04T22:55:08.231661Z", + "created_at": "2025-09-03T17:36:15.612263Z", "done": false, "done_reason": null, "total_duration": null, @@ -761,7 +761,7 @@ "__type__": "ollama._types.GenerateResponse", "__data__": { "model": "llama3.2:3b-instruct-fp16", - "created_at": "2025-08-04T22:55:08.285188Z", + "created_at": "2025-09-03T17:36:15.652533Z", "done": false, "done_reason": null, "total_duration": null, @@ -779,15 +779,15 @@ "__type__": "ollama._types.GenerateResponse", "__data__": { "model": "llama3.2:3b-instruct-fp16", - "created_at": "2025-08-04T22:55:08.334914Z", + "created_at": "2025-09-03T17:36:15.692748Z", "done": true, "done_reason": "stop", - "total_duration": 2543128958, - "load_duration": 133497375, + "total_duration": 1808812333, + "load_duration": 57887042, "prompt_eval_count": 18, - "prompt_eval_duration": 62000000, + "prompt_eval_duration": 42042750, "eval_count": 43, - "eval_duration": 2346000000, + "eval_duration": 1708293042, "response": "", "thinking": null, "context": null diff --git a/tests/integration/recordings/responses/ae1c22f18ecc.json b/tests/integration/recordings/responses/ae1c22f18ecc.json index 595b6668d..c9a47657b 100644 --- a/tests/integration/recordings/responses/ae1c22f18ecc.json +++ b/tests/integration/recordings/responses/ae1c22f18ecc.json @@ -20,15 +20,15 @@ "__type__": "ollama._types.GenerateResponse", "__data__": { "model": "llama3.2:3b-instruct-fp16", - "created_at": "2025-07-31T17:59:32.661124541Z", + "created_at": "2025-09-03T17:41:47.144448Z", "done": true, "done_reason": "stop", - "total_duration": 11391290133, - "load_duration": 42154800, + "total_duration": 2462760250, + "load_duration": 83668541, "prompt_eval_count": 20, - "prompt_eval_duration": 1208581216, + "prompt_eval_duration": 74227125, "eval_count": 58, - "eval_duration": 10140044676, + "eval_duration": 2304346166, "response": "I'm happy to help you with your test, but I don't see what kind of test we are testing. Could you please provide more context or clarify what kind of test you would like me to perform? Is it a programming test, a language proficiency test, or something else?", "thinking": null, "context": null diff --git a/tests/integration/recordings/responses/ae6835cfe70e.json b/tests/integration/recordings/responses/ae6835cfe70e.json index 1bc383707..9766c6023 100644 --- a/tests/integration/recordings/responses/ae6835cfe70e.json +++ b/tests/integration/recordings/responses/ae6835cfe70e.json @@ -20,15 +20,15 @@ "__type__": "ollama._types.GenerateResponse", "__data__": { "model": "llama3.2:3b-instruct-fp16", - "created_at": "2025-08-04T22:55:57.955211Z", + "created_at": "2025-09-03T17:42:18.871277Z", "done": true, "done_reason": "stop", - "total_duration": 842946458, - "load_duration": 91343000, + "total_duration": 644170416, + "load_duration": 69749500, "prompt_eval_count": 386, - "prompt_eval_duration": 685000000, + "prompt_eval_duration": 531218583, "eval_count": 2, - "eval_duration": 64000000, + "eval_duration": 42446084, "response": "[]", "thinking": null, "context": null diff --git a/tests/integration/recordings/responses/b14ff438ca99.json b/tests/integration/recordings/responses/b14ff438ca99.json index c445e7d42..180ec3286 100644 --- a/tests/integration/recordings/responses/b14ff438ca99.json +++ b/tests/integration/recordings/responses/b14ff438ca99.json @@ -20,15 +20,15 @@ "__type__": "ollama._types.GenerateResponse", "__data__": { "model": "llama3.2:3b-instruct-fp16", - "created_at": "2025-07-31T17:51:39.104140157Z", + "created_at": "2025-09-03T17:39:59.708499Z", "done": true, "done_reason": "stop", - "total_duration": 22895811031, - "load_duration": 41692686, + "total_duration": 5293681583, + "load_duration": 196095541, "prompt_eval_count": 23, - "prompt_eval_duration": 793961939, + "prompt_eval_duration": 72668042, "eval_count": 124, - "eval_duration": 22059637137, + "eval_duration": 5024327166, "response": "The official currency of Japan is the Japanese yen (\u00a5). It is abbreviated as \"JPY\" and its symbol is \u00a5. The yen is divided into 100 sen, although the sen has been officially discontinued since 1967.\n\nYou can exchange your money for yen at banks, currency exchange offices, or use ATMs to withdraw cash from an ATM. Credit cards are also widely accepted in Japan, especially among major retailers and restaurants.\n\nIt's worth noting that some businesses may not accept foreign currencies other than US dollars, so it's a good idea to have some local currency on hand when traveling to Japan.", "thinking": null, "context": null diff --git a/tests/integration/recordings/responses/b5e3ed420986.json b/tests/integration/recordings/responses/b5e3ed420986.json index 871708ea0..f5a6e2400 100644 --- a/tests/integration/recordings/responses/b5e3ed420986.json +++ b/tests/integration/recordings/responses/b5e3ed420986.json @@ -20,390 +20,390 @@ "data": [ { "embedding": [ - -0.054539014, - -0.016468922, - -0.010608761, - 0.02301095, - 0.011758054, - -0.11193683, - -0.0096305525, - 0.019113416, - 0.048967674, - -0.040160257, - -0.022335947, - 0.016229406, - 0.009204825, - 0.05479278, - 0.049229205, - -0.09585555, - -0.031133035, - -0.010217964, - -0.029166166, - -0.08954575, - -0.0006925836, - 0.034955315, - 0.016062167, - 0.0034184188, - 0.039653763, - -0.016046634, - -0.02841708, - 0.021410936, - 0.046111625, - -0.062207576, - -0.023055006, - 0.1013955, - 0.025184965, - -0.03625098, - -0.032918476, - 0.03443538, - -0.01667641, - -0.066225745, - -0.06069369, - 0.0005895856, - -0.063880995, - 0.0077826553, - -0.0051208152, - -0.03670025, - -0.023568328, - 0.07426548, - -0.017221872, - 0.064796105, - -0.009619924, - -0.0011168239, - -0.0946396, - 0.029776908, - -0.082821324, - -0.053136017, - -0.014514815, - -0.015186634, - 0.03710505, - 0.07176102, - -0.01892326, - -0.11193171, - -0.11862717, - 0.029721867, - 0.030640045, - 0.103079796, - -0.02800051, - -0.045588907, - 0.0014006048, - 0.0046053855, - 0.03230686, - -0.027150096, - -0.06602394, - -0.015831675, - 0.019209974, - 0.06880736, - 0.04709176, - -0.105855644, - 0.046280492, - -0.03096076, - -0.069832, - -0.014894174, - -0.0014720439, - 0.026728554, - -0.04701634, - 0.07608865, - 0.05755428, - -0.020295804, - 0.038703557, - 0.06851399, - -0.068138964, - -0.017405631, - 0.057037257, - -0.07952873, - -0.014248788, - 0.0036484832, - -0.052898604, - 0.049604755, - 0.021487204, - 0.035027836, - 0.02545877, - -0.004785061, - 0.051205274, - -0.08541501, - 0.07143089, - 0.04468161, - 0.03930722, - -0.0135141155, - 0.07088695, - -0.0660048, - 0.0592439, - -0.023046793, - -0.027459674, - -0.04689379, - -0.037509903, - -0.0084943585, - 0.05313619, - 0.0038019137, - -0.02021957, - 0.043566354, - -0.034341905, - 0.042827673, - -0.007318655, - -0.0016014964, - 0.04183553, - -0.025132777, - -0.03014748, - 0.056046948, - -0.03387941, - -4.800238e-33, - 0.008938797, - -0.105446324, - -0.022468172, - -0.0046421383, - 0.10120766, - -0.024071503, - 0.0720334, - 0.00824967, - -0.017588114, - -0.012572595, - 0.011187751, - 0.09430494, - 0.025195174, - 0.061279986, - 0.028598385, - 0.07013615, - -0.028032323, - 0.042044032, - 0.012670473, - 0.05118446, - 0.069872275, - 0.113011226, - 0.06393332, - 0.046133682, - 0.00069346296, - -0.04742425, - -0.0076766815, - -0.016270984, - -0.03935856, - -0.0060400777, - -0.057824753, - -0.032809503, - 0.030087646, - 0.04949177, - 0.0065082232, - -0.015118406, - 0.027426325, - -0.13929617, - 0.04686397, - -0.0001376871, - 0.023311358, - 0.014268379, - 0.0005033175, - -0.019155173, - -0.021629533, - 0.012334637, - -0.035448097, - -0.015012808, - -0.12478333, - 0.017866643, - -0.015385203, - -0.030914769, - 0.07756115, - 0.067938074, - -0.0029891697, - 0.03446983, - 0.072096206, - -0.008727331, - -0.0039063273, - -0.048090436, - 0.021224795, - 0.065839365, - 0.07848987, - 0.014581675, - 0.06676033, - 0.07221585, - 0.033575963, - 0.08418111, - 0.016567666, - 0.042123966, - -0.05935007, - 0.020415181, - -0.06571829, - 0.04579863, - 0.002951678, - 0.0034759378, - -0.008463108, - -0.14008056, - 0.056221444, - 0.05469431, - -0.060425404, - -0.035049956, - -0.05707458, - -0.010413291, - -0.08953148, - -0.023625003, - 0.034471046, - 0.033661205, - 0.06720743, - -0.07255193, - -0.041828338, - -0.08223931, - 0.010640704, - -0.042891644, - -0.0014475408, - 8.39199e-34, - -0.07032797, - 0.0070702634, - -0.035070483, - 0.021509597, - -0.11257678, - -0.04567272, - 0.08481507, - 0.050335176, - 0.053387776, - 0.012060723, - -0.0019196937, - -0.08608223, - 0.09600442, - 0.0037239613, - 0.060983595, - 0.015279161, - -0.040586337, - 0.10490671, - 0.07111468, - -0.0050306814, - -0.048980962, - 0.09183541, - -0.09862482, - -0.012065119, - -0.016891332, - -0.028088856, - -0.12471142, - -0.078602985, - -0.018680012, - 0.021758018, - 0.005759521, - 0.051118605, - -0.082707904, - 0.072964445, - 0.0141024105, - 0.0010097212, - -0.03685827, - 0.00568948, - 0.017905025, - 0.013780462, - 0.04993993, - 0.021444008, - 0.110891685, - 0.061709184, - 0.01853852, - 0.036215156, - -0.06684297, - 0.036332514, - -0.021102918, - -0.07972151, - 0.065229, - 0.0030138723, - 0.018853001, - -0.008725459, - -0.058164038, - -0.040056095, - 0.051841468, - 0.016301498, - -0.08781288, - -0.02227259, - -0.013245076, - -0.03801183, - 0.025480323, - 0.030531729, - -0.054035358, - 0.04038695, - -0.116109855, - -0.026073342, - -0.0043725744, - -0.15029478, - 0.08059584, - -0.05766878, - 0.02516043, - -0.0038830324, - -0.064506546, - 0.020497749, - -0.034779944, - -0.02932536, - -0.052795924, - 0.05048031, - -0.036627516, - -0.009295713, - -0.03128295, - -0.0010504925, - -0.089731686, - 0.044538505, - -0.058741618, - 0.028392328, - 0.05705406, - -0.021216048, - 0.024795407, - 0.023279097, - -0.025490018, - 0.066466905, - 0.011147595, - -1.57812e-08, - -0.043579992, - 0.050845813, - 0.009048856, - 0.036609128, - 0.0027812773, - 0.03891625, - -0.013210705, - 0.0068475637, - -0.0067914757, - 0.020505553, - -0.029885264, - -0.0055864784, - -0.06776668, - -0.054356683, - 0.024375776, - 0.13760787, - -0.07139099, - 0.007762989, - 0.051617414, - 0.05973323, - 0.042459413, - -0.03560275, - -0.05791632, - 0.04441552, - -0.10566783, - 0.009725281, - -0.016063722, - 0.035676833, - 0.023308199, - -0.079277165, - 0.0054484066, - -0.060464006, - -0.044717573, - 0.013122884, - -0.015911829, - -0.012086337, - 0.005874884, - -0.070992075, - 0.017624497, - 0.036101837, - 0.023521954, - -0.007950616, - -0.036010865, - 0.0059945653, - 0.059922658, - 0.0058807023, - -0.058820717, - -0.04119291, - -0.038226888, - -0.03001563, - 0.019165142, - -0.020903448, - -0.0089449985, - -0.02588891, - 0.08723996, - 0.04226809, - -0.09462471, - -0.0349857, - 0.05150947, - 0.04254913, - -0.01820297, - 0.06036542, - 0.19380692, - 0.014680669 + -0.054516047, + -0.016456056, + -0.010628294, + 0.022998175, + 0.011771307, + -0.11192805, + -0.009638266, + 0.019111464, + 0.048958372, + -0.040184658, + -0.022362057, + 0.016236247, + 0.009179422, + 0.054799747, + 0.049246185, + -0.095869735, + -0.031108288, + -0.010185289, + -0.02914681, + -0.08954776, + -0.0006788293, + 0.03496997, + 0.016079746, + 0.003440155, + 0.039660316, + -0.016080642, + -0.028411511, + 0.021429215, + 0.046082154, + -0.062199906, + -0.023051145, + 0.10141082, + 0.025186997, + -0.03625052, + -0.032918967, + 0.034433577, + -0.016646268, + -0.066217534, + -0.06070787, + 0.0006243064, + -0.06383077, + 0.0077886702, + -0.005127284, + -0.036702275, + -0.023532037, + 0.074247204, + -0.017199293, + 0.064781435, + -0.00963324, + -0.0011216484, + -0.094671436, + 0.029772488, + -0.0828219, + -0.053136364, + -0.014507852, + -0.015170829, + 0.03712605, + 0.071739994, + -0.018907284, + -0.11193762, + -0.11859575, + 0.029719124, + 0.030655412, + 0.10308374, + -0.027978238, + -0.045611758, + 0.0013704232, + 0.004602404, + 0.032320693, + -0.027153788, + -0.06603313, + -0.015827695, + 0.01920783, + 0.06879109, + 0.047088612, + -0.1058506, + 0.046279814, + -0.030967912, + -0.06984916, + -0.014879451, + -0.0014568317, + 0.026731879, + -0.04702097, + 0.076069675, + 0.05755153, + -0.020301627, + 0.038702164, + 0.06855233, + -0.06817319, + -0.017392006, + 0.057020444, + -0.0795406, + -0.014256318, + 0.0036161602, + -0.05289696, + 0.049625576, + 0.021482797, + 0.034989595, + 0.025457244, + -0.004806878, + 0.051217325, + -0.085426696, + 0.07142323, + 0.04465428, + 0.039311107, + -0.013488202, + 0.07088864, + -0.06598805, + 0.05922822, + -0.023026757, + -0.027465338, + -0.046879534, + -0.03751372, + -0.0085191075, + 0.05315477, + 0.0037932945, + -0.020239882, + 0.043557003, + -0.03434906, + 0.04282584, + -0.007332412, + -0.0016165953, + 0.041878954, + -0.025151564, + -0.0301328, + 0.05601688, + -0.03388191, + -4.802144e-33, + 0.008930927, + -0.10549414, + -0.022485359, + -0.00461374, + 0.10122854, + -0.024063904, + 0.072040126, + 0.00826307, + -0.017573163, + -0.012551788, + 0.011197847, + 0.09432378, + 0.025232295, + 0.061275084, + 0.028605146, + 0.070148624, + -0.028050693, + 0.042055413, + 0.012653081, + 0.051212482, + 0.06987365, + 0.113007665, + 0.063927636, + 0.04614841, + 0.00071471, + -0.04746817, + -0.007670411, + -0.016275087, + -0.039374933, + -0.0060473024, + -0.057836913, + -0.032802302, + 0.030103875, + 0.049495216, + 0.006514002, + -0.015127479, + 0.027406687, + -0.13926439, + 0.04688173, + -0.00014261098, + 0.023295157, + 0.014260961, + 0.00048042598, + -0.019151432, + -0.02166308, + 0.012344319, + -0.03541818, + -0.014996304, + -0.12476534, + 0.017857043, + -0.015367026, + -0.030933712, + 0.0775453, + 0.067932405, + -0.002991927, + 0.034482367, + 0.07207725, + -0.008732087, + -0.0038812195, + -0.048092995, + 0.021236168, + 0.06584243, + 0.07847724, + 0.014562048, + 0.066736475, + 0.07221872, + 0.03357779, + 0.084165, + 0.01657892, + 0.04212138, + -0.059364557, + 0.020403123, + -0.065706775, + 0.045810685, + 0.0029439582, + 0.0034878643, + -0.008467763, + -0.14005418, + 0.056226924, + 0.05473064, + -0.060421, + -0.035074305, + -0.05707729, + -0.0104098, + -0.089569785, + -0.023614792, + 0.0344653, + 0.033663824, + 0.06720568, + -0.0725603, + -0.04185905, + -0.08224899, + 0.010631505, + -0.042881776, + -0.0014539668, + 8.40692e-34, + -0.07032476, + 0.0070766173, + -0.03506184, + 0.021500606, + -0.11258514, + -0.045659322, + 0.08482931, + 0.050339974, + 0.0533988, + 0.01208183, + -0.0019384808, + -0.0860773, + 0.09599927, + 0.0037235345, + 0.060938608, + 0.015288853, + -0.040593054, + 0.10491757, + 0.07109598, + -0.0050172145, + -0.049021836, + 0.091859885, + -0.09862007, + -0.012040684, + -0.016914355, + -0.028067894, + -0.12471722, + -0.078632146, + -0.018693453, + 0.021743925, + 0.0057838396, + 0.051090635, + -0.08270728, + 0.07299018, + 0.014088154, + 0.0010067249, + -0.03681869, + 0.005664378, + 0.017898101, + 0.01379136, + 0.049959406, + 0.021462437, + 0.11088524, + 0.061694097, + 0.018546695, + 0.036211833, + -0.06682083, + 0.036322806, + -0.021121122, + -0.079697676, + 0.065231666, + 0.002995329, + 0.0188468, + -0.008694769, + -0.058170997, + -0.040058907, + 0.051831294, + 0.016280394, + -0.08779952, + -0.022270929, + -0.013231236, + -0.03801554, + 0.0254927, + 0.030549657, + -0.054053955, + 0.040396415, + -0.116118245, + -0.026093038, + -0.004378966, + -0.15024145, + 0.08058958, + -0.05766716, + 0.02520104, + -0.0038984206, + -0.06448939, + 0.020477816, + -0.034754846, + -0.029315596, + -0.052802563, + 0.050487537, + -0.03663958, + -0.009309272, + -0.031305738, + -0.0010610216, + -0.089741714, + 0.0445201, + -0.058746234, + 0.028397618, + 0.057035178, + -0.021242462, + 0.024774676, + 0.023253858, + -0.025503494, + 0.066465355, + 0.011176001, + -1.5780694e-08, + -0.043592602, + 0.050871234, + 0.009062051, + 0.03658537, + 0.002769079, + 0.038917493, + -0.013205564, + 0.006855097, + -0.006784634, + 0.020516934, + -0.029890155, + -0.005596517, + -0.06777992, + -0.05436433, + 0.02436097, + 0.13761573, + -0.07139558, + 0.007746665, + 0.051632155, + 0.059728563, + 0.0424793, + -0.035606194, + -0.05791164, + 0.044417217, + -0.105627485, + 0.009701339, + -0.016052725, + 0.03566595, + 0.023313522, + -0.079250954, + 0.0054293363, + -0.060480006, + -0.044735, + 0.013152052, + -0.015912784, + -0.012098195, + 0.0058634495, + -0.070984975, + 0.017616477, + 0.03611389, + 0.023517592, + -0.007936504, + -0.03601146, + 0.0059993765, + 0.059939068, + 0.0058700717, + -0.05880679, + -0.04119574, + -0.038231015, + -0.030013425, + 0.01916342, + -0.020920184, + -0.008940394, + -0.025874808, + 0.08722286, + 0.042265054, + -0.09463029, + -0.034977533, + 0.05149754, + 0.042541843, + -0.01818799, + 0.06035198, + 0.1938343, + 0.01467125 ], "index": 0, "object": "embedding" diff --git a/tests/integration/recordings/responses/b612debbd3bf.json b/tests/integration/recordings/responses/b612debbd3bf.json index 0b73eaf31..4c39a78f1 100644 --- a/tests/integration/recordings/responses/b612debbd3bf.json +++ b/tests/integration/recordings/responses/b612debbd3bf.json @@ -20,390 +20,390 @@ "data": [ { "embedding": [ - -0.003989132, - 0.051404107, - -0.00056249514, - -0.038048144, - 0.00023617804, - -0.07165115, - -0.032934345, - 0.029131265, - 0.089478746, - 0.027012052, - 0.022988115, - 0.029467529, - 0.013449345, - 0.02187333, - 0.024701167, - 0.02318687, - -0.067904875, - 0.042214446, - -0.06686454, - -0.044817198, - -0.019499827, - -0.017647728, - -0.047033403, - 0.01010371, - -0.035198584, - 0.1279292, - -0.03992792, - -0.03702997, - 0.021821143, - -0.06663628, - 0.020529605, - 0.03141518, - 0.121698014, - 0.037880983, - -0.07562467, - 0.035962664, - 0.11100028, - -0.025674157, - -0.0779127, - 0.016963888, - -0.0807954, - 0.042507604, - 0.00820509, - 0.07316419, - 0.01111272, - 0.01623341, - 0.019468198, - -0.05727617, - -0.026948903, - 0.02756721, - -0.10366233, - 0.061819006, - -0.02805692, - 0.04555006, - 0.038514387, - 0.102219224, - 0.010187554, - 0.0038878673, - -0.07438772, - -0.009772767, - -0.014589378, - 0.005427063, - -0.04896932, - 0.024673788, - 0.08042059, - -0.0013942291, - 0.0008588407, - 0.0016949617, - 0.016265066, - 0.0036070896, - 0.05801152, - -0.010051563, - -0.008403578, - 0.06814287, - 0.03398574, - -0.011672763, - -0.049353864, - -0.034604926, - 0.022498535, - 0.016111419, - 0.02527047, - 0.03502525, - -0.018208683, - 0.068031214, - 0.059953574, - -0.025391363, - 0.04580482, - -0.04296594, - -0.10485879, - -0.028135728, - 0.079018995, - -0.01712349, - 0.012407565, - 0.04061926, - -0.020135157, - 0.026930887, - 0.041811634, - -0.04416108, - 0.080970354, - 0.021775935, - 0.081765614, - 0.033288363, - 0.021744251, - 0.0920779, - -0.052091073, - -0.13620377, - 0.01355201, - -0.019836528, - -0.03622741, - -0.050273415, - -0.03297705, - 0.046637394, - -0.062427662, - -0.05683662, - -0.027652364, - -0.15121156, - -0.09399186, - -0.011023118, - -0.024265675, - -0.046763826, - -0.002908067, - -0.066486366, - -0.025612496, - 0.018278103, - 0.0020231954, - -0.062278572, - -0.11748546, - -4.4292726e-33, - -0.009130088, - -0.037159156, - -0.026047857, - 0.052019667, - 0.00085722556, - 0.006592443, - -0.0045248135, - -0.04015857, - 0.004117024, - 0.0428665, - -0.049716696, - 0.045335494, - 0.042848498, - 0.044919603, - 0.11100728, - 0.021570923, - -0.031257298, - 0.07225882, - -0.01912497, - -0.034713253, - 0.06771385, - -0.016151445, - 0.05971066, - -0.022954458, - 0.028852448, - 0.015406495, - -0.00031955744, - -0.012751747, - -0.03327897, - -0.00012636236, - -0.02479355, - -0.042213496, - -0.002454921, - 0.041260865, - 0.0919246, - 0.06857511, - -0.0152807245, - -0.12649235, - 0.016997697, - -0.08620996, - 0.055064507, - 0.030273788, - 0.00431866, - 0.031995468, - -0.03225614, - 0.004922506, - 0.009020533, - -0.023137338, - -0.040697925, - -0.09105851, - 0.03639921, - 0.024429396, - 0.013554936, - 0.032427397, - 0.04099883, - 0.037522644, - -0.041546755, - -0.079021014, - -0.053779483, - 0.06449904, - -0.08023162, - 0.021288263, - 0.062299646, - 0.0457609, - 0.03245626, - 0.08930955, - -0.040566627, - -0.031877786, - 0.09784694, - 0.018440586, - 0.0055373674, - 0.033386778, - -0.069314316, - 0.0050042598, - -0.011121069, - 0.04041817, - -0.018704956, - -0.06160915, - -0.019937823, - 0.05572433, - -0.033941865, - -0.03284764, - 0.039774805, - 0.032533348, - -0.014803814, - -0.04081455, - 0.090428285, - -0.07119735, - -0.045317948, - 0.0044284705, - -0.011297022, - 0.010466631, - -0.0050936122, - -0.032272205, - -0.014571677, - 1.9730937e-33, - -0.014730757, - -0.011375904, - -0.018987043, - -0.030017996, - -0.03238378, - 0.00021963792, - -0.012572021, - -0.121466525, - 0.0020859565, - 0.031917855, - -0.0047694035, - 0.009451863, - 0.07091064, - -0.10059175, - 0.025064182, - 0.06191513, - -0.0040704445, - -0.09924964, - -0.011796679, - -0.047690243, - -0.030504584, - 0.06266709, - -0.07385124, - -0.0061550937, - -0.01423386, - 0.0073556406, - -0.12380783, - -0.12357105, - 0.049844977, - 0.013651552, - -0.042339053, - -0.05773099, - 0.008854461, - -0.039381962, - -0.010391537, - 0.01995317, - 0.06865881, - -0.0034758614, - 0.034933414, - 0.016901772, - -0.041236185, - 0.1275965, - -0.010944973, - -0.038379222, - 0.03352998, - 0.024260346, - -0.009189018, - 0.08945688, - -0.037322775, - -0.033685952, - 0.083590224, - 0.024379434, - 0.013052954, - -0.082478285, - 0.081726134, - 0.025851976, - -0.040732652, - 0.011625263, - 0.045134045, - 0.05800952, - -0.043148052, - -0.02189082, - 0.0076365937, - 0.07503425, - -0.0371004, - -0.04029487, - -0.044494897, - -0.10995023, - -0.024031844, - -0.08961193, - 0.020242436, - 0.030619737, - -0.021178389, - 0.04682225, - -0.08384518, - -0.04420498, - -0.041840017, - 0.031129008, - 0.010757745, - 0.06393576, - -0.0031622013, - -0.012325239, - 0.03960315, - 0.038744513, - 0.04009258, - 0.012087899, - 0.060512736, - -0.04624927, - 0.00929668, - -0.051231515, - -0.0496359, - -0.015559894, - -0.08582702, - 0.07392022, - -0.02927744, - -1.4551534e-08, - -0.060233776, - -0.056502644, - -0.0039323824, - -0.030575769, - 0.033688147, - -0.051516674, - 0.011328192, - 0.14126065, - 0.02396768, - 0.019315943, - 0.06601706, - 0.030757405, - -0.106958, - 0.0033853063, - 0.073158585, - 0.024177559, - 0.08089344, - -0.078784004, - -0.032134753, - 0.07526011, - 0.054319587, - 0.009856976, - -0.12708029, - 0.06313889, - 0.09004333, - -0.0015960654, - 0.058387086, - 0.059561662, - -0.0047651688, - 0.0229759, - 0.03569084, - -0.034010228, - 0.07279012, - 0.07974487, - 0.091203436, - 0.022210982, - 0.04596847, - 0.044025153, - -0.083589375, - -0.10002216, - 0.020842535, - 0.023079954, - -0.04795557, - 0.08441458, - 0.0771154, - 0.009332128, - -0.08095578, - 0.092889085, - -0.020154007, - -0.0008010522, - -0.03861009, - 0.016097447, - 0.0070208795, - -0.017685603, - -0.002207989, - -0.02192508, - 0.033382397, - -0.03214206, - -0.012332422, - -0.002134471, - 0.021111421, - 0.016544258, - 0.017546006, - -0.07716502 + -0.003961408, + 0.051414188, + -0.00058039324, + -0.03805786, + 0.00026862609, + -0.07164569, + -0.032947958, + 0.029143414, + 0.0895043, + 0.027018296, + 0.022992423, + 0.029479899, + 0.013462918, + 0.021877697, + 0.024697151, + 0.023186686, + -0.06790505, + 0.042193525, + -0.0668863, + -0.04484601, + -0.019504927, + -0.017638002, + -0.047011577, + 0.010105266, + -0.035193082, + 0.12793653, + -0.03992006, + -0.03702981, + 0.021819357, + -0.06665871, + 0.020533124, + 0.03142357, + 0.121719204, + 0.037876442, + -0.075640336, + 0.0359664, + 0.11100785, + -0.02567441, + -0.07788109, + 0.016981006, + -0.08081605, + 0.042523988, + 0.008232587, + 0.0731737, + 0.011123085, + 0.016207846, + 0.01944517, + -0.057269264, + -0.026940528, + 0.027561199, + -0.103662655, + 0.06181235, + -0.028062372, + 0.04553612, + 0.038513146, + 0.10225101, + 0.010200513, + 0.003872203, + -0.074381135, + -0.0097752875, + -0.014599097, + 0.0054576746, + -0.04897588, + 0.024681844, + 0.08043012, + -0.0014103616, + 0.0008604012, + 0.0016741438, + 0.016251745, + 0.00360708, + 0.058014695, + -0.010049014, + -0.0084027, + 0.06814959, + 0.033971835, + -0.011656133, + -0.04935883, + -0.03459291, + 0.022477727, + 0.01610207, + 0.025287844, + 0.03501659, + -0.018194117, + 0.06807382, + 0.059983365, + -0.025374522, + 0.04583719, + -0.04297365, + -0.104865946, + -0.028109012, + 0.079001896, + -0.017114554, + 0.012419278, + 0.04061318, + -0.020101532, + 0.026956845, + 0.041828763, + -0.044170532, + 0.08095696, + 0.021788325, + 0.081747636, + 0.033276387, + 0.021741632, + 0.092068955, + -0.05207143, + -0.13620017, + 0.013549487, + -0.019821124, + -0.036206715, + -0.050286006, + -0.032959178, + 0.04662646, + -0.062424622, + -0.056837536, + -0.027646665, + -0.15120761, + -0.093959294, + -0.010999317, + -0.02427833, + -0.046769585, + -0.002897303, + -0.06647176, + -0.025597623, + 0.018255977, + 0.0020313214, + -0.06226326, + -0.117481604, + -4.4295206e-33, + -0.009129055, + -0.037181977, + -0.02604801, + 0.052037112, + 0.00087297254, + 0.0065994835, + -0.0045263134, + -0.040167294, + 0.0041152886, + 0.042845216, + -0.049708433, + 0.045345027, + 0.04285296, + 0.044911012, + 0.11100636, + 0.021593297, + -0.03125754, + 0.072277226, + -0.01916381, + -0.03471753, + 0.06770263, + -0.016145714, + 0.05970865, + -0.02298266, + 0.028831182, + 0.015415605, + -0.00031274176, + -0.012733097, + -0.03328956, + -0.00013622487, + -0.024770694, + -0.042212497, + -0.0024302523, + 0.04124051, + 0.09191475, + 0.06856497, + -0.015284932, + -0.12650564, + 0.017038988, + -0.086213395, + 0.05503028, + 0.030287316, + 0.0043085497, + 0.03199775, + -0.032243066, + 0.004920853, + 0.009013211, + -0.023148343, + -0.04070659, + -0.091041416, + 0.036388315, + 0.024427423, + 0.013590955, + 0.032416057, + 0.040976506, + 0.037508775, + -0.041537814, + -0.0790035, + -0.05377612, + 0.06448428, + -0.080218546, + 0.021294411, + 0.062302276, + 0.045776673, + 0.032483075, + 0.08931608, + -0.04060625, + -0.031852096, + 0.09785858, + 0.01842136, + 0.005539284, + 0.033401128, + -0.069316946, + 0.0050071795, + -0.01113226, + 0.04040353, + -0.018702384, + -0.061634906, + -0.019955046, + 0.055725593, + -0.0339558, + -0.03284888, + 0.039789777, + 0.032518264, + -0.014831044, + -0.040828414, + 0.09042645, + -0.07117855, + -0.0452999, + 0.004429679, + -0.011286574, + 0.010456636, + -0.005107356, + -0.03228427, + -0.014561991, + 1.973978e-33, + -0.014741807, + -0.011373571, + -0.018968971, + -0.030024195, + -0.032379575, + 0.00021643718, + -0.012567692, + -0.121494584, + 0.0020773544, + 0.03192013, + -0.004760303, + 0.0094626825, + 0.070903994, + -0.10057645, + 0.025073227, + 0.0619163, + -0.0040503214, + -0.099229865, + -0.011797051, + -0.04770035, + -0.030485118, + 0.06268395, + -0.073855996, + -0.0061467164, + -0.01423362, + 0.0073681897, + -0.12381955, + -0.12358002, + 0.049814835, + 0.013639601, + -0.04231122, + -0.057728436, + 0.008867639, + -0.03936158, + -0.010378862, + 0.01995126, + 0.06864242, + -0.0034683226, + 0.034935873, + 0.01691657, + -0.041248, + 0.12756771, + -0.0109369, + -0.038407195, + 0.03351686, + 0.024284633, + -0.009186648, + 0.089450404, + -0.037300985, + -0.033677705, + 0.083595864, + 0.024388704, + 0.013052032, + -0.082466476, + 0.08174954, + 0.025851287, + -0.0407412, + 0.011634866, + 0.045149248, + 0.057999264, + -0.043137826, + -0.0218611, + 0.007614091, + 0.075013876, + -0.037117332, + -0.040271968, + -0.044543337, + -0.10995435, + -0.024011672, + -0.08962033, + 0.020206504, + 0.030622963, + -0.021175418, + 0.046819735, + -0.08388905, + -0.04419095, + -0.041822553, + 0.031128531, + 0.010744972, + 0.06392119, + -0.0031621107, + -0.012324199, + 0.039583333, + 0.03872388, + 0.04003792, + 0.012126796, + 0.060538515, + -0.046224117, + 0.009284271, + -0.051235553, + -0.049639463, + -0.015559349, + -0.08584357, + 0.07390804, + -0.029281551, + -1.4552155e-08, + -0.060234137, + -0.05653537, + -0.003924483, + -0.030553697, + 0.033688337, + -0.051516354, + 0.011325061, + 0.14125879, + 0.0239569, + 0.01933575, + 0.066012196, + 0.030753234, + -0.10696803, + 0.0034088665, + 0.073148385, + 0.02414587, + 0.080867074, + -0.07877004, + -0.032145467, + 0.07524812, + 0.0542984, + 0.009829384, + -0.1270656, + 0.06314169, + 0.09003407, + -0.0016169662, + 0.058391552, + 0.059590362, + -0.0047688517, + 0.022996303, + 0.035714924, + -0.034012605, + 0.07277301, + 0.0797266, + 0.0912049, + 0.022215161, + 0.045965668, + 0.04404474, + -0.083592154, + -0.10004596, + 0.020836696, + 0.023092525, + -0.047950342, + 0.08443384, + 0.0771323, + 0.009310225, + -0.080956854, + 0.09289323, + -0.020150434, + -0.00083508895, + -0.038630493, + 0.01606296, + 0.007031474, + -0.01770303, + -0.0022343053, + -0.021911092, + 0.03337036, + -0.032134622, + -0.012314019, + -0.0021285508, + 0.021125747, + 0.016543584, + 0.01756058, + -0.0771557 ], "index": 0, "object": "embedding" diff --git a/tests/integration/recordings/responses/bd356b27a085.json b/tests/integration/recordings/responses/bd356b27a085.json index 58da672f0..f372e5af9 100644 --- a/tests/integration/recordings/responses/bd356b27a085.json +++ b/tests/integration/recordings/responses/bd356b27a085.json @@ -21,7 +21,7 @@ "__type__": "ollama._types.GenerateResponse", "__data__": { "model": "llama3.2:3b-instruct-fp16", - "created_at": "2025-07-29T23:46:35.850399Z", + "created_at": "2025-09-03T17:34:22.916043Z", "done": false, "done_reason": null, "total_duration": null, @@ -39,7 +39,7 @@ "__type__": "ollama._types.GenerateResponse", "__data__": { "model": "llama3.2:3b-instruct-fp16", - "created_at": "2025-07-29T23:46:35.89419Z", + "created_at": "2025-09-03T17:34:22.957379Z", "done": false, "done_reason": null, "total_duration": null, @@ -57,7 +57,7 @@ "__type__": "ollama._types.GenerateResponse", "__data__": { "model": "llama3.2:3b-instruct-fp16", - "created_at": "2025-07-29T23:46:35.938049Z", + "created_at": "2025-09-03T17:34:23.00029Z", "done": false, "done_reason": null, "total_duration": null, @@ -75,7 +75,7 @@ "__type__": "ollama._types.GenerateResponse", "__data__": { "model": "llama3.2:3b-instruct-fp16", - "created_at": "2025-07-29T23:46:35.980392Z", + "created_at": "2025-09-03T17:34:23.043332Z", "done": false, "done_reason": null, "total_duration": null, @@ -93,7 +93,7 @@ "__type__": "ollama._types.GenerateResponse", "__data__": { "model": "llama3.2:3b-instruct-fp16", - "created_at": "2025-07-29T23:46:36.023004Z", + "created_at": "2025-09-03T17:34:23.085324Z", "done": false, "done_reason": null, "total_duration": null, @@ -111,7 +111,7 @@ "__type__": "ollama._types.GenerateResponse", "__data__": { "model": "llama3.2:3b-instruct-fp16", - "created_at": "2025-07-29T23:46:36.065467Z", + "created_at": "2025-09-03T17:34:23.128181Z", "done": false, "done_reason": null, "total_duration": null, @@ -129,7 +129,7 @@ "__type__": "ollama._types.GenerateResponse", "__data__": { "model": "llama3.2:3b-instruct-fp16", - "created_at": "2025-07-29T23:46:36.108189Z", + "created_at": "2025-09-03T17:34:23.172026Z", "done": false, "done_reason": null, "total_duration": null, @@ -147,15 +147,15 @@ "__type__": "ollama._types.GenerateResponse", "__data__": { "model": "llama3.2:3b-instruct-fp16", - "created_at": "2025-07-29T23:46:36.150902Z", + "created_at": "2025-09-03T17:34:23.216706Z", "done": true, "done_reason": "stop", - "total_duration": 468910417, - "load_duration": 93969000, + "total_duration": 516060000, + "load_duration": 127260334, "prompt_eval_count": 479, - "prompt_eval_duration": 72596750, + "prompt_eval_duration": 87107292, "eval_count": 8, - "eval_duration": 301590375, + "eval_duration": 299381042, "response": "", "thinking": null, "context": null diff --git a/tests/integration/recordings/responses/c2199d6064db.json b/tests/integration/recordings/responses/c2199d6064db.json index 73194cc00..ff7298e86 100644 --- a/tests/integration/recordings/responses/c2199d6064db.json +++ b/tests/integration/recordings/responses/c2199d6064db.json @@ -20,390 +20,390 @@ "data": [ { "embedding": [ - -0.021827588, - 0.08818103, - -0.10864717, - 0.0027738505, - 0.049183175, - -0.030155653, - -0.015535575, - 0.027562236, - -0.025055608, - 0.016142149, - 0.12481904, - 0.0027390872, - -0.033304155, - -0.007155499, - -0.07006565, - -0.028012667, - -0.0974939, - -0.09156265, - 0.013381448, - 0.08751534, - 0.013976399, - 0.036656633, - -0.0363098, - -0.019737098, - 0.04459191, - -0.009628102, - -0.018323021, - 0.048807826, - -0.015294308, - -0.071472056, - 0.04096934, - 0.08271212, - 0.06394962, - 0.014480425, - 0.13194743, - 0.030426797, - 0.10103986, - -0.030337727, - -0.047615312, - 0.044662375, - 0.027032219, - -0.029383352, - 0.038528103, - 0.005350361, - 0.014771562, - 0.02561623, - 0.0041866824, - 0.0035074751, - 0.029762248, - -0.036631253, - -0.045908086, - 0.031111827, - -0.07789252, - -0.019519411, - 0.053894877, - -0.015229676, - -0.0016866667, - 0.016928526, - 0.019906636, - 0.071048684, - 0.009945389, - 0.031127382, - -0.010339295, - 0.029969081, - 0.1150558, - 0.0257364, - -0.05285643, - -0.042424288, - 0.00530526, - -0.09986522, - -0.12739678, - -0.012008937, - -0.013796879, - 0.052672364, - -0.017240625, - 0.009655106, - -0.07752442, - 0.001446598, - 0.06974642, - -0.084652565, - -0.06148656, - -0.1424512, - 0.00971367, - -0.008617611, - -0.03184207, - 0.12822424, - 0.05323436, - 0.021975016, - 0.0026292745, - 0.015444466, - -0.042529456, - 0.031529475, - -0.062093526, - 0.044023193, - -0.006063745, - 0.06960859, - 0.0050675236, - 0.05936227, - 0.006593922, - 0.08395398, - -0.0067747384, - -0.041917052, - 0.027087294, - 0.1064389, - -0.03939661, - -0.053915743, - 0.0969116, - -0.008478297, - 0.03400473, - -0.033850323, - 0.0022322247, - -0.08182309, - -0.008227045, - -0.112729885, - 0.0058874753, - -0.09516338, - -0.07956543, - 0.0528746, - -0.08121418, - 0.034270033, - 0.079010375, - -0.026773734, - -0.043880418, - 0.0067898994, - -0.054401524, - -0.021739269, - 0.08060149, - -3.9385423e-33, - -0.0072775874, - -0.07965713, - 0.024867468, - 0.115594625, - 0.035952598, - -0.07256428, - 0.01264772, - 0.05078877, - -0.1001076, - 0.019520493, - 0.003609843, - -0.07002774, - 0.00796547, - 0.029297192, - -0.017813923, - 0.026997875, - 0.016828112, - 0.035944253, - -0.020945141, - -0.032345034, - 0.056713093, - -0.009717346, - -0.059717353, - -0.053816583, - -0.055860512, - 0.0652541, - -0.024728304, - -0.07780815, - 0.038602088, - 0.008995879, - 0.009711051, - -0.02800488, - -0.02488407, - -0.001753672, - 0.025541821, - 0.03461599, - 3.1180356e-05, - 0.0034299733, - -0.04524332, - 0.034621477, - -0.025317375, - -0.029820684, - -0.019064484, - -0.023168772, - 0.049378216, - -0.0614278, - 0.00038631904, - 0.0028947273, - 0.027602436, - 0.0069355685, - -0.020665208, - 0.0607627, - 0.015200459, - 0.038925096, - -0.025373906, - -0.0017942133, - -0.019378444, - -0.005707356, - -0.01781858, - 0.03804118, - 0.032033492, - 0.039991416, - -0.096098565, - 0.0007088372, - -0.018460834, - -0.06865977, - -0.007682667, - -0.083552696, - 0.10225278, - 0.05144313, - -0.033060983, - -0.05033815, - 0.043931242, - 0.017761385, - -0.006623071, - -0.018680306, - 0.012787289, - 0.016647147, - -0.095078625, - -0.023556676, - 0.0068797185, - -0.07225466, - -0.0030222975, - -0.06930809, - -0.027324349, - -0.06728827, - -0.0066746464, - -0.06802411, - 0.044557177, - -0.09791178, - 0.05094532, - 0.010023194, - -0.04618695, - -0.067631915, - 0.044459086, - 2.564085e-33, - 0.0148239555, - 0.071699664, - -0.05235211, - 0.011046101, - -0.01389393, - 0.07070217, - 0.09194932, - -0.019197263, - -0.01579352, - 0.14807871, - 0.03188067, - 0.022338957, - 0.070754, - -0.037077773, - 0.08807045, - -0.018151604, - -0.013233297, - -0.04176197, - -0.05230764, - -0.0027928778, - -0.024819419, - 0.13973284, - 0.07498215, - 0.05643386, - -0.02942886, - 0.017126264, - 0.03372573, - 0.068746336, - 0.020448433, - -0.018980682, - 0.081244655, - 0.06527421, - -0.09341324, - 0.0037619828, - 0.06348108, - -0.08774056, - 0.092889525, - -0.024263546, - 0.029117694, - 0.0034306366, - 0.055297706, - 0.102015935, - -0.023556657, - 0.065803, - 0.015247541, - 0.034352973, - 0.105588056, - 0.011606838, - 0.04098301, - -0.056642916, - 0.037729684, - -0.04976193, - 0.047909457, - 0.0042117573, - -0.014169, - 0.07561971, - -0.0096767275, - 0.055205546, - -0.031133024, - 0.019914651, - -0.025017431, - 0.031833746, - -0.019527186, - -0.009863273, - -0.020237885, - -0.033213306, - -0.026289295, - 0.038861252, - 0.012964407, - -0.041289695, - 0.012831493, - 0.028716395, - -0.054101057, - -0.07626151, - 0.021948934, - -0.023362676, - -0.026700463, - -0.029420532, - 0.0052917786, - 0.012322609, - 0.052309964, - 0.005428001, - -0.0063846395, - 0.046033006, - 0.042387757, - -0.018442502, - 0.012625506, - 0.093027025, - -0.0059689214, - -0.015190377, - -0.011668946, - 0.048090797, - 0.025912488, - 0.050898798, - 0.005562451, - -1.5056784e-08, - -0.030993447, - -0.07005236, - -0.032605737, - -0.00874509, - -0.004551062, - 0.07593507, - -0.032746524, - -0.08790053, - -0.032251474, - -0.024588991, - 0.051248234, - -0.0345528, - -0.08264784, - 0.013345202, - -0.020562632, - -0.05624872, - -0.009445643, - -0.015907064, - -0.036610577, - 0.010109376, - -0.0343682, - 0.0315048, - -0.00014384133, - 0.010448328, - 0.017060373, - 0.015475448, - 0.074810885, - 0.07080812, - -0.050022244, - -0.047005255, - 0.013738294, - 0.060728636, - -0.009370956, - -0.015692767, - -0.01834865, - 0.12297243, - 0.11857768, - 0.123661466, - 0.022802081, - -0.019996397, - -0.07401723, - -0.004714934, - -0.02488245, - 0.006072489, - -0.066606365, - -0.081319734, - -0.08740771, - -0.06348687, - -0.039211858, - -0.11271469, - -0.030644065, - 0.026577946, - -0.06322251, - 0.042043004, - -0.03901968, - -0.009200455, - 0.0050292667, - 0.001581719, - -0.058653522, - 0.04309485, - 0.066819645, - 0.062200524, - 0.021176148, - -0.04108276 + -0.021802, + 0.088129535, + -0.10867403, + 0.0027561262, + 0.04917365, + -0.030165128, + -0.0155558735, + 0.027549915, + -0.025064131, + 0.016137881, + 0.124836035, + 0.0027821937, + -0.033310093, + -0.0071708336, + -0.07004796, + -0.027996853, + -0.09748515, + -0.091607764, + 0.013367206, + 0.08752305, + 0.013990884, + 0.03663788, + -0.036330026, + -0.019752761, + 0.04456914, + -0.009629443, + -0.01832647, + 0.048832405, + -0.015315298, + -0.07147843, + 0.04094573, + 0.082709365, + 0.063961774, + 0.01448001, + 0.13194442, + 0.0303949, + 0.101027474, + -0.030359762, + -0.047630757, + 0.044637363, + 0.027034018, + -0.029368822, + 0.038537122, + 0.0053882804, + 0.01478374, + 0.025617138, + 0.0041860593, + 0.0034900715, + 0.029765956, + -0.036669906, + -0.04589116, + 0.031120853, + -0.07786974, + -0.019517597, + 0.053876307, + -0.0152282175, + -0.0016955235, + 0.016938528, + 0.019939963, + 0.07106882, + 0.009938938, + 0.03114348, + -0.010335175, + 0.029952966, + 0.115054145, + 0.025746102, + -0.052842245, + -0.042447682, + 0.0053093657, + -0.09987591, + -0.12741813, + -0.012022532, + -0.013787561, + 0.05265948, + -0.01723935, + 0.009638554, + -0.0775266, + 0.0014047497, + 0.06974368, + -0.08465856, + -0.061480872, + -0.14244927, + 0.0096944375, + -0.008611519, + -0.0318523, + 0.12823504, + 0.053257603, + 0.021978743, + 0.0026468195, + 0.015444479, + -0.042528655, + 0.031551417, + -0.06209267, + 0.044017885, + -0.0060390937, + 0.06959196, + 0.0050514904, + 0.059341036, + 0.00658094, + 0.08397857, + -0.0067914296, + -0.041901726, + 0.027081704, + 0.106456675, + -0.039408114, + -0.053899165, + 0.09689717, + -0.0084604705, + 0.03398384, + -0.033843804, + 0.002225838, + -0.08180734, + -0.008216738, + -0.11271415, + 0.0058824755, + -0.095151186, + -0.07958445, + 0.052868627, + -0.08120183, + 0.034291897, + 0.07903789, + -0.02675632, + -0.04391073, + 0.0067707864, + -0.05438546, + -0.021719433, + 0.080597855, + -3.9388086e-33, + -0.0072714644, + -0.079664536, + 0.024838887, + 0.115598045, + 0.03591746, + -0.07254434, + 0.012642099, + 0.050809097, + -0.100082524, + 0.019521356, + 0.0035883472, + -0.07001022, + 0.007977421, + 0.029305879, + -0.017785804, + 0.02702277, + 0.016827941, + 0.035956737, + -0.0209356, + -0.032321777, + 0.056705642, + -0.009747762, + -0.059722506, + -0.053817417, + -0.055837773, + 0.06526892, + -0.024752634, + -0.07778206, + 0.038636208, + 0.008998632, + 0.009699391, + -0.02798574, + -0.024878206, + -0.0017547129, + 0.025541965, + 0.034623418, + -8.975541e-06, + 0.0034556785, + -0.04525613, + 0.03461154, + -0.025307115, + -0.02981576, + -0.019071916, + -0.023184983, + 0.049324982, + -0.061433185, + 0.00038017757, + 0.0028894164, + 0.027610173, + 0.0069347974, + -0.020659719, + 0.060771395, + 0.015200205, + 0.038918514, + -0.025353896, + -0.0017897633, + -0.019378036, + -0.0056970986, + -0.017806012, + 0.038060427, + 0.0320353, + 0.03998783, + -0.09612384, + 0.0006942505, + -0.018478483, + -0.06866618, + -0.0077035497, + -0.083554305, + 0.10223985, + 0.05141575, + -0.033018276, + -0.05033401, + 0.043923385, + 0.017748218, + -0.006601344, + -0.018691983, + 0.012763011, + 0.016694913, + -0.095070764, + -0.023533016, + 0.006879241, + -0.07225332, + -0.0029991802, + -0.06930797, + -0.027289826, + -0.0672911, + -0.006683099, + -0.06801406, + 0.04452207, + -0.09788058, + 0.050909285, + 0.010051549, + -0.04617998, + -0.067622505, + 0.04447288, + 2.5643933e-33, + 0.014783131, + 0.071710624, + -0.05237768, + 0.011041238, + -0.013921518, + 0.07072471, + 0.091977395, + -0.01916791, + -0.015780058, + 0.14812021, + 0.031904023, + 0.022344623, + 0.07071857, + -0.037060503, + 0.08806883, + -0.018145561, + -0.013254877, + -0.041782882, + -0.052317847, + -0.00279131, + -0.024807084, + 0.13974102, + 0.074973755, + 0.056424167, + -0.029412953, + 0.017093861, + 0.03373144, + 0.06874087, + 0.020454561, + -0.018965451, + 0.081238694, + 0.06527906, + -0.09342225, + 0.0037720343, + 0.06347132, + -0.08775714, + 0.09286548, + -0.024266576, + 0.029101077, + 0.0034162905, + 0.05528427, + 0.102037616, + -0.023588225, + 0.065829135, + 0.01520327, + 0.034344077, + 0.10559419, + 0.011605323, + 0.0409873, + -0.056635953, + 0.037730522, + -0.04976337, + 0.047961522, + 0.0042118295, + -0.014172872, + 0.07564937, + -0.009671058, + 0.05520304, + -0.031121492, + 0.019924358, + -0.024975697, + 0.031822197, + -0.019536836, + -0.009870229, + -0.020225972, + -0.03319855, + -0.026266782, + 0.038882248, + 0.012940086, + -0.041266225, + 0.012833021, + 0.028703777, + -0.054075323, + -0.07628176, + 0.021953572, + -0.023357453, + -0.026714878, + -0.029401133, + 0.005280363, + 0.012325193, + 0.05232579, + 0.0054451786, + -0.0063759633, + 0.04604998, + 0.042399842, + -0.018433316, + 0.01260558, + 0.09300185, + -0.005949781, + -0.015193224, + -0.011673769, + 0.048114438, + 0.02588804, + 0.050943956, + 0.005536351, + -1.5059804e-08, + -0.03100338, + -0.07003323, + -0.032613333, + -0.008732137, + -0.0045523546, + 0.0759239, + -0.032725554, + -0.08790561, + -0.032228027, + -0.02459868, + 0.051224917, + -0.034561895, + -0.08266327, + 0.013319846, + -0.020541467, + -0.056271035, + -0.009450659, + -0.015903467, + -0.036625408, + 0.010096497, + -0.03440534, + 0.0315293, + -0.00013937108, + 0.010463861, + 0.017065981, + 0.015492903, + 0.074808784, + 0.07079003, + -0.050000764, + -0.047017526, + 0.01375958, + 0.060757488, + -0.009361379, + -0.01570009, + -0.01836736, + 0.12301148, + 0.1185397, + 0.12366319, + 0.022782512, + -0.020027133, + -0.07401259, + -0.0047104736, + -0.024872223, + 0.006070436, + -0.06660639, + -0.08130306, + -0.0873992, + -0.0634906, + -0.039198957, + -0.11274462, + -0.030654918, + 0.026607778, + -0.063220546, + 0.042023618, + -0.039010853, + -0.009214424, + 0.005044682, + 0.0015641748, + -0.058640927, + 0.043107104, + 0.06682025, + 0.062172387, + 0.021147223, + -0.041068073 ], "index": 0, "object": "embedding" diff --git a/tests/integration/recordings/responses/c9cba6f3ee38.json b/tests/integration/recordings/responses/c9cba6f3ee38.json index 488ac6563..02363c70e 100644 --- a/tests/integration/recordings/responses/c9cba6f3ee38.json +++ b/tests/integration/recordings/responses/c9cba6f3ee38.json @@ -20,15 +20,15 @@ "__type__": "ollama._types.GenerateResponse", "__data__": { "model": "llama-guard3:1b", - "created_at": "2025-08-01T23:14:21.909783Z", + "created_at": "2025-09-03T17:38:03.002753Z", "done": true, "done_reason": "stop", - "total_duration": 311036333, - "load_duration": 37569542, + "total_duration": 334941166, + "load_duration": 149512166, "prompt_eval_count": 219, - "prompt_eval_duration": 259000000, + "prompt_eval_duration": 173843500, "eval_count": 2, - "eval_duration": 12000000, + "eval_duration": 11119166, "response": "safe", "thinking": null, "context": null diff --git a/tests/integration/recordings/responses/cb3df2a1dc22.json b/tests/integration/recordings/responses/cb3df2a1dc22.json index d65945ac1..41db65a5e 100644 --- a/tests/integration/recordings/responses/cb3df2a1dc22.json +++ b/tests/integration/recordings/responses/cb3df2a1dc22.json @@ -1,7 +1,7 @@ { "request": { "method": "POST", - "url": "http://localhost:11434/v1/v1/chat/completions", + "url": "http://0.0.0.0:11434/v1/v1/chat/completions", "headers": {}, "body": { "model": "llama3.2:3b-instruct-fp16", @@ -20,14 +20,14 @@ "body": { "__type__": "openai.types.chat.chat_completion.ChatCompletion", "__data__": { - "id": "chatcmpl-877", + "id": "chatcmpl-271", "choices": [ { "finish_reason": "stop", "index": 0, "logprobs": null, "message": { - "content": "I'm not capable of directly testing the functionality of external systems like Telemetry. However, I can provide you with some general information about creating telemetry data and offer suggestions on how to set up a basic telemetry system.\r\n\r\nTelemetry is the automatic measurement, reporting, and transmission of data from sensors or other devices. In the context of OpenAI, telemetry refers to the collection and analysis of data related to the company's products and services.\r\n\r\nTo create telemetry creation using the OpenAI APIs you would need to follow these steps:\r\n\r\n1. Register for an OpenAI account and get an access token.\r\n2. Choose the OpenAI API that you want to use (e.g., GPT-3).\r\n3. Create a new file or project in your preferred programming language or framework.\r\n4. Import the necessary libraries and modules to interact with the OpenAI API.\r\n5. Use the OpenAI API to create and send telemetry data.\r\n\r\nHere is an example of how you might create a basic telemetry system using Python and the OpenAI GPT-3 API:\r\n\r\n```python\r\nimport os\r\nimport json\r\n\r\n# Set your OpenAI access token\r\naccess_token = \"YOUR_OPENAI_ACCESS_TOKEN\"\r\n\r\n# Define the telemetry data\r\ntelemetry_data = {\r\n \"name\": \"example-telemetry\",\r\n \"description\": \"Example telemetry data.\r\n\r\n # Define the telemetry metrics\r\n \"metrics\": [\r\n {\"key\": \"users\", \"value\": 100},\r\n {\"key\": \" engagement\", \"value\": 20}\r\n ]\r\n}\r\n\r\n# Convert the telemetry data to JSON\r\ntelemetry_json = json.dumps(telemetry_data)\r\n\r\n# Set the OpenAI API endpoint and headers\r\napi_endpoint = \"https://api.openai.com/v1/telemetry\"\r\nheaders = {\r\n \"Authorization\": f\"Bearer {access_token}\",\r\n \"Content-Type\": \"application/json\"\r\n}\r\n\r\n# Send the telemetry data to the OpenAI API\r\nimport requests\r\n\r\nresponse = requests.post(api_endpoint, headers=headers, data=telemetry_json)\r\n\r\n# Check if the request was successful\r\nif response.status_code == 200:\r\n print(\"Telemetry data sent successfully\")\r\nelse:\r\n print(\"Error sending telemetry data\")\r\n```\n\nPlease note that this is a basic example and you should adjust it according to your needs. Also, the specific implementation details may vary depending on the OpenAI API you're using and the programming language or framework you're working with.\r\n\r\nI hope this helps! Let me know if you have any further questions.", + "content": "# OpenAI Telemetry Creation Testing\n\nThis guide provides a test environment for creating and analyzing telemetries using the OpenAI API.\n\n## Prerequisites\n\n- Python 3.8 or higher\n- `requests` library\n- An OpenAI API key (create an account on the [OpenAI website](https://openai.com/))\n\n## Step 1: Install Required Libraries\n\nFirst, install the required libraries by running the following command in your terminal:\n\n```bash\npip install requests\n```\n\n## Step 2: Create a Telemetry Object\n\nCreate a new Python file (e.g., `telemetry.py`) and import the required library. Define a telemetry object with the relevant data:\n\n```python\n# Import the requests library\nimport requests\n\nclass Telemetry:\n def __init__(self, api_key):\n \"\"\"\n Initialize the telemetry object.\n\n Args:\n api_key (str): The OpenAI API key.\n \"\"\"\n\n self.api_key = api_key\n\n def create_telemetry(self, id, data):\n \"\"\"\n Create a new telemetry entry using the OpenAI API.\n\n Args:\n id (str): The ID of the model or dataset.\n data (dict): The telemetry data to be created.\n\n Returns:\n dict: The response from the OpenAI API.\n\n Raises:\n ValueError: If the request fails.\n \"\"\"\n\n url = f\"https://api.openai.com/v1/models/{id}/telemetry\"\n\n headers = {\n \"Authorization\": self.api_key,\n \"Content-Type\": \"application/json\",\n }\n\n telemetry_data = {\"events\": data}\n\n response = requests.post(url, json=telemetry_data, headers=headers)\n\n if not response.ok:\n raise ValueError(\"Failed to create telemetry\")\n\n return response.json()\n```\n\n## Step 3: Usage Example\n\nHere's an example usage of the `Telemetry` class:\n\n```python\n# Create a new Telemetry object with your OpenAI API key\ntelemetry = Telemetry(\n \"YOUR_OPENAI_API_KEY_HERE\"\n)\n\n# Define the telemetry data\ndata = {\"event\": \"example_event\"}\n\n# Create a new telemetry entry\nid = \"my_model_id\" # Replace with your model or dataset ID\n\ntry:\n result = telemetry.create_telemetry(id, data)\n print(result)\nexcept ValueError as e:\n print(e)\n```\n\nThis code creates a new `Telemetry` object, defines some sample telemetry data, and uses the `create_telemetry` method to create a new telemetry entry. The response from the OpenAI API is printed out.\n\nNote: Replace `\"YOUR_OPENAI_API_KEY_HERE\"` with your actual OpenAI API key.\n\n## Conclusion\n\nThis guide provides a basic example of how to create telemetries using the OpenAI API. You can modify the code and implement additional features as needed for your project.\n\nStay updated on our latest tutorials and guides:\n\n* [Check out our Discord channel](link): https://discord.gg/openai-exists\n\nHappy coding!", "refusal": null, "role": "assistant", "annotations": null, @@ -37,15 +37,15 @@ } } ], - "created": 1754510083, + "created": 1756921299, "model": "llama3.2:3b-instruct-fp16", "object": "chat.completion", "service_tier": null, "system_fingerprint": "fp_ollama", "usage": { - "completion_tokens": 505, + "completion_tokens": 633, "prompt_tokens": 30, - "total_tokens": 535, + "total_tokens": 663, "completion_tokens_details": null, "prompt_tokens_details": null } diff --git a/tests/integration/recordings/responses/cd094caaf1c0.json b/tests/integration/recordings/responses/cd094caaf1c0.json index c0b3873d3..70a3d334d 100644 --- a/tests/integration/recordings/responses/cd094caaf1c0.json +++ b/tests/integration/recordings/responses/cd094caaf1c0.json @@ -21,7 +21,7 @@ "__type__": "ollama._types.GenerateResponse", "__data__": { "model": "llama3.2:3b-instruct-fp16", - "created_at": "2025-08-04T22:55:14.822116Z", + "created_at": "2025-09-03T17:36:21.138019Z", "done": false, "done_reason": null, "total_duration": null, @@ -39,7 +39,7 @@ "__type__": "ollama._types.GenerateResponse", "__data__": { "model": "llama3.2:3b-instruct-fp16", - "created_at": "2025-08-04T22:55:14.874482Z", + "created_at": "2025-09-03T17:36:21.179853Z", "done": false, "done_reason": null, "total_duration": null, @@ -57,7 +57,7 @@ "__type__": "ollama._types.GenerateResponse", "__data__": { "model": "llama3.2:3b-instruct-fp16", - "created_at": "2025-08-04T22:55:14.926533Z", + "created_at": "2025-09-03T17:36:21.220635Z", "done": false, "done_reason": null, "total_duration": null, @@ -75,7 +75,7 @@ "__type__": "ollama._types.GenerateResponse", "__data__": { "model": "llama3.2:3b-instruct-fp16", - "created_at": "2025-08-04T22:55:14.980659Z", + "created_at": "2025-09-03T17:36:21.261418Z", "done": false, "done_reason": null, "total_duration": null, @@ -93,7 +93,7 @@ "__type__": "ollama._types.GenerateResponse", "__data__": { "model": "llama3.2:3b-instruct-fp16", - "created_at": "2025-08-04T22:55:15.036126Z", + "created_at": "2025-09-03T17:36:21.301991Z", "done": false, "done_reason": null, "total_duration": null, @@ -111,7 +111,7 @@ "__type__": "ollama._types.GenerateResponse", "__data__": { "model": "llama3.2:3b-instruct-fp16", - "created_at": "2025-08-04T22:55:15.087015Z", + "created_at": "2025-09-03T17:36:21.3425Z", "done": false, "done_reason": null, "total_duration": null, @@ -129,7 +129,7 @@ "__type__": "ollama._types.GenerateResponse", "__data__": { "model": "llama3.2:3b-instruct-fp16", - "created_at": "2025-08-04T22:55:15.137306Z", + "created_at": "2025-09-03T17:36:21.38302Z", "done": false, "done_reason": null, "total_duration": null, @@ -147,7 +147,7 @@ "__type__": "ollama._types.GenerateResponse", "__data__": { "model": "llama3.2:3b-instruct-fp16", - "created_at": "2025-08-04T22:55:15.189129Z", + "created_at": "2025-09-03T17:36:21.423862Z", "done": false, "done_reason": null, "total_duration": null, @@ -165,7 +165,7 @@ "__type__": "ollama._types.GenerateResponse", "__data__": { "model": "llama3.2:3b-instruct-fp16", - "created_at": "2025-08-04T22:55:15.240264Z", + "created_at": "2025-09-03T17:36:21.464611Z", "done": false, "done_reason": null, "total_duration": null, @@ -183,7 +183,7 @@ "__type__": "ollama._types.GenerateResponse", "__data__": { "model": "llama3.2:3b-instruct-fp16", - "created_at": "2025-08-04T22:55:15.291201Z", + "created_at": "2025-09-03T17:36:21.505714Z", "done": false, "done_reason": null, "total_duration": null, @@ -201,7 +201,7 @@ "__type__": "ollama._types.GenerateResponse", "__data__": { "model": "llama3.2:3b-instruct-fp16", - "created_at": "2025-08-04T22:55:15.341476Z", + "created_at": "2025-09-03T17:36:21.547075Z", "done": false, "done_reason": null, "total_duration": null, @@ -219,7 +219,7 @@ "__type__": "ollama._types.GenerateResponse", "__data__": { "model": "llama3.2:3b-instruct-fp16", - "created_at": "2025-08-04T22:55:15.39284Z", + "created_at": "2025-09-03T17:36:21.588896Z", "done": false, "done_reason": null, "total_duration": null, @@ -237,7 +237,7 @@ "__type__": "ollama._types.GenerateResponse", "__data__": { "model": "llama3.2:3b-instruct-fp16", - "created_at": "2025-08-04T22:55:15.44438Z", + "created_at": "2025-09-03T17:36:21.629146Z", "done": false, "done_reason": null, "total_duration": null, @@ -255,7 +255,7 @@ "__type__": "ollama._types.GenerateResponse", "__data__": { "model": "llama3.2:3b-instruct-fp16", - "created_at": "2025-08-04T22:55:15.497561Z", + "created_at": "2025-09-03T17:36:21.669722Z", "done": false, "done_reason": null, "total_duration": null, @@ -273,7 +273,7 @@ "__type__": "ollama._types.GenerateResponse", "__data__": { "model": "llama3.2:3b-instruct-fp16", - "created_at": "2025-08-04T22:55:15.550461Z", + "created_at": "2025-09-03T17:36:21.710707Z", "done": false, "done_reason": null, "total_duration": null, @@ -291,7 +291,7 @@ "__type__": "ollama._types.GenerateResponse", "__data__": { "model": "llama3.2:3b-instruct-fp16", - "created_at": "2025-08-04T22:55:15.599866Z", + "created_at": "2025-09-03T17:36:21.751267Z", "done": false, "done_reason": null, "total_duration": null, @@ -309,7 +309,7 @@ "__type__": "ollama._types.GenerateResponse", "__data__": { "model": "llama3.2:3b-instruct-fp16", - "created_at": "2025-08-04T22:55:15.651899Z", + "created_at": "2025-09-03T17:36:21.791565Z", "done": false, "done_reason": null, "total_duration": null, @@ -327,7 +327,7 @@ "__type__": "ollama._types.GenerateResponse", "__data__": { "model": "llama3.2:3b-instruct-fp16", - "created_at": "2025-08-04T22:55:15.702896Z", + "created_at": "2025-09-03T17:36:21.83176Z", "done": false, "done_reason": null, "total_duration": null, @@ -345,7 +345,7 @@ "__type__": "ollama._types.GenerateResponse", "__data__": { "model": "llama3.2:3b-instruct-fp16", - "created_at": "2025-08-04T22:55:15.75492Z", + "created_at": "2025-09-03T17:36:21.872029Z", "done": false, "done_reason": null, "total_duration": null, @@ -363,7 +363,7 @@ "__type__": "ollama._types.GenerateResponse", "__data__": { "model": "llama3.2:3b-instruct-fp16", - "created_at": "2025-08-04T22:55:15.805824Z", + "created_at": "2025-09-03T17:36:21.914066Z", "done": false, "done_reason": null, "total_duration": null, @@ -381,7 +381,7 @@ "__type__": "ollama._types.GenerateResponse", "__data__": { "model": "llama3.2:3b-instruct-fp16", - "created_at": "2025-08-04T22:55:15.8564Z", + "created_at": "2025-09-03T17:36:21.955317Z", "done": false, "done_reason": null, "total_duration": null, @@ -399,7 +399,7 @@ "__type__": "ollama._types.GenerateResponse", "__data__": { "model": "llama3.2:3b-instruct-fp16", - "created_at": "2025-08-04T22:55:15.907374Z", + "created_at": "2025-09-03T17:36:21.995588Z", "done": false, "done_reason": null, "total_duration": null, @@ -417,7 +417,7 @@ "__type__": "ollama._types.GenerateResponse", "__data__": { "model": "llama3.2:3b-instruct-fp16", - "created_at": "2025-08-04T22:55:15.959599Z", + "created_at": "2025-09-03T17:36:22.03605Z", "done": false, "done_reason": null, "total_duration": null, @@ -435,7 +435,7 @@ "__type__": "ollama._types.GenerateResponse", "__data__": { "model": "llama3.2:3b-instruct-fp16", - "created_at": "2025-08-04T22:55:16.012545Z", + "created_at": "2025-09-03T17:36:22.076924Z", "done": false, "done_reason": null, "total_duration": null, @@ -453,7 +453,7 @@ "__type__": "ollama._types.GenerateResponse", "__data__": { "model": "llama3.2:3b-instruct-fp16", - "created_at": "2025-08-04T22:55:16.065508Z", + "created_at": "2025-09-03T17:36:22.117922Z", "done": false, "done_reason": null, "total_duration": null, @@ -471,7 +471,7 @@ "__type__": "ollama._types.GenerateResponse", "__data__": { "model": "llama3.2:3b-instruct-fp16", - "created_at": "2025-08-04T22:55:16.122471Z", + "created_at": "2025-09-03T17:36:22.158925Z", "done": false, "done_reason": null, "total_duration": null, @@ -489,7 +489,7 @@ "__type__": "ollama._types.GenerateResponse", "__data__": { "model": "llama3.2:3b-instruct-fp16", - "created_at": "2025-08-04T22:55:16.175606Z", + "created_at": "2025-09-03T17:36:22.199113Z", "done": false, "done_reason": null, "total_duration": null, @@ -507,7 +507,7 @@ "__type__": "ollama._types.GenerateResponse", "__data__": { "model": "llama3.2:3b-instruct-fp16", - "created_at": "2025-08-04T22:55:16.227171Z", + "created_at": "2025-09-03T17:36:22.239797Z", "done": false, "done_reason": null, "total_duration": null, @@ -525,7 +525,7 @@ "__type__": "ollama._types.GenerateResponse", "__data__": { "model": "llama3.2:3b-instruct-fp16", - "created_at": "2025-08-04T22:55:16.278522Z", + "created_at": "2025-09-03T17:36:22.280592Z", "done": false, "done_reason": null, "total_duration": null, @@ -543,7 +543,7 @@ "__type__": "ollama._types.GenerateResponse", "__data__": { "model": "llama3.2:3b-instruct-fp16", - "created_at": "2025-08-04T22:55:16.329492Z", + "created_at": "2025-09-03T17:36:22.321607Z", "done": false, "done_reason": null, "total_duration": null, @@ -561,7 +561,7 @@ "__type__": "ollama._types.GenerateResponse", "__data__": { "model": "llama3.2:3b-instruct-fp16", - "created_at": "2025-08-04T22:55:16.381232Z", + "created_at": "2025-09-03T17:36:22.36237Z", "done": false, "done_reason": null, "total_duration": null, @@ -579,7 +579,7 @@ "__type__": "ollama._types.GenerateResponse", "__data__": { "model": "llama3.2:3b-instruct-fp16", - "created_at": "2025-08-04T22:55:16.43463Z", + "created_at": "2025-09-03T17:36:22.402735Z", "done": false, "done_reason": null, "total_duration": null, @@ -597,7 +597,7 @@ "__type__": "ollama._types.GenerateResponse", "__data__": { "model": "llama3.2:3b-instruct-fp16", - "created_at": "2025-08-04T22:55:16.483135Z", + "created_at": "2025-09-03T17:36:22.44328Z", "done": false, "done_reason": null, "total_duration": null, @@ -615,7 +615,7 @@ "__type__": "ollama._types.GenerateResponse", "__data__": { "model": "llama3.2:3b-instruct-fp16", - "created_at": "2025-08-04T22:55:16.544729Z", + "created_at": "2025-09-03T17:36:22.48369Z", "done": false, "done_reason": null, "total_duration": null, @@ -633,7 +633,7 @@ "__type__": "ollama._types.GenerateResponse", "__data__": { "model": "llama3.2:3b-instruct-fp16", - "created_at": "2025-08-04T22:55:16.605218Z", + "created_at": "2025-09-03T17:36:22.524383Z", "done": false, "done_reason": null, "total_duration": null, @@ -651,7 +651,7 @@ "__type__": "ollama._types.GenerateResponse", "__data__": { "model": "llama3.2:3b-instruct-fp16", - "created_at": "2025-08-04T22:55:16.660652Z", + "created_at": "2025-09-03T17:36:22.564975Z", "done": false, "done_reason": null, "total_duration": null, @@ -669,7 +669,7 @@ "__type__": "ollama._types.GenerateResponse", "__data__": { "model": "llama3.2:3b-instruct-fp16", - "created_at": "2025-08-04T22:55:16.718606Z", + "created_at": "2025-09-03T17:36:22.605886Z", "done": false, "done_reason": null, "total_duration": null, @@ -687,7 +687,7 @@ "__type__": "ollama._types.GenerateResponse", "__data__": { "model": "llama3.2:3b-instruct-fp16", - "created_at": "2025-08-04T22:55:16.772786Z", + "created_at": "2025-09-03T17:36:22.646199Z", "done": false, "done_reason": null, "total_duration": null, @@ -705,7 +705,7 @@ "__type__": "ollama._types.GenerateResponse", "__data__": { "model": "llama3.2:3b-instruct-fp16", - "created_at": "2025-08-04T22:55:16.826904Z", + "created_at": "2025-09-03T17:36:22.686594Z", "done": false, "done_reason": null, "total_duration": null, @@ -723,7 +723,7 @@ "__type__": "ollama._types.GenerateResponse", "__data__": { "model": "llama3.2:3b-instruct-fp16", - "created_at": "2025-08-04T22:55:16.878735Z", + "created_at": "2025-09-03T17:36:22.726941Z", "done": false, "done_reason": null, "total_duration": null, @@ -741,7 +741,7 @@ "__type__": "ollama._types.GenerateResponse", "__data__": { "model": "llama3.2:3b-instruct-fp16", - "created_at": "2025-08-04T22:55:16.931262Z", + "created_at": "2025-09-03T17:36:22.767696Z", "done": false, "done_reason": null, "total_duration": null, @@ -759,7 +759,7 @@ "__type__": "ollama._types.GenerateResponse", "__data__": { "model": "llama3.2:3b-instruct-fp16", - "created_at": "2025-08-04T22:55:16.984266Z", + "created_at": "2025-09-03T17:36:22.810962Z", "done": false, "done_reason": null, "total_duration": null, @@ -777,7 +777,7 @@ "__type__": "ollama._types.GenerateResponse", "__data__": { "model": "llama3.2:3b-instruct-fp16", - "created_at": "2025-08-04T22:55:17.035518Z", + "created_at": "2025-09-03T17:36:22.851903Z", "done": false, "done_reason": null, "total_duration": null, @@ -795,7 +795,7 @@ "__type__": "ollama._types.GenerateResponse", "__data__": { "model": "llama3.2:3b-instruct-fp16", - "created_at": "2025-08-04T22:55:17.084669Z", + "created_at": "2025-09-03T17:36:22.892412Z", "done": false, "done_reason": null, "total_duration": null, @@ -813,7 +813,7 @@ "__type__": "ollama._types.GenerateResponse", "__data__": { "model": "llama3.2:3b-instruct-fp16", - "created_at": "2025-08-04T22:55:17.138856Z", + "created_at": "2025-09-03T17:36:22.932877Z", "done": false, "done_reason": null, "total_duration": null, @@ -831,7 +831,7 @@ "__type__": "ollama._types.GenerateResponse", "__data__": { "model": "llama3.2:3b-instruct-fp16", - "created_at": "2025-08-04T22:55:17.19578Z", + "created_at": "2025-09-03T17:36:22.973247Z", "done": false, "done_reason": null, "total_duration": null, @@ -849,7 +849,7 @@ "__type__": "ollama._types.GenerateResponse", "__data__": { "model": "llama3.2:3b-instruct-fp16", - "created_at": "2025-08-04T22:55:17.254009Z", + "created_at": "2025-09-03T17:36:23.013989Z", "done": false, "done_reason": null, "total_duration": null, @@ -867,7 +867,7 @@ "__type__": "ollama._types.GenerateResponse", "__data__": { "model": "llama3.2:3b-instruct-fp16", - "created_at": "2025-08-04T22:55:17.307391Z", + "created_at": "2025-09-03T17:36:23.054251Z", "done": false, "done_reason": null, "total_duration": null, @@ -885,7 +885,7 @@ "__type__": "ollama._types.GenerateResponse", "__data__": { "model": "llama3.2:3b-instruct-fp16", - "created_at": "2025-08-04T22:55:17.363223Z", + "created_at": "2025-09-03T17:36:23.094676Z", "done": false, "done_reason": null, "total_duration": null, @@ -903,7 +903,7 @@ "__type__": "ollama._types.GenerateResponse", "__data__": { "model": "llama3.2:3b-instruct-fp16", - "created_at": "2025-08-04T22:55:17.420075Z", + "created_at": "2025-09-03T17:36:23.135452Z", "done": false, "done_reason": null, "total_duration": null, @@ -921,7 +921,7 @@ "__type__": "ollama._types.GenerateResponse", "__data__": { "model": "llama3.2:3b-instruct-fp16", - "created_at": "2025-08-04T22:55:17.475276Z", + "created_at": "2025-09-03T17:36:23.176336Z", "done": false, "done_reason": null, "total_duration": null, @@ -939,7 +939,7 @@ "__type__": "ollama._types.GenerateResponse", "__data__": { "model": "llama3.2:3b-instruct-fp16", - "created_at": "2025-08-04T22:55:17.529886Z", + "created_at": "2025-09-03T17:36:23.216888Z", "done": false, "done_reason": null, "total_duration": null, @@ -957,7 +957,7 @@ "__type__": "ollama._types.GenerateResponse", "__data__": { "model": "llama3.2:3b-instruct-fp16", - "created_at": "2025-08-04T22:55:17.587218Z", + "created_at": "2025-09-03T17:36:23.257355Z", "done": false, "done_reason": null, "total_duration": null, @@ -975,7 +975,7 @@ "__type__": "ollama._types.GenerateResponse", "__data__": { "model": "llama3.2:3b-instruct-fp16", - "created_at": "2025-08-04T22:55:17.640408Z", + "created_at": "2025-09-03T17:36:23.297487Z", "done": false, "done_reason": null, "total_duration": null, @@ -993,7 +993,7 @@ "__type__": "ollama._types.GenerateResponse", "__data__": { "model": "llama3.2:3b-instruct-fp16", - "created_at": "2025-08-04T22:55:17.692792Z", + "created_at": "2025-09-03T17:36:23.337777Z", "done": false, "done_reason": null, "total_duration": null, @@ -1011,7 +1011,7 @@ "__type__": "ollama._types.GenerateResponse", "__data__": { "model": "llama3.2:3b-instruct-fp16", - "created_at": "2025-08-04T22:55:17.746336Z", + "created_at": "2025-09-03T17:36:23.37817Z", "done": false, "done_reason": null, "total_duration": null, @@ -1029,7 +1029,7 @@ "__type__": "ollama._types.GenerateResponse", "__data__": { "model": "llama3.2:3b-instruct-fp16", - "created_at": "2025-08-04T22:55:17.801383Z", + "created_at": "2025-09-03T17:36:23.418119Z", "done": false, "done_reason": null, "total_duration": null, @@ -1047,7 +1047,7 @@ "__type__": "ollama._types.GenerateResponse", "__data__": { "model": "llama3.2:3b-instruct-fp16", - "created_at": "2025-08-04T22:55:17.854621Z", + "created_at": "2025-09-03T17:36:23.458074Z", "done": false, "done_reason": null, "total_duration": null, @@ -1065,7 +1065,7 @@ "__type__": "ollama._types.GenerateResponse", "__data__": { "model": "llama3.2:3b-instruct-fp16", - "created_at": "2025-08-04T22:55:17.911212Z", + "created_at": "2025-09-03T17:36:23.498828Z", "done": false, "done_reason": null, "total_duration": null, @@ -1083,7 +1083,7 @@ "__type__": "ollama._types.GenerateResponse", "__data__": { "model": "llama3.2:3b-instruct-fp16", - "created_at": "2025-08-04T22:55:17.970851Z", + "created_at": "2025-09-03T17:36:23.539337Z", "done": false, "done_reason": null, "total_duration": null, @@ -1101,7 +1101,7 @@ "__type__": "ollama._types.GenerateResponse", "__data__": { "model": "llama3.2:3b-instruct-fp16", - "created_at": "2025-08-04T22:55:18.025592Z", + "created_at": "2025-09-03T17:36:23.579947Z", "done": false, "done_reason": null, "total_duration": null, @@ -1119,7 +1119,7 @@ "__type__": "ollama._types.GenerateResponse", "__data__": { "model": "llama3.2:3b-instruct-fp16", - "created_at": "2025-08-04T22:55:18.084169Z", + "created_at": "2025-09-03T17:36:23.620572Z", "done": false, "done_reason": null, "total_duration": null, @@ -1137,7 +1137,7 @@ "__type__": "ollama._types.GenerateResponse", "__data__": { "model": "llama3.2:3b-instruct-fp16", - "created_at": "2025-08-04T22:55:18.142748Z", + "created_at": "2025-09-03T17:36:23.661884Z", "done": false, "done_reason": null, "total_duration": null, @@ -1155,7 +1155,7 @@ "__type__": "ollama._types.GenerateResponse", "__data__": { "model": "llama3.2:3b-instruct-fp16", - "created_at": "2025-08-04T22:55:18.198201Z", + "created_at": "2025-09-03T17:36:23.703234Z", "done": false, "done_reason": null, "total_duration": null, @@ -1173,7 +1173,7 @@ "__type__": "ollama._types.GenerateResponse", "__data__": { "model": "llama3.2:3b-instruct-fp16", - "created_at": "2025-08-04T22:55:18.247029Z", + "created_at": "2025-09-03T17:36:23.743994Z", "done": false, "done_reason": null, "total_duration": null, @@ -1191,7 +1191,7 @@ "__type__": "ollama._types.GenerateResponse", "__data__": { "model": "llama3.2:3b-instruct-fp16", - "created_at": "2025-08-04T22:55:18.298673Z", + "created_at": "2025-09-03T17:36:23.784238Z", "done": false, "done_reason": null, "total_duration": null, @@ -1209,7 +1209,7 @@ "__type__": "ollama._types.GenerateResponse", "__data__": { "model": "llama3.2:3b-instruct-fp16", - "created_at": "2025-08-04T22:55:18.346985Z", + "created_at": "2025-09-03T17:36:23.824425Z", "done": false, "done_reason": null, "total_duration": null, @@ -1227,7 +1227,7 @@ "__type__": "ollama._types.GenerateResponse", "__data__": { "model": "llama3.2:3b-instruct-fp16", - "created_at": "2025-08-04T22:55:18.396338Z", + "created_at": "2025-09-03T17:36:23.864711Z", "done": false, "done_reason": null, "total_duration": null, @@ -1245,7 +1245,7 @@ "__type__": "ollama._types.GenerateResponse", "__data__": { "model": "llama3.2:3b-instruct-fp16", - "created_at": "2025-08-04T22:55:18.44707Z", + "created_at": "2025-09-03T17:36:23.904729Z", "done": false, "done_reason": null, "total_duration": null, @@ -1263,7 +1263,7 @@ "__type__": "ollama._types.GenerateResponse", "__data__": { "model": "llama3.2:3b-instruct-fp16", - "created_at": "2025-08-04T22:55:18.500596Z", + "created_at": "2025-09-03T17:36:23.944762Z", "done": false, "done_reason": null, "total_duration": null, @@ -1281,7 +1281,7 @@ "__type__": "ollama._types.GenerateResponse", "__data__": { "model": "llama3.2:3b-instruct-fp16", - "created_at": "2025-08-04T22:55:18.552919Z", + "created_at": "2025-09-03T17:36:23.985199Z", "done": false, "done_reason": null, "total_duration": null, @@ -1299,7 +1299,7 @@ "__type__": "ollama._types.GenerateResponse", "__data__": { "model": "llama3.2:3b-instruct-fp16", - "created_at": "2025-08-04T22:55:18.605569Z", + "created_at": "2025-09-03T17:36:24.025821Z", "done": false, "done_reason": null, "total_duration": null, @@ -1317,7 +1317,7 @@ "__type__": "ollama._types.GenerateResponse", "__data__": { "model": "llama3.2:3b-instruct-fp16", - "created_at": "2025-08-04T22:55:18.657753Z", + "created_at": "2025-09-03T17:36:24.066639Z", "done": false, "done_reason": null, "total_duration": null, @@ -1335,7 +1335,7 @@ "__type__": "ollama._types.GenerateResponse", "__data__": { "model": "llama3.2:3b-instruct-fp16", - "created_at": "2025-08-04T22:55:18.712933Z", + "created_at": "2025-09-03T17:36:24.109215Z", "done": false, "done_reason": null, "total_duration": null, @@ -1353,7 +1353,7 @@ "__type__": "ollama._types.GenerateResponse", "__data__": { "model": "llama3.2:3b-instruct-fp16", - "created_at": "2025-08-04T22:55:18.765708Z", + "created_at": "2025-09-03T17:36:24.15123Z", "done": false, "done_reason": null, "total_duration": null, @@ -1371,7 +1371,7 @@ "__type__": "ollama._types.GenerateResponse", "__data__": { "model": "llama3.2:3b-instruct-fp16", - "created_at": "2025-08-04T22:55:18.81852Z", + "created_at": "2025-09-03T17:36:24.192856Z", "done": false, "done_reason": null, "total_duration": null, @@ -1389,7 +1389,7 @@ "__type__": "ollama._types.GenerateResponse", "__data__": { "model": "llama3.2:3b-instruct-fp16", - "created_at": "2025-08-04T22:55:18.870752Z", + "created_at": "2025-09-03T17:36:24.23433Z", "done": false, "done_reason": null, "total_duration": null, @@ -1407,7 +1407,7 @@ "__type__": "ollama._types.GenerateResponse", "__data__": { "model": "llama3.2:3b-instruct-fp16", - "created_at": "2025-08-04T22:55:18.922652Z", + "created_at": "2025-09-03T17:36:24.275212Z", "done": false, "done_reason": null, "total_duration": null, @@ -1425,7 +1425,7 @@ "__type__": "ollama._types.GenerateResponse", "__data__": { "model": "llama3.2:3b-instruct-fp16", - "created_at": "2025-08-04T22:55:18.974032Z", + "created_at": "2025-09-03T17:36:24.315722Z", "done": false, "done_reason": null, "total_duration": null, @@ -1443,7 +1443,7 @@ "__type__": "ollama._types.GenerateResponse", "__data__": { "model": "llama3.2:3b-instruct-fp16", - "created_at": "2025-08-04T22:55:19.025272Z", + "created_at": "2025-09-03T17:36:24.355996Z", "done": false, "done_reason": null, "total_duration": null, @@ -1461,7 +1461,7 @@ "__type__": "ollama._types.GenerateResponse", "__data__": { "model": "llama3.2:3b-instruct-fp16", - "created_at": "2025-08-04T22:55:19.076061Z", + "created_at": "2025-09-03T17:36:24.396181Z", "done": false, "done_reason": null, "total_duration": null, @@ -1479,7 +1479,7 @@ "__type__": "ollama._types.GenerateResponse", "__data__": { "model": "llama3.2:3b-instruct-fp16", - "created_at": "2025-08-04T22:55:19.126893Z", + "created_at": "2025-09-03T17:36:24.43716Z", "done": false, "done_reason": null, "total_duration": null, @@ -1497,7 +1497,7 @@ "__type__": "ollama._types.GenerateResponse", "__data__": { "model": "llama3.2:3b-instruct-fp16", - "created_at": "2025-08-04T22:55:19.179123Z", + "created_at": "2025-09-03T17:36:24.478009Z", "done": false, "done_reason": null, "total_duration": null, @@ -1515,7 +1515,7 @@ "__type__": "ollama._types.GenerateResponse", "__data__": { "model": "llama3.2:3b-instruct-fp16", - "created_at": "2025-08-04T22:55:19.230189Z", + "created_at": "2025-09-03T17:36:24.519697Z", "done": false, "done_reason": null, "total_duration": null, @@ -1533,7 +1533,7 @@ "__type__": "ollama._types.GenerateResponse", "__data__": { "model": "llama3.2:3b-instruct-fp16", - "created_at": "2025-08-04T22:55:19.280582Z", + "created_at": "2025-09-03T17:36:24.562228Z", "done": false, "done_reason": null, "total_duration": null, @@ -1551,7 +1551,7 @@ "__type__": "ollama._types.GenerateResponse", "__data__": { "model": "llama3.2:3b-instruct-fp16", - "created_at": "2025-08-04T22:55:19.330127Z", + "created_at": "2025-09-03T17:36:24.604366Z", "done": false, "done_reason": null, "total_duration": null, @@ -1569,7 +1569,7 @@ "__type__": "ollama._types.GenerateResponse", "__data__": { "model": "llama3.2:3b-instruct-fp16", - "created_at": "2025-08-04T22:55:19.379656Z", + "created_at": "2025-09-03T17:36:24.645258Z", "done": false, "done_reason": null, "total_duration": null, @@ -1587,7 +1587,7 @@ "__type__": "ollama._types.GenerateResponse", "__data__": { "model": "llama3.2:3b-instruct-fp16", - "created_at": "2025-08-04T22:55:19.430197Z", + "created_at": "2025-09-03T17:36:24.686966Z", "done": false, "done_reason": null, "total_duration": null, @@ -1605,7 +1605,7 @@ "__type__": "ollama._types.GenerateResponse", "__data__": { "model": "llama3.2:3b-instruct-fp16", - "created_at": "2025-08-04T22:55:19.48034Z", + "created_at": "2025-09-03T17:36:24.726702Z", "done": false, "done_reason": null, "total_duration": null, @@ -1623,7 +1623,7 @@ "__type__": "ollama._types.GenerateResponse", "__data__": { "model": "llama3.2:3b-instruct-fp16", - "created_at": "2025-08-04T22:55:19.530546Z", + "created_at": "2025-09-03T17:36:24.766742Z", "done": false, "done_reason": null, "total_duration": null, @@ -1641,7 +1641,7 @@ "__type__": "ollama._types.GenerateResponse", "__data__": { "model": "llama3.2:3b-instruct-fp16", - "created_at": "2025-08-04T22:55:19.583294Z", + "created_at": "2025-09-03T17:36:24.806841Z", "done": false, "done_reason": null, "total_duration": null, @@ -1659,7 +1659,7 @@ "__type__": "ollama._types.GenerateResponse", "__data__": { "model": "llama3.2:3b-instruct-fp16", - "created_at": "2025-08-04T22:55:19.630956Z", + "created_at": "2025-09-03T17:36:24.846655Z", "done": false, "done_reason": null, "total_duration": null, @@ -1677,7 +1677,7 @@ "__type__": "ollama._types.GenerateResponse", "__data__": { "model": "llama3.2:3b-instruct-fp16", - "created_at": "2025-08-04T22:55:19.682434Z", + "created_at": "2025-09-03T17:36:24.886602Z", "done": false, "done_reason": null, "total_duration": null, @@ -1695,7 +1695,7 @@ "__type__": "ollama._types.GenerateResponse", "__data__": { "model": "llama3.2:3b-instruct-fp16", - "created_at": "2025-08-04T22:55:19.731714Z", + "created_at": "2025-09-03T17:36:24.926582Z", "done": false, "done_reason": null, "total_duration": null, @@ -1713,7 +1713,7 @@ "__type__": "ollama._types.GenerateResponse", "__data__": { "model": "llama3.2:3b-instruct-fp16", - "created_at": "2025-08-04T22:55:19.780871Z", + "created_at": "2025-09-03T17:36:24.966301Z", "done": false, "done_reason": null, "total_duration": null, @@ -1731,7 +1731,7 @@ "__type__": "ollama._types.GenerateResponse", "__data__": { "model": "llama3.2:3b-instruct-fp16", - "created_at": "2025-08-04T22:55:19.829955Z", + "created_at": "2025-09-03T17:36:25.006614Z", "done": false, "done_reason": null, "total_duration": null, @@ -1749,7 +1749,7 @@ "__type__": "ollama._types.GenerateResponse", "__data__": { "model": "llama3.2:3b-instruct-fp16", - "created_at": "2025-08-04T22:55:19.880971Z", + "created_at": "2025-09-03T17:36:25.046631Z", "done": false, "done_reason": null, "total_duration": null, @@ -1767,7 +1767,7 @@ "__type__": "ollama._types.GenerateResponse", "__data__": { "model": "llama3.2:3b-instruct-fp16", - "created_at": "2025-08-04T22:55:19.931241Z", + "created_at": "2025-09-03T17:36:25.086885Z", "done": false, "done_reason": null, "total_duration": null, @@ -1785,7 +1785,7 @@ "__type__": "ollama._types.GenerateResponse", "__data__": { "model": "llama3.2:3b-instruct-fp16", - "created_at": "2025-08-04T22:55:19.980096Z", + "created_at": "2025-09-03T17:36:25.127555Z", "done": false, "done_reason": null, "total_duration": null, @@ -1803,7 +1803,7 @@ "__type__": "ollama._types.GenerateResponse", "__data__": { "model": "llama3.2:3b-instruct-fp16", - "created_at": "2025-08-04T22:55:20.03407Z", + "created_at": "2025-09-03T17:36:25.168437Z", "done": false, "done_reason": null, "total_duration": null, @@ -1821,7 +1821,7 @@ "__type__": "ollama._types.GenerateResponse", "__data__": { "model": "llama3.2:3b-instruct-fp16", - "created_at": "2025-08-04T22:55:20.090735Z", + "created_at": "2025-09-03T17:36:25.20913Z", "done": false, "done_reason": null, "total_duration": null, @@ -1839,7 +1839,7 @@ "__type__": "ollama._types.GenerateResponse", "__data__": { "model": "llama3.2:3b-instruct-fp16", - "created_at": "2025-08-04T22:55:20.153924Z", + "created_at": "2025-09-03T17:36:25.249991Z", "done": false, "done_reason": null, "total_duration": null, @@ -1857,7 +1857,7 @@ "__type__": "ollama._types.GenerateResponse", "__data__": { "model": "llama3.2:3b-instruct-fp16", - "created_at": "2025-08-04T22:55:20.220305Z", + "created_at": "2025-09-03T17:36:25.29007Z", "done": false, "done_reason": null, "total_duration": null, @@ -1875,7 +1875,7 @@ "__type__": "ollama._types.GenerateResponse", "__data__": { "model": "llama3.2:3b-instruct-fp16", - "created_at": "2025-08-04T22:55:20.304523Z", + "created_at": "2025-09-03T17:36:25.331038Z", "done": false, "done_reason": null, "total_duration": null, @@ -1893,7 +1893,7 @@ "__type__": "ollama._types.GenerateResponse", "__data__": { "model": "llama3.2:3b-instruct-fp16", - "created_at": "2025-08-04T22:55:20.4249Z", + "created_at": "2025-09-03T17:36:25.37155Z", "done": false, "done_reason": null, "total_duration": null, @@ -1911,7 +1911,7 @@ "__type__": "ollama._types.GenerateResponse", "__data__": { "model": "llama3.2:3b-instruct-fp16", - "created_at": "2025-08-04T22:55:20.483091Z", + "created_at": "2025-09-03T17:36:25.413816Z", "done": false, "done_reason": null, "total_duration": null, @@ -1929,7 +1929,7 @@ "__type__": "ollama._types.GenerateResponse", "__data__": { "model": "llama3.2:3b-instruct-fp16", - "created_at": "2025-08-04T22:55:20.552198Z", + "created_at": "2025-09-03T17:36:25.457114Z", "done": false, "done_reason": null, "total_duration": null, @@ -1947,7 +1947,7 @@ "__type__": "ollama._types.GenerateResponse", "__data__": { "model": "llama3.2:3b-instruct-fp16", - "created_at": "2025-08-04T22:55:20.651684Z", + "created_at": "2025-09-03T17:36:25.49976Z", "done": false, "done_reason": null, "total_duration": null, @@ -1965,7 +1965,7 @@ "__type__": "ollama._types.GenerateResponse", "__data__": { "model": "llama3.2:3b-instruct-fp16", - "created_at": "2025-08-04T22:55:20.767844Z", + "created_at": "2025-09-03T17:36:25.540794Z", "done": false, "done_reason": null, "total_duration": null, @@ -1983,7 +1983,7 @@ "__type__": "ollama._types.GenerateResponse", "__data__": { "model": "llama3.2:3b-instruct-fp16", - "created_at": "2025-08-04T22:55:20.836273Z", + "created_at": "2025-09-03T17:36:25.581085Z", "done": false, "done_reason": null, "total_duration": null, @@ -2001,7 +2001,7 @@ "__type__": "ollama._types.GenerateResponse", "__data__": { "model": "llama3.2:3b-instruct-fp16", - "created_at": "2025-08-04T22:55:20.919729Z", + "created_at": "2025-09-03T17:36:25.62194Z", "done": false, "done_reason": null, "total_duration": null, @@ -2019,7 +2019,7 @@ "__type__": "ollama._types.GenerateResponse", "__data__": { "model": "llama3.2:3b-instruct-fp16", - "created_at": "2025-08-04T22:55:20.987772Z", + "created_at": "2025-09-03T17:36:25.66242Z", "done": false, "done_reason": null, "total_duration": null, @@ -2037,7 +2037,7 @@ "__type__": "ollama._types.GenerateResponse", "__data__": { "model": "llama3.2:3b-instruct-fp16", - "created_at": "2025-08-04T22:55:21.0516Z", + "created_at": "2025-09-03T17:36:25.702827Z", "done": false, "done_reason": null, "total_duration": null, @@ -2055,7 +2055,7 @@ "__type__": "ollama._types.GenerateResponse", "__data__": { "model": "llama3.2:3b-instruct-fp16", - "created_at": "2025-08-04T22:55:21.118611Z", + "created_at": "2025-09-03T17:36:25.743383Z", "done": false, "done_reason": null, "total_duration": null, @@ -2073,7 +2073,7 @@ "__type__": "ollama._types.GenerateResponse", "__data__": { "model": "llama3.2:3b-instruct-fp16", - "created_at": "2025-08-04T22:55:21.182092Z", + "created_at": "2025-09-03T17:36:25.785523Z", "done": false, "done_reason": null, "total_duration": null, @@ -2091,7 +2091,7 @@ "__type__": "ollama._types.GenerateResponse", "__data__": { "model": "llama3.2:3b-instruct-fp16", - "created_at": "2025-08-04T22:55:21.241399Z", + "created_at": "2025-09-03T17:36:25.828276Z", "done": false, "done_reason": null, "total_duration": null, @@ -2109,7 +2109,7 @@ "__type__": "ollama._types.GenerateResponse", "__data__": { "model": "llama3.2:3b-instruct-fp16", - "created_at": "2025-08-04T22:55:21.296699Z", + "created_at": "2025-09-03T17:36:25.871231Z", "done": false, "done_reason": null, "total_duration": null, @@ -2127,7 +2127,7 @@ "__type__": "ollama._types.GenerateResponse", "__data__": { "model": "llama3.2:3b-instruct-fp16", - "created_at": "2025-08-04T22:55:21.355772Z", + "created_at": "2025-09-03T17:36:25.913246Z", "done": false, "done_reason": null, "total_duration": null, @@ -2145,7 +2145,7 @@ "__type__": "ollama._types.GenerateResponse", "__data__": { "model": "llama3.2:3b-instruct-fp16", - "created_at": "2025-08-04T22:55:21.410821Z", + "created_at": "2025-09-03T17:36:25.955162Z", "done": false, "done_reason": null, "total_duration": null, @@ -2163,7 +2163,7 @@ "__type__": "ollama._types.GenerateResponse", "__data__": { "model": "llama3.2:3b-instruct-fp16", - "created_at": "2025-08-04T22:55:21.46582Z", + "created_at": "2025-09-03T17:36:25.997821Z", "done": false, "done_reason": null, "total_duration": null, @@ -2181,7 +2181,7 @@ "__type__": "ollama._types.GenerateResponse", "__data__": { "model": "llama3.2:3b-instruct-fp16", - "created_at": "2025-08-04T22:55:21.520896Z", + "created_at": "2025-09-03T17:36:26.03971Z", "done": false, "done_reason": null, "total_duration": null, @@ -2199,7 +2199,7 @@ "__type__": "ollama._types.GenerateResponse", "__data__": { "model": "llama3.2:3b-instruct-fp16", - "created_at": "2025-08-04T22:55:21.58943Z", + "created_at": "2025-09-03T17:36:26.082988Z", "done": false, "done_reason": null, "total_duration": null, @@ -2217,7 +2217,7 @@ "__type__": "ollama._types.GenerateResponse", "__data__": { "model": "llama3.2:3b-instruct-fp16", - "created_at": "2025-08-04T22:55:21.700526Z", + "created_at": "2025-09-03T17:36:26.126136Z", "done": false, "done_reason": null, "total_duration": null, @@ -2235,7 +2235,7 @@ "__type__": "ollama._types.GenerateResponse", "__data__": { "model": "llama3.2:3b-instruct-fp16", - "created_at": "2025-08-04T22:55:21.772492Z", + "created_at": "2025-09-03T17:36:26.168484Z", "done": false, "done_reason": null, "total_duration": null, @@ -2253,7 +2253,7 @@ "__type__": "ollama._types.GenerateResponse", "__data__": { "model": "llama3.2:3b-instruct-fp16", - "created_at": "2025-08-04T22:55:21.839261Z", + "created_at": "2025-09-03T17:36:26.210934Z", "done": false, "done_reason": null, "total_duration": null, @@ -2271,7 +2271,7 @@ "__type__": "ollama._types.GenerateResponse", "__data__": { "model": "llama3.2:3b-instruct-fp16", - "created_at": "2025-08-04T22:55:21.90185Z", + "created_at": "2025-09-03T17:36:26.25385Z", "done": false, "done_reason": null, "total_duration": null, @@ -2289,7 +2289,7 @@ "__type__": "ollama._types.GenerateResponse", "__data__": { "model": "llama3.2:3b-instruct-fp16", - "created_at": "2025-08-04T22:55:21.96248Z", + "created_at": "2025-09-03T17:36:26.295017Z", "done": false, "done_reason": null, "total_duration": null, @@ -2307,7 +2307,7 @@ "__type__": "ollama._types.GenerateResponse", "__data__": { "model": "llama3.2:3b-instruct-fp16", - "created_at": "2025-08-04T22:55:22.024705Z", + "created_at": "2025-09-03T17:36:26.335776Z", "done": false, "done_reason": null, "total_duration": null, @@ -2325,7 +2325,7 @@ "__type__": "ollama._types.GenerateResponse", "__data__": { "model": "llama3.2:3b-instruct-fp16", - "created_at": "2025-08-04T22:55:22.079411Z", + "created_at": "2025-09-03T17:36:26.377421Z", "done": false, "done_reason": null, "total_duration": null, @@ -2343,7 +2343,7 @@ "__type__": "ollama._types.GenerateResponse", "__data__": { "model": "llama3.2:3b-instruct-fp16", - "created_at": "2025-08-04T22:55:22.132835Z", + "created_at": "2025-09-03T17:36:26.419324Z", "done": false, "done_reason": null, "total_duration": null, @@ -2361,7 +2361,7 @@ "__type__": "ollama._types.GenerateResponse", "__data__": { "model": "llama3.2:3b-instruct-fp16", - "created_at": "2025-08-04T22:55:22.189848Z", + "created_at": "2025-09-03T17:36:26.460598Z", "done": false, "done_reason": null, "total_duration": null, @@ -2379,7 +2379,7 @@ "__type__": "ollama._types.GenerateResponse", "__data__": { "model": "llama3.2:3b-instruct-fp16", - "created_at": "2025-08-04T22:55:22.252016Z", + "created_at": "2025-09-03T17:36:26.502926Z", "done": false, "done_reason": null, "total_duration": null, @@ -2397,7 +2397,7 @@ "__type__": "ollama._types.GenerateResponse", "__data__": { "model": "llama3.2:3b-instruct-fp16", - "created_at": "2025-08-04T22:55:22.316246Z", + "created_at": "2025-09-03T17:36:26.545467Z", "done": false, "done_reason": null, "total_duration": null, @@ -2415,7 +2415,7 @@ "__type__": "ollama._types.GenerateResponse", "__data__": { "model": "llama3.2:3b-instruct-fp16", - "created_at": "2025-08-04T22:55:22.384612Z", + "created_at": "2025-09-03T17:36:26.587384Z", "done": false, "done_reason": null, "total_duration": null, @@ -2433,7 +2433,7 @@ "__type__": "ollama._types.GenerateResponse", "__data__": { "model": "llama3.2:3b-instruct-fp16", - "created_at": "2025-08-04T22:55:22.444066Z", + "created_at": "2025-09-03T17:36:26.628641Z", "done": false, "done_reason": null, "total_duration": null, @@ -2451,7 +2451,7 @@ "__type__": "ollama._types.GenerateResponse", "__data__": { "model": "llama3.2:3b-instruct-fp16", - "created_at": "2025-08-04T22:55:22.50686Z", + "created_at": "2025-09-03T17:36:26.669783Z", "done": false, "done_reason": null, "total_duration": null, @@ -2469,7 +2469,7 @@ "__type__": "ollama._types.GenerateResponse", "__data__": { "model": "llama3.2:3b-instruct-fp16", - "created_at": "2025-08-04T22:55:22.562225Z", + "created_at": "2025-09-03T17:36:26.710862Z", "done": false, "done_reason": null, "total_duration": null, @@ -2487,7 +2487,7 @@ "__type__": "ollama._types.GenerateResponse", "__data__": { "model": "llama3.2:3b-instruct-fp16", - "created_at": "2025-08-04T22:55:22.621013Z", + "created_at": "2025-09-03T17:36:26.751949Z", "done": false, "done_reason": null, "total_duration": null, @@ -2505,7 +2505,7 @@ "__type__": "ollama._types.GenerateResponse", "__data__": { "model": "llama3.2:3b-instruct-fp16", - "created_at": "2025-08-04T22:55:22.682489Z", + "created_at": "2025-09-03T17:36:26.793375Z", "done": false, "done_reason": null, "total_duration": null, @@ -2523,7 +2523,7 @@ "__type__": "ollama._types.GenerateResponse", "__data__": { "model": "llama3.2:3b-instruct-fp16", - "created_at": "2025-08-04T22:55:22.754211Z", + "created_at": "2025-09-03T17:36:26.835697Z", "done": false, "done_reason": null, "total_duration": null, @@ -2541,7 +2541,7 @@ "__type__": "ollama._types.GenerateResponse", "__data__": { "model": "llama3.2:3b-instruct-fp16", - "created_at": "2025-08-04T22:55:22.813395Z", + "created_at": "2025-09-03T17:36:26.876139Z", "done": false, "done_reason": null, "total_duration": null, @@ -2559,7 +2559,7 @@ "__type__": "ollama._types.GenerateResponse", "__data__": { "model": "llama3.2:3b-instruct-fp16", - "created_at": "2025-08-04T22:55:22.872143Z", + "created_at": "2025-09-03T17:36:26.917322Z", "done": false, "done_reason": null, "total_duration": null, @@ -2577,7 +2577,7 @@ "__type__": "ollama._types.GenerateResponse", "__data__": { "model": "llama3.2:3b-instruct-fp16", - "created_at": "2025-08-04T22:55:22.930176Z", + "created_at": "2025-09-03T17:36:26.958405Z", "done": false, "done_reason": null, "total_duration": null, @@ -2595,7 +2595,7 @@ "__type__": "ollama._types.GenerateResponse", "__data__": { "model": "llama3.2:3b-instruct-fp16", - "created_at": "2025-08-04T22:55:22.989936Z", + "created_at": "2025-09-03T17:36:26.999602Z", "done": false, "done_reason": null, "total_duration": null, @@ -2613,7 +2613,7 @@ "__type__": "ollama._types.GenerateResponse", "__data__": { "model": "llama3.2:3b-instruct-fp16", - "created_at": "2025-08-04T22:55:23.052675Z", + "created_at": "2025-09-03T17:36:27.041369Z", "done": false, "done_reason": null, "total_duration": null, @@ -2631,7 +2631,7 @@ "__type__": "ollama._types.GenerateResponse", "__data__": { "model": "llama3.2:3b-instruct-fp16", - "created_at": "2025-08-04T22:55:23.116141Z", + "created_at": "2025-09-03T17:36:27.082117Z", "done": false, "done_reason": null, "total_duration": null, @@ -2649,7 +2649,7 @@ "__type__": "ollama._types.GenerateResponse", "__data__": { "model": "llama3.2:3b-instruct-fp16", - "created_at": "2025-08-04T22:55:23.171904Z", + "created_at": "2025-09-03T17:36:27.124286Z", "done": false, "done_reason": null, "total_duration": null, @@ -2667,7 +2667,7 @@ "__type__": "ollama._types.GenerateResponse", "__data__": { "model": "llama3.2:3b-instruct-fp16", - "created_at": "2025-08-04T22:55:23.226341Z", + "created_at": "2025-09-03T17:36:27.165354Z", "done": false, "done_reason": null, "total_duration": null, @@ -2685,7 +2685,7 @@ "__type__": "ollama._types.GenerateResponse", "__data__": { "model": "llama3.2:3b-instruct-fp16", - "created_at": "2025-08-04T22:55:23.279164Z", + "created_at": "2025-09-03T17:36:27.206517Z", "done": false, "done_reason": null, "total_duration": null, @@ -2703,7 +2703,7 @@ "__type__": "ollama._types.GenerateResponse", "__data__": { "model": "llama3.2:3b-instruct-fp16", - "created_at": "2025-08-04T22:55:23.331167Z", + "created_at": "2025-09-03T17:36:27.247418Z", "done": false, "done_reason": null, "total_duration": null, @@ -2721,7 +2721,7 @@ "__type__": "ollama._types.GenerateResponse", "__data__": { "model": "llama3.2:3b-instruct-fp16", - "created_at": "2025-08-04T22:55:23.3852Z", + "created_at": "2025-09-03T17:36:27.288727Z", "done": false, "done_reason": null, "total_duration": null, @@ -2739,7 +2739,7 @@ "__type__": "ollama._types.GenerateResponse", "__data__": { "model": "llama3.2:3b-instruct-fp16", - "created_at": "2025-08-04T22:55:23.441499Z", + "created_at": "2025-09-03T17:36:27.32952Z", "done": false, "done_reason": null, "total_duration": null, @@ -2757,7 +2757,7 @@ "__type__": "ollama._types.GenerateResponse", "__data__": { "model": "llama3.2:3b-instruct-fp16", - "created_at": "2025-08-04T22:55:23.495317Z", + "created_at": "2025-09-03T17:36:27.37057Z", "done": false, "done_reason": null, "total_duration": null, @@ -2775,7 +2775,7 @@ "__type__": "ollama._types.GenerateResponse", "__data__": { "model": "llama3.2:3b-instruct-fp16", - "created_at": "2025-08-04T22:55:23.55017Z", + "created_at": "2025-09-03T17:36:27.413166Z", "done": false, "done_reason": null, "total_duration": null, @@ -2793,7 +2793,7 @@ "__type__": "ollama._types.GenerateResponse", "__data__": { "model": "llama3.2:3b-instruct-fp16", - "created_at": "2025-08-04T22:55:23.600579Z", + "created_at": "2025-09-03T17:36:27.453878Z", "done": false, "done_reason": null, "total_duration": null, @@ -2811,7 +2811,7 @@ "__type__": "ollama._types.GenerateResponse", "__data__": { "model": "llama3.2:3b-instruct-fp16", - "created_at": "2025-08-04T22:55:23.654506Z", + "created_at": "2025-09-03T17:36:27.495693Z", "done": false, "done_reason": null, "total_duration": null, @@ -2829,7 +2829,7 @@ "__type__": "ollama._types.GenerateResponse", "__data__": { "model": "llama3.2:3b-instruct-fp16", - "created_at": "2025-08-04T22:55:23.709135Z", + "created_at": "2025-09-03T17:36:27.536879Z", "done": false, "done_reason": null, "total_duration": null, @@ -2847,7 +2847,7 @@ "__type__": "ollama._types.GenerateResponse", "__data__": { "model": "llama3.2:3b-instruct-fp16", - "created_at": "2025-08-04T22:55:23.760466Z", + "created_at": "2025-09-03T17:36:27.578071Z", "done": false, "done_reason": null, "total_duration": null, @@ -2865,7 +2865,7 @@ "__type__": "ollama._types.GenerateResponse", "__data__": { "model": "llama3.2:3b-instruct-fp16", - "created_at": "2025-08-04T22:55:23.813218Z", + "created_at": "2025-09-03T17:36:27.619459Z", "done": false, "done_reason": null, "total_duration": null, @@ -2883,7 +2883,7 @@ "__type__": "ollama._types.GenerateResponse", "__data__": { "model": "llama3.2:3b-instruct-fp16", - "created_at": "2025-08-04T22:55:23.865353Z", + "created_at": "2025-09-03T17:36:27.660329Z", "done": false, "done_reason": null, "total_duration": null, @@ -2901,7 +2901,7 @@ "__type__": "ollama._types.GenerateResponse", "__data__": { "model": "llama3.2:3b-instruct-fp16", - "created_at": "2025-08-04T22:55:23.922629Z", + "created_at": "2025-09-03T17:36:27.701195Z", "done": false, "done_reason": null, "total_duration": null, @@ -2919,7 +2919,7 @@ "__type__": "ollama._types.GenerateResponse", "__data__": { "model": "llama3.2:3b-instruct-fp16", - "created_at": "2025-08-04T22:55:23.975942Z", + "created_at": "2025-09-03T17:36:27.74184Z", "done": false, "done_reason": null, "total_duration": null, @@ -2937,7 +2937,7 @@ "__type__": "ollama._types.GenerateResponse", "__data__": { "model": "llama3.2:3b-instruct-fp16", - "created_at": "2025-08-04T22:55:24.028952Z", + "created_at": "2025-09-03T17:36:27.782435Z", "done": false, "done_reason": null, "total_duration": null, @@ -2955,7 +2955,7 @@ "__type__": "ollama._types.GenerateResponse", "__data__": { "model": "llama3.2:3b-instruct-fp16", - "created_at": "2025-08-04T22:55:24.086171Z", + "created_at": "2025-09-03T17:36:27.822698Z", "done": false, "done_reason": null, "total_duration": null, @@ -2973,7 +2973,7 @@ "__type__": "ollama._types.GenerateResponse", "__data__": { "model": "llama3.2:3b-instruct-fp16", - "created_at": "2025-08-04T22:55:24.145184Z", + "created_at": "2025-09-03T17:36:27.863482Z", "done": false, "done_reason": null, "total_duration": null, @@ -2991,7 +2991,7 @@ "__type__": "ollama._types.GenerateResponse", "__data__": { "model": "llama3.2:3b-instruct-fp16", - "created_at": "2025-08-04T22:55:24.201279Z", + "created_at": "2025-09-03T17:36:27.904189Z", "done": false, "done_reason": null, "total_duration": null, @@ -3009,7 +3009,7 @@ "__type__": "ollama._types.GenerateResponse", "__data__": { "model": "llama3.2:3b-instruct-fp16", - "created_at": "2025-08-04T22:55:24.255619Z", + "created_at": "2025-09-03T17:36:27.944927Z", "done": false, "done_reason": null, "total_duration": null, @@ -3027,7 +3027,7 @@ "__type__": "ollama._types.GenerateResponse", "__data__": { "model": "llama3.2:3b-instruct-fp16", - "created_at": "2025-08-04T22:55:24.311758Z", + "created_at": "2025-09-03T17:36:27.985583Z", "done": false, "done_reason": null, "total_duration": null, @@ -3045,7 +3045,7 @@ "__type__": "ollama._types.GenerateResponse", "__data__": { "model": "llama3.2:3b-instruct-fp16", - "created_at": "2025-08-04T22:55:24.369104Z", + "created_at": "2025-09-03T17:36:28.026811Z", "done": false, "done_reason": null, "total_duration": null, @@ -3063,7 +3063,7 @@ "__type__": "ollama._types.GenerateResponse", "__data__": { "model": "llama3.2:3b-instruct-fp16", - "created_at": "2025-08-04T22:55:24.423674Z", + "created_at": "2025-09-03T17:36:28.067929Z", "done": false, "done_reason": null, "total_duration": null, @@ -3081,7 +3081,7 @@ "__type__": "ollama._types.GenerateResponse", "__data__": { "model": "llama3.2:3b-instruct-fp16", - "created_at": "2025-08-04T22:55:24.47792Z", + "created_at": "2025-09-03T17:36:28.108844Z", "done": false, "done_reason": null, "total_duration": null, @@ -3099,7 +3099,7 @@ "__type__": "ollama._types.GenerateResponse", "__data__": { "model": "llama3.2:3b-instruct-fp16", - "created_at": "2025-08-04T22:55:24.531093Z", + "created_at": "2025-09-03T17:36:28.149655Z", "done": false, "done_reason": null, "total_duration": null, @@ -3117,7 +3117,7 @@ "__type__": "ollama._types.GenerateResponse", "__data__": { "model": "llama3.2:3b-instruct-fp16", - "created_at": "2025-08-04T22:55:24.582555Z", + "created_at": "2025-09-03T17:36:28.190377Z", "done": false, "done_reason": null, "total_duration": null, @@ -3135,7 +3135,7 @@ "__type__": "ollama._types.GenerateResponse", "__data__": { "model": "llama3.2:3b-instruct-fp16", - "created_at": "2025-08-04T22:55:24.63568Z", + "created_at": "2025-09-03T17:36:28.230919Z", "done": false, "done_reason": null, "total_duration": null, @@ -3153,7 +3153,7 @@ "__type__": "ollama._types.GenerateResponse", "__data__": { "model": "llama3.2:3b-instruct-fp16", - "created_at": "2025-08-04T22:55:24.689009Z", + "created_at": "2025-09-03T17:36:28.271506Z", "done": false, "done_reason": null, "total_duration": null, @@ -3171,7 +3171,7 @@ "__type__": "ollama._types.GenerateResponse", "__data__": { "model": "llama3.2:3b-instruct-fp16", - "created_at": "2025-08-04T22:55:24.742834Z", + "created_at": "2025-09-03T17:36:28.313533Z", "done": false, "done_reason": null, "total_duration": null, @@ -3189,7 +3189,7 @@ "__type__": "ollama._types.GenerateResponse", "__data__": { "model": "llama3.2:3b-instruct-fp16", - "created_at": "2025-08-04T22:55:24.79443Z", + "created_at": "2025-09-03T17:36:28.356508Z", "done": false, "done_reason": null, "total_duration": null, @@ -3207,7 +3207,7 @@ "__type__": "ollama._types.GenerateResponse", "__data__": { "model": "llama3.2:3b-instruct-fp16", - "created_at": "2025-08-04T22:55:24.845937Z", + "created_at": "2025-09-03T17:36:28.397379Z", "done": false, "done_reason": null, "total_duration": null, @@ -3225,7 +3225,7 @@ "__type__": "ollama._types.GenerateResponse", "__data__": { "model": "llama3.2:3b-instruct-fp16", - "created_at": "2025-08-04T22:55:24.896501Z", + "created_at": "2025-09-03T17:36:28.438016Z", "done": false, "done_reason": null, "total_duration": null, @@ -3243,7 +3243,7 @@ "__type__": "ollama._types.GenerateResponse", "__data__": { "model": "llama3.2:3b-instruct-fp16", - "created_at": "2025-08-04T22:55:24.952958Z", + "created_at": "2025-09-03T17:36:28.47858Z", "done": false, "done_reason": null, "total_duration": null, @@ -3261,7 +3261,7 @@ "__type__": "ollama._types.GenerateResponse", "__data__": { "model": "llama3.2:3b-instruct-fp16", - "created_at": "2025-08-04T22:55:25.009085Z", + "created_at": "2025-09-03T17:36:28.519407Z", "done": false, "done_reason": null, "total_duration": null, @@ -3279,7 +3279,7 @@ "__type__": "ollama._types.GenerateResponse", "__data__": { "model": "llama3.2:3b-instruct-fp16", - "created_at": "2025-08-04T22:55:25.067495Z", + "created_at": "2025-09-03T17:36:28.560412Z", "done": false, "done_reason": null, "total_duration": null, @@ -3297,7 +3297,7 @@ "__type__": "ollama._types.GenerateResponse", "__data__": { "model": "llama3.2:3b-instruct-fp16", - "created_at": "2025-08-04T22:55:25.121739Z", + "created_at": "2025-09-03T17:36:28.601727Z", "done": false, "done_reason": null, "total_duration": null, @@ -3315,7 +3315,7 @@ "__type__": "ollama._types.GenerateResponse", "__data__": { "model": "llama3.2:3b-instruct-fp16", - "created_at": "2025-08-04T22:55:25.172013Z", + "created_at": "2025-09-03T17:36:28.64332Z", "done": false, "done_reason": null, "total_duration": null, @@ -3333,7 +3333,7 @@ "__type__": "ollama._types.GenerateResponse", "__data__": { "model": "llama3.2:3b-instruct-fp16", - "created_at": "2025-08-04T22:55:25.222982Z", + "created_at": "2025-09-03T17:36:28.683692Z", "done": false, "done_reason": null, "total_duration": null, @@ -3351,7 +3351,7 @@ "__type__": "ollama._types.GenerateResponse", "__data__": { "model": "llama3.2:3b-instruct-fp16", - "created_at": "2025-08-04T22:55:25.274019Z", + "created_at": "2025-09-03T17:36:28.724325Z", "done": false, "done_reason": null, "total_duration": null, @@ -3369,7 +3369,7 @@ "__type__": "ollama._types.GenerateResponse", "__data__": { "model": "llama3.2:3b-instruct-fp16", - "created_at": "2025-08-04T22:55:25.324668Z", + "created_at": "2025-09-03T17:36:28.764731Z", "done": false, "done_reason": null, "total_duration": null, @@ -3387,7 +3387,7 @@ "__type__": "ollama._types.GenerateResponse", "__data__": { "model": "llama3.2:3b-instruct-fp16", - "created_at": "2025-08-04T22:55:25.377987Z", + "created_at": "2025-09-03T17:36:28.805214Z", "done": false, "done_reason": null, "total_duration": null, @@ -3405,7 +3405,7 @@ "__type__": "ollama._types.GenerateResponse", "__data__": { "model": "llama3.2:3b-instruct-fp16", - "created_at": "2025-08-04T22:55:25.429358Z", + "created_at": "2025-09-03T17:36:28.845962Z", "done": false, "done_reason": null, "total_duration": null, @@ -3423,7 +3423,7 @@ "__type__": "ollama._types.GenerateResponse", "__data__": { "model": "llama3.2:3b-instruct-fp16", - "created_at": "2025-08-04T22:55:25.481004Z", + "created_at": "2025-09-03T17:36:28.886874Z", "done": false, "done_reason": null, "total_duration": null, @@ -3441,7 +3441,7 @@ "__type__": "ollama._types.GenerateResponse", "__data__": { "model": "llama3.2:3b-instruct-fp16", - "created_at": "2025-08-04T22:55:25.534764Z", + "created_at": "2025-09-03T17:36:28.927442Z", "done": false, "done_reason": null, "total_duration": null, @@ -3459,7 +3459,7 @@ "__type__": "ollama._types.GenerateResponse", "__data__": { "model": "llama3.2:3b-instruct-fp16", - "created_at": "2025-08-04T22:55:25.587324Z", + "created_at": "2025-09-03T17:36:28.967837Z", "done": false, "done_reason": null, "total_duration": null, @@ -3477,7 +3477,7 @@ "__type__": "ollama._types.GenerateResponse", "__data__": { "model": "llama3.2:3b-instruct-fp16", - "created_at": "2025-08-04T22:55:25.639379Z", + "created_at": "2025-09-03T17:36:29.008786Z", "done": false, "done_reason": null, "total_duration": null, @@ -3495,7 +3495,7 @@ "__type__": "ollama._types.GenerateResponse", "__data__": { "model": "llama3.2:3b-instruct-fp16", - "created_at": "2025-08-04T22:55:25.692618Z", + "created_at": "2025-09-03T17:36:29.049817Z", "done": false, "done_reason": null, "total_duration": null, @@ -3513,7 +3513,7 @@ "__type__": "ollama._types.GenerateResponse", "__data__": { "model": "llama3.2:3b-instruct-fp16", - "created_at": "2025-08-04T22:55:25.74473Z", + "created_at": "2025-09-03T17:36:29.090455Z", "done": false, "done_reason": null, "total_duration": null, @@ -3531,7 +3531,7 @@ "__type__": "ollama._types.GenerateResponse", "__data__": { "model": "llama3.2:3b-instruct-fp16", - "created_at": "2025-08-04T22:55:25.803002Z", + "created_at": "2025-09-03T17:36:29.131723Z", "done": false, "done_reason": null, "total_duration": null, @@ -3549,7 +3549,7 @@ "__type__": "ollama._types.GenerateResponse", "__data__": { "model": "llama3.2:3b-instruct-fp16", - "created_at": "2025-08-04T22:55:25.858781Z", + "created_at": "2025-09-03T17:36:29.172582Z", "done": false, "done_reason": null, "total_duration": null, @@ -3567,7 +3567,7 @@ "__type__": "ollama._types.GenerateResponse", "__data__": { "model": "llama3.2:3b-instruct-fp16", - "created_at": "2025-08-04T22:55:25.916114Z", + "created_at": "2025-09-03T17:36:29.214861Z", "done": false, "done_reason": null, "total_duration": null, @@ -3585,7 +3585,7 @@ "__type__": "ollama._types.GenerateResponse", "__data__": { "model": "llama3.2:3b-instruct-fp16", - "created_at": "2025-08-04T22:55:25.968791Z", + "created_at": "2025-09-03T17:36:29.256056Z", "done": false, "done_reason": null, "total_duration": null, @@ -3603,7 +3603,7 @@ "__type__": "ollama._types.GenerateResponse", "__data__": { "model": "llama3.2:3b-instruct-fp16", - "created_at": "2025-08-04T22:55:26.023195Z", + "created_at": "2025-09-03T17:36:29.296825Z", "done": false, "done_reason": null, "total_duration": null, @@ -3621,7 +3621,7 @@ "__type__": "ollama._types.GenerateResponse", "__data__": { "model": "llama3.2:3b-instruct-fp16", - "created_at": "2025-08-04T22:55:26.076958Z", + "created_at": "2025-09-03T17:36:29.337822Z", "done": false, "done_reason": null, "total_duration": null, @@ -3639,7 +3639,7 @@ "__type__": "ollama._types.GenerateResponse", "__data__": { "model": "llama3.2:3b-instruct-fp16", - "created_at": "2025-08-04T22:55:26.128711Z", + "created_at": "2025-09-03T17:36:29.378894Z", "done": false, "done_reason": null, "total_duration": null, @@ -3657,7 +3657,7 @@ "__type__": "ollama._types.GenerateResponse", "__data__": { "model": "llama3.2:3b-instruct-fp16", - "created_at": "2025-08-04T22:55:26.187987Z", + "created_at": "2025-09-03T17:36:29.419586Z", "done": false, "done_reason": null, "total_duration": null, @@ -3675,7 +3675,7 @@ "__type__": "ollama._types.GenerateResponse", "__data__": { "model": "llama3.2:3b-instruct-fp16", - "created_at": "2025-08-04T22:55:26.241555Z", + "created_at": "2025-09-03T17:36:29.459743Z", "done": false, "done_reason": null, "total_duration": null, @@ -3693,7 +3693,7 @@ "__type__": "ollama._types.GenerateResponse", "__data__": { "model": "llama3.2:3b-instruct-fp16", - "created_at": "2025-08-04T22:55:26.292588Z", + "created_at": "2025-09-03T17:36:29.500928Z", "done": false, "done_reason": null, "total_duration": null, @@ -3711,7 +3711,7 @@ "__type__": "ollama._types.GenerateResponse", "__data__": { "model": "llama3.2:3b-instruct-fp16", - "created_at": "2025-08-04T22:55:26.345649Z", + "created_at": "2025-09-03T17:36:29.541823Z", "done": false, "done_reason": null, "total_duration": null, @@ -3729,7 +3729,7 @@ "__type__": "ollama._types.GenerateResponse", "__data__": { "model": "llama3.2:3b-instruct-fp16", - "created_at": "2025-08-04T22:55:26.39865Z", + "created_at": "2025-09-03T17:36:29.583225Z", "done": false, "done_reason": null, "total_duration": null, @@ -3747,7 +3747,7 @@ "__type__": "ollama._types.GenerateResponse", "__data__": { "model": "llama3.2:3b-instruct-fp16", - "created_at": "2025-08-04T22:55:26.44719Z", + "created_at": "2025-09-03T17:36:29.62471Z", "done": false, "done_reason": null, "total_duration": null, @@ -3765,7 +3765,7 @@ "__type__": "ollama._types.GenerateResponse", "__data__": { "model": "llama3.2:3b-instruct-fp16", - "created_at": "2025-08-04T22:55:26.499784Z", + "created_at": "2025-09-03T17:36:29.665624Z", "done": false, "done_reason": null, "total_duration": null, @@ -3783,7 +3783,7 @@ "__type__": "ollama._types.GenerateResponse", "__data__": { "model": "llama3.2:3b-instruct-fp16", - "created_at": "2025-08-04T22:55:26.552673Z", + "created_at": "2025-09-03T17:36:29.706601Z", "done": false, "done_reason": null, "total_duration": null, @@ -3801,7 +3801,7 @@ "__type__": "ollama._types.GenerateResponse", "__data__": { "model": "llama3.2:3b-instruct-fp16", - "created_at": "2025-08-04T22:55:26.60472Z", + "created_at": "2025-09-03T17:36:29.747221Z", "done": false, "done_reason": null, "total_duration": null, @@ -3819,7 +3819,7 @@ "__type__": "ollama._types.GenerateResponse", "__data__": { "model": "llama3.2:3b-instruct-fp16", - "created_at": "2025-08-04T22:55:26.656364Z", + "created_at": "2025-09-03T17:36:29.787753Z", "done": false, "done_reason": null, "total_duration": null, @@ -3837,7 +3837,7 @@ "__type__": "ollama._types.GenerateResponse", "__data__": { "model": "llama3.2:3b-instruct-fp16", - "created_at": "2025-08-04T22:55:26.710318Z", + "created_at": "2025-09-03T17:36:29.828297Z", "done": false, "done_reason": null, "total_duration": null, @@ -3855,7 +3855,7 @@ "__type__": "ollama._types.GenerateResponse", "__data__": { "model": "llama3.2:3b-instruct-fp16", - "created_at": "2025-08-04T22:55:26.763384Z", + "created_at": "2025-09-03T17:36:29.86906Z", "done": false, "done_reason": null, "total_duration": null, @@ -3873,7 +3873,7 @@ "__type__": "ollama._types.GenerateResponse", "__data__": { "model": "llama3.2:3b-instruct-fp16", - "created_at": "2025-08-04T22:55:26.813607Z", + "created_at": "2025-09-03T17:36:29.909608Z", "done": false, "done_reason": null, "total_duration": null, @@ -3891,7 +3891,7 @@ "__type__": "ollama._types.GenerateResponse", "__data__": { "model": "llama3.2:3b-instruct-fp16", - "created_at": "2025-08-04T22:55:26.866943Z", + "created_at": "2025-09-03T17:36:29.950119Z", "done": false, "done_reason": null, "total_duration": null, @@ -3909,7 +3909,7 @@ "__type__": "ollama._types.GenerateResponse", "__data__": { "model": "llama3.2:3b-instruct-fp16", - "created_at": "2025-08-04T22:55:26.918563Z", + "created_at": "2025-09-03T17:36:29.990856Z", "done": false, "done_reason": null, "total_duration": null, @@ -3927,7 +3927,7 @@ "__type__": "ollama._types.GenerateResponse", "__data__": { "model": "llama3.2:3b-instruct-fp16", - "created_at": "2025-08-04T22:55:26.969428Z", + "created_at": "2025-09-03T17:36:30.031737Z", "done": false, "done_reason": null, "total_duration": null, @@ -3945,7 +3945,7 @@ "__type__": "ollama._types.GenerateResponse", "__data__": { "model": "llama3.2:3b-instruct-fp16", - "created_at": "2025-08-04T22:55:27.023314Z", + "created_at": "2025-09-03T17:36:30.072804Z", "done": false, "done_reason": null, "total_duration": null, @@ -3963,7 +3963,7 @@ "__type__": "ollama._types.GenerateResponse", "__data__": { "model": "llama3.2:3b-instruct-fp16", - "created_at": "2025-08-04T22:55:27.075325Z", + "created_at": "2025-09-03T17:36:30.115879Z", "done": false, "done_reason": null, "total_duration": null, @@ -3981,7 +3981,7 @@ "__type__": "ollama._types.GenerateResponse", "__data__": { "model": "llama3.2:3b-instruct-fp16", - "created_at": "2025-08-04T22:55:27.128289Z", + "created_at": "2025-09-03T17:36:30.157268Z", "done": false, "done_reason": null, "total_duration": null, @@ -3999,7 +3999,7 @@ "__type__": "ollama._types.GenerateResponse", "__data__": { "model": "llama3.2:3b-instruct-fp16", - "created_at": "2025-08-04T22:55:27.190218Z", + "created_at": "2025-09-03T17:36:30.198026Z", "done": false, "done_reason": null, "total_duration": null, @@ -4017,7 +4017,7 @@ "__type__": "ollama._types.GenerateResponse", "__data__": { "model": "llama3.2:3b-instruct-fp16", - "created_at": "2025-08-04T22:55:27.246086Z", + "created_at": "2025-09-03T17:36:30.238729Z", "done": false, "done_reason": null, "total_duration": null, @@ -4035,7 +4035,7 @@ "__type__": "ollama._types.GenerateResponse", "__data__": { "model": "llama3.2:3b-instruct-fp16", - "created_at": "2025-08-04T22:55:27.306117Z", + "created_at": "2025-09-03T17:36:30.279348Z", "done": false, "done_reason": null, "total_duration": null, @@ -4053,7 +4053,7 @@ "__type__": "ollama._types.GenerateResponse", "__data__": { "model": "llama3.2:3b-instruct-fp16", - "created_at": "2025-08-04T22:55:27.359915Z", + "created_at": "2025-09-03T17:36:30.31988Z", "done": false, "done_reason": null, "total_duration": null, @@ -4071,7 +4071,7 @@ "__type__": "ollama._types.GenerateResponse", "__data__": { "model": "llama3.2:3b-instruct-fp16", - "created_at": "2025-08-04T22:55:27.419018Z", + "created_at": "2025-09-03T17:36:30.360471Z", "done": false, "done_reason": null, "total_duration": null, @@ -4089,7 +4089,7 @@ "__type__": "ollama._types.GenerateResponse", "__data__": { "model": "llama3.2:3b-instruct-fp16", - "created_at": "2025-08-04T22:55:27.476634Z", + "created_at": "2025-09-03T17:36:30.401158Z", "done": false, "done_reason": null, "total_duration": null, @@ -4107,7 +4107,7 @@ "__type__": "ollama._types.GenerateResponse", "__data__": { "model": "llama3.2:3b-instruct-fp16", - "created_at": "2025-08-04T22:55:27.535904Z", + "created_at": "2025-09-03T17:36:30.441986Z", "done": false, "done_reason": null, "total_duration": null, @@ -4125,7 +4125,7 @@ "__type__": "ollama._types.GenerateResponse", "__data__": { "model": "llama3.2:3b-instruct-fp16", - "created_at": "2025-08-04T22:55:27.588323Z", + "created_at": "2025-09-03T17:36:30.482303Z", "done": false, "done_reason": null, "total_duration": null, @@ -4143,7 +4143,7 @@ "__type__": "ollama._types.GenerateResponse", "__data__": { "model": "llama3.2:3b-instruct-fp16", - "created_at": "2025-08-04T22:55:27.641718Z", + "created_at": "2025-09-03T17:36:30.523844Z", "done": false, "done_reason": null, "total_duration": null, @@ -4161,7 +4161,7 @@ "__type__": "ollama._types.GenerateResponse", "__data__": { "model": "llama3.2:3b-instruct-fp16", - "created_at": "2025-08-04T22:55:27.699892Z", + "created_at": "2025-09-03T17:36:30.564853Z", "done": false, "done_reason": null, "total_duration": null, @@ -4179,7 +4179,7 @@ "__type__": "ollama._types.GenerateResponse", "__data__": { "model": "llama3.2:3b-instruct-fp16", - "created_at": "2025-08-04T22:55:27.754283Z", + "created_at": "2025-09-03T17:36:30.605812Z", "done": false, "done_reason": null, "total_duration": null, @@ -4197,7 +4197,7 @@ "__type__": "ollama._types.GenerateResponse", "__data__": { "model": "llama3.2:3b-instruct-fp16", - "created_at": "2025-08-04T22:55:27.806748Z", + "created_at": "2025-09-03T17:36:30.646752Z", "done": false, "done_reason": null, "total_duration": null, @@ -4215,7 +4215,7 @@ "__type__": "ollama._types.GenerateResponse", "__data__": { "model": "llama3.2:3b-instruct-fp16", - "created_at": "2025-08-04T22:55:27.859134Z", + "created_at": "2025-09-03T17:36:30.68766Z", "done": false, "done_reason": null, "total_duration": null, @@ -4233,7 +4233,7 @@ "__type__": "ollama._types.GenerateResponse", "__data__": { "model": "llama3.2:3b-instruct-fp16", - "created_at": "2025-08-04T22:55:27.911671Z", + "created_at": "2025-09-03T17:36:30.728603Z", "done": false, "done_reason": null, "total_duration": null, @@ -4251,7 +4251,7 @@ "__type__": "ollama._types.GenerateResponse", "__data__": { "model": "llama3.2:3b-instruct-fp16", - "created_at": "2025-08-04T22:55:27.964185Z", + "created_at": "2025-09-03T17:36:30.769336Z", "done": false, "done_reason": null, "total_duration": null, @@ -4269,7 +4269,7 @@ "__type__": "ollama._types.GenerateResponse", "__data__": { "model": "llama3.2:3b-instruct-fp16", - "created_at": "2025-08-04T22:55:28.021644Z", + "created_at": "2025-09-03T17:36:30.80994Z", "done": false, "done_reason": null, "total_duration": null, @@ -4287,7 +4287,7 @@ "__type__": "ollama._types.GenerateResponse", "__data__": { "model": "llama3.2:3b-instruct-fp16", - "created_at": "2025-08-04T22:55:28.082519Z", + "created_at": "2025-09-03T17:36:30.850918Z", "done": false, "done_reason": null, "total_duration": null, @@ -4305,7 +4305,7 @@ "__type__": "ollama._types.GenerateResponse", "__data__": { "model": "llama3.2:3b-instruct-fp16", - "created_at": "2025-08-04T22:55:28.14397Z", + "created_at": "2025-09-03T17:36:30.89149Z", "done": false, "done_reason": null, "total_duration": null, @@ -4323,7 +4323,7 @@ "__type__": "ollama._types.GenerateResponse", "__data__": { "model": "llama3.2:3b-instruct-fp16", - "created_at": "2025-08-04T22:55:28.205905Z", + "created_at": "2025-09-03T17:36:30.932133Z", "done": false, "done_reason": null, "total_duration": null, @@ -4341,7 +4341,7 @@ "__type__": "ollama._types.GenerateResponse", "__data__": { "model": "llama3.2:3b-instruct-fp16", - "created_at": "2025-08-04T22:55:28.263955Z", + "created_at": "2025-09-03T17:36:30.97327Z", "done": false, "done_reason": null, "total_duration": null, @@ -4359,7 +4359,7 @@ "__type__": "ollama._types.GenerateResponse", "__data__": { "model": "llama3.2:3b-instruct-fp16", - "created_at": "2025-08-04T22:55:28.320542Z", + "created_at": "2025-09-03T17:36:31.016238Z", "done": false, "done_reason": null, "total_duration": null, @@ -4377,7 +4377,7 @@ "__type__": "ollama._types.GenerateResponse", "__data__": { "model": "llama3.2:3b-instruct-fp16", - "created_at": "2025-08-04T22:55:28.374084Z", + "created_at": "2025-09-03T17:36:31.057488Z", "done": false, "done_reason": null, "total_duration": null, @@ -4395,7 +4395,7 @@ "__type__": "ollama._types.GenerateResponse", "__data__": { "model": "llama3.2:3b-instruct-fp16", - "created_at": "2025-08-04T22:55:28.427518Z", + "created_at": "2025-09-03T17:36:31.097989Z", "done": false, "done_reason": null, "total_duration": null, @@ -4413,7 +4413,7 @@ "__type__": "ollama._types.GenerateResponse", "__data__": { "model": "llama3.2:3b-instruct-fp16", - "created_at": "2025-08-04T22:55:28.479545Z", + "created_at": "2025-09-03T17:36:31.13892Z", "done": false, "done_reason": null, "total_duration": null, @@ -4431,7 +4431,7 @@ "__type__": "ollama._types.GenerateResponse", "__data__": { "model": "llama3.2:3b-instruct-fp16", - "created_at": "2025-08-04T22:55:28.531416Z", + "created_at": "2025-09-03T17:36:31.179559Z", "done": false, "done_reason": null, "total_duration": null, @@ -4449,7 +4449,7 @@ "__type__": "ollama._types.GenerateResponse", "__data__": { "model": "llama3.2:3b-instruct-fp16", - "created_at": "2025-08-04T22:55:28.58181Z", + "created_at": "2025-09-03T17:36:31.220282Z", "done": false, "done_reason": null, "total_duration": null, @@ -4467,7 +4467,7 @@ "__type__": "ollama._types.GenerateResponse", "__data__": { "model": "llama3.2:3b-instruct-fp16", - "created_at": "2025-08-04T22:55:28.632489Z", + "created_at": "2025-09-03T17:36:31.260847Z", "done": false, "done_reason": null, "total_duration": null, @@ -4485,7 +4485,7 @@ "__type__": "ollama._types.GenerateResponse", "__data__": { "model": "llama3.2:3b-instruct-fp16", - "created_at": "2025-08-04T22:55:28.684096Z", + "created_at": "2025-09-03T17:36:31.301689Z", "done": false, "done_reason": null, "total_duration": null, @@ -4503,7 +4503,7 @@ "__type__": "ollama._types.GenerateResponse", "__data__": { "model": "llama3.2:3b-instruct-fp16", - "created_at": "2025-08-04T22:55:28.737131Z", + "created_at": "2025-09-03T17:36:31.342413Z", "done": false, "done_reason": null, "total_duration": null, @@ -4521,7 +4521,7 @@ "__type__": "ollama._types.GenerateResponse", "__data__": { "model": "llama3.2:3b-instruct-fp16", - "created_at": "2025-08-04T22:55:28.789945Z", + "created_at": "2025-09-03T17:36:31.383094Z", "done": false, "done_reason": null, "total_duration": null, @@ -4539,7 +4539,7 @@ "__type__": "ollama._types.GenerateResponse", "__data__": { "model": "llama3.2:3b-instruct-fp16", - "created_at": "2025-08-04T22:55:28.842126Z", + "created_at": "2025-09-03T17:36:31.424087Z", "done": false, "done_reason": null, "total_duration": null, @@ -4557,7 +4557,7 @@ "__type__": "ollama._types.GenerateResponse", "__data__": { "model": "llama3.2:3b-instruct-fp16", - "created_at": "2025-08-04T22:55:28.895142Z", + "created_at": "2025-09-03T17:36:31.465298Z", "done": false, "done_reason": null, "total_duration": null, @@ -4575,7 +4575,7 @@ "__type__": "ollama._types.GenerateResponse", "__data__": { "model": "llama3.2:3b-instruct-fp16", - "created_at": "2025-08-04T22:55:28.947434Z", + "created_at": "2025-09-03T17:36:31.506962Z", "done": false, "done_reason": null, "total_duration": null, @@ -4593,7 +4593,7 @@ "__type__": "ollama._types.GenerateResponse", "__data__": { "model": "llama3.2:3b-instruct-fp16", - "created_at": "2025-08-04T22:55:29.003682Z", + "created_at": "2025-09-03T17:36:31.548213Z", "done": false, "done_reason": null, "total_duration": null, @@ -4611,7 +4611,7 @@ "__type__": "ollama._types.GenerateResponse", "__data__": { "model": "llama3.2:3b-instruct-fp16", - "created_at": "2025-08-04T22:55:29.056399Z", + "created_at": "2025-09-03T17:36:31.589913Z", "done": false, "done_reason": null, "total_duration": null, @@ -4629,7 +4629,7 @@ "__type__": "ollama._types.GenerateResponse", "__data__": { "model": "llama3.2:3b-instruct-fp16", - "created_at": "2025-08-04T22:55:29.109724Z", + "created_at": "2025-09-03T17:36:31.630948Z", "done": false, "done_reason": null, "total_duration": null, @@ -4647,7 +4647,7 @@ "__type__": "ollama._types.GenerateResponse", "__data__": { "model": "llama3.2:3b-instruct-fp16", - "created_at": "2025-08-04T22:55:29.163194Z", + "created_at": "2025-09-03T17:36:31.672087Z", "done": false, "done_reason": null, "total_duration": null, @@ -4665,7 +4665,7 @@ "__type__": "ollama._types.GenerateResponse", "__data__": { "model": "llama3.2:3b-instruct-fp16", - "created_at": "2025-08-04T22:55:29.217213Z", + "created_at": "2025-09-03T17:36:31.713337Z", "done": false, "done_reason": null, "total_duration": null, @@ -4683,7 +4683,7 @@ "__type__": "ollama._types.GenerateResponse", "__data__": { "model": "llama3.2:3b-instruct-fp16", - "created_at": "2025-08-04T22:55:29.269168Z", + "created_at": "2025-09-03T17:36:31.754423Z", "done": false, "done_reason": null, "total_duration": null, @@ -4701,7 +4701,7 @@ "__type__": "ollama._types.GenerateResponse", "__data__": { "model": "llama3.2:3b-instruct-fp16", - "created_at": "2025-08-04T22:55:29.321308Z", + "created_at": "2025-09-03T17:36:31.795742Z", "done": false, "done_reason": null, "total_duration": null, @@ -4719,7 +4719,7 @@ "__type__": "ollama._types.GenerateResponse", "__data__": { "model": "llama3.2:3b-instruct-fp16", - "created_at": "2025-08-04T22:55:29.374321Z", + "created_at": "2025-09-03T17:36:31.836637Z", "done": false, "done_reason": null, "total_duration": null, @@ -4737,7 +4737,7 @@ "__type__": "ollama._types.GenerateResponse", "__data__": { "model": "llama3.2:3b-instruct-fp16", - "created_at": "2025-08-04T22:55:29.427106Z", + "created_at": "2025-09-03T17:36:31.878115Z", "done": false, "done_reason": null, "total_duration": null, @@ -4755,7 +4755,7 @@ "__type__": "ollama._types.GenerateResponse", "__data__": { "model": "llama3.2:3b-instruct-fp16", - "created_at": "2025-08-04T22:55:29.479022Z", + "created_at": "2025-09-03T17:36:31.919569Z", "done": false, "done_reason": null, "total_duration": null, @@ -4773,7 +4773,7 @@ "__type__": "ollama._types.GenerateResponse", "__data__": { "model": "llama3.2:3b-instruct-fp16", - "created_at": "2025-08-04T22:55:29.536933Z", + "created_at": "2025-09-03T17:36:31.960615Z", "done": false, "done_reason": null, "total_duration": null, @@ -4791,7 +4791,7 @@ "__type__": "ollama._types.GenerateResponse", "__data__": { "model": "llama3.2:3b-instruct-fp16", - "created_at": "2025-08-04T22:55:29.589411Z", + "created_at": "2025-09-03T17:36:32.001695Z", "done": false, "done_reason": null, "total_duration": null, @@ -4809,7 +4809,7 @@ "__type__": "ollama._types.GenerateResponse", "__data__": { "model": "llama3.2:3b-instruct-fp16", - "created_at": "2025-08-04T22:55:29.641976Z", + "created_at": "2025-09-03T17:36:32.042291Z", "done": false, "done_reason": null, "total_duration": null, @@ -4827,7 +4827,7 @@ "__type__": "ollama._types.GenerateResponse", "__data__": { "model": "llama3.2:3b-instruct-fp16", - "created_at": "2025-08-04T22:55:29.693984Z", + "created_at": "2025-09-03T17:36:32.082564Z", "done": false, "done_reason": null, "total_duration": null, @@ -4845,7 +4845,7 @@ "__type__": "ollama._types.GenerateResponse", "__data__": { "model": "llama3.2:3b-instruct-fp16", - "created_at": "2025-08-04T22:55:29.746091Z", + "created_at": "2025-09-03T17:36:32.123962Z", "done": false, "done_reason": null, "total_duration": null, @@ -4863,7 +4863,7 @@ "__type__": "ollama._types.GenerateResponse", "__data__": { "model": "llama3.2:3b-instruct-fp16", - "created_at": "2025-08-04T22:55:29.79699Z", + "created_at": "2025-09-03T17:36:32.164847Z", "done": false, "done_reason": null, "total_duration": null, @@ -4881,7 +4881,7 @@ "__type__": "ollama._types.GenerateResponse", "__data__": { "model": "llama3.2:3b-instruct-fp16", - "created_at": "2025-08-04T22:55:29.849326Z", + "created_at": "2025-09-03T17:36:32.205607Z", "done": false, "done_reason": null, "total_duration": null, @@ -4899,7 +4899,7 @@ "__type__": "ollama._types.GenerateResponse", "__data__": { "model": "llama3.2:3b-instruct-fp16", - "created_at": "2025-08-04T22:55:29.90127Z", + "created_at": "2025-09-03T17:36:32.246372Z", "done": false, "done_reason": null, "total_duration": null, @@ -4917,7 +4917,7 @@ "__type__": "ollama._types.GenerateResponse", "__data__": { "model": "llama3.2:3b-instruct-fp16", - "created_at": "2025-08-04T22:55:29.953331Z", + "created_at": "2025-09-03T17:36:32.287091Z", "done": false, "done_reason": null, "total_duration": null, @@ -4935,7 +4935,7 @@ "__type__": "ollama._types.GenerateResponse", "__data__": { "model": "llama3.2:3b-instruct-fp16", - "created_at": "2025-08-04T22:55:30.006229Z", + "created_at": "2025-09-03T17:36:32.32769Z", "done": false, "done_reason": null, "total_duration": null, @@ -4953,7 +4953,7 @@ "__type__": "ollama._types.GenerateResponse", "__data__": { "model": "llama3.2:3b-instruct-fp16", - "created_at": "2025-08-04T22:55:30.057576Z", + "created_at": "2025-09-03T17:36:32.368571Z", "done": false, "done_reason": null, "total_duration": null, @@ -4971,7 +4971,7 @@ "__type__": "ollama._types.GenerateResponse", "__data__": { "model": "llama3.2:3b-instruct-fp16", - "created_at": "2025-08-04T22:55:30.108201Z", + "created_at": "2025-09-03T17:36:32.409389Z", "done": false, "done_reason": null, "total_duration": null, @@ -4989,7 +4989,7 @@ "__type__": "ollama._types.GenerateResponse", "__data__": { "model": "llama3.2:3b-instruct-fp16", - "created_at": "2025-08-04T22:55:30.159044Z", + "created_at": "2025-09-03T17:36:32.450109Z", "done": false, "done_reason": null, "total_duration": null, @@ -5007,7 +5007,7 @@ "__type__": "ollama._types.GenerateResponse", "__data__": { "model": "llama3.2:3b-instruct-fp16", - "created_at": "2025-08-04T22:55:30.211179Z", + "created_at": "2025-09-03T17:36:32.491077Z", "done": false, "done_reason": null, "total_duration": null, @@ -5025,7 +5025,7 @@ "__type__": "ollama._types.GenerateResponse", "__data__": { "model": "llama3.2:3b-instruct-fp16", - "created_at": "2025-08-04T22:55:30.26223Z", + "created_at": "2025-09-03T17:36:32.532737Z", "done": false, "done_reason": null, "total_duration": null, @@ -5043,7 +5043,7 @@ "__type__": "ollama._types.GenerateResponse", "__data__": { "model": "llama3.2:3b-instruct-fp16", - "created_at": "2025-08-04T22:55:30.314187Z", + "created_at": "2025-09-03T17:36:32.572701Z", "done": false, "done_reason": null, "total_duration": null, @@ -5061,7 +5061,7 @@ "__type__": "ollama._types.GenerateResponse", "__data__": { "model": "llama3.2:3b-instruct-fp16", - "created_at": "2025-08-04T22:55:30.368683Z", + "created_at": "2025-09-03T17:36:32.614093Z", "done": false, "done_reason": null, "total_duration": null, @@ -5079,7 +5079,7 @@ "__type__": "ollama._types.GenerateResponse", "__data__": { "model": "llama3.2:3b-instruct-fp16", - "created_at": "2025-08-04T22:55:30.423991Z", + "created_at": "2025-09-03T17:36:32.655113Z", "done": false, "done_reason": null, "total_duration": null, @@ -5097,7 +5097,7 @@ "__type__": "ollama._types.GenerateResponse", "__data__": { "model": "llama3.2:3b-instruct-fp16", - "created_at": "2025-08-04T22:55:30.475926Z", + "created_at": "2025-09-03T17:36:32.696438Z", "done": false, "done_reason": null, "total_duration": null, @@ -5115,7 +5115,7 @@ "__type__": "ollama._types.GenerateResponse", "__data__": { "model": "llama3.2:3b-instruct-fp16", - "created_at": "2025-08-04T22:55:30.535785Z", + "created_at": "2025-09-03T17:36:32.73788Z", "done": false, "done_reason": null, "total_duration": null, @@ -5133,7 +5133,7 @@ "__type__": "ollama._types.GenerateResponse", "__data__": { "model": "llama3.2:3b-instruct-fp16", - "created_at": "2025-08-04T22:55:30.591719Z", + "created_at": "2025-09-03T17:36:32.780775Z", "done": false, "done_reason": null, "total_duration": null, @@ -5151,7 +5151,7 @@ "__type__": "ollama._types.GenerateResponse", "__data__": { "model": "llama3.2:3b-instruct-fp16", - "created_at": "2025-08-04T22:55:30.645659Z", + "created_at": "2025-09-03T17:36:32.823196Z", "done": false, "done_reason": null, "total_duration": null, @@ -5169,7 +5169,7 @@ "__type__": "ollama._types.GenerateResponse", "__data__": { "model": "llama3.2:3b-instruct-fp16", - "created_at": "2025-08-04T22:55:30.698314Z", + "created_at": "2025-09-03T17:36:32.86428Z", "done": false, "done_reason": null, "total_duration": null, @@ -5187,7 +5187,7 @@ "__type__": "ollama._types.GenerateResponse", "__data__": { "model": "llama3.2:3b-instruct-fp16", - "created_at": "2025-08-04T22:55:30.747479Z", + "created_at": "2025-09-03T17:36:32.905305Z", "done": false, "done_reason": null, "total_duration": null, @@ -5205,7 +5205,7 @@ "__type__": "ollama._types.GenerateResponse", "__data__": { "model": "llama3.2:3b-instruct-fp16", - "created_at": "2025-08-04T22:55:30.799751Z", + "created_at": "2025-09-03T17:36:32.946086Z", "done": false, "done_reason": null, "total_duration": null, @@ -5223,7 +5223,7 @@ "__type__": "ollama._types.GenerateResponse", "__data__": { "model": "llama3.2:3b-instruct-fp16", - "created_at": "2025-08-04T22:55:30.854603Z", + "created_at": "2025-09-03T17:36:32.986849Z", "done": false, "done_reason": null, "total_duration": null, @@ -5241,7 +5241,7 @@ "__type__": "ollama._types.GenerateResponse", "__data__": { "model": "llama3.2:3b-instruct-fp16", - "created_at": "2025-08-04T22:55:30.907564Z", + "created_at": "2025-09-03T17:36:33.028251Z", "done": false, "done_reason": null, "total_duration": null, @@ -5259,7 +5259,7 @@ "__type__": "ollama._types.GenerateResponse", "__data__": { "model": "llama3.2:3b-instruct-fp16", - "created_at": "2025-08-04T22:55:30.961713Z", + "created_at": "2025-09-03T17:36:33.069225Z", "done": false, "done_reason": null, "total_duration": null, @@ -5277,7 +5277,7 @@ "__type__": "ollama._types.GenerateResponse", "__data__": { "model": "llama3.2:3b-instruct-fp16", - "created_at": "2025-08-04T22:55:31.016244Z", + "created_at": "2025-09-03T17:36:33.110717Z", "done": false, "done_reason": null, "total_duration": null, @@ -5295,7 +5295,7 @@ "__type__": "ollama._types.GenerateResponse", "__data__": { "model": "llama3.2:3b-instruct-fp16", - "created_at": "2025-08-04T22:55:31.069635Z", + "created_at": "2025-09-03T17:36:33.151703Z", "done": false, "done_reason": null, "total_duration": null, @@ -5313,7 +5313,7 @@ "__type__": "ollama._types.GenerateResponse", "__data__": { "model": "llama3.2:3b-instruct-fp16", - "created_at": "2025-08-04T22:55:31.1225Z", + "created_at": "2025-09-03T17:36:33.192643Z", "done": false, "done_reason": null, "total_duration": null, @@ -5331,7 +5331,7 @@ "__type__": "ollama._types.GenerateResponse", "__data__": { "model": "llama3.2:3b-instruct-fp16", - "created_at": "2025-08-04T22:55:31.17487Z", + "created_at": "2025-09-03T17:36:33.233604Z", "done": false, "done_reason": null, "total_duration": null, @@ -5349,7 +5349,7 @@ "__type__": "ollama._types.GenerateResponse", "__data__": { "model": "llama3.2:3b-instruct-fp16", - "created_at": "2025-08-04T22:55:31.226231Z", + "created_at": "2025-09-03T17:36:33.274665Z", "done": false, "done_reason": null, "total_duration": null, @@ -5367,7 +5367,7 @@ "__type__": "ollama._types.GenerateResponse", "__data__": { "model": "llama3.2:3b-instruct-fp16", - "created_at": "2025-08-04T22:55:31.28044Z", + "created_at": "2025-09-03T17:36:33.315311Z", "done": false, "done_reason": null, "total_duration": null, @@ -5385,7 +5385,7 @@ "__type__": "ollama._types.GenerateResponse", "__data__": { "model": "llama3.2:3b-instruct-fp16", - "created_at": "2025-08-04T22:55:31.338834Z", + "created_at": "2025-09-03T17:36:33.356272Z", "done": false, "done_reason": null, "total_duration": null, @@ -5403,7 +5403,7 @@ "__type__": "ollama._types.GenerateResponse", "__data__": { "model": "llama3.2:3b-instruct-fp16", - "created_at": "2025-08-04T22:55:31.39313Z", + "created_at": "2025-09-03T17:36:33.397164Z", "done": false, "done_reason": null, "total_duration": null, @@ -5421,7 +5421,7 @@ "__type__": "ollama._types.GenerateResponse", "__data__": { "model": "llama3.2:3b-instruct-fp16", - "created_at": "2025-08-04T22:55:31.443815Z", + "created_at": "2025-09-03T17:36:33.438163Z", "done": false, "done_reason": null, "total_duration": null, @@ -5439,7 +5439,7 @@ "__type__": "ollama._types.GenerateResponse", "__data__": { "model": "llama3.2:3b-instruct-fp16", - "created_at": "2025-08-04T22:55:31.496638Z", + "created_at": "2025-09-03T17:36:33.478995Z", "done": false, "done_reason": null, "total_duration": null, @@ -5457,7 +5457,7 @@ "__type__": "ollama._types.GenerateResponse", "__data__": { "model": "llama3.2:3b-instruct-fp16", - "created_at": "2025-08-04T22:55:31.549024Z", + "created_at": "2025-09-03T17:36:33.520178Z", "done": false, "done_reason": null, "total_duration": null, @@ -5475,7 +5475,7 @@ "__type__": "ollama._types.GenerateResponse", "__data__": { "model": "llama3.2:3b-instruct-fp16", - "created_at": "2025-08-04T22:55:31.604983Z", + "created_at": "2025-09-03T17:36:33.561169Z", "done": false, "done_reason": null, "total_duration": null, @@ -5493,7 +5493,7 @@ "__type__": "ollama._types.GenerateResponse", "__data__": { "model": "llama3.2:3b-instruct-fp16", - "created_at": "2025-08-04T22:55:31.657366Z", + "created_at": "2025-09-03T17:36:33.602614Z", "done": false, "done_reason": null, "total_duration": null, @@ -5511,7 +5511,7 @@ "__type__": "ollama._types.GenerateResponse", "__data__": { "model": "llama3.2:3b-instruct-fp16", - "created_at": "2025-08-04T22:55:31.710345Z", + "created_at": "2025-09-03T17:36:33.643517Z", "done": false, "done_reason": null, "total_duration": null, @@ -5529,7 +5529,7 @@ "__type__": "ollama._types.GenerateResponse", "__data__": { "model": "llama3.2:3b-instruct-fp16", - "created_at": "2025-08-04T22:55:31.761482Z", + "created_at": "2025-09-03T17:36:33.69501Z", "done": false, "done_reason": null, "total_duration": null, @@ -5547,7 +5547,7 @@ "__type__": "ollama._types.GenerateResponse", "__data__": { "model": "llama3.2:3b-instruct-fp16", - "created_at": "2025-08-04T22:55:31.812505Z", + "created_at": "2025-09-03T17:36:33.744642Z", "done": false, "done_reason": null, "total_duration": null, @@ -5565,7 +5565,7 @@ "__type__": "ollama._types.GenerateResponse", "__data__": { "model": "llama3.2:3b-instruct-fp16", - "created_at": "2025-08-04T22:55:31.864427Z", + "created_at": "2025-09-03T17:36:33.788023Z", "done": false, "done_reason": null, "total_duration": null, @@ -5583,7 +5583,7 @@ "__type__": "ollama._types.GenerateResponse", "__data__": { "model": "llama3.2:3b-instruct-fp16", - "created_at": "2025-08-04T22:55:31.915242Z", + "created_at": "2025-09-03T17:36:33.830123Z", "done": false, "done_reason": null, "total_duration": null, @@ -5601,7 +5601,7 @@ "__type__": "ollama._types.GenerateResponse", "__data__": { "model": "llama3.2:3b-instruct-fp16", - "created_at": "2025-08-04T22:55:31.967322Z", + "created_at": "2025-09-03T17:36:33.873234Z", "done": false, "done_reason": null, "total_duration": null, @@ -5619,7 +5619,7 @@ "__type__": "ollama._types.GenerateResponse", "__data__": { "model": "llama3.2:3b-instruct-fp16", - "created_at": "2025-08-04T22:55:32.018589Z", + "created_at": "2025-09-03T17:36:33.91574Z", "done": false, "done_reason": null, "total_duration": null, @@ -5637,7 +5637,7 @@ "__type__": "ollama._types.GenerateResponse", "__data__": { "model": "llama3.2:3b-instruct-fp16", - "created_at": "2025-08-04T22:55:32.070624Z", + "created_at": "2025-09-03T17:36:33.958165Z", "done": false, "done_reason": null, "total_duration": null, @@ -5655,7 +5655,7 @@ "__type__": "ollama._types.GenerateResponse", "__data__": { "model": "llama3.2:3b-instruct-fp16", - "created_at": "2025-08-04T22:55:32.121703Z", + "created_at": "2025-09-03T17:36:34.000544Z", "done": false, "done_reason": null, "total_duration": null, @@ -5673,7 +5673,7 @@ "__type__": "ollama._types.GenerateResponse", "__data__": { "model": "llama3.2:3b-instruct-fp16", - "created_at": "2025-08-04T22:55:32.174718Z", + "created_at": "2025-09-03T17:36:34.043824Z", "done": false, "done_reason": null, "total_duration": null, @@ -5691,7 +5691,7 @@ "__type__": "ollama._types.GenerateResponse", "__data__": { "model": "llama3.2:3b-instruct-fp16", - "created_at": "2025-08-04T22:55:32.23641Z", + "created_at": "2025-09-03T17:36:34.086339Z", "done": false, "done_reason": null, "total_duration": null, @@ -5709,7 +5709,7 @@ "__type__": "ollama._types.GenerateResponse", "__data__": { "model": "llama3.2:3b-instruct-fp16", - "created_at": "2025-08-04T22:55:32.294487Z", + "created_at": "2025-09-03T17:36:34.128863Z", "done": false, "done_reason": null, "total_duration": null, @@ -5727,7 +5727,7 @@ "__type__": "ollama._types.GenerateResponse", "__data__": { "model": "llama3.2:3b-instruct-fp16", - "created_at": "2025-08-04T22:55:32.354809Z", + "created_at": "2025-09-03T17:36:34.171675Z", "done": false, "done_reason": null, "total_duration": null, @@ -5745,7 +5745,7 @@ "__type__": "ollama._types.GenerateResponse", "__data__": { "model": "llama3.2:3b-instruct-fp16", - "created_at": "2025-08-04T22:55:32.409827Z", + "created_at": "2025-09-03T17:36:34.214025Z", "done": false, "done_reason": null, "total_duration": null, @@ -5763,7 +5763,7 @@ "__type__": "ollama._types.GenerateResponse", "__data__": { "model": "llama3.2:3b-instruct-fp16", - "created_at": "2025-08-04T22:55:32.467898Z", + "created_at": "2025-09-03T17:36:34.256135Z", "done": false, "done_reason": null, "total_duration": null, @@ -5781,7 +5781,7 @@ "__type__": "ollama._types.GenerateResponse", "__data__": { "model": "llama3.2:3b-instruct-fp16", - "created_at": "2025-08-04T22:55:32.525406Z", + "created_at": "2025-09-03T17:36:34.298571Z", "done": false, "done_reason": null, "total_duration": null, @@ -5799,7 +5799,7 @@ "__type__": "ollama._types.GenerateResponse", "__data__": { "model": "llama3.2:3b-instruct-fp16", - "created_at": "2025-08-04T22:55:32.580356Z", + "created_at": "2025-09-03T17:36:34.340742Z", "done": false, "done_reason": null, "total_duration": null, @@ -5817,7 +5817,7 @@ "__type__": "ollama._types.GenerateResponse", "__data__": { "model": "llama3.2:3b-instruct-fp16", - "created_at": "2025-08-04T22:55:32.637738Z", + "created_at": "2025-09-03T17:36:34.38192Z", "done": false, "done_reason": null, "total_duration": null, @@ -5835,7 +5835,7 @@ "__type__": "ollama._types.GenerateResponse", "__data__": { "model": "llama3.2:3b-instruct-fp16", - "created_at": "2025-08-04T22:55:32.691339Z", + "created_at": "2025-09-03T17:36:34.423807Z", "done": false, "done_reason": null, "total_duration": null, @@ -5853,7 +5853,7 @@ "__type__": "ollama._types.GenerateResponse", "__data__": { "model": "llama3.2:3b-instruct-fp16", - "created_at": "2025-08-04T22:55:32.75193Z", + "created_at": "2025-09-03T17:36:34.465059Z", "done": false, "done_reason": null, "total_duration": null, @@ -5871,7 +5871,7 @@ "__type__": "ollama._types.GenerateResponse", "__data__": { "model": "llama3.2:3b-instruct-fp16", - "created_at": "2025-08-04T22:55:32.809022Z", + "created_at": "2025-09-03T17:36:34.506527Z", "done": false, "done_reason": null, "total_duration": null, @@ -5889,7 +5889,7 @@ "__type__": "ollama._types.GenerateResponse", "__data__": { "model": "llama3.2:3b-instruct-fp16", - "created_at": "2025-08-04T22:55:32.868509Z", + "created_at": "2025-09-03T17:36:34.547797Z", "done": false, "done_reason": null, "total_duration": null, @@ -5907,7 +5907,7 @@ "__type__": "ollama._types.GenerateResponse", "__data__": { "model": "llama3.2:3b-instruct-fp16", - "created_at": "2025-08-04T22:55:32.927239Z", + "created_at": "2025-09-03T17:36:34.589189Z", "done": false, "done_reason": null, "total_duration": null, @@ -5925,7 +5925,7 @@ "__type__": "ollama._types.GenerateResponse", "__data__": { "model": "llama3.2:3b-instruct-fp16", - "created_at": "2025-08-04T22:55:32.985536Z", + "created_at": "2025-09-03T17:36:34.632479Z", "done": false, "done_reason": null, "total_duration": null, @@ -5943,7 +5943,7 @@ "__type__": "ollama._types.GenerateResponse", "__data__": { "model": "llama3.2:3b-instruct-fp16", - "created_at": "2025-08-04T22:55:33.040875Z", + "created_at": "2025-09-03T17:36:34.673914Z", "done": false, "done_reason": null, "total_duration": null, @@ -5961,7 +5961,7 @@ "__type__": "ollama._types.GenerateResponse", "__data__": { "model": "llama3.2:3b-instruct-fp16", - "created_at": "2025-08-04T22:55:33.099492Z", + "created_at": "2025-09-03T17:36:34.714561Z", "done": false, "done_reason": null, "total_duration": null, @@ -5979,7 +5979,7 @@ "__type__": "ollama._types.GenerateResponse", "__data__": { "model": "llama3.2:3b-instruct-fp16", - "created_at": "2025-08-04T22:55:33.151102Z", + "created_at": "2025-09-03T17:36:34.755794Z", "done": false, "done_reason": null, "total_duration": null, @@ -5997,7 +5997,7 @@ "__type__": "ollama._types.GenerateResponse", "__data__": { "model": "llama3.2:3b-instruct-fp16", - "created_at": "2025-08-04T22:55:33.2036Z", + "created_at": "2025-09-03T17:36:34.797365Z", "done": false, "done_reason": null, "total_duration": null, @@ -6015,7 +6015,7 @@ "__type__": "ollama._types.GenerateResponse", "__data__": { "model": "llama3.2:3b-instruct-fp16", - "created_at": "2025-08-04T22:55:33.255217Z", + "created_at": "2025-09-03T17:36:34.839305Z", "done": false, "done_reason": null, "total_duration": null, @@ -6033,7 +6033,7 @@ "__type__": "ollama._types.GenerateResponse", "__data__": { "model": "llama3.2:3b-instruct-fp16", - "created_at": "2025-08-04T22:55:33.306726Z", + "created_at": "2025-09-03T17:36:34.881479Z", "done": false, "done_reason": null, "total_duration": null, @@ -6051,7 +6051,7 @@ "__type__": "ollama._types.GenerateResponse", "__data__": { "model": "llama3.2:3b-instruct-fp16", - "created_at": "2025-08-04T22:55:33.357871Z", + "created_at": "2025-09-03T17:36:34.923518Z", "done": false, "done_reason": null, "total_duration": null, @@ -6069,7 +6069,7 @@ "__type__": "ollama._types.GenerateResponse", "__data__": { "model": "llama3.2:3b-instruct-fp16", - "created_at": "2025-08-04T22:55:33.410678Z", + "created_at": "2025-09-03T17:36:34.964593Z", "done": false, "done_reason": null, "total_duration": null, @@ -6087,7 +6087,7 @@ "__type__": "ollama._types.GenerateResponse", "__data__": { "model": "llama3.2:3b-instruct-fp16", - "created_at": "2025-08-04T22:55:33.473848Z", + "created_at": "2025-09-03T17:36:35.005594Z", "done": false, "done_reason": null, "total_duration": null, @@ -6105,7 +6105,7 @@ "__type__": "ollama._types.GenerateResponse", "__data__": { "model": "llama3.2:3b-instruct-fp16", - "created_at": "2025-08-04T22:55:33.530364Z", + "created_at": "2025-09-03T17:36:35.047897Z", "done": false, "done_reason": null, "total_duration": null, @@ -6123,7 +6123,7 @@ "__type__": "ollama._types.GenerateResponse", "__data__": { "model": "llama3.2:3b-instruct-fp16", - "created_at": "2025-08-04T22:55:33.588387Z", + "created_at": "2025-09-03T17:36:35.088945Z", "done": false, "done_reason": null, "total_duration": null, @@ -6141,7 +6141,7 @@ "__type__": "ollama._types.GenerateResponse", "__data__": { "model": "llama3.2:3b-instruct-fp16", - "created_at": "2025-08-04T22:55:33.644848Z", + "created_at": "2025-09-03T17:36:35.130496Z", "done": false, "done_reason": null, "total_duration": null, @@ -6159,7 +6159,7 @@ "__type__": "ollama._types.GenerateResponse", "__data__": { "model": "llama3.2:3b-instruct-fp16", - "created_at": "2025-08-04T22:55:33.702142Z", + "created_at": "2025-09-03T17:36:35.171697Z", "done": false, "done_reason": null, "total_duration": null, @@ -6177,7 +6177,7 @@ "__type__": "ollama._types.GenerateResponse", "__data__": { "model": "llama3.2:3b-instruct-fp16", - "created_at": "2025-08-04T22:55:33.757078Z", + "created_at": "2025-09-03T17:36:35.212785Z", "done": false, "done_reason": null, "total_duration": null, @@ -6195,7 +6195,7 @@ "__type__": "ollama._types.GenerateResponse", "__data__": { "model": "llama3.2:3b-instruct-fp16", - "created_at": "2025-08-04T22:55:33.809287Z", + "created_at": "2025-09-03T17:36:35.254Z", "done": false, "done_reason": null, "total_duration": null, @@ -6213,7 +6213,7 @@ "__type__": "ollama._types.GenerateResponse", "__data__": { "model": "llama3.2:3b-instruct-fp16", - "created_at": "2025-08-04T22:55:33.863545Z", + "created_at": "2025-09-03T17:36:35.294945Z", "done": false, "done_reason": null, "total_duration": null, @@ -6231,7 +6231,7 @@ "__type__": "ollama._types.GenerateResponse", "__data__": { "model": "llama3.2:3b-instruct-fp16", - "created_at": "2025-08-04T22:55:33.921183Z", + "created_at": "2025-09-03T17:36:35.335904Z", "done": false, "done_reason": null, "total_duration": null, @@ -6249,7 +6249,7 @@ "__type__": "ollama._types.GenerateResponse", "__data__": { "model": "llama3.2:3b-instruct-fp16", - "created_at": "2025-08-04T22:55:33.972308Z", + "created_at": "2025-09-03T17:36:35.376911Z", "done": false, "done_reason": null, "total_duration": null, @@ -6267,7 +6267,7 @@ "__type__": "ollama._types.GenerateResponse", "__data__": { "model": "llama3.2:3b-instruct-fp16", - "created_at": "2025-08-04T22:55:34.024699Z", + "created_at": "2025-09-03T17:36:35.417931Z", "done": false, "done_reason": null, "total_duration": null, @@ -6285,7 +6285,7 @@ "__type__": "ollama._types.GenerateResponse", "__data__": { "model": "llama3.2:3b-instruct-fp16", - "created_at": "2025-08-04T22:55:34.078626Z", + "created_at": "2025-09-03T17:36:35.45891Z", "done": false, "done_reason": null, "total_duration": null, @@ -6303,7 +6303,7 @@ "__type__": "ollama._types.GenerateResponse", "__data__": { "model": "llama3.2:3b-instruct-fp16", - "created_at": "2025-08-04T22:55:34.132072Z", + "created_at": "2025-09-03T17:36:35.501211Z", "done": false, "done_reason": null, "total_duration": null, @@ -6321,7 +6321,7 @@ "__type__": "ollama._types.GenerateResponse", "__data__": { "model": "llama3.2:3b-instruct-fp16", - "created_at": "2025-08-04T22:55:34.185534Z", + "created_at": "2025-09-03T17:36:35.543696Z", "done": false, "done_reason": null, "total_duration": null, @@ -6339,7 +6339,7 @@ "__type__": "ollama._types.GenerateResponse", "__data__": { "model": "llama3.2:3b-instruct-fp16", - "created_at": "2025-08-04T22:55:34.237811Z", + "created_at": "2025-09-03T17:36:35.584233Z", "done": false, "done_reason": null, "total_duration": null, @@ -6357,7 +6357,7 @@ "__type__": "ollama._types.GenerateResponse", "__data__": { "model": "llama3.2:3b-instruct-fp16", - "created_at": "2025-08-04T22:55:34.289202Z", + "created_at": "2025-09-03T17:36:35.626596Z", "done": false, "done_reason": null, "total_duration": null, @@ -6375,7 +6375,7 @@ "__type__": "ollama._types.GenerateResponse", "__data__": { "model": "llama3.2:3b-instruct-fp16", - "created_at": "2025-08-04T22:55:34.341588Z", + "created_at": "2025-09-03T17:36:35.667752Z", "done": false, "done_reason": null, "total_duration": null, @@ -6393,7 +6393,7 @@ "__type__": "ollama._types.GenerateResponse", "__data__": { "model": "llama3.2:3b-instruct-fp16", - "created_at": "2025-08-04T22:55:34.393213Z", + "created_at": "2025-09-03T17:36:35.70907Z", "done": false, "done_reason": null, "total_duration": null, @@ -6411,7 +6411,7 @@ "__type__": "ollama._types.GenerateResponse", "__data__": { "model": "llama3.2:3b-instruct-fp16", - "created_at": "2025-08-04T22:55:34.444819Z", + "created_at": "2025-09-03T17:36:35.749741Z", "done": false, "done_reason": null, "total_duration": null, @@ -6429,7 +6429,7 @@ "__type__": "ollama._types.GenerateResponse", "__data__": { "model": "llama3.2:3b-instruct-fp16", - "created_at": "2025-08-04T22:55:34.497564Z", + "created_at": "2025-09-03T17:36:35.79089Z", "done": false, "done_reason": null, "total_duration": null, @@ -6447,7 +6447,7 @@ "__type__": "ollama._types.GenerateResponse", "__data__": { "model": "llama3.2:3b-instruct-fp16", - "created_at": "2025-08-04T22:55:34.552231Z", + "created_at": "2025-09-03T17:36:35.832516Z", "done": false, "done_reason": null, "total_duration": null, @@ -6465,7 +6465,7 @@ "__type__": "ollama._types.GenerateResponse", "__data__": { "model": "llama3.2:3b-instruct-fp16", - "created_at": "2025-08-04T22:55:34.608902Z", + "created_at": "2025-09-03T17:36:35.874088Z", "done": false, "done_reason": null, "total_duration": null, @@ -6483,7 +6483,7 @@ "__type__": "ollama._types.GenerateResponse", "__data__": { "model": "llama3.2:3b-instruct-fp16", - "created_at": "2025-08-04T22:55:34.66848Z", + "created_at": "2025-09-03T17:36:35.915661Z", "done": false, "done_reason": null, "total_duration": null, @@ -6501,7 +6501,7 @@ "__type__": "ollama._types.GenerateResponse", "__data__": { "model": "llama3.2:3b-instruct-fp16", - "created_at": "2025-08-04T22:55:34.721915Z", + "created_at": "2025-09-03T17:36:35.95745Z", "done": false, "done_reason": null, "total_duration": null, @@ -6519,7 +6519,7 @@ "__type__": "ollama._types.GenerateResponse", "__data__": { "model": "llama3.2:3b-instruct-fp16", - "created_at": "2025-08-04T22:55:34.776127Z", + "created_at": "2025-09-03T17:36:35.998856Z", "done": false, "done_reason": null, "total_duration": null, @@ -6537,7 +6537,7 @@ "__type__": "ollama._types.GenerateResponse", "__data__": { "model": "llama3.2:3b-instruct-fp16", - "created_at": "2025-08-04T22:55:34.833308Z", + "created_at": "2025-09-03T17:36:36.040666Z", "done": false, "done_reason": null, "total_duration": null, @@ -6555,7 +6555,7 @@ "__type__": "ollama._types.GenerateResponse", "__data__": { "model": "llama3.2:3b-instruct-fp16", - "created_at": "2025-08-04T22:55:34.889407Z", + "created_at": "2025-09-03T17:36:36.082075Z", "done": false, "done_reason": null, "total_duration": null, @@ -6573,7 +6573,7 @@ "__type__": "ollama._types.GenerateResponse", "__data__": { "model": "llama3.2:3b-instruct-fp16", - "created_at": "2025-08-04T22:55:34.942394Z", + "created_at": "2025-09-03T17:36:36.123665Z", "done": false, "done_reason": null, "total_duration": null, @@ -6591,7 +6591,7 @@ "__type__": "ollama._types.GenerateResponse", "__data__": { "model": "llama3.2:3b-instruct-fp16", - "created_at": "2025-08-04T22:55:34.997254Z", + "created_at": "2025-09-03T17:36:36.164998Z", "done": false, "done_reason": null, "total_duration": null, @@ -6609,7 +6609,7 @@ "__type__": "ollama._types.GenerateResponse", "__data__": { "model": "llama3.2:3b-instruct-fp16", - "created_at": "2025-08-04T22:55:35.049568Z", + "created_at": "2025-09-03T17:36:36.206212Z", "done": false, "done_reason": null, "total_duration": null, @@ -6627,7 +6627,7 @@ "__type__": "ollama._types.GenerateResponse", "__data__": { "model": "llama3.2:3b-instruct-fp16", - "created_at": "2025-08-04T22:55:35.101649Z", + "created_at": "2025-09-03T17:36:36.24761Z", "done": false, "done_reason": null, "total_duration": null, @@ -6645,7 +6645,7 @@ "__type__": "ollama._types.GenerateResponse", "__data__": { "model": "llama3.2:3b-instruct-fp16", - "created_at": "2025-08-04T22:55:35.151407Z", + "created_at": "2025-09-03T17:36:36.288872Z", "done": false, "done_reason": null, "total_duration": null, @@ -6663,7 +6663,7 @@ "__type__": "ollama._types.GenerateResponse", "__data__": { "model": "llama3.2:3b-instruct-fp16", - "created_at": "2025-08-04T22:55:35.20241Z", + "created_at": "2025-09-03T17:36:36.330688Z", "done": false, "done_reason": null, "total_duration": null, @@ -6681,7 +6681,7 @@ "__type__": "ollama._types.GenerateResponse", "__data__": { "model": "llama3.2:3b-instruct-fp16", - "created_at": "2025-08-04T22:55:35.254715Z", + "created_at": "2025-09-03T17:36:36.372212Z", "done": false, "done_reason": null, "total_duration": null, @@ -6699,7 +6699,7 @@ "__type__": "ollama._types.GenerateResponse", "__data__": { "model": "llama3.2:3b-instruct-fp16", - "created_at": "2025-08-04T22:55:35.305634Z", + "created_at": "2025-09-03T17:36:36.415315Z", "done": false, "done_reason": null, "total_duration": null, @@ -6717,7 +6717,7 @@ "__type__": "ollama._types.GenerateResponse", "__data__": { "model": "llama3.2:3b-instruct-fp16", - "created_at": "2025-08-04T22:55:35.357517Z", + "created_at": "2025-09-03T17:36:36.458461Z", "done": false, "done_reason": null, "total_duration": null, @@ -6735,7 +6735,7 @@ "__type__": "ollama._types.GenerateResponse", "__data__": { "model": "llama3.2:3b-instruct-fp16", - "created_at": "2025-08-04T22:55:35.410715Z", + "created_at": "2025-09-03T17:36:36.501868Z", "done": false, "done_reason": null, "total_duration": null, @@ -6753,7 +6753,7 @@ "__type__": "ollama._types.GenerateResponse", "__data__": { "model": "llama3.2:3b-instruct-fp16", - "created_at": "2025-08-04T22:55:35.464886Z", + "created_at": "2025-09-03T17:36:36.544291Z", "done": false, "done_reason": null, "total_duration": null, @@ -6771,7 +6771,7 @@ "__type__": "ollama._types.GenerateResponse", "__data__": { "model": "llama3.2:3b-instruct-fp16", - "created_at": "2025-08-04T22:55:35.515495Z", + "created_at": "2025-09-03T17:36:36.58593Z", "done": false, "done_reason": null, "total_duration": null, @@ -6789,7 +6789,7 @@ "__type__": "ollama._types.GenerateResponse", "__data__": { "model": "llama3.2:3b-instruct-fp16", - "created_at": "2025-08-04T22:55:35.566584Z", + "created_at": "2025-09-03T17:36:36.627055Z", "done": false, "done_reason": null, "total_duration": null, @@ -6807,7 +6807,7 @@ "__type__": "ollama._types.GenerateResponse", "__data__": { "model": "llama3.2:3b-instruct-fp16", - "created_at": "2025-08-04T22:55:35.616019Z", + "created_at": "2025-09-03T17:36:36.668404Z", "done": false, "done_reason": null, "total_duration": null, @@ -6825,7 +6825,7 @@ "__type__": "ollama._types.GenerateResponse", "__data__": { "model": "llama3.2:3b-instruct-fp16", - "created_at": "2025-08-04T22:55:35.669824Z", + "created_at": "2025-09-03T17:36:36.709546Z", "done": false, "done_reason": null, "total_duration": null, @@ -6843,7 +6843,7 @@ "__type__": "ollama._types.GenerateResponse", "__data__": { "model": "llama3.2:3b-instruct-fp16", - "created_at": "2025-08-04T22:55:35.724262Z", + "created_at": "2025-09-03T17:36:36.750533Z", "done": false, "done_reason": null, "total_duration": null, @@ -6861,7 +6861,7 @@ "__type__": "ollama._types.GenerateResponse", "__data__": { "model": "llama3.2:3b-instruct-fp16", - "created_at": "2025-08-04T22:55:35.779373Z", + "created_at": "2025-09-03T17:36:36.792039Z", "done": false, "done_reason": null, "total_duration": null, @@ -6879,7 +6879,7 @@ "__type__": "ollama._types.GenerateResponse", "__data__": { "model": "llama3.2:3b-instruct-fp16", - "created_at": "2025-08-04T22:55:35.834386Z", + "created_at": "2025-09-03T17:36:36.833512Z", "done": false, "done_reason": null, "total_duration": null, @@ -6897,7 +6897,7 @@ "__type__": "ollama._types.GenerateResponse", "__data__": { "model": "llama3.2:3b-instruct-fp16", - "created_at": "2025-08-04T22:55:35.887658Z", + "created_at": "2025-09-03T17:36:36.875114Z", "done": false, "done_reason": null, "total_duration": null, @@ -6915,7 +6915,7 @@ "__type__": "ollama._types.GenerateResponse", "__data__": { "model": "llama3.2:3b-instruct-fp16", - "created_at": "2025-08-04T22:55:35.940042Z", + "created_at": "2025-09-03T17:36:36.916425Z", "done": false, "done_reason": null, "total_duration": null, @@ -6933,7 +6933,7 @@ "__type__": "ollama._types.GenerateResponse", "__data__": { "model": "llama3.2:3b-instruct-fp16", - "created_at": "2025-08-04T22:55:35.996154Z", + "created_at": "2025-09-03T17:36:36.959229Z", "done": false, "done_reason": null, "total_duration": null, @@ -6951,7 +6951,7 @@ "__type__": "ollama._types.GenerateResponse", "__data__": { "model": "llama3.2:3b-instruct-fp16", - "created_at": "2025-08-04T22:55:36.054767Z", + "created_at": "2025-09-03T17:36:37.000732Z", "done": false, "done_reason": null, "total_duration": null, @@ -6969,7 +6969,7 @@ "__type__": "ollama._types.GenerateResponse", "__data__": { "model": "llama3.2:3b-instruct-fp16", - "created_at": "2025-08-04T22:55:36.110188Z", + "created_at": "2025-09-03T17:36:37.042352Z", "done": false, "done_reason": null, "total_duration": null, @@ -6987,7 +6987,7 @@ "__type__": "ollama._types.GenerateResponse", "__data__": { "model": "llama3.2:3b-instruct-fp16", - "created_at": "2025-08-04T22:55:36.172356Z", + "created_at": "2025-09-03T17:36:37.083572Z", "done": false, "done_reason": null, "total_duration": null, @@ -7005,7 +7005,7 @@ "__type__": "ollama._types.GenerateResponse", "__data__": { "model": "llama3.2:3b-instruct-fp16", - "created_at": "2025-08-04T22:55:36.229749Z", + "created_at": "2025-09-03T17:36:37.125478Z", "done": false, "done_reason": null, "total_duration": null, @@ -7023,7 +7023,7 @@ "__type__": "ollama._types.GenerateResponse", "__data__": { "model": "llama3.2:3b-instruct-fp16", - "created_at": "2025-08-04T22:55:36.287566Z", + "created_at": "2025-09-03T17:36:37.166749Z", "done": false, "done_reason": null, "total_duration": null, @@ -7041,7 +7041,7 @@ "__type__": "ollama._types.GenerateResponse", "__data__": { "model": "llama3.2:3b-instruct-fp16", - "created_at": "2025-08-04T22:55:36.343992Z", + "created_at": "2025-09-03T17:36:37.207713Z", "done": false, "done_reason": null, "total_duration": null, @@ -7059,7 +7059,7 @@ "__type__": "ollama._types.GenerateResponse", "__data__": { "model": "llama3.2:3b-instruct-fp16", - "created_at": "2025-08-04T22:55:36.402701Z", + "created_at": "2025-09-03T17:36:37.249261Z", "done": false, "done_reason": null, "total_duration": null, @@ -7077,7 +7077,7 @@ "__type__": "ollama._types.GenerateResponse", "__data__": { "model": "llama3.2:3b-instruct-fp16", - "created_at": "2025-08-04T22:55:36.455985Z", + "created_at": "2025-09-03T17:36:37.291638Z", "done": false, "done_reason": null, "total_duration": null, @@ -7095,15 +7095,15 @@ "__type__": "ollama._types.GenerateResponse", "__data__": { "model": "llama3.2:3b-instruct-fp16", - "created_at": "2025-08-04T22:55:36.508093Z", + "created_at": "2025-09-03T17:36:37.333479Z", "done": true, "done_reason": "stop", - "total_duration": 21827314917, - "load_duration": 60502000, + "total_duration": 16422193500, + "load_duration": 146702667, "prompt_eval_count": 36, - "prompt_eval_duration": 75000000, + "prompt_eval_duration": 78361500, "eval_count": 394, - "eval_duration": 21690000000, + "eval_duration": 16196482750, "response": "", "thinking": null, "context": null diff --git a/tests/integration/recordings/responses/d0ac68cbde69.json b/tests/integration/recordings/responses/d0ac68cbde69.json index 5c19e7c5a..750c5c69b 100644 --- a/tests/integration/recordings/responses/d0ac68cbde69.json +++ b/tests/integration/recordings/responses/d0ac68cbde69.json @@ -13,21 +13,21 @@ "__data__": { "models": [ { - "model": "llama3.2:3b-instruct-fp16", - "name": "llama3.2:3b-instruct-fp16", - "digest": "195a8c01d91ec3cb1e0aad4624a51f2602c51fa7d96110f8ab5a20c84081804d", - "expires_at": "2025-08-18T13:47:44.262256-07:00", - "size": 7919570944, - "size_vram": 7919570944, + "model": "llama3.2-vision:11b", + "name": "llama3.2-vision:11b", + "digest": "6f2f9757ae97e8a3f8ea33d6adb2b11d93d9a35bef277cd2c0b1b5af8e8d0b1e", + "expires_at": "2025-09-03T11:51:35.966409-07:00", + "size": 12401209008, + "size_vram": 12401209008, "details": { "parent_model": "", "format": "gguf", - "family": "llama", + "family": "mllama", "families": [ - "llama" + "mllama" ], - "parameter_size": "3.2B", - "quantization_level": "F16" + "parameter_size": "10.7B", + "quantization_level": "Q4_K_M" } } ] diff --git a/tests/integration/recordings/responses/d4c86ac355fb.json b/tests/integration/recordings/responses/d4c86ac355fb.json index 399c99e96..5dd3c7cc2 100644 --- a/tests/integration/recordings/responses/d4c86ac355fb.json +++ b/tests/integration/recordings/responses/d4c86ac355fb.json @@ -20,15 +20,15 @@ "__type__": "ollama._types.GenerateResponse", "__data__": { "model": "llama-guard3:1b", - "created_at": "2025-08-01T23:12:54.357928Z", + "created_at": "2025-09-03T17:37:35.824092Z", "done": true, "done_reason": "stop", - "total_duration": 227148458, - "load_duration": 113314916, + "total_duration": 270017875, + "load_duration": 183186083, "prompt_eval_count": 220, - "prompt_eval_duration": 83000000, + "prompt_eval_duration": 74457250, "eval_count": 2, - "eval_duration": 27000000, + "eval_duration": 11684125, "response": "safe", "thinking": null, "context": null diff --git a/tests/integration/recordings/responses/d86d4fc1eaca.json b/tests/integration/recordings/responses/d86d4fc1eaca.json index 165e65093..b22354c20 100644 --- a/tests/integration/recordings/responses/d86d4fc1eaca.json +++ b/tests/integration/recordings/responses/d86d4fc1eaca.json @@ -20,390 +20,390 @@ "data": [ { "embedding": [ - -0.043112263, - 0.008686894, - 0.06879597, - 0.018093547, - 0.04600579, - 0.0026370327, - -0.0032194739, - -0.04128641, - -0.090751864, - -0.03311354, - -0.026625047, - 0.007723082, - 0.02020638, - -0.032501053, - -0.03582959, - 0.031117352, - -0.03921459, - -0.011261255, - -0.10972644, - -0.12942035, - 0.0180839, - 0.011446483, - -0.07227963, - -0.013646516, - 0.035441313, - 0.024786202, - 0.033887945, - 0.072541736, - -0.012643559, - -0.058576923, - 0.05788946, - -0.08161914, - 0.064951725, - 0.0013679718, - -0.067565694, - 0.03500105, - -0.04499739, - -0.004745917, - 0.04001028, - -0.010447466, - 0.01971203, - -0.09853681, - -0.012831109, - 0.018893523, - 0.09566803, - 0.11574249, - -0.040688448, - -0.026871145, - -0.046950754, - 0.022665758, - -0.088503055, - -0.02349465, - -0.022964876, - -0.031086901, - -0.052040946, - 0.042409953, - 0.011587446, - 0.06698339, - 0.027131157, - -0.0021599897, - 0.04676616, - -0.08205926, - -0.038376193, - 0.052162487, - 0.097754784, - -0.0006300649, - -0.051922448, - 0.09102494, - -0.016122114, - -0.068757266, - 0.007674277, - 0.07676188, - -0.0017702047, - 0.014375106, - 0.038056612, - -0.0044639558, - 0.01128439, - 0.0006278256, - 0.08837875, - -0.059357397, - -0.042713538, - -0.048170365, - -0.053083148, - 0.03308664, - 0.008073919, - -0.042588204, - -0.038085114, - -0.0071590515, - 0.010923276, - -0.05467666, - 0.039005354, - -0.06774879, - -0.023520455, - -0.038865313, - 0.03465567, - 0.015331597, - 0.0073779793, - -0.123536974, - 0.03618996, - 0.13191763, - -0.06441666, - 0.03345934, - -0.014335858, - 0.0014165065, - 0.031064518, - -0.039842315, - 0.02367409, - -0.0028713108, - 0.09695666, - -0.13332556, - -0.054217666, - 0.019605756, - 0.069848165, - -0.05345, - 0.0018457369, - 0.021261381, - 0.019834742, - 0.0364726, - 0.008800545, - 0.01899199, - -0.07162491, - -0.018764688, - 0.030988883, - 0.09103274, - 0.016486289, - -0.08622413, - -0.083044365, - -1.3872017e-34, - -0.07202043, - -0.04547031, - -0.02789685, - 0.058260243, - -0.010473749, - -0.06121573, - 0.026039537, - -0.06574506, - 0.029187253, - 0.012286592, - -0.0634218, - 0.040592846, - 0.036436044, - 0.019791061, - 0.087508686, - 0.02819681, - 0.044173952, - 0.076273374, - 0.029475076, - -0.0022728525, - 0.043047428, - 0.025950495, - 5.87631e-06, - -0.038482204, - -0.016193746, - 0.03337992, - 0.021100886, - -0.023393923, - 0.009839609, - 0.033582654, - 0.030119505, - 0.060411848, - -0.06525265, - -0.016019775, - 0.01918547, - -0.0026020391, - -0.046634916, - 0.02794535, - 0.02097679, - 0.007491536, - -0.048716933, - -0.007056093, - 0.019862399, - 0.01642084, - -0.06380952, - 0.0312326, - 0.09198801, - -0.031442497, - 0.022264522, - -0.015000218, - 0.002577486, - -0.031360134, - -0.015259252, - -0.025491642, - 0.082340494, - 0.14332701, - -0.02549817, - -0.005105692, - -0.023140578, - -0.031175751, - 0.069945835, - 0.030767307, - 0.048112787, - 0.03713218, - 0.006838781, - 0.0676382, - 0.049743734, - 0.008490252, - 0.0717143, - 0.007724331, - -0.0051555126, - -0.0031412526, - 0.024659572, - -0.06878996, - 0.052448474, - -0.009324618, - 0.10184338, - -0.01364986, - -0.022692662, - 0.0214144, - -0.09594176, - 0.024049604, - -0.07207682, - -0.044615954, - 0.03346317, - -0.03939876, - 0.020151427, - -0.07493882, - -0.008306699, - 0.013818277, - -0.098477356, - 0.03363548, - 0.08237572, - -0.0034042797, - -0.05002446, - -2.0284525e-33, - -0.1366396, - 0.06461703, - 0.05217467, - 0.10100113, - 0.01633431, - -0.012683015, - -0.09023996, - -0.023585103, - 0.005757103, - 0.102958955, - -0.025938109, - -0.04024086, - 0.03442524, - 0.019281812, - -0.05693542, - 0.019865949, - 0.01892263, - -0.03937148, - 0.011244816, - 0.05603835, - -0.015989995, - 0.058931332, - -0.03825127, - -0.030448802, - -0.021279855, - 0.031412993, - -0.021256046, - -0.013973024, - -0.051028315, - 0.048959594, - 0.018415732, - -0.015543872, - -0.050339997, - 0.053825643, - -0.05102614, - 0.016936453, - -0.03276066, - -0.025018891, - 0.00083950633, - 0.10212479, - 0.047226448, - 0.01013783, - -0.11656542, - 0.012194899, - -0.029693797, - -0.099592775, - -0.05208683, - 0.068527095, - 0.05462999, - -0.06600112, - 0.025495205, - 0.013553149, - 0.008376301, - -0.10753366, - -0.08184969, - 0.07179369, - 0.008020084, - -0.013001388, - 0.02034551, - 0.07830072, - -0.073259205, - -0.11530623, - 0.040887818, - 0.04355819, - -0.001209231, - 0.045809098, - -0.00439629, - 0.07479018, - -0.017603617, - -0.046038117, - 0.022736022, - 0.057742845, - -0.015455795, - 0.0078048306, - -0.043795776, - -0.05287881, - -0.08780934, - 0.016208123, - -0.018338274, - -0.05680242, - 0.036081936, - -0.040417098, - 0.039246004, - 0.083620116, - -0.019201642, - 0.055849098, - 0.047579776, - -0.07378654, - 0.033696014, - -0.08679882, - -0.0106773665, - 0.052387673, - 0.009724484, - 0.023857431, - -0.08621698, - -1.7164837e-08, - 0.021028662, - -0.05131077, - 0.11875527, - -0.04681493, - 0.06569432, - 0.05875326, - -0.050507378, - 0.05572548, - -0.040579688, - 0.05569073, - 0.025022164, - -0.001695402, - -0.03103065, - 0.022217639, - 0.02812072, - 0.031644266, - -0.025532138, - 0.020890266, - -0.023071108, - 0.013451792, - 0.07502988, - 0.022283832, - 0.028922528, - -0.014248503, - 0.025503293, - -0.051433153, - -0.0144749675, - 0.014626067, - -0.028012041, - 0.08404862, - -0.07754722, - 0.03867142, - -0.004333606, - 0.025680339, - 0.12575574, - 0.07000303, - 0.0059297155, - -0.104100324, - -0.041432552, - 0.016101085, - -0.040745873, - 0.017750472, - -0.09112738, - -0.026067602, - 0.055624463, - 0.016697235, - 0.016438706, - -0.11938217, - 0.027880691, - 0.015196545, - 0.042352572, - 0.06814026, - 0.057811365, - 0.063263096, - 0.067467265, - 0.059775982, - 0.06467763, - -0.067497864, - -0.035580758, - 0.06402302, - 0.008630453, - 0.0031874685, - 0.009377425, - -0.08392178 + -0.04308226, + 0.008707138, + 0.06876158, + 0.018115537, + 0.04603657, + 0.0026118131, + -0.0032358477, + -0.041284926, + -0.09074888, + -0.033087812, + -0.026611822, + 0.0077352105, + 0.020191023, + -0.03254043, + -0.035847843, + 0.031108031, + -0.039247137, + -0.011286401, + -0.109710276, + -0.12942196, + 0.018077252, + 0.011446383, + -0.07231236, + -0.013655743, + 0.035438832, + 0.024783252, + 0.03387316, + 0.0726014, + -0.012643238, + -0.058606703, + 0.057943814, + -0.08163548, + 0.064962864, + 0.0013675748, + -0.06751009, + 0.03504323, + -0.044962864, + -0.004789603, + 0.039971247, + -0.010461211, + 0.019703588, + -0.09856083, + -0.01284534, + 0.018876119, + 0.09569305, + 0.11571406, + -0.040684983, + -0.026837468, + -0.046950106, + 0.022655226, + -0.0884734, + -0.023497678, + -0.022986038, + -0.031128721, + -0.052087843, + 0.04241795, + 0.011578454, + 0.06702011, + 0.027121129, + -0.0021518404, + 0.04675332, + -0.082024105, + -0.038331598, + 0.05215799, + 0.097757615, + -0.0006708623, + -0.051935766, + 0.09100271, + -0.016111707, + -0.06877312, + 0.00767068, + 0.076737314, + -0.0017499238, + 0.014369293, + 0.038031887, + -0.0044654603, + 0.011287075, + 0.0006178959, + 0.08834809, + -0.05933476, + -0.042706404, + -0.048178285, + -0.053068914, + 0.033110976, + 0.008051986, + -0.042581946, + -0.038104057, + -0.007202849, + 0.010891519, + -0.05466173, + 0.03903238, + -0.06774145, + -0.02356764, + -0.03883483, + 0.03464186, + 0.015297014, + 0.0073803077, + -0.12351391, + 0.036168184, + 0.13193323, + -0.06441449, + 0.033508655, + -0.01435515, + 0.0014314495, + 0.031048443, + -0.03981852, + 0.0236718, + -0.0028333638, + 0.096959464, + -0.13331193, + -0.054209094, + 0.019610135, + 0.06984815, + -0.05347757, + 0.0018131314, + 0.02127606, + 0.01981612, + 0.036502477, + 0.008825069, + 0.018954003, + -0.07161326, + -0.018733062, + 0.031044634, + 0.09102944, + 0.016508427, + -0.08625295, + -0.08300717, + -1.4044197e-34, + -0.072007515, + -0.045496386, + -0.027986562, + 0.05823018, + -0.010462877, + -0.06121516, + 0.026053715, + -0.06574638, + 0.029178392, + 0.012307141, + -0.06338016, + 0.040593755, + 0.03648161, + 0.01977942, + 0.08755496, + 0.028216325, + 0.044194777, + 0.076237544, + 0.02949726, + -0.0022650051, + 0.04304541, + 0.025918182, + 1.2261046e-05, + -0.038463842, + -0.0161955, + 0.03338553, + 0.02112944, + -0.023382189, + 0.009846733, + 0.033575017, + 0.030112585, + 0.060389582, + -0.06522927, + -0.016030189, + 0.019156763, + -0.002600835, + -0.04663393, + 0.02794595, + 0.021004112, + 0.0074595963, + -0.048745092, + -0.0070450655, + 0.019834043, + 0.016411202, + -0.06381404, + 0.031237993, + 0.091976196, + -0.0313931, + 0.022238847, + -0.015018542, + 0.0025784613, + -0.031382624, + -0.0152902305, + -0.025491757, + 0.08233924, + 0.14333151, + -0.0255008, + -0.005104579, + -0.02309693, + -0.03117742, + 0.06995927, + 0.030787794, + 0.04810884, + 0.037135385, + 0.0068392092, + 0.06759879, + 0.049763102, + 0.008472162, + 0.07170584, + 0.0076969583, + -0.005139827, + -0.0031728086, + 0.024646448, + -0.06879641, + 0.05249289, + -0.009404918, + 0.10184627, + -0.013639711, + -0.022681188, + 0.021382388, + -0.09593746, + 0.024071718, + -0.072101034, + -0.04462981, + 0.033456877, + -0.03942254, + 0.020099705, + -0.07495305, + -0.008311987, + 0.013811793, + -0.09847922, + 0.0336409, + 0.08235891, + -0.0034134828, + -0.05005179, + -2.0283256e-33, + -0.13664234, + 0.06463093, + 0.05221015, + 0.10102781, + 0.016344123, + -0.01269384, + -0.09024102, + -0.023596523, + 0.0057664234, + 0.10294541, + -0.025930807, + -0.040247634, + 0.034446176, + 0.019228913, + -0.056902077, + 0.019905953, + 0.018969242, + -0.039362065, + 0.011287794, + 0.056024995, + -0.016000811, + 0.058928564, + -0.038211577, + -0.030445429, + -0.02130076, + 0.031401403, + -0.021228284, + -0.01400283, + -0.051042903, + 0.048970606, + 0.018451849, + -0.015488385, + -0.05033241, + 0.053844187, + -0.050984643, + 0.016940817, + -0.032773405, + -0.02502497, + 0.000826887, + 0.10213942, + 0.04724571, + 0.010156266, + -0.11653258, + 0.012165439, + -0.029735534, + -0.09959623, + -0.052066926, + 0.06851813, + 0.054645896, + -0.066007115, + 0.025503889, + 0.013539478, + 0.008429433, + -0.10756056, + -0.08184448, + 0.07179834, + 0.007978949, + -0.013011469, + 0.020322459, + 0.07827889, + -0.07320297, + -0.1153648, + 0.04087073, + 0.04355079, + -0.0012279376, + 0.045840748, + -0.004366462, + 0.074786335, + -0.017625354, + -0.046014115, + 0.022716347, + 0.057738, + -0.015408269, + 0.007771719, + -0.04381374, + -0.05289107, + -0.08783473, + 0.016243288, + -0.018398289, + -0.05679973, + 0.036058675, + -0.040418148, + 0.039242174, + 0.083593465, + -0.019223504, + 0.05582025, + 0.04756948, + -0.07378718, + 0.03371102, + -0.08680738, + -0.010659349, + 0.0524085, + 0.009771544, + 0.023841262, + -0.086208895, + -1.7164519e-08, + 0.021028979, + -0.051292755, + 0.11877283, + -0.04687027, + 0.06566496, + 0.058750976, + -0.050496, + 0.055720143, + -0.040577173, + 0.055665523, + 0.025019526, + -0.001681203, + -0.031047702, + 0.022228474, + 0.028109053, + 0.03163934, + -0.025502652, + 0.020898303, + -0.023064507, + 0.013436037, + 0.07504084, + 0.022279648, + 0.028908938, + -0.014271217, + 0.025474275, + -0.051414162, + -0.014502164, + 0.014646399, + -0.028023712, + 0.08406334, + -0.07755092, + 0.038713943, + -0.0043370826, + 0.025676368, + 0.12571524, + 0.06996381, + 0.0059321956, + -0.10410214, + -0.041439336, + 0.016119901, + -0.040744506, + 0.017772397, + -0.09114363, + -0.026066387, + 0.055598073, + 0.016705057, + 0.016444646, + -0.11935461, + 0.02789905, + 0.0151745565, + 0.042357437, + 0.06817164, + 0.05782822, + 0.063278705, + 0.06748475, + 0.059781626, + 0.06468886, + -0.06749451, + -0.035589237, + 0.0640055, + 0.008595763, + 0.003157698, + 0.009343837, + -0.08392565 ], "index": 0, "object": "embedding" diff --git a/tests/integration/recordings/responses/dac7a32e5db9.json b/tests/integration/recordings/responses/dac7a32e5db9.json index a28144442..97d1fccfc 100644 --- a/tests/integration/recordings/responses/dac7a32e5db9.json +++ b/tests/integration/recordings/responses/dac7a32e5db9.json @@ -20,15 +20,15 @@ "__type__": "ollama._types.GenerateResponse", "__data__": { "model": "llama3.2:3b-instruct-fp16", - "created_at": "2025-07-31T17:50:00.921192644Z", + "created_at": "2025-09-03T17:39:36.919474Z", "done": true, "done_reason": "stop", - "total_duration": 2073152067, - "load_duration": 42902450, + "total_duration": 470635833, + "load_duration": 113755958, "prompt_eval_count": 23, - "prompt_eval_duration": 795517987, + "prompt_eval_duration": 67480542, "eval_count": 8, - "eval_duration": 1234259942, + "eval_duration": 288746541, "response": "The capital of France is Paris.", "thinking": null, "context": null diff --git a/tests/integration/recordings/responses/dd226d71f844.json b/tests/integration/recordings/responses/dd226d71f844.json index 2b8b52a63..ba2810bc9 100644 --- a/tests/integration/recordings/responses/dd226d71f844.json +++ b/tests/integration/recordings/responses/dd226d71f844.json @@ -22,7 +22,7 @@ "__type__": "ollama._types.GenerateResponse", "__data__": { "model": "llama3.2:3b-instruct-fp16", - "created_at": "2025-08-01T23:14:25.381208Z", + "created_at": "2025-09-03T17:38:05.682744Z", "done": false, "done_reason": null, "total_duration": null, @@ -40,7 +40,7 @@ "__type__": "ollama._types.GenerateResponse", "__data__": { "model": "llama3.2:3b-instruct-fp16", - "created_at": "2025-08-01T23:14:25.441511Z", + "created_at": "2025-09-03T17:38:05.72605Z", "done": false, "done_reason": null, "total_duration": null, @@ -58,7 +58,7 @@ "__type__": "ollama._types.GenerateResponse", "__data__": { "model": "llama3.2:3b-instruct-fp16", - "created_at": "2025-08-01T23:14:25.499052Z", + "created_at": "2025-09-03T17:38:05.770654Z", "done": false, "done_reason": null, "total_duration": null, @@ -76,7 +76,7 @@ "__type__": "ollama._types.GenerateResponse", "__data__": { "model": "llama3.2:3b-instruct-fp16", - "created_at": "2025-08-01T23:14:25.577259Z", + "created_at": "2025-09-03T17:38:05.819087Z", "done": false, "done_reason": null, "total_duration": null, @@ -94,7 +94,7 @@ "__type__": "ollama._types.GenerateResponse", "__data__": { "model": "llama3.2:3b-instruct-fp16", - "created_at": "2025-08-01T23:14:25.635016Z", + "created_at": "2025-09-03T17:38:05.862915Z", "done": false, "done_reason": null, "total_duration": null, @@ -112,7 +112,7 @@ "__type__": "ollama._types.GenerateResponse", "__data__": { "model": "llama3.2:3b-instruct-fp16", - "created_at": "2025-08-01T23:14:25.68944Z", + "created_at": "2025-09-03T17:38:05.913209Z", "done": false, "done_reason": null, "total_duration": null, @@ -130,7 +130,7 @@ "__type__": "ollama._types.GenerateResponse", "__data__": { "model": "llama3.2:3b-instruct-fp16", - "created_at": "2025-08-01T23:14:25.742314Z", + "created_at": "2025-09-03T17:38:05.951646Z", "done": false, "done_reason": null, "total_duration": null, @@ -148,7 +148,7 @@ "__type__": "ollama._types.GenerateResponse", "__data__": { "model": "llama3.2:3b-instruct-fp16", - "created_at": "2025-08-01T23:14:25.795086Z", + "created_at": "2025-09-03T17:38:05.996738Z", "done": false, "done_reason": null, "total_duration": null, @@ -166,7 +166,7 @@ "__type__": "ollama._types.GenerateResponse", "__data__": { "model": "llama3.2:3b-instruct-fp16", - "created_at": "2025-08-01T23:14:25.847905Z", + "created_at": "2025-09-03T17:38:06.046726Z", "done": false, "done_reason": null, "total_duration": null, @@ -184,7 +184,7 @@ "__type__": "ollama._types.GenerateResponse", "__data__": { "model": "llama3.2:3b-instruct-fp16", - "created_at": "2025-08-01T23:14:25.898666Z", + "created_at": "2025-09-03T17:38:06.08508Z", "done": false, "done_reason": null, "total_duration": null, @@ -202,7 +202,7 @@ "__type__": "ollama._types.GenerateResponse", "__data__": { "model": "llama3.2:3b-instruct-fp16", - "created_at": "2025-08-01T23:14:25.952292Z", + "created_at": "2025-09-03T17:38:06.128566Z", "done": false, "done_reason": null, "total_duration": null, @@ -220,7 +220,7 @@ "__type__": "ollama._types.GenerateResponse", "__data__": { "model": "llama3.2:3b-instruct-fp16", - "created_at": "2025-08-01T23:14:26.001903Z", + "created_at": "2025-09-03T17:38:06.173309Z", "done": false, "done_reason": null, "total_duration": null, @@ -238,15 +238,15 @@ "__type__": "ollama._types.GenerateResponse", "__data__": { "model": "llama3.2:3b-instruct-fp16", - "created_at": "2025-08-01T23:14:26.053764Z", + "created_at": "2025-09-03T17:38:06.218818Z", "done": true, "done_reason": "stop", - "total_duration": 880684833, - "load_duration": 101945250, + "total_duration": 755252250, + "load_duration": 141479625, "prompt_eval_count": 402, - "prompt_eval_duration": 100000000, + "prompt_eval_duration": 76304166, "eval_count": 13, - "eval_duration": 677000000, + "eval_duration": 536202125, "response": "", "thinking": null, "context": null diff --git a/tests/integration/recordings/responses/dd9e7d5913e9.json b/tests/integration/recordings/responses/dd9e7d5913e9.json index 8f4b0ef30..e3d8b41f5 100644 --- a/tests/integration/recordings/responses/dd9e7d5913e9.json +++ b/tests/integration/recordings/responses/dd9e7d5913e9.json @@ -21,7 +21,7 @@ "__type__": "ollama._types.GenerateResponse", "__data__": { "model": "llama3.2:3b-instruct-fp16", - "created_at": "2025-08-04T22:55:41.559883Z", + "created_at": "2025-09-03T17:36:40.972565Z", "done": false, "done_reason": null, "total_duration": null, @@ -39,15 +39,15 @@ "__type__": "ollama._types.GenerateResponse", "__data__": { "model": "llama3.2:3b-instruct-fp16", - "created_at": "2025-08-04T22:55:41.619829Z", + "created_at": "2025-09-03T17:36:41.014682Z", "done": true, "done_reason": "stop", - "total_duration": 915493834, - "load_duration": 167838417, + "total_duration": 693115125, + "load_duration": 114019375, "prompt_eval_count": 386, - "prompt_eval_duration": 683000000, + "prompt_eval_duration": 535931209, "eval_count": 2, - "eval_duration": 63000000, + "eval_duration": 42505166, "response": "", "thinking": null, "context": null diff --git a/tests/integration/recordings/responses/decfd950646c.json b/tests/integration/recordings/responses/decfd950646c.json index f62340c27..c46fa8686 100644 --- a/tests/integration/recordings/responses/decfd950646c.json +++ b/tests/integration/recordings/responses/decfd950646c.json @@ -1,7 +1,7 @@ { "request": { "method": "POST", - "url": "http://localhost:11434/v1/v1/chat/completions", + "url": "http://0.0.0.0:11434/v1/v1/chat/completions", "headers": {}, "body": { "model": "llama3.2:3b-instruct-fp16", @@ -44,32 +44,22 @@ { "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", "__data__": { - "id": "chatcmpl-620", + "id": "chatcmpl-202", "choices": [ { "delta": { - "content": "", + "content": "{\"name\":\"get_weather\",\"parameters{\"key\"]=\"Tokyo\"}}", "function_call": null, "refusal": null, "role": "assistant", - "tool_calls": [ - { - "index": 0, - "id": "call_490d5ur7", - "function": { - "arguments": "{\"city\":\"Tokyo\"}", - "name": "get_weather" - }, - "type": "function" - } - ] + "tool_calls": null }, "finish_reason": null, "index": 0, "logprobs": null } ], - "created": 1755228972, + "created": 1756921363, "model": "llama3.2:3b-instruct-fp16", "object": "chat.completion.chunk", "service_tier": null, @@ -80,7 +70,7 @@ { "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", "__data__": { - "id": "chatcmpl-620", + "id": "chatcmpl-202", "choices": [ { "delta": { @@ -90,12 +80,12 @@ "role": "assistant", "tool_calls": null }, - "finish_reason": "tool_calls", + "finish_reason": "stop", "index": 0, "logprobs": null } ], - "created": 1755228972, + "created": 1756921363, "model": "llama3.2:3b-instruct-fp16", "object": "chat.completion.chunk", "service_tier": null, diff --git a/tests/integration/recordings/responses/e0a6dce1d94b.json b/tests/integration/recordings/responses/e0a6dce1d94b.json index 08fd4df2c..4a285b30b 100644 --- a/tests/integration/recordings/responses/e0a6dce1d94b.json +++ b/tests/integration/recordings/responses/e0a6dce1d94b.json @@ -20,390 +20,390 @@ "data": [ { "embedding": [ - -0.028391164, - 0.08177924, - -0.078595236, - 0.02794012, - 0.0501054, - -0.03523528, - -0.0040212795, - 0.029318463, - -0.057719484, - 0.013758128, - 0.14608414, - -0.012030242, - -0.0244042, - -0.05507163, - -0.026622117, - -0.0132702645, - -0.109127365, - -0.037243392, - -0.003585629, - 0.047631495, - 0.062134072, - 0.0070668682, - -0.015537441, - -0.0080097895, - 0.03766712, - 0.015882641, - -0.041853406, - 0.09733282, - -0.025634848, - -0.11367206, - 0.035507742, - 0.07039588, - 0.016794816, - 0.022213018, - 0.12344487, - 0.007708932, - 0.12549855, - 0.00806089, - -0.02614805, - 0.0028652712, - 0.018172521, - -0.046700634, - 0.04102468, - 0.001336475, - 0.0019230411, - 0.008665353, - 0.016688382, - 0.022002129, - 0.0020729597, - -0.03286714, - -0.08643458, - 0.008018572, - -0.07433228, - -0.01628817, - 0.060542718, - 0.005992304, - 0.016035207, - 0.021369386, - 0.009568174, - 0.03177933, - 0.023040457, - 0.03435853, - -0.042258766, - 0.024753148, - 0.11620828, - -0.02494626, - -0.03897831, - -0.024997817, - -0.020839883, - -0.08836877, - -0.15072803, - 0.020933837, - -0.022511186, - 0.0023899842, - 0.0057860566, - -0.001578469, - -0.11986527, - -0.003025397, - 0.055101633, - -0.11829019, - -0.05885812, - -0.1504569, - 0.01861341, - -0.009307191, - -0.028901236, - 0.08401475, - 0.043742407, - -0.0006705526, - -0.052525397, - 0.00025590818, - 0.040425412, - 0.0066513056, - 0.026082706, - 0.051888794, - 0.01259031, - 0.061460704, - 0.013889724, - 0.03844097, - 0.048208673, - 0.10407735, - -0.02645537, - -0.021476867, - -0.020856835, - 0.050631326, - -0.05169685, - -0.07577173, - 0.05749261, - -0.0499922, - 0.06527451, - -0.02872225, - 0.03874818, - -0.062776215, - -0.014480463, - -0.06345894, - 0.06641256, - -0.014838074, - -0.03524914, - 0.07739568, - -0.039939843, - 0.032204024, - 0.10169046, - -0.022527538, - -0.05930125, - 0.00039771595, - -0.057792112, - -0.070337616, - 0.06377354, - -4.088526e-33, - -0.021773575, - -0.079873994, - -0.013886454, - 0.14922747, - 0.025207443, - -0.042269774, - -0.0067705857, - 0.054603398, - -0.092237934, - 0.008083855, - -0.03861146, - -0.11771469, - 0.012989592, - 0.034553546, - -0.017051153, - 0.011906159, - 0.012945488, - 0.042745717, - -0.01759736, - -0.018408326, - 0.06513165, - 0.0405268, - -0.022535695, - -0.06094611, - -0.018629104, - 0.011654488, - 0.014083773, - -0.067636594, - 0.08541857, - 0.030126775, - 0.010824449, - -0.054840527, - -0.024132056, - 0.048314847, - 0.007516418, - 0.013355685, - 0.024563083, - -0.005942082, - -0.045623902, - -0.004832818, - 0.004424451, - -0.0023969507, - 0.013589571, - -0.0168692, - 0.06961138, - -0.07734751, - 0.020551285, - 0.0048098145, - 0.055662792, - 0.013124815, - -0.011720894, - 0.04093993, - 0.007497743, - 0.042012148, - 0.010350773, - 0.019379916, - 0.01108285, - 0.017257342, - 0.018258827, - 0.0773061, - 0.01962173, - 0.052673563, - -0.05859421, - 0.039764106, - -0.05021828, - -0.04896494, - -0.05262346, - -0.09227966, - 0.07557037, - 0.08099812, - -0.02225778, - -0.04215297, - 0.056577113, - 0.02356105, - 0.0015294012, - -0.049797468, - 0.0023656262, - 0.028645845, - -0.06897522, - -0.0477758, - -0.04864175, - -0.0766266, - -0.032856915, - -0.046002492, - -0.057314955, - -0.08091142, - -0.008058203, - -0.09362831, - 0.0512433, - -0.05832409, - -0.00059281266, - 0.022221608, - -0.046930317, - -0.08964614, - 0.11954097, - 2.044738e-33, - 0.01219642, - 0.08643133, - -0.023233324, - 0.002765521, - -0.0010344109, - 0.034877002, - 0.07328553, - -0.04988436, - -0.04193409, - 0.13485521, - -0.006909938, - 0.0062319604, - 0.059107542, - -0.028918913, - 0.09142895, - -0.018481337, - 0.00771716, - -0.04420843, - -0.025174472, - -0.0150115965, - -0.03543459, - 0.124125846, - 0.13119355, - 0.08100271, - -0.033272874, - 0.0039677722, - 0.02646281, - 0.026607113, - 0.017331243, - -0.0036059914, - 0.03546072, - 0.059571866, - -0.12454768, - 0.021932347, - 0.02564387, - -0.11062035, - 0.09607079, - -0.06733944, - -0.01182028, - 0.0423393, - 0.0378881, - 0.1058394, - 0.00734931, - 0.066321366, - 0.022943782, - 0.049426265, - 0.14638706, - -0.0067357672, - 0.0043576923, - -0.029188734, - -0.009015755, - -0.08637437, - 0.035848346, - 0.0030120711, - -0.029328048, - 0.070184804, - 0.014865788, - 0.028357765, - -0.040338036, - 0.019171577, - 0.015582609, - 0.028644681, - -0.019528968, - -0.018315561, - -0.0054145255, - -0.09313447, - -0.061137658, - 0.03881072, - 0.02792733, - 0.034151476, - -0.027465515, - 0.010710185, - -0.055215303, - -0.073805, - 0.021541798, - -0.015463418, - -0.024991987, - -0.004779671, - 0.030454708, - -0.02407339, - 0.034101877, - -0.010341885, - -0.012655972, - 0.036309235, - -0.0044550677, - -0.014974223, - 0.027874243, - 0.09782822, - -0.026438858, - -0.005190334, - -0.019119462, - 0.06202614, - 0.052122016, - 0.037861902, - 0.012597777, - -1.7054827e-08, - -0.04997221, - -0.08913875, - -0.0035288178, - -0.015788937, - -0.021885982, - 0.07185057, - -0.050171196, - -0.010661625, - -0.03058095, - -0.015772644, - 0.01322944, - -0.0025733304, - -0.04212318, - 0.009266956, - -0.041135434, - -0.029588273, - 0.0021936113, - -0.033001017, - -0.050396364, - -0.02149836, - -0.0068135546, - 0.008485492, - 0.03569217, - 0.025194813, - -0.016510937, - 0.04917863, - 0.018346637, - 0.04907251, - -0.0582019, - -0.015061549, - 0.04578192, - 0.049921762, - 0.02044503, - -0.052017137, - -0.033587772, - 0.06185581, - 0.11143413, - 0.07770764, - 0.02244692, - 0.0025846648, - -0.04391288, - 0.008592464, - -0.036181543, - 0.0296719, - -0.017300868, - -0.094585225, - -0.05786905, - -0.065796606, - -0.061245505, - -0.104576424, - -0.029241998, - 0.0013673713, - 0.0060772314, - 0.04078779, - -0.036728922, - 0.016783627, - 0.005292796, - 0.030990785, - -0.054467708, - 0.0048806495, - 0.07091143, - 0.06684519, - 0.01770421, - -0.029248381 + -0.028407024, + 0.08176727, + -0.07856116, + 0.027924549, + 0.05008439, + -0.035268802, + -0.0040619136, + 0.029315198, + -0.05775003, + 0.013769637, + 0.14610882, + -0.012019041, + -0.024392882, + -0.05509032, + -0.02661779, + -0.013253934, + -0.109151706, + -0.037233494, + -0.0036058167, + 0.04766495, + 0.06212885, + 0.0070259646, + -0.015513743, + -0.008010851, + 0.037648663, + 0.01587603, + -0.041856695, + 0.09732178, + -0.025641596, + -0.11368298, + 0.03550726, + 0.07043342, + 0.016779423, + 0.02220752, + 0.123395406, + 0.0077137193, + 0.12550895, + 0.008077936, + -0.026158499, + 0.0028612812, + 0.018155744, + -0.04666325, + 0.041025575, + 0.0013476727, + 0.0019516364, + 0.008663665, + 0.016689047, + 0.02200178, + 0.0020768014, + -0.032861207, + -0.086455174, + 0.008047145, + -0.07434091, + -0.016292974, + 0.06051878, + 0.005966867, + 0.0160179, + 0.021412006, + 0.009540338, + 0.03177335, + 0.023032434, + 0.03437097, + -0.04224765, + 0.024748176, + 0.116213955, + -0.024936162, + -0.03895259, + -0.024991278, + -0.020854436, + -0.08835937, + -0.15073228, + 0.020921277, + -0.022518696, + 0.0023868105, + 0.0057663955, + -0.0015790414, + -0.11985628, + -0.0029912454, + 0.0550998, + -0.11830636, + -0.058846988, + -0.15046737, + 0.018624697, + -0.0093440395, + -0.028901154, + 0.08400474, + 0.0437436, + -0.0006745939, + -0.052540295, + 0.00024754918, + 0.040431518, + 0.0066545215, + 0.02609114, + 0.051891107, + 0.012606882, + 0.061448827, + 0.013889043, + 0.038454182, + 0.048222367, + 0.104106456, + -0.026478294, + -0.021488149, + -0.020865437, + 0.05061779, + -0.05171592, + -0.07573864, + 0.057483904, + -0.049993664, + 0.06528295, + -0.02875688, + 0.038766492, + -0.062760465, + -0.0144796055, + -0.063462086, + 0.06642258, + -0.014848135, + -0.03523116, + 0.0774014, + -0.039893247, + 0.032182425, + 0.10171478, + -0.022525396, + -0.059299074, + 0.00038746602, + -0.05779858, + -0.07034273, + 0.06375495, + -4.088634e-33, + -0.021801252, + -0.07985834, + -0.013881648, + 0.14923096, + 0.02520313, + -0.042283125, + -0.0067697223, + 0.054634638, + -0.09223034, + 0.0081036305, + -0.03861765, + -0.117698364, + 0.012977803, + 0.034548674, + -0.01703291, + 0.011910173, + 0.012945288, + 0.04277919, + -0.017591223, + -0.0184066, + 0.06513148, + 0.04050013, + -0.02252127, + -0.060939074, + -0.018603502, + 0.011679816, + 0.01410369, + -0.06763908, + 0.08543174, + 0.030138582, + 0.010859261, + -0.054844614, + -0.024129191, + 0.048327282, + 0.00750549, + 0.013356204, + 0.024558878, + -0.005942624, + -0.045620095, + -0.00484637, + 0.004418298, + -0.0023806267, + 0.013590539, + -0.016870445, + 0.06959721, + -0.07736302, + 0.02058481, + 0.0048155314, + 0.055696823, + 0.0131223425, + -0.011748222, + 0.040935397, + 0.007458848, + 0.042072233, + 0.010358565, + 0.019406458, + 0.011092792, + 0.017259602, + 0.018278012, + 0.077335365, + 0.019612921, + 0.05268688, + -0.05863009, + 0.039751627, + -0.050250556, + -0.048913844, + -0.05265637, + -0.09227304, + 0.0755598, + 0.08097828, + -0.022257954, + -0.042141132, + 0.056546185, + 0.023585746, + 0.0015263582, + -0.049815144, + 0.002336895, + 0.028626408, + -0.06897293, + -0.04780049, + -0.048637427, + -0.076585636, + -0.03285766, + -0.046012525, + -0.0573021, + -0.080889866, + -0.008056378, + -0.0936112, + 0.051229417, + -0.058302302, + -0.0005942833, + 0.02222621, + -0.046907477, + -0.08964737, + 0.1195762, + 2.0452953e-33, + 0.012159685, + 0.086426094, + -0.023217503, + 0.002771192, + -0.0010614472, + 0.03487195, + 0.07328719, + -0.049876485, + -0.041938163, + 0.13486409, + -0.00690217, + 0.006254477, + 0.059122436, + -0.028893106, + 0.09141587, + -0.018487127, + 0.0077112317, + -0.044207573, + -0.0251735, + -0.014999972, + -0.035417248, + 0.12413253, + 0.13118097, + 0.081015825, + -0.03327241, + 0.003976432, + 0.026454262, + 0.026598025, + 0.017349144, + -0.0036153824, + 0.035460044, + 0.05956128, + -0.124593176, + 0.021954069, + 0.025635097, + -0.11063109, + 0.096061416, + -0.06731725, + -0.011819293, + 0.042329434, + 0.03790837, + 0.10582649, + 0.0073426333, + 0.06629678, + 0.022922922, + 0.0494007, + 0.14639522, + -0.0067070075, + 0.004380622, + -0.029196544, + -0.009010303, + -0.08637028, + 0.03588363, + 0.0029887543, + -0.029351206, + 0.07019312, + 0.014898416, + 0.028345235, + -0.040354595, + 0.01916304, + 0.015590835, + 0.028637327, + -0.019529723, + -0.018309733, + -0.0054176697, + -0.093132764, + -0.06116049, + 0.038816936, + 0.02793884, + 0.034137025, + -0.027511358, + 0.010699668, + -0.05521562, + -0.07380209, + 0.021521263, + -0.015450832, + -0.024988633, + -0.004755674, + 0.030465573, + -0.024057997, + 0.0341225, + -0.0103128245, + -0.012666524, + 0.03628323, + -0.0044518244, + -0.014977736, + 0.02790076, + 0.0978009, + -0.026436698, + -0.005187212, + -0.019124882, + 0.06205225, + 0.052137945, + 0.037870288, + 0.012578256, + -1.705626e-08, + -0.05000592, + -0.08913878, + -0.0035273295, + -0.01577607, + -0.021846429, + 0.07184407, + -0.050185654, + -0.010643527, + -0.030602882, + -0.01577121, + 0.013220822, + -0.0025653532, + -0.04210823, + 0.009286525, + -0.041129403, + -0.029615805, + 0.002200794, + -0.032989334, + -0.05041253, + -0.021504797, + -0.0068345494, + 0.0084738685, + 0.03568697, + 0.0252117, + -0.016504692, + 0.04915123, + 0.018349955, + 0.049084183, + -0.058165494, + -0.015055481, + 0.045743454, + 0.049920842, + 0.020444298, + -0.052004594, + -0.033592116, + 0.061816722, + 0.111411005, + 0.07770497, + 0.022457859, + 0.0025742552, + -0.043929543, + 0.008576763, + -0.036182683, + 0.029673496, + -0.017278075, + -0.09458994, + -0.057882637, + -0.06579892, + -0.06124832, + -0.10455079, + -0.02925637, + 0.0013624659, + 0.0060532107, + 0.04077331, + -0.036694046, + 0.016800206, + 0.005279432, + 0.030968234, + -0.05446385, + 0.0048696757, + 0.070877954, + 0.06684445, + 0.017715273, + -0.029237686 ], "index": 0, "object": "embedding" diff --git a/tests/integration/recordings/responses/e2c9b07709fe.json b/tests/integration/recordings/responses/e2c9b07709fe.json index 47fa23233..0bab360ba 100644 --- a/tests/integration/recordings/responses/e2c9b07709fe.json +++ b/tests/integration/recordings/responses/e2c9b07709fe.json @@ -1,7 +1,7 @@ { "request": { "method": "POST", - "url": "http://localhost:11434/v1/v1/chat/completions", + "url": "http://0.0.0.0:11434/v1/v1/chat/completions", "headers": {}, "body": { "model": "llama3.2:3b-instruct-fp16", @@ -22,14 +22,14 @@ "body": { "__type__": "openai.types.chat.chat_completion.ChatCompletion", "__data__": { - "id": "chatcmpl-494", + "id": "chatcmpl-662", "choices": [ { "finish_reason": "length", "index": 0, "logprobs": null, "message": { - "content": "To test the OpenAI API with a temperature of 1, you can use the following Python code:\n\n```python\nimport requests\n\ndef generate_text(model_name, prompt, temperature=1):\n # Set the API endpoint and parameters\n url = \"https://api.openai.com/v1/models/\" + model_name + \"/generate\"\n params = {\n \"prompt\": prompt,\n \"temperature\": temperature\n }\n\n # Send a GET request to the API\n response =", + "content": "To test the prompt understanding of OpenAI's text generation capabilities, I'll simulate a conversation. \n\nYou mentioned testing the model with a temperature setting of 1. The temperature parameter in OpenAI's text models controls the diversity and coherence of generated text.\n\nA temperature of 1 is considered \"colder\" than usual, meaning the model will generate more coherent but potentially less diverse text compared to higher temperatures (e.g., 0.5 or 0.7).\n\nPlease provide a prompt for", "refusal": null, "role": "assistant", "annotations": null, @@ -39,7 +39,7 @@ } } ], - "created": 1754510067, + "created": 1756921259, "model": "llama3.2:3b-instruct-fp16", "object": "chat.completion", "service_tier": null, diff --git a/tests/integration/recordings/responses/e96152610712.json b/tests/integration/recordings/responses/e96152610712.json index b55e02825..aa758da0d 100644 --- a/tests/integration/recordings/responses/e96152610712.json +++ b/tests/integration/recordings/responses/e96152610712.json @@ -20,15 +20,15 @@ "__type__": "ollama._types.GenerateResponse", "__data__": { "model": "llama-guard3:1b", - "created_at": "2025-08-01T23:12:51.421145Z", + "created_at": "2025-09-03T17:37:33.16899Z", "done": true, "done_reason": "stop", - "total_duration": 201670125, - "load_duration": 70275459, + "total_duration": 300698625, + "load_duration": 179823875, "prompt_eval_count": 207, - "prompt_eval_duration": 71000000, + "prompt_eval_duration": 65083666, "eval_count": 5, - "eval_duration": 58000000, + "eval_duration": 55216084, "response": "unsafe\nS2", "thinking": null, "context": null diff --git a/tests/integration/recordings/responses/e9c8a0e4f0e0.json b/tests/integration/recordings/responses/e9c8a0e4f0e0.json index 85adb5734..87a208405 100644 --- a/tests/integration/recordings/responses/e9c8a0e4f0e0.json +++ b/tests/integration/recordings/responses/e9c8a0e4f0e0.json @@ -1,7 +1,7 @@ { "request": { "method": "POST", - "url": "http://localhost:11434/v1/v1/chat/completions", + "url": "http://0.0.0.0:11434/v1/v1/chat/completions", "headers": {}, "body": { "model": "llama3.2:3b-instruct-fp16", @@ -20,14 +20,14 @@ "body": { "__type__": "openai.types.chat.chat_completion.ChatCompletion", "__data__": { - "id": "chatcmpl-57", + "id": "chatcmpl-957", "choices": [ { "finish_reason": "stop", "index": 0, "logprobs": null, "message": { - "content": "Humans live on Earth. It is the third planet from the Sun and is the only known planet in the universe that currently supports human life.", + "content": "Humans live on Earth. It's a terrestrial planet in the Solar System, located in the outer reaches of the Sun's gravitational pull.", "refusal": null, "role": "assistant", "annotations": null, @@ -37,15 +37,15 @@ } } ], - "created": 1754081845, + "created": 1756921355, "model": "llama3.2:3b-instruct-fp16", "object": "chat.completion", "service_tier": null, "system_fingerprint": "fp_ollama", "usage": { - "completion_tokens": 29, + "completion_tokens": 28, "prompt_tokens": 32, - "total_tokens": 61, + "total_tokens": 60, "completion_tokens_details": null, "prompt_tokens_details": null } diff --git a/tests/integration/recordings/responses/ed9e9b34008d.json b/tests/integration/recordings/responses/ed9e9b34008d.json index ae46f481a..d0591dbc1 100644 --- a/tests/integration/recordings/responses/ed9e9b34008d.json +++ b/tests/integration/recordings/responses/ed9e9b34008d.json @@ -20,15 +20,15 @@ "__type__": "ollama._types.GenerateResponse", "__data__": { "model": "llama3.2:3b-instruct-fp16", - "created_at": "2025-07-31T17:50:48.719062652Z", + "created_at": "2025-09-03T17:39:48.030217Z", "done": true, "done_reason": "stop", - "total_duration": 42572007410, - "load_duration": 42791399, + "total_duration": 9760536750, + "load_duration": 242188583, "prompt_eval_count": 26, - "prompt_eval_duration": 1301967184, + "prompt_eval_duration": 83819333, "eval_count": 232, - "eval_duration": 41226696354, + "eval_duration": 9434009042, "response": "The largest planet in our solar system is Jupiter. It is a gas giant, meaning it is primarily composed of hydrogen and helium gases. Jupiter has a diameter of approximately 142,984 kilometers (88,846 miles), which is more than 11 times the diameter of Earth.\n\nJupiter is not only the largest planet in terms of size, but also the most massive planet in our solar system, with a mass that is more than 318 times that of Earth. It has a thick atmosphere and a strong magnetic field, and is known for its distinctive banded appearance, which is caused by strong winds in the upper atmosphere.\n\nJupiter's massive size and gravitational pull have a significant impact on the surrounding space, including the orbits of nearby planets and asteroids. Its moons are also notable, with four large ones: Io, Europa, Ganymede, and Callisto, which are known as the Galilean moons due to their discovery by Galileo Galilei in 1610.\n\nJupiter is a fascinating planet that continues to be studied by astronomers and space agencies around the world, offering insights into the formation and evolution of our solar system.", "thinking": null, "context": null diff --git a/tests/integration/recordings/responses/eee47930e3ae.json b/tests/integration/recordings/responses/eee47930e3ae.json index 20ec83476..283416a09 100644 --- a/tests/integration/recordings/responses/eee47930e3ae.json +++ b/tests/integration/recordings/responses/eee47930e3ae.json @@ -22,7 +22,7 @@ "__type__": "ollama._types.GenerateResponse", "__data__": { "model": "llama3.2:3b-instruct-fp16", - "created_at": "2025-08-01T23:14:23.842191Z", + "created_at": "2025-09-03T17:38:04.631107Z", "done": false, "done_reason": null, "total_duration": null, @@ -40,7 +40,7 @@ "__type__": "ollama._types.GenerateResponse", "__data__": { "model": "llama3.2:3b-instruct-fp16", - "created_at": "2025-08-01T23:14:23.903756Z", + "created_at": "2025-09-03T17:38:04.673105Z", "done": false, "done_reason": null, "total_duration": null, @@ -58,7 +58,7 @@ "__type__": "ollama._types.GenerateResponse", "__data__": { "model": "llama3.2:3b-instruct-fp16", - "created_at": "2025-08-01T23:14:23.962295Z", + "created_at": "2025-09-03T17:38:04.714459Z", "done": false, "done_reason": null, "total_duration": null, @@ -76,7 +76,7 @@ "__type__": "ollama._types.GenerateResponse", "__data__": { "model": "llama3.2:3b-instruct-fp16", - "created_at": "2025-08-01T23:14:24.019479Z", + "created_at": "2025-09-03T17:38:04.755882Z", "done": false, "done_reason": null, "total_duration": null, @@ -94,7 +94,7 @@ "__type__": "ollama._types.GenerateResponse", "__data__": { "model": "llama3.2:3b-instruct-fp16", - "created_at": "2025-08-01T23:14:24.076158Z", + "created_at": "2025-09-03T17:38:04.797494Z", "done": false, "done_reason": null, "total_duration": null, @@ -112,7 +112,7 @@ "__type__": "ollama._types.GenerateResponse", "__data__": { "model": "llama3.2:3b-instruct-fp16", - "created_at": "2025-08-01T23:14:24.142903Z", + "created_at": "2025-09-03T17:38:04.839382Z", "done": false, "done_reason": null, "total_duration": null, @@ -130,7 +130,7 @@ "__type__": "ollama._types.GenerateResponse", "__data__": { "model": "llama3.2:3b-instruct-fp16", - "created_at": "2025-08-01T23:14:24.202616Z", + "created_at": "2025-09-03T17:38:04.881062Z", "done": false, "done_reason": null, "total_duration": null, @@ -148,7 +148,7 @@ "__type__": "ollama._types.GenerateResponse", "__data__": { "model": "llama3.2:3b-instruct-fp16", - "created_at": "2025-08-01T23:14:24.25501Z", + "created_at": "2025-09-03T17:38:04.921976Z", "done": false, "done_reason": null, "total_duration": null, @@ -166,7 +166,7 @@ "__type__": "ollama._types.GenerateResponse", "__data__": { "model": "llama3.2:3b-instruct-fp16", - "created_at": "2025-08-01T23:14:24.308017Z", + "created_at": "2025-09-03T17:38:04.962922Z", "done": false, "done_reason": null, "total_duration": null, @@ -184,7 +184,7 @@ "__type__": "ollama._types.GenerateResponse", "__data__": { "model": "llama3.2:3b-instruct-fp16", - "created_at": "2025-08-01T23:14:24.360014Z", + "created_at": "2025-09-03T17:38:05.00411Z", "done": false, "done_reason": null, "total_duration": null, @@ -202,7 +202,7 @@ "__type__": "ollama._types.GenerateResponse", "__data__": { "model": "llama3.2:3b-instruct-fp16", - "created_at": "2025-08-01T23:14:24.413785Z", + "created_at": "2025-09-03T17:38:05.04532Z", "done": false, "done_reason": null, "total_duration": null, @@ -220,7 +220,7 @@ "__type__": "ollama._types.GenerateResponse", "__data__": { "model": "llama3.2:3b-instruct-fp16", - "created_at": "2025-08-01T23:14:24.466618Z", + "created_at": "2025-09-03T17:38:05.086979Z", "done": false, "done_reason": null, "total_duration": null, @@ -238,7 +238,7 @@ "__type__": "ollama._types.GenerateResponse", "__data__": { "model": "llama3.2:3b-instruct-fp16", - "created_at": "2025-08-01T23:14:24.519141Z", + "created_at": "2025-09-03T17:38:05.128195Z", "done": false, "done_reason": null, "total_duration": null, @@ -256,7 +256,7 @@ "__type__": "ollama._types.GenerateResponse", "__data__": { "model": "llama3.2:3b-instruct-fp16", - "created_at": "2025-08-01T23:14:24.572343Z", + "created_at": "2025-09-03T17:38:05.169221Z", "done": false, "done_reason": null, "total_duration": null, @@ -274,7 +274,7 @@ "__type__": "ollama._types.GenerateResponse", "__data__": { "model": "llama3.2:3b-instruct-fp16", - "created_at": "2025-08-01T23:14:24.626495Z", + "created_at": "2025-09-03T17:38:05.210938Z", "done": false, "done_reason": null, "total_duration": null, @@ -292,7 +292,7 @@ "__type__": "ollama._types.GenerateResponse", "__data__": { "model": "llama3.2:3b-instruct-fp16", - "created_at": "2025-08-01T23:14:24.683554Z", + "created_at": "2025-09-03T17:38:05.252232Z", "done": false, "done_reason": null, "total_duration": null, @@ -310,7 +310,7 @@ "__type__": "ollama._types.GenerateResponse", "__data__": { "model": "llama3.2:3b-instruct-fp16", - "created_at": "2025-08-01T23:14:24.736715Z", + "created_at": "2025-09-03T17:38:05.293529Z", "done": false, "done_reason": null, "total_duration": null, @@ -328,7 +328,7 @@ "__type__": "ollama._types.GenerateResponse", "__data__": { "model": "llama3.2:3b-instruct-fp16", - "created_at": "2025-08-01T23:14:24.789545Z", + "created_at": "2025-09-03T17:38:05.334965Z", "done": false, "done_reason": null, "total_duration": null, @@ -346,15 +346,15 @@ "__type__": "ollama._types.GenerateResponse", "__data__": { "model": "llama3.2:3b-instruct-fp16", - "created_at": "2025-08-01T23:14:24.842095Z", + "created_at": "2025-09-03T17:38:05.376741Z", "done": true, "done_reason": "stop", - "total_duration": 1141228125, - "load_duration": 38375333, + "total_duration": 936717042, + "load_duration": 109245542, "prompt_eval_count": 371, - "prompt_eval_duration": 99000000, + "prompt_eval_duration": 80430583, "eval_count": 19, - "eval_duration": 1002000000, + "eval_duration": 746422917, "response": "", "thinking": null, "context": null diff --git a/tests/integration/recordings/responses/ef59cbff54d0.json b/tests/integration/recordings/responses/ef59cbff54d0.json index e16cf605c..559930873 100644 --- a/tests/integration/recordings/responses/ef59cbff54d0.json +++ b/tests/integration/recordings/responses/ef59cbff54d0.json @@ -20,15 +20,15 @@ "__type__": "ollama._types.GenerateResponse", "__data__": { "model": "llama-guard3:1b", - "created_at": "2025-08-01T23:12:54.110896Z", + "created_at": "2025-09-03T17:37:35.524155Z", "done": true, "done_reason": "stop", - "total_duration": 219323916, - "load_duration": 109411750, + "total_duration": 251173708, + "load_duration": 165988125, "prompt_eval_count": 213, - "prompt_eval_duration": 86000000, + "prompt_eval_duration": 73363375, "eval_count": 2, - "eval_duration": 22000000, + "eval_duration": 11249792, "response": "safe", "thinking": null, "context": null diff --git a/tests/integration/recordings/responses/ef757a75ed08.json b/tests/integration/recordings/responses/ef757a75ed08.json index b2d68f4d6..05860c4bb 100644 --- a/tests/integration/recordings/responses/ef757a75ed08.json +++ b/tests/integration/recordings/responses/ef757a75ed08.json @@ -21,7 +21,7 @@ "__type__": "ollama._types.GenerateResponse", "__data__": { "model": "llama3.2:3b-instruct-fp16", - "created_at": "2025-07-29T23:46:35.212563Z", + "created_at": "2025-09-03T17:34:22.272912Z", "done": false, "done_reason": null, "total_duration": null, @@ -39,7 +39,7 @@ "__type__": "ollama._types.GenerateResponse", "__data__": { "model": "llama3.2:3b-instruct-fp16", - "created_at": "2025-07-29T23:46:35.254896Z", + "created_at": "2025-09-03T17:34:22.31501Z", "done": false, "done_reason": null, "total_duration": null, @@ -57,7 +57,7 @@ "__type__": "ollama._types.GenerateResponse", "__data__": { "model": "llama3.2:3b-instruct-fp16", - "created_at": "2025-07-29T23:46:35.297152Z", + "created_at": "2025-09-03T17:34:22.356888Z", "done": false, "done_reason": null, "total_duration": null, @@ -75,7 +75,7 @@ "__type__": "ollama._types.GenerateResponse", "__data__": { "model": "llama3.2:3b-instruct-fp16", - "created_at": "2025-07-29T23:46:35.339477Z", + "created_at": "2025-09-03T17:34:22.398576Z", "done": false, "done_reason": null, "total_duration": null, @@ -93,7 +93,7 @@ "__type__": "ollama._types.GenerateResponse", "__data__": { "model": "llama3.2:3b-instruct-fp16", - "created_at": "2025-07-29T23:46:35.382245Z", + "created_at": "2025-09-03T17:34:22.440412Z", "done": false, "done_reason": null, "total_duration": null, @@ -111,7 +111,7 @@ "__type__": "ollama._types.GenerateResponse", "__data__": { "model": "llama3.2:3b-instruct-fp16", - "created_at": "2025-07-29T23:46:35.423387Z", + "created_at": "2025-09-03T17:34:22.482165Z", "done": false, "done_reason": null, "total_duration": null, @@ -129,7 +129,7 @@ "__type__": "ollama._types.GenerateResponse", "__data__": { "model": "llama3.2:3b-instruct-fp16", - "created_at": "2025-07-29T23:46:35.465286Z", + "created_at": "2025-09-03T17:34:22.523773Z", "done": false, "done_reason": null, "total_duration": null, @@ -147,7 +147,7 @@ "__type__": "ollama._types.GenerateResponse", "__data__": { "model": "llama3.2:3b-instruct-fp16", - "created_at": "2025-07-29T23:46:35.507249Z", + "created_at": "2025-09-03T17:34:22.565072Z", "done": false, "done_reason": null, "total_duration": null, @@ -165,15 +165,15 @@ "__type__": "ollama._types.GenerateResponse", "__data__": { "model": "llama3.2:3b-instruct-fp16", - "created_at": "2025-07-29T23:46:35.549072Z", + "created_at": "2025-09-03T17:34:22.607117Z", "done": true, "done_reason": "stop", - "total_duration": 5519843458, - "load_duration": 4110366375, + "total_duration": 1386049708, + "load_duration": 96970583, "prompt_eval_count": 456, - "prompt_eval_duration": 1070783708, + "prompt_eval_duration": 952471625, "eval_count": 9, - "eval_duration": 337120750, + "eval_duration": 335924459, "response": "", "thinking": null, "context": null diff --git a/tests/integration/recordings/vision/responses/f1592dee71e5.json b/tests/integration/recordings/responses/f1592dee71e5.json similarity index 99% rename from tests/integration/recordings/vision/responses/f1592dee71e5.json rename to tests/integration/recordings/responses/f1592dee71e5.json index a30aa460b..d95497ee2 100644 --- a/tests/integration/recordings/vision/responses/f1592dee71e5.json +++ b/tests/integration/recordings/responses/f1592dee71e5.json @@ -30,18 +30,18 @@ "__type__": "ollama._types.ChatResponse", "__data__": { "model": "llama3.2-vision:11b", - "created_at": "2025-08-01T00:06:12.068973125Z", + "created_at": "2025-09-03T17:54:32.086616Z", "done": true, "done_reason": "stop", - "total_duration": 44793549354, - "load_duration": 51960915, + "total_duration": 3537246333, + "load_duration": 130547125, "prompt_eval_count": 18, - "prompt_eval_duration": 579363429, - "eval_count": 110, - "eval_duration": 44156162976, + "prompt_eval_duration": 140216250, + "eval_count": 56, + "eval_duration": 3262609875, "message": { "role": "assistant", - "content": "The image features a close-up of a golden retriever puppy, with its mouth open and tongue out, as if it is smiling or panting. The puppy's fur is a light golden color, and its ears are floppy and hanging down on either side of its head. The background of the image is blurred, but it appears to be a natural setting, possibly a field or a park, with a greenish-yellow color. The overall atmosphere of the image is one of happiness and playfulness, as the puppy seems to be enjoying itself.", + "content": "The image is of a golden retriever puppy. The puppy is looking directly at the camera with its mouth open and tongue out. The puppy is white with golden ears and a black nose. The background is out of focus, but it appears to be a grassy field.", "thinking": null, "images": null, "tool_calls": null diff --git a/tests/integration/recordings/responses/f477c2fe1332.json b/tests/integration/recordings/responses/f477c2fe1332.json index 2e29690ee..d3c8e7176 100644 --- a/tests/integration/recordings/responses/f477c2fe1332.json +++ b/tests/integration/recordings/responses/f477c2fe1332.json @@ -22,7 +22,7 @@ "__type__": "ollama._types.GenerateResponse", "__data__": { "model": "llama3.2:3b-instruct-fp16", - "created_at": "2025-08-01T23:14:37.046199Z", + "created_at": "2025-09-03T17:42:31.583665Z", "done": false, "done_reason": null, "total_duration": null, @@ -40,7 +40,7 @@ "__type__": "ollama._types.GenerateResponse", "__data__": { "model": "llama3.2:3b-instruct-fp16", - "created_at": "2025-08-01T23:14:37.097228Z", + "created_at": "2025-09-03T17:42:31.625653Z", "done": false, "done_reason": null, "total_duration": null, @@ -58,7 +58,7 @@ "__type__": "ollama._types.GenerateResponse", "__data__": { "model": "llama3.2:3b-instruct-fp16", - "created_at": "2025-08-01T23:14:37.147575Z", + "created_at": "2025-09-03T17:42:31.667189Z", "done": false, "done_reason": null, "total_duration": null, @@ -76,7 +76,7 @@ "__type__": "ollama._types.GenerateResponse", "__data__": { "model": "llama3.2:3b-instruct-fp16", - "created_at": "2025-08-01T23:14:37.199038Z", + "created_at": "2025-09-03T17:42:31.708905Z", "done": false, "done_reason": null, "total_duration": null, @@ -94,7 +94,7 @@ "__type__": "ollama._types.GenerateResponse", "__data__": { "model": "llama3.2:3b-instruct-fp16", - "created_at": "2025-08-01T23:14:37.25106Z", + "created_at": "2025-09-03T17:42:31.751003Z", "done": false, "done_reason": null, "total_duration": null, @@ -112,7 +112,7 @@ "__type__": "ollama._types.GenerateResponse", "__data__": { "model": "llama3.2:3b-instruct-fp16", - "created_at": "2025-08-01T23:14:37.302712Z", + "created_at": "2025-09-03T17:42:31.792516Z", "done": false, "done_reason": null, "total_duration": null, @@ -130,7 +130,7 @@ "__type__": "ollama._types.GenerateResponse", "__data__": { "model": "llama3.2:3b-instruct-fp16", - "created_at": "2025-08-01T23:14:37.355658Z", + "created_at": "2025-09-03T17:42:31.834194Z", "done": false, "done_reason": null, "total_duration": null, @@ -148,7 +148,7 @@ "__type__": "ollama._types.GenerateResponse", "__data__": { "model": "llama3.2:3b-instruct-fp16", - "created_at": "2025-08-01T23:14:37.407436Z", + "created_at": "2025-09-03T17:42:31.878321Z", "done": false, "done_reason": null, "total_duration": null, @@ -166,7 +166,7 @@ "__type__": "ollama._types.GenerateResponse", "__data__": { "model": "llama3.2:3b-instruct-fp16", - "created_at": "2025-08-01T23:14:37.459062Z", + "created_at": "2025-09-03T17:42:31.921552Z", "done": false, "done_reason": null, "total_duration": null, @@ -184,7 +184,7 @@ "__type__": "ollama._types.GenerateResponse", "__data__": { "model": "llama3.2:3b-instruct-fp16", - "created_at": "2025-08-01T23:14:37.511804Z", + "created_at": "2025-09-03T17:42:31.963105Z", "done": false, "done_reason": null, "total_duration": null, @@ -202,7 +202,7 @@ "__type__": "ollama._types.GenerateResponse", "__data__": { "model": "llama3.2:3b-instruct-fp16", - "created_at": "2025-08-01T23:14:37.562406Z", + "created_at": "2025-09-03T17:42:32.005494Z", "done": false, "done_reason": null, "total_duration": null, @@ -220,7 +220,7 @@ "__type__": "ollama._types.GenerateResponse", "__data__": { "model": "llama3.2:3b-instruct-fp16", - "created_at": "2025-08-01T23:14:37.614648Z", + "created_at": "2025-09-03T17:42:32.047231Z", "done": false, "done_reason": null, "total_duration": null, @@ -238,7 +238,7 @@ "__type__": "ollama._types.GenerateResponse", "__data__": { "model": "llama3.2:3b-instruct-fp16", - "created_at": "2025-08-01T23:14:37.665414Z", + "created_at": "2025-09-03T17:42:32.089031Z", "done": false, "done_reason": null, "total_duration": null, @@ -256,7 +256,7 @@ "__type__": "ollama._types.GenerateResponse", "__data__": { "model": "llama3.2:3b-instruct-fp16", - "created_at": "2025-08-01T23:14:37.71826Z", + "created_at": "2025-09-03T17:42:32.130704Z", "done": false, "done_reason": null, "total_duration": null, @@ -274,7 +274,7 @@ "__type__": "ollama._types.GenerateResponse", "__data__": { "model": "llama3.2:3b-instruct-fp16", - "created_at": "2025-08-01T23:14:37.769822Z", + "created_at": "2025-09-03T17:42:32.172183Z", "done": false, "done_reason": null, "total_duration": null, @@ -292,7 +292,7 @@ "__type__": "ollama._types.GenerateResponse", "__data__": { "model": "llama3.2:3b-instruct-fp16", - "created_at": "2025-08-01T23:14:37.821049Z", + "created_at": "2025-09-03T17:42:32.21392Z", "done": false, "done_reason": null, "total_duration": null, @@ -310,7 +310,7 @@ "__type__": "ollama._types.GenerateResponse", "__data__": { "model": "llama3.2:3b-instruct-fp16", - "created_at": "2025-08-01T23:14:37.872903Z", + "created_at": "2025-09-03T17:42:32.255392Z", "done": false, "done_reason": null, "total_duration": null, @@ -328,7 +328,7 @@ "__type__": "ollama._types.GenerateResponse", "__data__": { "model": "llama3.2:3b-instruct-fp16", - "created_at": "2025-08-01T23:14:37.924976Z", + "created_at": "2025-09-03T17:42:32.297249Z", "done": false, "done_reason": null, "total_duration": null, @@ -346,7 +346,7 @@ "__type__": "ollama._types.GenerateResponse", "__data__": { "model": "llama3.2:3b-instruct-fp16", - "created_at": "2025-08-01T23:14:37.976776Z", + "created_at": "2025-09-03T17:42:32.341358Z", "done": false, "done_reason": null, "total_duration": null, @@ -364,7 +364,7 @@ "__type__": "ollama._types.GenerateResponse", "__data__": { "model": "llama3.2:3b-instruct-fp16", - "created_at": "2025-08-01T23:14:38.029285Z", + "created_at": "2025-09-03T17:42:32.384155Z", "done": false, "done_reason": null, "total_duration": null, @@ -382,15 +382,15 @@ "__type__": "ollama._types.GenerateResponse", "__data__": { "model": "llama3.2:3b-instruct-fp16", - "created_at": "2025-08-01T23:14:38.084154Z", + "created_at": "2025-09-03T17:42:32.426441Z", "done": true, "done_reason": "stop", - "total_duration": 1782717042, - "load_duration": 78612834, + "total_duration": 1659557917, + "load_duration": 75341875, "prompt_eval_count": 375, - "prompt_eval_duration": 658000000, + "prompt_eval_duration": 740178250, "eval_count": 21, - "eval_duration": 1044000000, + "eval_duration": 843394541, "response": "", "thinking": null, "context": null diff --git a/tests/integration/recordings/responses/f6d655e91ac3.json b/tests/integration/recordings/responses/f6d655e91ac3.json index 1dd1010b1..185fff181 100644 --- a/tests/integration/recordings/responses/f6d655e91ac3.json +++ b/tests/integration/recordings/responses/f6d655e91ac3.json @@ -20,390 +20,390 @@ "data": [ { "embedding": [ - -0.034272887, - 0.0900405, - -0.114585444, - 0.0021513691, - 0.059019327, - -0.02748151, - -0.020571338, - 0.03373777, - -0.03872984, - 0.026010917, - 0.1147871, - 0.027154561, - -0.015938662, - -0.02185328, - -0.046722047, - -0.04638079, - -0.07416656, - -0.052859545, - -0.028124748, - 0.06325527, - 0.029144203, - 0.047097813, - -0.05268828, - -0.0053592497, - 0.030669667, - 0.01769888, - -0.01687185, - 0.08683223, - -0.014155632, - -0.08387485, - 0.019995376, - 0.07114902, - 0.08367812, - 0.030923046, - 0.11826658, - 0.028755534, - 0.06955482, - -0.017287154, - -0.005806163, - 0.005812646, - 0.0011825147, - -0.06533827, - 0.037360404, - 0.018541763, - -0.0034888012, - -0.0011040586, - -0.029778237, - -0.021269588, - 0.005844319, - -0.035600223, - -0.037232384, - 0.012353592, - -0.06692711, - -0.023162046, - 0.05686014, - 0.0014791423, - 0.01440185, - -0.017189784, - 0.009246685, - 0.06083274, - 0.024673132, - 0.036989614, - -0.050630055, - 0.051760096, - 0.10160539, - 0.008477512, - -0.048004184, - -0.013003718, - 0.031101642, - -0.1659611, - -0.14100891, - 0.009773047, - -0.025983926, - 0.05229989, - -0.007893064, - 0.0078570945, - -0.08468617, - -0.044539623, - 0.054151334, - -0.07042244, - -0.05768138, - -0.10078619, - 0.021822996, - 0.022160508, - 0.0072028935, - 0.13064505, - 0.08020654, - -0.0044225734, - -0.018743401, - 0.0075993463, - -0.031649683, - 0.031955328, - -0.022171712, - 0.030735254, - -0.023809722, - 0.0695489, - 0.016647533, - 0.0095261615, - 0.027464647, - 0.10212388, - 0.02145324, - -0.021429047, - 0.015128828, - 0.039440226, - -0.09434037, - -0.11546961, - 0.09468322, - -0.011139115, - 0.072680146, - -0.03602365, - -0.011743472, - -0.066524595, - -0.034747, - -0.10301544, - 0.030228501, - -0.06316883, - -0.090848505, - 0.041170754, - -0.03368485, - 0.045751248, - 0.07133673, - -0.031778056, - -0.05968261, - -0.017208954, - -0.032287136, - -0.058584064, - 0.0673487, - -5.023248e-33, - -0.005809502, - -0.071970925, - -0.00930889, - 0.09656616, - 0.037086118, - -0.034771495, - -0.00472216, - 0.016682126, - -0.098648354, - 0.005475455, - -0.014123589, - -0.08407786, - 0.0027178645, - 0.04443311, - -0.01269345, - 0.034540884, - -0.0005944164, - 0.06320702, - -0.026761396, - -0.013525239, - 0.024135783, - 0.015422592, - -0.04138039, - -0.05520989, - -0.06454275, - 0.031492148, - -0.0072836457, - -0.039476894, - 0.059850004, - 0.026700241, - 0.013972591, - -0.038822647, - -0.04851447, - 0.017551823, - 0.020952301, - 0.03522171, - 0.011540296, - -0.00842795, - -0.044636253, - 0.014627958, - 3.2639466e-05, - -0.046966836, - 0.027031295, - 0.006612757, - 0.06439624, - -0.044763926, - -0.02612974, - -0.016271371, - 0.055233188, - 0.014105759, - -0.008459233, - 0.04205111, - 0.050489996, - 0.021618336, - 0.011294852, - 0.0485963, - 0.017674806, - -0.004992791, - 0.00193088, - 0.063277334, - 0.035901506, - 0.03502828, - -0.06643911, - 0.008779193, - -0.027297689, - -0.059879173, - -0.027194038, - -0.087292045, - 0.11242319, - 0.05879699, - -0.041721053, - -0.069260724, - 0.064383894, - 0.015849635, - -0.027780458, - -0.03755858, - -0.011723025, - 0.06948493, - -0.07109373, - -0.039075296, - -0.043134894, - -0.1120962, - -0.030726664, - -0.06376309, - -0.03524182, - -0.061186828, - -0.015275632, - -0.100939795, - 0.047502656, - -0.08317205, - -0.0029857687, - 0.013144553, - -0.056699008, - -0.05796209, - 0.06137419, - 2.7670645e-33, - 0.003669078, - 0.06695531, - -0.055944078, - 0.025168538, - 0.0147572905, - 0.033805534, - 0.0934766, - -0.010511114, - -0.046672594, - 0.14254896, - -0.015461952, - 0.0067206374, - 0.07682516, - -0.045769565, - 0.07989758, - 0.0036198904, - 0.023618277, - -0.06530977, - -0.04256109, - -0.025923597, - -0.07477869, - 0.1001957, - 0.1257842, - 0.064083636, - -0.01666794, - 0.014075608, - 0.025267936, - 0.0017376567, - -0.013351121, - 0.0117214825, - 0.037724674, - 0.040572807, - -0.12054958, - 0.024336847, - 0.034385506, - -0.10165844, - 0.11865242, - -0.035707537, - -0.012689929, - 0.022641081, - 0.039234713, - 0.10621312, - 0.010647405, - 0.07653686, - 0.020896297, - 0.06464065, - 0.08582743, - -0.03212417, - 0.043577865, - 0.01106648, - 0.023217985, - -0.06711702, - 0.05536062, - -0.008119422, - -0.0268995, - 0.077022836, - -0.011600607, - 0.04498788, - -0.024568135, - 0.020904513, - -0.0016571331, - 0.029054169, - -0.038968027, - -0.013624052, - -0.019825684, - -0.057037495, - -0.014532248, - 0.010170884, - 0.016871484, - 0.012004644, - 0.019911213, - 0.019217802, - -0.06554125, - -0.050251007, - 0.05082798, - -0.07560525, - -0.018781837, - -0.0122035425, - 0.0019368301, - -0.00351373, - 0.07000184, - -0.029289605, - -0.008412919, - 0.04744267, - -0.00043944066, - -0.014024816, - -0.0035281784, - 0.0844005, - -0.0015739133, - 0.0016869568, - -0.023196274, - 0.059908636, - 0.019615034, - 0.054351386, - 0.012312578, - -1.5289404e-08, - -0.038118448, - -0.084228516, - -0.013602922, - -0.032792244, - -0.020994218, - 0.08923806, - 0.005445469, - -0.07045531, - -0.03966009, - -0.018226359, - 0.05718637, - -0.026399894, - -0.098825626, - 0.017524764, - -0.019498266, - -0.062369697, - -0.019561017, - -0.011198561, - -0.03005754, - 0.010641676, - -0.005561297, - 0.053242564, - 0.04418294, - 0.025771322, - 0.005914542, - 0.059626196, - 0.06883921, - 0.08894957, - -0.062240407, - -0.038899083, - 0.028789395, - 0.087763906, - 0.017739464, - -0.050055157, - -0.0009801601, - 0.1297665, - 0.08312503, - 0.08157199, - 0.0117320195, - 0.006869762, - -0.072692566, - -0.0019829427, - -0.018348025, - 0.0088948505, - -0.038234424, - -0.09056964, - -0.06433111, - -0.042595394, - -0.030844258, - -0.09312696, - -0.043474108, - 0.012029141, - -6.677036e-05, - 0.040267132, - -0.049134284, - 0.014589591, - 0.017469455, - -0.005167336, - -0.03331327, - 0.0075517776, - 0.07486923, - 0.0646153, - 0.04480708, - -0.02847676 + -0.03427073, + 0.090051405, + -0.11458989, + 0.0021456745, + 0.059038658, + -0.027524853, + -0.020602634, + 0.03373726, + -0.038729247, + 0.026002944, + 0.11481002, + 0.027119067, + -0.015927644, + -0.021832926, + -0.046713773, + -0.0463825, + -0.074167565, + -0.0528447, + -0.028117927, + 0.06325688, + 0.029135453, + 0.047131006, + -0.052675154, + -0.005349263, + 0.030659368, + 0.017706472, + -0.01687267, + 0.08681507, + -0.014155131, + -0.0838676, + 0.020020565, + 0.07115838, + 0.08365558, + 0.030919788, + 0.11829893, + 0.028751066, + 0.069536895, + -0.017295403, + -0.005784813, + 0.005809313, + 0.0012009157, + -0.0653044, + 0.0373506, + 0.018565746, + -0.0034945607, + -0.0011305016, + -0.029752811, + -0.021266408, + 0.0058016903, + -0.035597492, + -0.03722647, + 0.012373253, + -0.066935256, + -0.023148224, + 0.056864377, + 0.0014741909, + 0.014408296, + -0.017165763, + 0.009236472, + 0.06087921, + 0.024628488, + 0.03699286, + -0.050610077, + 0.05173448, + 0.10159555, + 0.008507267, + -0.04803921, + -0.013024803, + 0.03110457, + -0.16593884, + -0.1410075, + 0.009813814, + -0.025974236, + 0.05233053, + -0.0078903325, + 0.00788491, + -0.08471812, + -0.044507448, + 0.054161046, + -0.0704361, + -0.05769206, + -0.100796975, + 0.02182441, + 0.022125391, + 0.0071617346, + 0.13063926, + 0.080232956, + -0.004421626, + -0.018768508, + 0.0076132733, + -0.03163366, + 0.031986494, + -0.022168567, + 0.03073627, + -0.023798423, + 0.06954045, + 0.016659362, + 0.009536805, + 0.027459558, + 0.102133445, + 0.021457382, + -0.021377807, + 0.015131543, + 0.039423607, + -0.09434147, + -0.11544392, + 0.09468138, + -0.011155598, + 0.07266597, + -0.03601087, + -0.011743829, + -0.06654009, + -0.03470551, + -0.10300434, + 0.03020924, + -0.06319472, + -0.0908424, + 0.04116676, + -0.033686537, + 0.045706224, + 0.07134009, + -0.031778418, + -0.059655976, + -0.017215038, + -0.03229557, + -0.058579948, + 0.06733934, + -5.023814e-33, + -0.0058283503, + -0.0719842, + -0.009296622, + 0.09659216, + 0.03709538, + -0.03478395, + -0.004713233, + 0.016686605, + -0.09859812, + 0.00547005, + -0.014113569, + -0.0840751, + 0.0027168505, + 0.04445616, + -0.012728728, + 0.034566686, + -0.0006014651, + 0.06319148, + -0.026799418, + -0.013500979, + 0.024169419, + 0.015417236, + -0.04135526, + -0.055208974, + -0.06455241, + 0.03148543, + -0.0073052812, + -0.03945437, + 0.059831504, + 0.026674163, + 0.01396753, + -0.038841277, + -0.048514687, + 0.01756627, + 0.020964677, + 0.035239976, + 0.0115498835, + -0.00846713, + -0.044673763, + 0.014640657, + 5.2045852e-05, + -0.04694704, + 0.02703366, + 0.006635295, + 0.064396136, + -0.044757996, + -0.026173549, + -0.016282372, + 0.05521396, + 0.014104745, + -0.008479494, + 0.04204778, + 0.05049772, + 0.021629427, + 0.011260506, + 0.04858872, + 0.017662494, + -0.005005865, + 0.0019118759, + 0.06333162, + 0.035875723, + 0.03504778, + -0.06642375, + 0.008791644, + -0.027326671, + -0.05987137, + -0.0272001, + -0.08728625, + 0.112434424, + 0.05879801, + -0.041698616, + -0.06924583, + 0.06434144, + 0.01583225, + -0.027750073, + -0.037574448, + -0.011715211, + 0.0694801, + -0.07104981, + -0.039085716, + -0.043068763, + -0.11208956, + -0.030723054, + -0.063793585, + -0.03527373, + -0.06119042, + -0.01526633, + -0.10094421, + 0.047486804, + -0.08320468, + -0.0029513796, + 0.0131224785, + -0.056690685, + -0.057956036, + 0.06140136, + 2.7669969e-33, + 0.0036719525, + 0.06695694, + -0.05591421, + 0.025166295, + 0.014735592, + 0.03381445, + 0.09345791, + -0.01053347, + -0.046693947, + 0.14254177, + -0.015430197, + 0.0066938214, + 0.07679359, + -0.045779705, + 0.07989786, + 0.0036165903, + 0.023604553, + -0.06533708, + -0.04253485, + -0.025912313, + -0.0748119, + 0.10020777, + 0.12578633, + 0.06409652, + -0.016682886, + 0.01406972, + 0.025274348, + 0.0017218525, + -0.013340701, + 0.01172295, + 0.03772902, + 0.040607873, + -0.120578945, + 0.024344057, + 0.03439985, + -0.10167353, + 0.11863072, + -0.03571693, + -0.0126576, + 0.022622129, + 0.039235484, + 0.10625315, + 0.0106492825, + 0.076503076, + 0.02088746, + 0.06468519, + 0.08582322, + -0.032148413, + 0.04359905, + 0.011070053, + 0.023209164, + -0.06709916, + 0.055355705, + -0.008128262, + -0.026921155, + 0.076995976, + -0.011614669, + 0.044967294, + -0.02459807, + 0.020910041, + -0.0016746842, + 0.02905443, + -0.03898753, + -0.01360213, + -0.019878393, + -0.057056017, + -0.014543598, + 0.010161744, + 0.016893594, + 0.011981163, + 0.019902436, + 0.019194229, + -0.06551642, + -0.050247267, + 0.050837662, + -0.075614415, + -0.018767305, + -0.012229684, + 0.0019464786, + -0.0035209567, + 0.0699799, + -0.02925182, + -0.008455151, + 0.04742619, + -0.0004527954, + -0.014011262, + -0.0035493495, + 0.08439228, + -0.001586065, + 0.0016962147, + -0.023180604, + 0.059889086, + 0.019616995, + 0.05435093, + 0.012301163, + -1.5289881e-08, + -0.038103975, + -0.084179275, + -0.013605872, + -0.03277629, + -0.020995136, + 0.08924277, + 0.005438667, + -0.07047066, + -0.03966912, + -0.018226335, + 0.05716885, + -0.026391266, + -0.09881308, + 0.017511, + -0.01952465, + -0.06237397, + -0.019553065, + -0.0112019945, + -0.030052405, + 0.010624359, + -0.005598304, + 0.05326868, + 0.044162616, + 0.025812192, + 0.0059228353, + 0.059632093, + 0.06885661, + 0.08894283, + -0.06225795, + -0.038893122, + 0.028817136, + 0.08772772, + 0.017759481, + -0.050048865, + -0.0009810333, + 0.1297453, + 0.083138496, + 0.08161095, + 0.011747931, + 0.006871316, + -0.07277484, + -0.0020051182, + -0.018357608, + 0.008882652, + -0.03823878, + -0.09057624, + -0.06433315, + -0.04256367, + -0.030856675, + -0.09314087, + -0.043470908, + 0.012043298, + -9.8401986e-05, + 0.040246293, + -0.04912119, + 0.014575804, + 0.017479645, + -0.00515073, + -0.033331197, + 0.0075505474, + 0.07488009, + 0.06460031, + 0.044803377, + -0.028485151 ], "index": 0, "object": "embedding" diff --git a/tests/integration/recordings/responses/f70f30f54211.json b/tests/integration/recordings/responses/f70f30f54211.json index e0ea9c016..c4dd90e68 100644 --- a/tests/integration/recordings/responses/f70f30f54211.json +++ b/tests/integration/recordings/responses/f70f30f54211.json @@ -1,7 +1,7 @@ { "request": { "method": "POST", - "url": "http://localhost:11434/v1/v1/chat/completions", + "url": "http://0.0.0.0:11434/v1/v1/chat/completions", "headers": {}, "body": { "model": "llama3.2:3b-instruct-fp16", @@ -38,7 +38,7 @@ "body": { "__type__": "openai.types.chat.chat_completion.ChatCompletion", "__data__": { - "id": "chatcmpl-549", + "id": "chatcmpl-10", "choices": [ { "finish_reason": "tool_calls", @@ -53,7 +53,7 @@ "function_call": null, "tool_calls": [ { - "id": "call_ybj7t2qt", + "id": "call_7cm57k1b", "function": { "arguments": "{\"city\":\"Tokyo\"}", "name": "get_weather" @@ -65,7 +65,7 @@ } } ], - "created": 1754081857, + "created": 1756921368, "model": "llama3.2:3b-instruct-fp16", "object": "chat.completion", "service_tier": null, diff --git a/tests/integration/recordings/responses/fcdef245da95.json b/tests/integration/recordings/responses/fcdef245da95.json index 04606b914..d2801b9c6 100644 --- a/tests/integration/recordings/responses/fcdef245da95.json +++ b/tests/integration/recordings/responses/fcdef245da95.json @@ -20,15 +20,15 @@ "__type__": "ollama._types.GenerateResponse", "__data__": { "model": "llama-guard3:1b", - "created_at": "2025-08-01T23:13:55.309172Z", + "created_at": "2025-09-03T17:37:44.986629Z", "done": true, "done_reason": "stop", - "total_duration": 2252068541, - "load_duration": 240932958, + "total_duration": 285693167, + "load_duration": 110888542, "prompt_eval_count": 212, - "prompt_eval_duration": 1979000000, + "prompt_eval_duration": 163158250, "eval_count": 2, - "eval_duration": 25000000, + "eval_duration": 11080125, "response": "safe", "thinking": null, "context": null diff --git a/tests/integration/recordings/vision/responses/ff7db0102b28.json b/tests/integration/recordings/responses/ff7db0102b28.json similarity index 98% rename from tests/integration/recordings/vision/responses/ff7db0102b28.json rename to tests/integration/recordings/responses/ff7db0102b28.json index 160e0a607..f1866d1f4 100644 --- a/tests/integration/recordings/vision/responses/ff7db0102b28.json +++ b/tests/integration/recordings/responses/ff7db0102b28.json @@ -31,7 +31,7 @@ "__type__": "ollama._types.ChatResponse", "__data__": { "model": "llama3.2-vision:11b", - "created_at": "2025-08-01T00:04:49.339347876Z", + "created_at": "2025-09-03T17:54:22.358461Z", "done": false, "done_reason": null, "total_duration": null, @@ -53,7 +53,7 @@ "__type__": "ollama._types.ChatResponse", "__data__": { "model": "llama3.2-vision:11b", - "created_at": "2025-08-01T00:04:49.747466769Z", + "created_at": "2025-09-03T17:54:22.416981Z", "done": false, "done_reason": null, "total_duration": null, @@ -75,7 +75,7 @@ "__type__": "ollama._types.ChatResponse", "__data__": { "model": "llama3.2-vision:11b", - "created_at": "2025-08-01T00:04:50.156146804Z", + "created_at": "2025-09-03T17:54:22.477481Z", "done": false, "done_reason": null, "total_duration": null, @@ -97,7 +97,7 @@ "__type__": "ollama._types.ChatResponse", "__data__": { "model": "llama3.2-vision:11b", - "created_at": "2025-08-01T00:04:50.566195243Z", + "created_at": "2025-09-03T17:54:22.53807Z", "done": false, "done_reason": null, "total_duration": null, @@ -119,7 +119,7 @@ "__type__": "ollama._types.ChatResponse", "__data__": { "model": "llama3.2-vision:11b", - "created_at": "2025-08-01T00:04:50.975121211Z", + "created_at": "2025-09-03T17:54:22.59701Z", "done": false, "done_reason": null, "total_duration": null, @@ -141,7 +141,7 @@ "__type__": "ollama._types.ChatResponse", "__data__": { "model": "llama3.2-vision:11b", - "created_at": "2025-08-01T00:04:51.388779549Z", + "created_at": "2025-09-03T17:54:22.655848Z", "done": false, "done_reason": null, "total_duration": null, @@ -163,7 +163,7 @@ "__type__": "ollama._types.ChatResponse", "__data__": { "model": "llama3.2-vision:11b", - "created_at": "2025-08-01T00:04:51.79897453Z", + "created_at": "2025-09-03T17:54:22.715363Z", "done": false, "done_reason": null, "total_duration": null, @@ -185,7 +185,7 @@ "__type__": "ollama._types.ChatResponse", "__data__": { "model": "llama3.2-vision:11b", - "created_at": "2025-08-01T00:04:52.209608504Z", + "created_at": "2025-09-03T17:54:22.773865Z", "done": false, "done_reason": null, "total_duration": null, @@ -207,7 +207,7 @@ "__type__": "ollama._types.ChatResponse", "__data__": { "model": "llama3.2-vision:11b", - "created_at": "2025-08-01T00:04:52.619045995Z", + "created_at": "2025-09-03T17:54:22.832338Z", "done": false, "done_reason": null, "total_duration": null, @@ -229,7 +229,7 @@ "__type__": "ollama._types.ChatResponse", "__data__": { "model": "llama3.2-vision:11b", - "created_at": "2025-08-01T00:04:53.026501007Z", + "created_at": "2025-09-03T17:54:22.890824Z", "done": false, "done_reason": null, "total_duration": null, @@ -251,7 +251,7 @@ "__type__": "ollama._types.ChatResponse", "__data__": { "model": "llama3.2-vision:11b", - "created_at": "2025-08-01T00:04:53.436015071Z", + "created_at": "2025-09-03T17:54:22.949237Z", "done": false, "done_reason": null, "total_duration": null, @@ -273,7 +273,7 @@ "__type__": "ollama._types.ChatResponse", "__data__": { "model": "llama3.2-vision:11b", - "created_at": "2025-08-01T00:04:53.843369446Z", + "created_at": "2025-09-03T17:54:23.008374Z", "done": false, "done_reason": null, "total_duration": null, @@ -295,7 +295,7 @@ "__type__": "ollama._types.ChatResponse", "__data__": { "model": "llama3.2-vision:11b", - "created_at": "2025-08-01T00:04:54.255794451Z", + "created_at": "2025-09-03T17:54:23.066921Z", "done": false, "done_reason": null, "total_duration": null, @@ -317,7 +317,7 @@ "__type__": "ollama._types.ChatResponse", "__data__": { "model": "llama3.2-vision:11b", - "created_at": "2025-08-01T00:04:54.663263793Z", + "created_at": "2025-09-03T17:54:23.125544Z", "done": false, "done_reason": null, "total_duration": null, @@ -339,7 +339,7 @@ "__type__": "ollama._types.ChatResponse", "__data__": { "model": "llama3.2-vision:11b", - "created_at": "2025-08-01T00:04:55.073162133Z", + "created_at": "2025-09-03T17:54:23.184923Z", "done": false, "done_reason": null, "total_duration": null, @@ -361,7 +361,7 @@ "__type__": "ollama._types.ChatResponse", "__data__": { "model": "llama3.2-vision:11b", - "created_at": "2025-08-01T00:04:55.48667439Z", + "created_at": "2025-09-03T17:54:23.244278Z", "done": false, "done_reason": null, "total_duration": null, @@ -383,7 +383,7 @@ "__type__": "ollama._types.ChatResponse", "__data__": { "model": "llama3.2-vision:11b", - "created_at": "2025-08-01T00:04:55.897947147Z", + "created_at": "2025-09-03T17:54:23.303383Z", "done": false, "done_reason": null, "total_duration": null, @@ -405,7 +405,7 @@ "__type__": "ollama._types.ChatResponse", "__data__": { "model": "llama3.2-vision:11b", - "created_at": "2025-08-01T00:04:56.31639321Z", + "created_at": "2025-09-03T17:54:23.36246Z", "done": false, "done_reason": null, "total_duration": null, @@ -427,7 +427,7 @@ "__type__": "ollama._types.ChatResponse", "__data__": { "model": "llama3.2-vision:11b", - "created_at": "2025-08-01T00:04:56.729288843Z", + "created_at": "2025-09-03T17:54:23.421703Z", "done": false, "done_reason": null, "total_duration": null, @@ -449,7 +449,7 @@ "__type__": "ollama._types.ChatResponse", "__data__": { "model": "llama3.2-vision:11b", - "created_at": "2025-08-01T00:04:57.142647132Z", + "created_at": "2025-09-03T17:54:23.481027Z", "done": false, "done_reason": null, "total_duration": null, @@ -471,7 +471,7 @@ "__type__": "ollama._types.ChatResponse", "__data__": { "model": "llama3.2-vision:11b", - "created_at": "2025-08-01T00:04:57.55091814Z", + "created_at": "2025-09-03T17:54:23.540282Z", "done": false, "done_reason": null, "total_duration": null, @@ -493,7 +493,7 @@ "__type__": "ollama._types.ChatResponse", "__data__": { "model": "llama3.2-vision:11b", - "created_at": "2025-08-01T00:04:57.959494633Z", + "created_at": "2025-09-03T17:54:23.59938Z", "done": false, "done_reason": null, "total_duration": null, @@ -515,7 +515,7 @@ "__type__": "ollama._types.ChatResponse", "__data__": { "model": "llama3.2-vision:11b", - "created_at": "2025-08-01T00:04:58.367117419Z", + "created_at": "2025-09-03T17:54:23.658742Z", "done": false, "done_reason": null, "total_duration": null, @@ -537,7 +537,7 @@ "__type__": "ollama._types.ChatResponse", "__data__": { "model": "llama3.2-vision:11b", - "created_at": "2025-08-01T00:04:58.77560425Z", + "created_at": "2025-09-03T17:54:23.718569Z", "done": false, "done_reason": null, "total_duration": null, @@ -559,7 +559,7 @@ "__type__": "ollama._types.ChatResponse", "__data__": { "model": "llama3.2-vision:11b", - "created_at": "2025-08-01T00:04:59.183890868Z", + "created_at": "2025-09-03T17:54:23.777758Z", "done": false, "done_reason": null, "total_duration": null, @@ -581,51 +581,7 @@ "__type__": "ollama._types.ChatResponse", "__data__": { "model": "llama3.2-vision:11b", - "created_at": "2025-08-01T00:04:59.596163097Z", - "done": false, - "done_reason": null, - "total_duration": null, - "load_duration": null, - "prompt_eval_count": null, - "prompt_eval_duration": null, - "eval_count": null, - "eval_duration": null, - "message": { - "role": "assistant", - "content": " smiling", - "thinking": null, - "images": null, - "tool_calls": null - } - } - }, - { - "__type__": "ollama._types.ChatResponse", - "__data__": { - "model": "llama3.2-vision:11b", - "created_at": "2025-08-01T00:05:00.004002773Z", - "done": false, - "done_reason": null, - "total_duration": null, - "load_duration": null, - "prompt_eval_count": null, - "prompt_eval_duration": null, - "eval_count": null, - "eval_duration": null, - "message": { - "role": "assistant", - "content": " or", - "thinking": null, - "images": null, - "tool_calls": null - } - } - }, - { - "__type__": "ollama._types.ChatResponse", - "__data__": { - "model": "llama3.2-vision:11b", - "created_at": "2025-08-01T00:05:00.410717383Z", + "created_at": "2025-09-03T17:54:23.836924Z", "done": false, "done_reason": null, "total_duration": null, @@ -647,7 +603,7 @@ "__type__": "ollama._types.ChatResponse", "__data__": { "model": "llama3.2-vision:11b", - "created_at": "2025-08-01T00:05:00.817783323Z", + "created_at": "2025-09-03T17:54:23.896332Z", "done": false, "done_reason": null, "total_duration": null, @@ -669,7 +625,73 @@ "__type__": "ollama._types.ChatResponse", "__data__": { "model": "llama3.2-vision:11b", - "created_at": "2025-08-01T00:05:01.223523865Z", + "created_at": "2025-09-03T17:54:23.955491Z", + "done": false, + "done_reason": null, + "total_duration": null, + "load_duration": null, + "prompt_eval_count": null, + "prompt_eval_duration": null, + "eval_count": null, + "eval_duration": null, + "message": { + "role": "assistant", + "content": " or", + "thinking": null, + "images": null, + "tool_calls": null + } + } + }, + { + "__type__": "ollama._types.ChatResponse", + "__data__": { + "model": "llama3.2-vision:11b", + "created_at": "2025-09-03T17:54:24.014861Z", + "done": false, + "done_reason": null, + "total_duration": null, + "load_duration": null, + "prompt_eval_count": null, + "prompt_eval_duration": null, + "eval_count": null, + "eval_duration": null, + "message": { + "role": "assistant", + "content": " b", + "thinking": null, + "images": null, + "tool_calls": null + } + } + }, + { + "__type__": "ollama._types.ChatResponse", + "__data__": { + "model": "llama3.2-vision:11b", + "created_at": "2025-09-03T17:54:24.074933Z", + "done": false, + "done_reason": null, + "total_duration": null, + "load_duration": null, + "prompt_eval_count": null, + "prompt_eval_duration": null, + "eval_count": null, + "eval_duration": null, + "message": { + "role": "assistant", + "content": "arking", + "thinking": null, + "images": null, + "tool_calls": null + } + } + }, + { + "__type__": "ollama._types.ChatResponse", + "__data__": { + "model": "llama3.2-vision:11b", + "created_at": "2025-09-03T17:54:24.133301Z", "done": false, "done_reason": null, "total_duration": null, @@ -691,7 +713,7 @@ "__type__": "ollama._types.ChatResponse", "__data__": { "model": "llama3.2-vision:11b", - "created_at": "2025-08-01T00:05:01.63351174Z", + "created_at": "2025-09-03T17:54:24.192664Z", "done": false, "done_reason": null, "total_duration": null, @@ -713,7 +735,7 @@ "__type__": "ollama._types.ChatResponse", "__data__": { "model": "llama3.2-vision:11b", - "created_at": "2025-08-01T00:05:02.032702205Z", + "created_at": "2025-09-03T17:54:24.251448Z", "done": false, "done_reason": null, "total_duration": null, @@ -735,7 +757,7 @@ "__type__": "ollama._types.ChatResponse", "__data__": { "model": "llama3.2-vision:11b", - "created_at": "2025-08-01T00:05:02.424431407Z", + "created_at": "2025-09-03T17:54:24.310083Z", "done": false, "done_reason": null, "total_duration": null, @@ -757,7 +779,7 @@ "__type__": "ollama._types.ChatResponse", "__data__": { "model": "llama3.2-vision:11b", - "created_at": "2025-08-01T00:05:02.81524835Z", + "created_at": "2025-09-03T17:54:24.369218Z", "done": false, "done_reason": null, "total_duration": null, @@ -779,7 +801,7 @@ "__type__": "ollama._types.ChatResponse", "__data__": { "model": "llama3.2-vision:11b", - "created_at": "2025-08-01T00:05:03.207597567Z", + "created_at": "2025-09-03T17:54:24.42843Z", "done": false, "done_reason": null, "total_duration": null, @@ -801,7 +823,7 @@ "__type__": "ollama._types.ChatResponse", "__data__": { "model": "llama3.2-vision:11b", - "created_at": "2025-08-01T00:05:03.614094549Z", + "created_at": "2025-09-03T17:54:24.487403Z", "done": false, "done_reason": null, "total_duration": null, @@ -823,7 +845,7 @@ "__type__": "ollama._types.ChatResponse", "__data__": { "model": "llama3.2-vision:11b", - "created_at": "2025-08-01T00:05:04.008232462Z", + "created_at": "2025-09-03T17:54:24.547118Z", "done": false, "done_reason": null, "total_duration": null, @@ -845,7 +867,7 @@ "__type__": "ollama._types.ChatResponse", "__data__": { "model": "llama3.2-vision:11b", - "created_at": "2025-08-01T00:05:04.411085956Z", + "created_at": "2025-09-03T17:54:24.606557Z", "done": false, "done_reason": null, "total_duration": null, @@ -867,7 +889,7 @@ "__type__": "ollama._types.ChatResponse", "__data__": { "model": "llama3.2-vision:11b", - "created_at": "2025-08-01T00:05:04.80616608Z", + "created_at": "2025-09-03T17:54:24.665594Z", "done": false, "done_reason": null, "total_duration": null, @@ -889,7 +911,7 @@ "__type__": "ollama._types.ChatResponse", "__data__": { "model": "llama3.2-vision:11b", - "created_at": "2025-08-01T00:05:05.212911563Z", + "created_at": "2025-09-03T17:54:24.725305Z", "done": false, "done_reason": null, "total_duration": null, @@ -911,7 +933,7 @@ "__type__": "ollama._types.ChatResponse", "__data__": { "model": "llama3.2-vision:11b", - "created_at": "2025-08-01T00:05:05.599645826Z", + "created_at": "2025-09-03T17:54:24.784482Z", "done": false, "done_reason": null, "total_duration": null, @@ -933,7 +955,7 @@ "__type__": "ollama._types.ChatResponse", "__data__": { "model": "llama3.2-vision:11b", - "created_at": "2025-08-01T00:05:05.998590959Z", + "created_at": "2025-09-03T17:54:24.843771Z", "done": false, "done_reason": null, "total_duration": null, @@ -955,7 +977,7 @@ "__type__": "ollama._types.ChatResponse", "__data__": { "model": "llama3.2-vision:11b", - "created_at": "2025-08-01T00:05:06.398745325Z", + "created_at": "2025-09-03T17:54:24.903031Z", "done": false, "done_reason": null, "total_duration": null, @@ -966,7 +988,7 @@ "eval_duration": null, "message": { "role": "assistant", - "content": " ears", + "content": " eyes", "thinking": null, "images": null, "tool_calls": null @@ -977,7 +999,7 @@ "__type__": "ollama._types.ChatResponse", "__data__": { "model": "llama3.2-vision:11b", - "created_at": "2025-08-01T00:05:06.790505624Z", + "created_at": "2025-09-03T17:54:24.962328Z", "done": false, "done_reason": null, "total_duration": null, @@ -999,7 +1021,7 @@ "__type__": "ollama._types.ChatResponse", "__data__": { "model": "llama3.2-vision:11b", - "created_at": "2025-08-01T00:05:07.199713609Z", + "created_at": "2025-09-03T17:54:25.022265Z", "done": false, "done_reason": null, "total_duration": null, @@ -1010,7 +1032,7 @@ "eval_duration": null, "message": { "role": "assistant", - "content": " long", + "content": " dark", "thinking": null, "images": null, "tool_calls": null @@ -1021,7 +1043,7 @@ "__type__": "ollama._types.ChatResponse", "__data__": { "model": "llama3.2-vision:11b", - "created_at": "2025-08-01T00:05:07.596500603Z", + "created_at": "2025-09-03T17:54:25.081666Z", "done": false, "done_reason": null, "total_duration": null, @@ -1032,7 +1054,7 @@ "eval_duration": null, "message": { "role": "assistant", - "content": " and", + "content": " brown", "thinking": null, "images": null, "tool_calls": null @@ -1043,29 +1065,7 @@ "__type__": "ollama._types.ChatResponse", "__data__": { "model": "llama3.2-vision:11b", - "created_at": "2025-08-01T00:05:07.997793386Z", - "done": false, - "done_reason": null, - "total_duration": null, - "load_duration": null, - "prompt_eval_count": null, - "prompt_eval_duration": null, - "eval_count": null, - "eval_duration": null, - "message": { - "role": "assistant", - "content": " floppy", - "thinking": null, - "images": null, - "tool_calls": null - } - } - }, - { - "__type__": "ollama._types.ChatResponse", - "__data__": { - "model": "llama3.2-vision:11b", - "created_at": "2025-08-01T00:05:08.381509773Z", + "created_at": "2025-09-03T17:54:25.140962Z", "done": false, "done_reason": null, "total_duration": null, @@ -1087,7 +1087,7 @@ "__type__": "ollama._types.ChatResponse", "__data__": { "model": "llama3.2-vision:11b", - "created_at": "2025-08-01T00:05:08.76579698Z", + "created_at": "2025-09-03T17:54:25.200015Z", "done": false, "done_reason": null, "total_duration": null, @@ -1109,7 +1109,7 @@ "__type__": "ollama._types.ChatResponse", "__data__": { "model": "llama3.2-vision:11b", - "created_at": "2025-08-01T00:05:09.159673897Z", + "created_at": "2025-09-03T17:54:25.259212Z", "done": false, "done_reason": null, "total_duration": null, @@ -1131,7 +1131,7 @@ "__type__": "ollama._types.ChatResponse", "__data__": { "model": "llama3.2-vision:11b", - "created_at": "2025-08-01T00:05:09.557596611Z", + "created_at": "2025-09-03T17:54:25.318509Z", "done": false, "done_reason": null, "total_duration": null, @@ -1153,7 +1153,7 @@ "__type__": "ollama._types.ChatResponse", "__data__": { "model": "llama3.2-vision:11b", - "created_at": "2025-08-01T00:05:09.950543555Z", + "created_at": "2025-09-03T17:54:25.377923Z", "done": false, "done_reason": null, "total_duration": null, @@ -1175,7 +1175,7 @@ "__type__": "ollama._types.ChatResponse", "__data__": { "model": "llama3.2-vision:11b", - "created_at": "2025-08-01T00:05:10.351722165Z", + "created_at": "2025-09-03T17:54:25.436963Z", "done": false, "done_reason": null, "total_duration": null, @@ -1197,7 +1197,7 @@ "__type__": "ollama._types.ChatResponse", "__data__": { "model": "llama3.2-vision:11b", - "created_at": "2025-08-01T00:05:10.752622361Z", + "created_at": "2025-09-03T17:54:25.4958Z", "done": false, "done_reason": null, "total_duration": null, @@ -1219,7 +1219,7 @@ "__type__": "ollama._types.ChatResponse", "__data__": { "model": "llama3.2-vision:11b", - "created_at": "2025-08-01T00:05:11.15541961Z", + "created_at": "2025-09-03T17:54:25.554502Z", "done": false, "done_reason": null, "total_duration": null, @@ -1241,7 +1241,7 @@ "__type__": "ollama._types.ChatResponse", "__data__": { "model": "llama3.2-vision:11b", - "created_at": "2025-08-01T00:05:11.549741697Z", + "created_at": "2025-09-03T17:54:25.613841Z", "done": false, "done_reason": null, "total_duration": null, @@ -1263,7 +1263,7 @@ "__type__": "ollama._types.ChatResponse", "__data__": { "model": "llama3.2-vision:11b", - "created_at": "2025-08-01T00:05:11.935619908Z", + "created_at": "2025-09-03T17:54:25.673643Z", "done": false, "done_reason": null, "total_duration": null, @@ -1285,7 +1285,7 @@ "__type__": "ollama._types.ChatResponse", "__data__": { "model": "llama3.2-vision:11b", - "created_at": "2025-08-01T00:05:12.343367145Z", + "created_at": "2025-09-03T17:54:25.733099Z", "done": false, "done_reason": null, "total_duration": null, @@ -1307,7 +1307,7 @@ "__type__": "ollama._types.ChatResponse", "__data__": { "model": "llama3.2-vision:11b", - "created_at": "2025-08-01T00:05:12.745897023Z", + "created_at": "2025-09-03T17:54:25.792667Z", "done": false, "done_reason": null, "total_duration": null, @@ -1329,7 +1329,7 @@ "__type__": "ollama._types.ChatResponse", "__data__": { "model": "llama3.2-vision:11b", - "created_at": "2025-08-01T00:05:13.148396264Z", + "created_at": "2025-09-03T17:54:25.853133Z", "done": false, "done_reason": null, "total_duration": null, @@ -1351,7 +1351,7 @@ "__type__": "ollama._types.ChatResponse", "__data__": { "model": "llama3.2-vision:11b", - "created_at": "2025-08-01T00:05:13.549096782Z", + "created_at": "2025-09-03T17:54:25.912402Z", "done": false, "done_reason": null, "total_duration": null, @@ -1373,7 +1373,7 @@ "__type__": "ollama._types.ChatResponse", "__data__": { "model": "llama3.2-vision:11b", - "created_at": "2025-08-01T00:05:13.945126876Z", + "created_at": "2025-09-03T17:54:25.971501Z", "done": false, "done_reason": null, "total_duration": null, @@ -1395,7 +1395,7 @@ "__type__": "ollama._types.ChatResponse", "__data__": { "model": "llama3.2-vision:11b", - "created_at": "2025-08-01T00:05:14.351732762Z", + "created_at": "2025-09-03T17:54:26.031043Z", "done": false, "done_reason": null, "total_duration": null, @@ -1417,7 +1417,7 @@ "__type__": "ollama._types.ChatResponse", "__data__": { "model": "llama3.2-vision:11b", - "created_at": "2025-08-01T00:05:14.754792448Z", + "created_at": "2025-09-03T17:54:26.090781Z", "done": false, "done_reason": null, "total_duration": null, @@ -1439,7 +1439,7 @@ "__type__": "ollama._types.ChatResponse", "__data__": { "model": "llama3.2-vision:11b", - "created_at": "2025-08-01T00:05:15.157906888Z", + "created_at": "2025-09-03T17:54:26.150238Z", "done": false, "done_reason": null, "total_duration": null, @@ -1461,7 +1461,7 @@ "__type__": "ollama._types.ChatResponse", "__data__": { "model": "llama3.2-vision:11b", - "created_at": "2025-08-01T00:05:15.567665265Z", + "created_at": "2025-09-03T17:54:26.209744Z", "done": false, "done_reason": null, "total_duration": null, @@ -1483,7 +1483,7 @@ "__type__": "ollama._types.ChatResponse", "__data__": { "model": "llama3.2-vision:11b", - "created_at": "2025-08-01T00:05:15.981925795Z", + "created_at": "2025-09-03T17:54:26.269231Z", "done": false, "done_reason": null, "total_duration": null, @@ -1494,7 +1494,7 @@ "eval_duration": null, "message": { "role": "assistant", - "content": " outdoors", + "content": " a", "thinking": null, "images": null, "tool_calls": null @@ -1505,7 +1505,95 @@ "__type__": "ollama._types.ChatResponse", "__data__": { "model": "llama3.2-vision:11b", - "created_at": "2025-08-01T00:05:16.388785931Z", + "created_at": "2025-09-03T17:54:26.328953Z", + "done": false, + "done_reason": null, + "total_duration": null, + "load_duration": null, + "prompt_eval_count": null, + "prompt_eval_duration": null, + "eval_count": null, + "eval_duration": null, + "message": { + "role": "assistant", + "content": " park", + "thinking": null, + "images": null, + "tool_calls": null + } + } + }, + { + "__type__": "ollama._types.ChatResponse", + "__data__": { + "model": "llama3.2-vision:11b", + "created_at": "2025-09-03T17:54:26.38859Z", + "done": false, + "done_reason": null, + "total_duration": null, + "load_duration": null, + "prompt_eval_count": null, + "prompt_eval_duration": null, + "eval_count": null, + "eval_duration": null, + "message": { + "role": "assistant", + "content": " or", + "thinking": null, + "images": null, + "tool_calls": null + } + } + }, + { + "__type__": "ollama._types.ChatResponse", + "__data__": { + "model": "llama3.2-vision:11b", + "created_at": "2025-09-03T17:54:26.44816Z", + "done": false, + "done_reason": null, + "total_duration": null, + "load_duration": null, + "prompt_eval_count": null, + "prompt_eval_duration": null, + "eval_count": null, + "eval_duration": null, + "message": { + "role": "assistant", + "content": " a", + "thinking": null, + "images": null, + "tool_calls": null + } + } + }, + { + "__type__": "ollama._types.ChatResponse", + "__data__": { + "model": "llama3.2-vision:11b", + "created_at": "2025-09-03T17:54:26.507848Z", + "done": false, + "done_reason": null, + "total_duration": null, + "load_duration": null, + "prompt_eval_count": null, + "prompt_eval_duration": null, + "eval_count": null, + "eval_duration": null, + "message": { + "role": "assistant", + "content": " field", + "thinking": null, + "images": null, + "tool_calls": null + } + } + }, + { + "__type__": "ollama._types.ChatResponse", + "__data__": { + "model": "llama3.2-vision:11b", + "created_at": "2025-09-03T17:54:26.567611Z", "done": false, "done_reason": null, "total_duration": null, @@ -1527,7 +1615,7 @@ "__type__": "ollama._types.ChatResponse", "__data__": { "model": "llama3.2-vision:11b", - "created_at": "2025-08-01T00:05:16.795150512Z", + "created_at": "2025-09-03T17:54:26.627394Z", "done": false, "done_reason": null, "total_duration": null, @@ -1549,7 +1637,7 @@ "__type__": "ollama._types.ChatResponse", "__data__": { "model": "llama3.2-vision:11b", - "created_at": "2025-08-01T00:05:17.204509535Z", + "created_at": "2025-09-03T17:54:26.688384Z", "done": false, "done_reason": null, "total_duration": null, @@ -1571,7 +1659,7 @@ "__type__": "ollama._types.ChatResponse", "__data__": { "model": "llama3.2-vision:11b", - "created_at": "2025-08-01T00:05:17.613690212Z", + "created_at": "2025-09-03T17:54:26.750165Z", "done": false, "done_reason": null, "total_duration": null, @@ -1593,7 +1681,7 @@ "__type__": "ollama._types.ChatResponse", "__data__": { "model": "llama3.2-vision:11b", - "created_at": "2025-08-01T00:05:18.020711094Z", + "created_at": "2025-09-03T17:54:26.809389Z", "done": false, "done_reason": null, "total_duration": null, @@ -1615,7 +1703,7 @@ "__type__": "ollama._types.ChatResponse", "__data__": { "model": "llama3.2-vision:11b", - "created_at": "2025-08-01T00:05:18.428597263Z", + "created_at": "2025-09-03T17:54:26.868745Z", "done": false, "done_reason": null, "total_duration": null, @@ -1637,7 +1725,7 @@ "__type__": "ollama._types.ChatResponse", "__data__": { "model": "llama3.2-vision:11b", - "created_at": "2025-08-01T00:05:18.836863657Z", + "created_at": "2025-09-03T17:54:26.928602Z", "done": false, "done_reason": null, "total_duration": null, @@ -1659,7 +1747,7 @@ "__type__": "ollama._types.ChatResponse", "__data__": { "model": "llama3.2-vision:11b", - "created_at": "2025-08-01T00:05:19.248527489Z", + "created_at": "2025-09-03T17:54:26.988568Z", "done": false, "done_reason": null, "total_duration": null, @@ -1681,7 +1769,7 @@ "__type__": "ollama._types.ChatResponse", "__data__": { "model": "llama3.2-vision:11b", - "created_at": "2025-08-01T00:05:19.662063245Z", + "created_at": "2025-09-03T17:54:27.04809Z", "done": false, "done_reason": null, "total_duration": null, @@ -1703,7 +1791,7 @@ "__type__": "ollama._types.ChatResponse", "__data__": { "model": "llama3.2-vision:11b", - "created_at": "2025-08-01T00:05:20.074553793Z", + "created_at": "2025-09-03T17:54:27.107359Z", "done": false, "done_reason": null, "total_duration": null, @@ -1725,51 +1813,7 @@ "__type__": "ollama._types.ChatResponse", "__data__": { "model": "llama3.2-vision:11b", - "created_at": "2025-08-01T00:05:20.494386446Z", - "done": false, - "done_reason": null, - "total_duration": null, - "load_duration": null, - "prompt_eval_count": null, - "prompt_eval_duration": null, - "eval_count": null, - "eval_duration": null, - "message": { - "role": "assistant", - "content": " happiness", - "thinking": null, - "images": null, - "tool_calls": null - } - } - }, - { - "__type__": "ollama._types.ChatResponse", - "__data__": { - "model": "llama3.2-vision:11b", - "created_at": "2025-08-01T00:05:20.905809772Z", - "done": false, - "done_reason": null, - "total_duration": null, - "load_duration": null, - "prompt_eval_count": null, - "prompt_eval_duration": null, - "eval_count": null, - "eval_duration": null, - "message": { - "role": "assistant", - "content": " and", - "thinking": null, - "images": null, - "tool_calls": null - } - } - }, - { - "__type__": "ollama._types.ChatResponse", - "__data__": { - "model": "llama3.2-vision:11b", - "created_at": "2025-08-01T00:05:21.32374153Z", + "created_at": "2025-09-03T17:54:27.16686Z", "done": false, "done_reason": null, "total_duration": null, @@ -1791,7 +1835,7 @@ "__type__": "ollama._types.ChatResponse", "__data__": { "model": "llama3.2-vision:11b", - "created_at": "2025-08-01T00:05:21.732533121Z", + "created_at": "2025-09-03T17:54:27.226135Z", "done": false, "done_reason": null, "total_duration": null, @@ -1813,7 +1857,51 @@ "__type__": "ollama._types.ChatResponse", "__data__": { "model": "llama3.2-vision:11b", - "created_at": "2025-08-01T00:05:22.140888939Z", + "created_at": "2025-09-03T17:54:27.285472Z", + "done": false, + "done_reason": null, + "total_duration": null, + "load_duration": null, + "prompt_eval_count": null, + "prompt_eval_duration": null, + "eval_count": null, + "eval_duration": null, + "message": { + "role": "assistant", + "content": " and", + "thinking": null, + "images": null, + "tool_calls": null + } + } + }, + { + "__type__": "ollama._types.ChatResponse", + "__data__": { + "model": "llama3.2-vision:11b", + "created_at": "2025-09-03T17:54:27.344933Z", + "done": false, + "done_reason": null, + "total_duration": null, + "load_duration": null, + "prompt_eval_count": null, + "prompt_eval_duration": null, + "eval_count": null, + "eval_duration": null, + "message": { + "role": "assistant", + "content": " energy", + "thinking": null, + "images": null, + "tool_calls": null + } + } + }, + { + "__type__": "ollama._types.ChatResponse", + "__data__": { + "model": "llama3.2-vision:11b", + "created_at": "2025-09-03T17:54:27.404492Z", "done": false, "done_reason": null, "total_duration": null, @@ -1835,7 +1923,7 @@ "__type__": "ollama._types.ChatResponse", "__data__": { "model": "llama3.2-vision:11b", - "created_at": "2025-08-01T00:05:22.552257821Z", + "created_at": "2025-09-03T17:54:27.463561Z", "done": false, "done_reason": null, "total_duration": null, @@ -1857,7 +1945,7 @@ "__type__": "ollama._types.ChatResponse", "__data__": { "model": "llama3.2-vision:11b", - "created_at": "2025-08-01T00:05:22.970740344Z", + "created_at": "2025-09-03T17:54:27.523445Z", "done": false, "done_reason": null, "total_duration": null, @@ -1879,7 +1967,7 @@ "__type__": "ollama._types.ChatResponse", "__data__": { "model": "llama3.2-vision:11b", - "created_at": "2025-08-01T00:05:23.380926627Z", + "created_at": "2025-09-03T17:54:27.582168Z", "done": false, "done_reason": null, "total_duration": null, @@ -1901,7 +1989,7 @@ "__type__": "ollama._types.ChatResponse", "__data__": { "model": "llama3.2-vision:11b", - "created_at": "2025-08-01T00:05:23.790553354Z", + "created_at": "2025-09-03T17:54:27.641388Z", "done": false, "done_reason": null, "total_duration": null, @@ -1923,7 +2011,7 @@ "__type__": "ollama._types.ChatResponse", "__data__": { "model": "llama3.2-vision:11b", - "created_at": "2025-08-01T00:05:24.202112923Z", + "created_at": "2025-09-03T17:54:27.70213Z", "done": false, "done_reason": null, "total_duration": null, @@ -1945,7 +2033,7 @@ "__type__": "ollama._types.ChatResponse", "__data__": { "model": "llama3.2-vision:11b", - "created_at": "2025-08-01T00:05:24.612103888Z", + "created_at": "2025-09-03T17:54:27.761774Z", "done": false, "done_reason": null, "total_duration": null, @@ -1967,7 +2055,7 @@ "__type__": "ollama._types.ChatResponse", "__data__": { "model": "llama3.2-vision:11b", - "created_at": "2025-08-01T00:05:25.019727418Z", + "created_at": "2025-09-03T17:54:27.821071Z", "done": false, "done_reason": null, "total_duration": null, @@ -1978,7 +2066,7 @@ "eval_duration": null, "message": { "role": "assistant", - "content": " enjoying", + "content": " in", "thinking": null, "images": null, "tool_calls": null @@ -1989,7 +2077,7 @@ "__type__": "ollama._types.ChatResponse", "__data__": { "model": "llama3.2-vision:11b", - "created_at": "2025-08-01T00:05:25.422980466Z", + "created_at": "2025-09-03T17:54:27.880307Z", "done": false, "done_reason": null, "total_duration": null, @@ -2000,7 +2088,7 @@ "eval_duration": null, "message": { "role": "assistant", - "content": " itself", + "content": " the", "thinking": null, "images": null, "tool_calls": null @@ -2011,7 +2099,161 @@ "__type__": "ollama._types.ChatResponse", "__data__": { "model": "llama3.2-vision:11b", - "created_at": "2025-08-01T00:05:25.815598412Z", + "created_at": "2025-09-03T17:54:27.939228Z", + "done": false, + "done_reason": null, + "total_duration": null, + "load_duration": null, + "prompt_eval_count": null, + "prompt_eval_duration": null, + "eval_count": null, + "eval_duration": null, + "message": { + "role": "assistant", + "content": " midst", + "thinking": null, + "images": null, + "tool_calls": null + } + } + }, + { + "__type__": "ollama._types.ChatResponse", + "__data__": { + "model": "llama3.2-vision:11b", + "created_at": "2025-09-03T17:54:27.998568Z", + "done": false, + "done_reason": null, + "total_duration": null, + "load_duration": null, + "prompt_eval_count": null, + "prompt_eval_duration": null, + "eval_count": null, + "eval_duration": null, + "message": { + "role": "assistant", + "content": " of", + "thinking": null, + "images": null, + "tool_calls": null + } + } + }, + { + "__type__": "ollama._types.ChatResponse", + "__data__": { + "model": "llama3.2-vision:11b", + "created_at": "2025-09-03T17:54:28.057651Z", + "done": false, + "done_reason": null, + "total_duration": null, + "load_duration": null, + "prompt_eval_count": null, + "prompt_eval_duration": null, + "eval_count": null, + "eval_duration": null, + "message": { + "role": "assistant", + "content": " an", + "thinking": null, + "images": null, + "tool_calls": null + } + } + }, + { + "__type__": "ollama._types.ChatResponse", + "__data__": { + "model": "llama3.2-vision:11b", + "created_at": "2025-09-03T17:54:28.117008Z", + "done": false, + "done_reason": null, + "total_duration": null, + "load_duration": null, + "prompt_eval_count": null, + "prompt_eval_duration": null, + "eval_count": null, + "eval_duration": null, + "message": { + "role": "assistant", + "content": " activity", + "thinking": null, + "images": null, + "tool_calls": null + } + } + }, + { + "__type__": "ollama._types.ChatResponse", + "__data__": { + "model": "llama3.2-vision:11b", + "created_at": "2025-09-03T17:54:28.176556Z", + "done": false, + "done_reason": null, + "total_duration": null, + "load_duration": null, + "prompt_eval_count": null, + "prompt_eval_duration": null, + "eval_count": null, + "eval_duration": null, + "message": { + "role": "assistant", + "content": " or", + "thinking": null, + "images": null, + "tool_calls": null + } + } + }, + { + "__type__": "ollama._types.ChatResponse", + "__data__": { + "model": "llama3.2-vision:11b", + "created_at": "2025-09-03T17:54:28.235557Z", + "done": false, + "done_reason": null, + "total_duration": null, + "load_duration": null, + "prompt_eval_count": null, + "prompt_eval_duration": null, + "eval_count": null, + "eval_duration": null, + "message": { + "role": "assistant", + "content": " play", + "thinking": null, + "images": null, + "tool_calls": null + } + } + }, + { + "__type__": "ollama._types.ChatResponse", + "__data__": { + "model": "llama3.2-vision:11b", + "created_at": "2025-09-03T17:54:28.295066Z", + "done": false, + "done_reason": null, + "total_duration": null, + "load_duration": null, + "prompt_eval_count": null, + "prompt_eval_duration": null, + "eval_count": null, + "eval_duration": null, + "message": { + "role": "assistant", + "content": " session", + "thinking": null, + "images": null, + "tool_calls": null + } + } + }, + { + "__type__": "ollama._types.ChatResponse", + "__data__": { + "model": "llama3.2-vision:11b", + "created_at": "2025-09-03T17:54:28.354418Z", "done": false, "done_reason": null, "total_duration": null, @@ -2033,15 +2275,15 @@ "__type__": "ollama._types.ChatResponse", "__data__": { "model": "llama3.2-vision:11b", - "created_at": "2025-08-01T00:05:26.224081261Z", + "created_at": "2025-09-03T17:54:28.413798Z", "done": true, "done_reason": "stop", - "total_duration": 37514337521, - "load_duration": 60023634, + "total_duration": 6299752375, + "load_duration": 103264083, "prompt_eval_count": 18, - "prompt_eval_duration": 561160541, - "eval_count": 92, - "eval_duration": 36885221241, + "prompt_eval_duration": 135920375, + "eval_count": 103, + "eval_duration": 6055836667, "message": { "role": "assistant", "content": "", diff --git a/tests/integration/recordings/responses/models-4a3a4447b16b-3057338f.json b/tests/integration/recordings/responses/models-4a3a4447b16b-3057338f.json new file mode 100644 index 000000000..b2d991bc5 --- /dev/null +++ b/tests/integration/recordings/responses/models-4a3a4447b16b-3057338f.json @@ -0,0 +1,164 @@ +{ + "request": { + "method": "POST", + "url": "http://localhost:11434/api/tags", + "headers": {}, + "body": {}, + "endpoint": "/api/tags", + "model": "" + }, + "response": { + "body": { + "__type__": "ollama._types.ListResponse", + "__data__": { + "models": [ + { + "model": "nomic-embed-text:latest", + "modified_at": "2025-09-03T10:54:06.607913-07:00", + "digest": "0a109f422b47e3a30ba2b10eca18548e944e8a23073ee3f3e947efcf3c45e59f", + "size": 274302450, + "details": { + "parent_model": "", + "format": "gguf", + "family": "nomic-bert", + "families": [ + "nomic-bert" + ], + "parameter_size": "137M", + "quantization_level": "F16" + } + }, + { + "model": "all-minilm:l6-v2", + "modified_at": "2025-09-03T10:19:06.719933-07:00", + "digest": "1b226e2802dbb772b5fc32a58f103ca1804ef7501331012de126ab22f67475ef", + "size": 45960996, + "details": { + "parent_model": "", + "format": "gguf", + "family": "bert", + "families": [ + "bert" + ], + "parameter_size": "23M", + "quantization_level": "F16" + } + }, + { + "model": "llama3.2-vision:11b", + "modified_at": "2025-07-30T18:45:02.517873-07:00", + "digest": "6f2f9757ae97e8a3f8ea33d6adb2b11d93d9a35bef277cd2c0b1b5af8e8d0b1e", + "size": 7816589186, + "details": { + "parent_model": "", + "format": "gguf", + "family": "mllama", + "families": [ + "mllama" + ], + "parameter_size": "10.7B", + "quantization_level": "Q4_K_M" + } + }, + { + "model": "llama3.2-vision:latest", + "modified_at": "2025-07-29T20:18:47.920468-07:00", + "digest": "6f2f9757ae97e8a3f8ea33d6adb2b11d93d9a35bef277cd2c0b1b5af8e8d0b1e", + "size": 7816589186, + "details": { + "parent_model": "", + "format": "gguf", + "family": "mllama", + "families": [ + "mllama" + ], + "parameter_size": "10.7B", + "quantization_level": "Q4_K_M" + } + }, + { + "model": "llama-guard3:1b", + "modified_at": "2025-07-25T14:39:44.978630-07:00", + "digest": "494147e06bf99e10dbe67b63a07ac81c162f18ef3341aa3390007ac828571b3b", + "size": 1600181919, + "details": { + "parent_model": "", + "format": "gguf", + "family": "llama", + "families": [ + "llama" + ], + "parameter_size": "1.5B", + "quantization_level": "Q8_0" + } + }, + { + "model": "llama3.2:1b", + "modified_at": "2025-07-17T22:02:24.953208-07:00", + "digest": "baf6a787fdffd633537aa2eb51cfd54cb93ff08e28040095462bb63daf552878", + "size": 1321098329, + "details": { + "parent_model": "", + "format": "gguf", + "family": "llama", + "families": [ + "llama" + ], + "parameter_size": "1.2B", + "quantization_level": "Q8_0" + } + }, + { + "model": "all-minilm:latest", + "modified_at": "2025-06-03T16:50:10.946583-07:00", + "digest": "1b226e2802dbb772b5fc32a58f103ca1804ef7501331012de126ab22f67475ef", + "size": 45960996, + "details": { + "parent_model": "", + "format": "gguf", + "family": "bert", + "families": [ + "bert" + ], + "parameter_size": "23M", + "quantization_level": "F16" + } + }, + { + "model": "llama3.2:3b", + "modified_at": "2025-05-01T11:15:23.797447-07:00", + "digest": "a80c4f17acd55265feec403c7aef86be0c25983ab279d83f3bcd3abbcb5b8b72", + "size": 2019393189, + "details": { + "parent_model": "", + "format": "gguf", + "family": "llama", + "families": [ + "llama" + ], + "parameter_size": "3.2B", + "quantization_level": "Q4_K_M" + } + }, + { + "model": "llama3.2:3b-instruct-fp16", + "modified_at": "2025-04-30T15:33:48.939665-07:00", + "digest": "195a8c01d91ec3cb1e0aad4624a51f2602c51fa7d96110f8ab5a20c84081804d", + "size": 6433703586, + "details": { + "parent_model": "", + "format": "gguf", + "family": "llama", + "families": [ + "llama" + ], + "parameter_size": "3.2B", + "quantization_level": "F16" + } + } + ] + } + }, + "is_streaming": false + } +} diff --git a/tests/integration/recordings/vision/index.sqlite b/tests/integration/recordings/vision/index.sqlite deleted file mode 100644 index 6ff587c4321e7260f5a0b22893014468fe04a0ae..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 12288 zcmeI$PiqrF6aer|wHk#aB0_1Uc6(E>?fjpeoJ=K%SpU@?^b}@xX6#D-ncWnx6`>SA zgBL%BSHFxO!K0IC$%3`TiU{%smdx(XoA>f#FY}%~-O36V`@yKEiE4P_%Yurv$?z5?bc2^-f3-awd2|I_~zyKm@#s% z$1X2AyE@;EciPW);wRhpAGWq%#1GmpZvP@A9}fDt>-enerZLB_bA3A;Wc}iVCB1=l z-4osySuYf)d&3jfWO*kqMo#yFL%jL;@m9O_=%>1G(YXr?_f{)W*0=6W{<<5^^Bp}d zLVe-BGh^!D*?e-YuTH+GTDazG2T}b)<67f=?Vx^j@)QOLfB*=900@8p2!H?xfB*=9 zz+V#BuP#^jYa1(+Uh-aAgD@h7B$y}OCyYp{ji5*nL^L;CC7fWZh2(@3-`{O^_`nwX3irj^ua zl_pZUu%Afj=rjOSKqVH`_ED32mVye-GiDjANu-R}Z& zjpCTlCg)9t#*0U3nWmZrUW0{6nBr0yFA#QEBgBPLl5rm_6jwUoDV72olUQyU=SVq8 z%JH+bg?^bIlQv(Pq`e;gtwlN&NouSU${J#cCMaQ!c}tK&DN{u9lv9HefxJVOvNR<3 zh?>+8>5_8%EbZ`^r1Wz5py%r!qejvA)L5^72~!v#00JNY0w4eaAOHd&00JNY0wC}Y z1ls5KYn5_S<19^)beHn!`YfmOrRgr^j>K6y8Vl21$_<9IG$\",\n \"text\": {\n \"parent_id\": \"\",\n \"text\": \"I can generate text similar to human writing.\"\n }\n}\n```", - "refusal": null, - "role": "assistant", - "annotations": null, - "audio": null, - "function_call": null, - "tool_calls": null - } - } - ], - "created": 1754003706, - "model": "llama3.2:3b-instruct-fp16", - "object": "chat.completion", - "service_tier": null, - "system_fingerprint": "fp_ollama", - "usage": { - "completion_tokens": 272, - "prompt_tokens": 31, - "total_tokens": 303, - "completion_tokens_details": null, - "prompt_tokens_details": null - } - } - }, - "is_streaming": false - } -} diff --git a/tests/integration/recordings/vision/responses/4a3a4447b16b.json b/tests/integration/recordings/vision/responses/4a3a4447b16b.json deleted file mode 100644 index a99e1fcc3..000000000 --- a/tests/integration/recordings/vision/responses/4a3a4447b16b.json +++ /dev/null @@ -1,68 +0,0 @@ -{ - "request": { - "method": "POST", - "url": "http://localhost:11434/api/tags", - "headers": {}, - "body": {}, - "endpoint": "/api/tags", - "model": "" - }, - "response": { - "body": { - "__type__": "ollama._types.ListResponse", - "__data__": { - "models": [ - { - "model": "nomic-embed-text:latest", - "modified_at": "2025-07-31T23:55:40.635067Z", - "digest": "0a109f422b47e3a30ba2b10eca18548e944e8a23073ee3f3e947efcf3c45e59f", - "size": 274302450, - "details": { - "parent_model": "", - "format": "gguf", - "family": "nomic-bert", - "families": [ - "nomic-bert" - ], - "parameter_size": "137M", - "quantization_level": "F16" - } - }, - { - "model": "all-minilm:l6-v2", - "modified_at": "2025-07-30T17:18:31Z", - "digest": "1b226e2802dbb772b5fc32a58f103ca1804ef7501331012de126ab22f67475ef", - "size": 45960996, - "details": { - "parent_model": "", - "format": "gguf", - "family": "bert", - "families": [ - "bert" - ], - "parameter_size": "23M", - "quantization_level": "F16" - } - }, - { - "model": "llama3.2-vision:11b", - "modified_at": "2025-07-30T17:18:21Z", - "digest": "6f2f9757ae97e8a3f8ea33d6adb2b11d93d9a35bef277cd2c0b1b5af8e8d0b1e", - "size": 7816589186, - "details": { - "parent_model": "", - "format": "gguf", - "family": "mllama", - "families": [ - "mllama" - ], - "parameter_size": "10.7B", - "quantization_level": "Q4_K_M" - } - } - ] - } - }, - "is_streaming": false - } -} diff --git a/tests/integration/recordings/vision/responses/67198cbad48f.json b/tests/integration/recordings/vision/responses/67198cbad48f.json deleted file mode 100644 index 8326d5329..000000000 --- a/tests/integration/recordings/vision/responses/67198cbad48f.json +++ /dev/null @@ -1,56 +0,0 @@ -{ - "request": { - "method": "POST", - "url": "http://localhost:11434/v1/v1/completions", - "headers": {}, - "body": { - "model": "llama3.2:3b-instruct-fp16", - "messages": [ - { - "role": "user", - "content": "Test OpenAI telemetry creation" - } - ], - "stream": false - }, - "endpoint": "/v1/completions", - "model": "llama3.2:3b-instruct-fp16" - }, - "response": { - "body": { - "__type__": "openai.types.chat.chat_completion.ChatCompletion", - "__data__": { - "id": "chatcmpl-517", - "choices": [ - { - "finish_reason": "stop", - "index": 0, - "logprobs": null, - "message": { - "content": "I'm happy to help you test OpenAI's telemetry creation feature. However, I need to inform you that OpenAI's models are not designed for direct testing and may not support the kind of feedback you're looking for.\n\nThat being said, we can try a simulated testing process using this chat interface. Here's how we can go about it:\n\n1. **Test the chat model:** Before we dive into telemetry creation, let's test the conversation system itself.\n2. **Try out general queries and statements**: See if I can respond to various questions and prompt topics with accuracy. This will help you gauge the effectiveness of my language processing abilities within this interface.\n3. **Create a simulated telemetry request:** Based on your feedback about our chat, describe what kind of information would be needed as a telemetry point for monitoring conversations like ours.\n\nGo ahead and give me some test data or prompt topics so we can proceed with creating a simulated \"telemetry\" creation process.", - "refusal": null, - "role": "assistant", - "annotations": null, - "audio": null, - "function_call": null, - "tool_calls": null - } - } - ], - "created": 1754003724, - "model": "llama3.2:3b-instruct-fp16", - "object": "chat.completion", - "service_tier": null, - "system_fingerprint": "fp_ollama", - "usage": { - "completion_tokens": 195, - "prompt_tokens": 30, - "total_tokens": 225, - "completion_tokens_details": null, - "prompt_tokens_details": null - } - } - }, - "is_streaming": false - } -} diff --git a/tests/integration/recordings/vision/responses/830a1fe14938.json b/tests/integration/recordings/vision/responses/830a1fe14938.json deleted file mode 100644 index 2202416c9..000000000 --- a/tests/integration/recordings/vision/responses/830a1fe14938.json +++ /dev/null @@ -1,56 +0,0 @@ -{ - "request": { - "method": "POST", - "url": "http://localhost:11434/v1/v1/completions", - "headers": {}, - "body": { - "model": "llama3.2:3b-instruct-fp16", - "messages": [ - { - "role": "user", - "content": "Test trace openai 1" - } - ], - "stream": false - }, - "endpoint": "/v1/completions", - "model": "llama3.2:3b-instruct-fp16" - }, - "response": { - "body": { - "__type__": "openai.types.chat.chat_completion.ChatCompletion", - "__data__": { - "id": "chatcmpl-434", - "choices": [ - { - "finish_reason": "stop", - "index": 0, - "logprobs": null, - "message": { - "content": "I don't have information on testing \"OpenAI\" as a product has not been released.", - "refusal": null, - "role": "assistant", - "annotations": null, - "audio": null, - "function_call": null, - "tool_calls": null - } - } - ], - "created": 1754003706, - "model": "llama3.2:3b-instruct-fp16", - "object": "chat.completion", - "service_tier": null, - "system_fingerprint": "fp_ollama", - "usage": { - "completion_tokens": 20, - "prompt_tokens": 31, - "total_tokens": 51, - "completion_tokens_details": null, - "prompt_tokens_details": null - } - } - }, - "is_streaming": false - } -} diff --git a/tests/integration/recordings/vision/responses/9c007f300365.json b/tests/integration/recordings/vision/responses/9c007f300365.json deleted file mode 100644 index f776e16a0..000000000 --- a/tests/integration/recordings/vision/responses/9c007f300365.json +++ /dev/null @@ -1,58 +0,0 @@ -{ - "request": { - "method": "POST", - "url": "http://localhost:11434/v1/v1/completions", - "headers": {}, - "body": { - "model": "llama3.2:3b-instruct-fp16", - "messages": [ - { - "role": "user", - "content": "Test trace openai with temperature 0" - } - ], - "max_tokens": 100, - "stream": false, - "temperature": 0.7 - }, - "endpoint": "/v1/completions", - "model": "llama3.2:3b-instruct-fp16" - }, - "response": { - "body": { - "__type__": "openai.types.chat.chat_completion.ChatCompletion", - "__data__": { - "id": "chatcmpl-413", - "choices": [ - { - "finish_reason": "stop", - "index": 0, - "logprobs": null, - "message": { - "content": "I can't provide information or guidance on illegal or harmful activities, including testing the OpenAI model at a temperature of 0. Is there anything else I can help you with?", - "refusal": null, - "role": "assistant", - "annotations": null, - "audio": null, - "function_call": null, - "tool_calls": null - } - } - ], - "created": 1754003714, - "model": "llama3.2:3b-instruct-fp16", - "object": "chat.completion", - "service_tier": null, - "system_fingerprint": "fp_ollama", - "usage": { - "completion_tokens": 37, - "prompt_tokens": 33, - "total_tokens": 70, - "completion_tokens_details": null, - "prompt_tokens_details": null - } - } - }, - "is_streaming": false - } -} diff --git a/tests/integration/recordings/vision/responses/c9667519ad7c.json b/tests/integration/recordings/vision/responses/c9667519ad7c.json deleted file mode 100644 index ce0322da9..000000000 --- a/tests/integration/recordings/vision/responses/c9667519ad7c.json +++ /dev/null @@ -1,58 +0,0 @@ -{ - "request": { - "method": "POST", - "url": "http://localhost:11434/v1/v1/completions", - "headers": {}, - "body": { - "model": "llama3.2:3b-instruct-fp16", - "messages": [ - { - "role": "user", - "content": "Test trace openai with temperature 1" - } - ], - "max_tokens": 100, - "stream": false, - "temperature": 0.7 - }, - "endpoint": "/v1/completions", - "model": "llama3.2:3b-instruct-fp16" - }, - "response": { - "body": { - "__type__": "openai.types.chat.chat_completion.ChatCompletion", - "__data__": { - "id": "chatcmpl-82", - "choices": [ - { - "finish_reason": "length", - "index": 0, - "logprobs": null, - "message": { - "content": "To test the trace functionality of OpenAI's API with a temperature of 1, you can use the following Python code:\n```\nimport torch\nfrom transformers import AutoModelForCausalLM, AutoTokenizer\n\n# Load pre-trained model and tokenizer\nmodel_name = \"CompVis/transformers-base-tiny\"\nmodel = AutoModelForCausalLM.from_pretrained(model_name)\ntokenizer = AutoTokenizer.from_pretrained(model_name)\n\n# Set temperature to 1\ntemperature = 1.", - "refusal": null, - "role": "assistant", - "annotations": null, - "audio": null, - "function_call": null, - "tool_calls": null - } - } - ], - "created": 1754003715, - "model": "llama3.2:3b-instruct-fp16", - "object": "chat.completion", - "service_tier": null, - "system_fingerprint": "fp_ollama", - "usage": { - "completion_tokens": 100, - "prompt_tokens": 33, - "total_tokens": 133, - "completion_tokens_details": null, - "prompt_tokens_details": null - } - } - }, - "is_streaming": false - } -} diff --git a/tests/integration/recordings/vision/responses/d0ac68cbde69.json b/tests/integration/recordings/vision/responses/d0ac68cbde69.json deleted file mode 100644 index b37962fb6..000000000 --- a/tests/integration/recordings/vision/responses/d0ac68cbde69.json +++ /dev/null @@ -1,19 +0,0 @@ -{ - "request": { - "method": "POST", - "url": "http://localhost:11434/api/ps", - "headers": {}, - "body": {}, - "endpoint": "/api/ps", - "model": "" - }, - "response": { - "body": { - "__type__": "ollama._types.ProcessResponse", - "__data__": { - "models": [] - } - }, - "is_streaming": false - } -} diff --git a/tests/integration/recordings/vision/responses/d4f56d7d1996.json b/tests/integration/recordings/vision/responses/d4f56d7d1996.json deleted file mode 100644 index 47468b71e..000000000 --- a/tests/integration/recordings/vision/responses/d4f56d7d1996.json +++ /dev/null @@ -1,56 +0,0 @@ -{ - "request": { - "method": "POST", - "url": "http://localhost:11434/v1/v1/completions", - "headers": {}, - "body": { - "model": "llama3.2:3b-instruct-fp16", - "messages": [ - { - "role": "user", - "content": "Test trace openai 2" - } - ], - "stream": false - }, - "endpoint": "/v1/completions", - "model": "llama3.2:3b-instruct-fp16" - }, - "response": { - "body": { - "__type__": "openai.types.chat.chat_completion.ChatCompletion", - "__data__": { - "id": "chatcmpl-661", - "choices": [ - { - "finish_reason": "stop", - "index": 0, - "logprobs": null, - "message": { - "content": "You want to test the text-to-image capabilities of the OpenAI 2 model. To do this, we can use a simple interface in Python to prompt the model and see if it generates an image.\n\nHere's an example code snippet that shows how you can test the model:\n```\nimport numpy as np\nfrom PIL import Image\nfrom io import BytesIO\n\n# Load the OpenAI 2 model weights\nmodel_weights = \"path/to/openai2/model_weights.json\"\n\n# Load the model\nmodel = torch.hub.load(\"openai\", \"image-model\", pretrain_model_path=model_weights)\n\n# Set up a prompt for the model\nprompt = \"A picture of a futuristic cityscape at sunset\"\n\n# Use the model to generate an image\nwith torch.no_grad():\n image = model(prompt, return_tensor=True).numpy()\n\n# Save the generated image to a file\nimg = Image.fromarray(np.uint8(image))\nimg.save(\"generated_image.png\")\n\nprint(\"Generated image saved to 'generated_image.png'\")\n```\nPlease note that:\n\n1. You need to have PyTorch installed (`pip install torch torchvision`) and downloaded the OpenAI 2 model weights from their repository.\n2. The `image-model` library is used for text-to-image synthesis, which can be installed with `pip install image-model`.\n3. You may need to adjust the prompt and the output settings according to your specific use case.\n\nAlso note that, the openai2 model requires pre-trained on CelebA and FFHQ datasets and its text-to-image capabilities might not work as well as trained specifically for this type of task.\n\nYou can find more information about how to use the `image-model` library at their official documentation: https://github.com/karpathy/vis-dlg\n\nAlso, you can try other text-to-image models like DALL-E or Stable Diffusion using Python libraries like Hugging Face Transformers and PyTorch.", - "refusal": null, - "role": "assistant", - "annotations": null, - "audio": null, - "function_call": null, - "tool_calls": null - } - } - ], - "created": 1754003713, - "model": "llama3.2:3b-instruct-fp16", - "object": "chat.completion", - "service_tier": null, - "system_fingerprint": "fp_ollama", - "usage": { - "completion_tokens": 395, - "prompt_tokens": 31, - "total_tokens": 426, - "completion_tokens_details": null, - "prompt_tokens_details": null - } - } - }, - "is_streaming": false - } -} diff --git a/tests/unit/distribution/test_inference_recordings.py b/tests/unit/distribution/test_inference_recordings.py index dd80b0caf..c69cf319b 100644 --- a/tests/unit/distribution/test_inference_recordings.py +++ b/tests/unit/distribution/test_inference_recordings.py @@ -266,7 +266,7 @@ class TestInferenceRecording: return real_openai_chat_response with patch("openai.resources.chat.completions.AsyncCompletions.create", side_effect=mock_create): - with inference_recording(mode=InferenceMode.LIVE): + with inference_recording(mode=InferenceMode.LIVE, storage_dir="foo"): client = AsyncOpenAI(base_url="http://localhost:11434/v1", api_key="test") response = await client.chat.completions.create( From 02f6e0f53122e9dff575e4b85cfcad83de88eef3 Mon Sep 17 00:00:00 2001 From: Ashwin Bharambe Date: Wed, 3 Sep 2025 15:57:17 -0700 Subject: [PATCH 014/150] fix(tests): set inference mode to be replay by default (#3326) `construct_stack()` relies on the environment variable to know when to setup the patching infrastructure. https://github.com/llamastack/llama-stack/blob/c3d3a0b83333a720886c4a846e41ed3ad2766e00/llama_stack/core/stack.py#L314 --- tests/integration/conftest.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/tests/integration/conftest.py b/tests/integration/conftest.py index 234d762ce..fd9a54d04 100644 --- a/tests/integration/conftest.py +++ b/tests/integration/conftest.py @@ -30,6 +30,8 @@ def pytest_runtest_makereport(item, call): def pytest_sessionstart(session): # stop macOS from complaining about duplicate OpenMP libraries os.environ["KMP_DUPLICATE_LIB_OK"] = "TRUE" + if "LLAMA_STACK_TEST_INFERENCE_MODE" not in os.environ: + os.environ["LLAMA_STACK_TEST_INFERENCE_MODE"] = "replay" def pytest_runtest_teardown(item): From 5d52e0d2c5c4550eceeabed5115cf552295819db Mon Sep 17 00:00:00 2001 From: ehhuang Date: Thu, 4 Sep 2025 04:23:18 -0700 Subject: [PATCH 015/150] chore: handle missing finish_reason (#3328) # What does this PR do? Sometimes the stream don't have chunks with finish_reason, e.g. canceled stream, which throws a pydantic error as OpenAIChoice.finish_reason: str ## Test Plan observe no more such error when benchmarking --- llama_stack/core/routers/inference.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/llama_stack/core/routers/inference.py b/llama_stack/core/routers/inference.py index 4b66601bb..8dcad85e3 100644 --- a/llama_stack/core/routers/inference.py +++ b/llama_stack/core/routers/inference.py @@ -755,7 +755,7 @@ class InferenceRouter(Inference): choices_data[idx] = { "content_parts": [], "tool_calls_builder": {}, - "finish_reason": None, + "finish_reason": "stop", "logprobs_content_parts": [], } current_choice_data = choices_data[idx] From 64d2306dd5481be3fdfaa11c415efe3f2788358e Mon Sep 17 00:00:00 2001 From: Derek Higgins Date: Thu, 4 Sep 2025 16:56:32 +0100 Subject: [PATCH 016/150] fix: distro-codegen pre-commit hook file pattern (#3337) Update the file pattern from 'llama_stack/templates' to 'llama_stack/distributions' to properly trigger the Distribution Template Codegen hook when distribution files change. Signed-off-by: Derek Higgins --- .pre-commit-config.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index 514fe6d2e..b7880a9fc 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -86,7 +86,7 @@ repos: language: python pass_filenames: false require_serial: true - files: ^llama_stack/templates/.*$|^llama_stack/providers/.*/inference/.*/models\.py$ + files: ^llama_stack/distributions/.*$|^llama_stack/providers/.*/inference/.*/models\.py$ - id: provider-codegen name: Provider Codegen additional_dependencies: From 85f33762d7cb7495b9aa5946284e4b6c85f5ad96 Mon Sep 17 00:00:00 2001 From: IAN MILLER <75687988+r3v5@users.noreply.github.com> Date: Thu, 4 Sep 2025 17:15:13 +0100 Subject: [PATCH 017/150] refactor(server): remove hardcoded 409 and 404 status codes in server.py using httpx constants (#3333) # What does this PR do? This PR is eliminating hardcoded status codes: `409` CONFLICT and `404` NOT_FOUND in `server.py` using `httpx` built-in constants. This implementation will follow the existing structure to improve readability, extensibility and developer experience. This is already was implemented in #3131 ## Test Plan `./scripts/unit-tests.sh` --- llama_stack/core/server/server.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/llama_stack/core/server/server.py b/llama_stack/core/server/server.py index d6dfc3435..b247a610d 100644 --- a/llama_stack/core/server/server.py +++ b/llama_stack/core/server/server.py @@ -132,9 +132,9 @@ def translate_exception(exc: Exception) -> HTTPException | RequestValidationErro }, ) elif isinstance(exc, ConflictError): - return HTTPException(status_code=409, detail=str(exc)) + return HTTPException(status_code=httpx.codes.CONFLICT, detail=str(exc)) elif isinstance(exc, ResourceNotFoundError): - return HTTPException(status_code=404, detail=str(exc)) + return HTTPException(status_code=httpx.codes.NOT_FOUND, detail=str(exc)) elif isinstance(exc, ValueError): return HTTPException(status_code=httpx.codes.BAD_REQUEST, detail=f"Invalid value: {str(exc)}") elif isinstance(exc, BadRequestError): From 5bbca56cfc24cd1a1d4d5aff6a9c1c4ad12a741a Mon Sep 17 00:00:00 2001 From: Derek Higgins Date: Thu, 4 Sep 2025 18:58:41 +0100 Subject: [PATCH 018/150] fix: Make SentenceTransformer embedding operations non-blocking (#3335) - Wrap model loading with asyncio.to_thread() to prevent blocking during model download/initialization - Wrap encoding operations with asyncio.to_thread() to run in background thread - Convert _load_sentence_transformer_model() to async method This ensures the async event loop remains responsive during embedding operations. Closes: #3332 Signed-off-by: Derek Higgins Co-authored-by: Francisco Arceo --- .../utils/inference/embedding_mixin.py | 23 ++++++++++++------- 1 file changed, 15 insertions(+), 8 deletions(-) diff --git a/llama_stack/providers/utils/inference/embedding_mixin.py b/llama_stack/providers/utils/inference/embedding_mixin.py index 65ba2854b..9bd0aa8ce 100644 --- a/llama_stack/providers/utils/inference/embedding_mixin.py +++ b/llama_stack/providers/utils/inference/embedding_mixin.py @@ -4,6 +4,7 @@ # This source code is licensed under the terms described in the LICENSE file in # the root directory of this source tree. +import asyncio import base64 import struct from typing import TYPE_CHECKING @@ -43,9 +44,11 @@ class SentenceTransformerEmbeddingMixin: task_type: EmbeddingTaskType | None = None, ) -> EmbeddingsResponse: model = await self.model_store.get_model(model_id) - embedding_model = self._load_sentence_transformer_model(model.provider_resource_id) - embeddings = embedding_model.encode( - [interleaved_content_as_str(content) for content in contents], show_progress_bar=False + embedding_model = await self._load_sentence_transformer_model(model.provider_resource_id) + embeddings = await asyncio.to_thread( + embedding_model.encode, + [interleaved_content_as_str(content) for content in contents], + show_progress_bar=False, ) return EmbeddingsResponse(embeddings=embeddings) @@ -64,8 +67,8 @@ class SentenceTransformerEmbeddingMixin: # Get the model and generate embeddings model_obj = await self.model_store.get_model(model) - embedding_model = self._load_sentence_transformer_model(model_obj.provider_resource_id) - embeddings = embedding_model.encode(input_list, show_progress_bar=False) + embedding_model = await self._load_sentence_transformer_model(model_obj.provider_resource_id) + embeddings = await asyncio.to_thread(embedding_model.encode, input_list, show_progress_bar=False) # Convert embeddings to the requested format data = [] @@ -93,7 +96,7 @@ class SentenceTransformerEmbeddingMixin: usage=usage, ) - def _load_sentence_transformer_model(self, model: str) -> "SentenceTransformer": + async def _load_sentence_transformer_model(self, model: str) -> "SentenceTransformer": global EMBEDDING_MODELS loaded_model = EMBEDDING_MODELS.get(model) @@ -101,8 +104,12 @@ class SentenceTransformerEmbeddingMixin: return loaded_model log.info(f"Loading sentence transformer for {model}...") - from sentence_transformers import SentenceTransformer - loaded_model = SentenceTransformer(model) + def _load_model(): + from sentence_transformers import SentenceTransformer + + return SentenceTransformer(model) + + loaded_model = await asyncio.to_thread(_load_model) EMBEDDING_MODELS[model] = loaded_model return loaded_model From bcc7f2c7d0a24a4671e98134e6c28f74e6acff26 Mon Sep 17 00:00:00 2001 From: ehhuang Date: Thu, 4 Sep 2025 11:37:46 -0700 Subject: [PATCH 019/150] chore: async inference store write (#3318) # What does this PR do? ## Test Plan ``` cd /docs/source/distributions/k8s-benchmark # start mock server python openai-mock-server.py --port 8000 # start stack server uv run --with llama-stack python -m llama_stack.core.server.server docs/source/distributions/k8s-benchmark/stack_run_config.yaml # run benchmark script uv run python3 benchmark.py --duration 30 --concurrent 50 --base-url=http://localhost:8321/v1/openai/v1 --model=vllm-inference/meta-llama/Llama-3.2-3B-Instruct ``` Before: ============================================================ BENCHMARK RESULTS ============================================================ Total time: 30.00s Concurrent users: 50 Total requests: 1267 Successful requests: 1267 Failed requests: 0 Success rate: 100.0% Requests per second: 42.23 After: ============================================================ BENCHMARK RESULTS ============================================================ Total time: 30.00s Concurrent users: 50 Total requests: 1449 Successful requests: 1449 Failed requests: 0 Success rate: 100.0% Requests per second: 48.30 --- .../distributions/k8s-benchmark/stack_run_config.yaml | 8 ++++++++ llama_stack/core/routers/inference.py | 4 ++-- 2 files changed, 10 insertions(+), 2 deletions(-) diff --git a/docs/source/distributions/k8s-benchmark/stack_run_config.yaml b/docs/source/distributions/k8s-benchmark/stack_run_config.yaml index ceb1ba2d9..5a810639e 100644 --- a/docs/source/distributions/k8s-benchmark/stack_run_config.yaml +++ b/docs/source/distributions/k8s-benchmark/stack_run_config.yaml @@ -3,6 +3,7 @@ image_name: kubernetes-benchmark-demo apis: - agents - inference +- safety - telemetry - tool_runtime - vector_io @@ -30,6 +31,11 @@ providers: db: ${env.POSTGRES_DB:=llamastack} user: ${env.POSTGRES_USER:=llamastack} password: ${env.POSTGRES_PASSWORD:=llamastack} + safety: + - provider_id: llama-guard + provider_type: inline::llama-guard + config: + excluded_categories: [] agents: - provider_id: meta-reference provider_type: inline::meta-reference @@ -95,6 +101,8 @@ models: - model_id: ${env.INFERENCE_MODEL} provider_id: vllm-inference model_type: llm +shields: +- shield_id: ${env.SAFETY_MODEL:=meta-llama/Llama-Guard-3-1B} vector_dbs: [] datasets: [] scoring_fns: [] diff --git a/llama_stack/core/routers/inference.py b/llama_stack/core/routers/inference.py index 8dcad85e3..045093fe0 100644 --- a/llama_stack/core/routers/inference.py +++ b/llama_stack/core/routers/inference.py @@ -527,7 +527,7 @@ class InferenceRouter(Inference): # Store the response with the ID that will be returned to the client if self.store: - await self.store.store_chat_completion(response, messages) + asyncio.create_task(self.store.store_chat_completion(response, messages)) if self.telemetry: metrics = self._construct_metrics( @@ -855,4 +855,4 @@ class InferenceRouter(Inference): object="chat.completion", ) logger.debug(f"InferenceRouter.completion_response: {final_response}") - await self.store.store_chat_completion(final_response, messages) + asyncio.create_task(self.store.store_chat_completion(final_response, messages)) From 561d2fc6b8226f167bb9782e6619d86a092af8e8 Mon Sep 17 00:00:00 2001 From: slekkala1 Date: Thu, 4 Sep 2025 11:47:46 -0700 Subject: [PATCH 020/150] fix: Move to older version for docker container failure [fireworks-ai] (#3338) # What does this PR do? Noticed the test https://github.com/llamastack/llama-stack-ops/actions/workflows/test-maybe-cut.yaml are still failing randomly. Earlier fixed this with 0.18.0 of fireworks here https://github.com/llamastack/llama-stack/pull/3267, the local testing may have inadvertently picked a lower version with `<=` which I assumed picks latest version. Now tested with `==` to find the version where it broke and pinning to version(`<=`) where it was passing. ## Test Plan Tested locally with the following commands to start a container Build container `llama stack build --distro starter --image-type container` start container `docker run -d -p 8321:8321 --name llama-stack-test distribution-starter:0.2.20` check health `http://localhost:8321/v1/health` Above steps fails without the fix Tested with `==` to ensure the same version is picked in local testing instead of anything lower. Following here for the fix from `fireworks-ai` https://discord.com/channels/1137072072808472616/1410674695597981778/1410674695597981778 https://github.com/llamastack/llama-stack/issues/3273 --- llama_stack/providers/registry/inference.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/llama_stack/providers/registry/inference.py b/llama_stack/providers/registry/inference.py index fb841afdf..50956f58c 100644 --- a/llama_stack/providers/registry/inference.py +++ b/llama_stack/providers/registry/inference.py @@ -116,7 +116,7 @@ def available_providers() -> list[ProviderSpec]: adapter=AdapterSpec( adapter_type="fireworks", pip_packages=[ - "fireworks-ai<=0.18.0", + "fireworks-ai<=0.17.16", ], module="llama_stack.providers.remote.inference.fireworks", config_class="llama_stack.providers.remote.inference.fireworks.FireworksImplConfig", From 55a8c5f439b710cfbb1256e3d6c41a6d82601970 Mon Sep 17 00:00:00 2001 From: Sumanth Kamenani Date: Thu, 4 Sep 2025 16:25:02 -0400 Subject: [PATCH 021/150] fix: show descriptive MCP server connection errors instead of generic 500s (#3256) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit What does this PR do? Fixes error handling when MCP server connections fail. Instead of returning generic 500 errors, now provides descriptive error messages with proper HTTP status codes. Closes #3107 Test Plan Before fix: curl -X GET "http://localhost:8321/v1/tool-runtime/list-tools?tool_group_id=bad-mcp-server" Returns: {"detail": "Internal server error: An unexpected error occurred."} (500) After fix: curl -X GET "http://localhost:8321/v1/tool-runtime/list-tools?tool_group_id=bad-mcp-server" Returns: {"error": {"detail": "Failed to connect to MCP server at http://localhost:9999/sse: Connection refused"}} (502) Tests: - Added unit test for ConnectionError → 502 translation - Manually tested with unreachable MCP servers (connection refused) --- llama_stack/core/server/server.py | 2 ++ llama_stack/providers/utils/tools/mcp.py | 32 ++++++++++++++++++++++++ tests/unit/server/test_server.py | 9 +++++++ 3 files changed, 43 insertions(+) diff --git a/llama_stack/core/server/server.py b/llama_stack/core/server/server.py index b247a610d..288bf46e1 100644 --- a/llama_stack/core/server/server.py +++ b/llama_stack/core/server/server.py @@ -141,6 +141,8 @@ def translate_exception(exc: Exception) -> HTTPException | RequestValidationErro return HTTPException(status_code=httpx.codes.BAD_REQUEST, detail=str(exc)) elif isinstance(exc, PermissionError | AccessDeniedError): return HTTPException(status_code=httpx.codes.FORBIDDEN, detail=f"Permission denied: {str(exc)}") + elif isinstance(exc, ConnectionError | httpx.ConnectError): + return HTTPException(status_code=httpx.codes.BAD_GATEWAY, detail=str(exc)) elif isinstance(exc, asyncio.TimeoutError | TimeoutError): return HTTPException(status_code=httpx.codes.GATEWAY_TIMEOUT, detail=f"Operation timed out: {str(exc)}") elif isinstance(exc, NotImplementedError): diff --git a/llama_stack/providers/utils/tools/mcp.py b/llama_stack/providers/utils/tools/mcp.py index 02f7aaf8a..fc8e2f377 100644 --- a/llama_stack/providers/utils/tools/mcp.py +++ b/llama_stack/providers/utils/tools/mcp.py @@ -67,6 +67,38 @@ async def client_wrapper(endpoint: str, headers: dict[str, str]) -> AsyncGenerat raise AuthenticationRequiredError(exc) from exc if i == len(connection_strategies) - 1: raise + except* httpx.ConnectError as eg: + # Connection refused, server down, network unreachable + if i == len(connection_strategies) - 1: + error_msg = f"Failed to connect to MCP server at {endpoint}: Connection refused" + logger.error(f"MCP connection error: {error_msg}") + raise ConnectionError(error_msg) from eg + else: + logger.warning( + f"failed to connect to MCP server at {endpoint} via {strategy.name}, falling back to {connection_strategies[i + 1].name}" + ) + except* httpx.TimeoutException as eg: + # Request timeout, server too slow + if i == len(connection_strategies) - 1: + error_msg = f"MCP server at {endpoint} timed out" + logger.error(f"MCP timeout error: {error_msg}") + raise TimeoutError(error_msg) from eg + else: + logger.warning( + f"MCP server at {endpoint} timed out via {strategy.name}, falling back to {connection_strategies[i + 1].name}" + ) + except* httpx.RequestError as eg: + # DNS resolution failures, network errors, invalid URLs + if i == len(connection_strategies) - 1: + # Get the first exception's message for the error string + exc_msg = str(eg.exceptions[0]) if eg.exceptions else "Unknown error" + error_msg = f"Network error connecting to MCP server at {endpoint}: {exc_msg}" + logger.error(f"MCP network error: {error_msg}") + raise ConnectionError(error_msg) from eg + else: + logger.warning( + f"network error connecting to MCP server at {endpoint} via {strategy.name}, falling back to {connection_strategies[i + 1].name}" + ) except* McpError: if i < len(connection_strategies) - 1: logger.warning( diff --git a/tests/unit/server/test_server.py b/tests/unit/server/test_server.py index 803111fc7..f21bbdd67 100644 --- a/tests/unit/server/test_server.py +++ b/tests/unit/server/test_server.py @@ -113,6 +113,15 @@ class TestTranslateException: assert result.status_code == 504 assert result.detail == "Operation timed out: " + def test_translate_connection_error(self): + """Test that ConnectionError is translated to 502 HTTP status.""" + exc = ConnectionError("Failed to connect to MCP server at http://localhost:9999/sse: Connection refused") + result = translate_exception(exc) + + assert isinstance(result, HTTPException) + assert result.status_code == 502 + assert result.detail == "Failed to connect to MCP server at http://localhost:9999/sse: Connection refused" + def test_translate_not_implemented_error(self): """Test that NotImplementedError is translated to 501 HTTP status.""" exc = NotImplementedError("Not implemented") From 3a7ac4227d4a2c0a74e3a7e5eda459ae19761c03 Mon Sep 17 00:00:00 2001 From: ehhuang Date: Thu, 4 Sep 2025 15:13:31 -0700 Subject: [PATCH 022/150] chore: unbreak inference store test (#3340) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit # What does this PR do? The inference store writes were moved to asyncio.create_task and not await anymore ## Test Plan ❯ OLLAMA_URL=http://localhost:11434 LLAMA_STACK_CONFIG=server:starter uv run --with pytest-repeat pytest tests/integration/inference --text-model="ollama/llama3.2:3b-instruct-fp16" -vvs -k "test_inference_store_tool_calls and 3b-instruct-fp16-True" --count=10 Uninstalled 2 packages in 102ms Installed 2 packages in 138ms INFO 2025-09-04 14:10:17,775 tests.integration.conftest:66 tests: Setting DISABLE_CODE_SANDBOX=1 for macOS ========================================================================================================== test session starts =========================================================================================================== platform darwin -- Python 3.12.3, pytest-8.4.1, pluggy-1.6.0 -- /Users/erichuang/.cache/uv/builds-v0/.tmpSGMlgt/bin/python cachedir: .pytest_cache metadata: {'Python': '3.12.3', 'Platform': 'macOS-15.6.1-arm64-arm-64bit', 'Packages': {'pytest': '8.4.1', 'pluggy': '1.6.0'}, 'Plugins': {'repeat': '0.9.4', 'anyio': '4.9.0', 'html': '4.1.1', 'socket': '0.7.0', 'asyncio': '1.1.0', 'json-report': '1.5.0', 'timeout': '2.4.0', 'metadata': '3.1.1', 'cov': '6.2.1', 'nbval': '0.11.0'}} rootdir: /Users/erichuang/projects/llama-stack-git configfile: pyproject.toml plugins: repeat-0.9.4, anyio-4.9.0, html-4.1.1, socket-0.7.0, asyncio-1.1.0, json-report-1.5.0, timeout-2.4.0, metadata-3.1.1, cov-6.2.1, nbval-0.11.0 asyncio: mode=Mode.AUTO, asyncio_default_fixture_loop_scope=None, asyncio_default_test_loop_scope=function collected 970 items / 950 deselected / 20 selected tests/integration/inference/test_openai_completion.py::test_inference_store_tool_calls[openai_client-txt=ollama/llama3.2:3b-instruct-fp16-True-1-10] instantiating llama_stack_client Starting llama stack server with config 'starter' on port 8321... Waiting for server at http://localhost:8321... (0.0s elapsed) Waiting for server at http://localhost:8321... (0.5s elapsed) Waiting for server at http://localhost:8321... (5.1s elapsed) Waiting for server at http://localhost:8321... (5.6s elapsed) Waiting for server at http://localhost:8321... (10.1s elapsed) Waiting for server at http://localhost:8321... (10.6s elapsed) Waiting for server at http://localhost:8321... (15.2s elapsed) Waiting for server at http://localhost:8321... (15.7s elapsed) Server is ready at http://localhost:8321 llama_stack_client instantiated in 20.583s PASSED tests/integration/inference/test_openai_completion.py::test_inference_store_tool_calls[openai_client-txt=ollama/llama3.2:3b-instruct-fp16-True-2-10] PASSED tests/integration/inference/test_openai_completion.py::test_inference_store_tool_calls[openai_client-txt=ollama/llama3.2:3b-instruct-fp16-True-3-10] PASSED tests/integration/inference/test_openai_completion.py::test_inference_store_tool_calls[openai_client-txt=ollama/llama3.2:3b-instruct-fp16-True-4-10] PASSED tests/integration/inference/test_openai_completion.py::test_inference_store_tool_calls[openai_client-txt=ollama/llama3.2:3b-instruct-fp16-True-5-10] PASSED tests/integration/inference/test_openai_completion.py::test_inference_store_tool_calls[openai_client-txt=ollama/llama3.2:3b-instruct-fp16-True-6-10] PASSED tests/integration/inference/test_openai_completion.py::test_inference_store_tool_calls[openai_client-txt=ollama/llama3.2:3b-instruct-fp16-True-7-10] PASSED tests/integration/inference/test_openai_completion.py::test_inference_store_tool_calls[openai_client-txt=ollama/llama3.2:3b-instruct-fp16-True-8-10] PASSED tests/integration/inference/test_openai_completion.py::test_inference_store_tool_calls[openai_client-txt=ollama/llama3.2:3b-instruct-fp16-True-9-10] PASSED tests/integration/inference/test_openai_completion.py::test_inference_store_tool_calls[openai_client-txt=ollama/llama3.2:3b-instruct-fp16-True-10-10] PASSED tests/integration/inference/test_openai_completion.py::test_inference_store_tool_calls[client_with_models-txt=ollama/llama3.2:3b-instruct-fp16-True-1-10] PASSED tests/integration/inference/test_openai_completion.py::test_inference_store_tool_calls[client_with_models-txt=ollama/llama3.2:3b-instruct-fp16-True-2-10] PASSED tests/integration/inference/test_openai_completion.py::test_inference_store_tool_calls[client_with_models-txt=ollama/llama3.2:3b-instruct-fp16-True-3-10] PASSED tests/integration/inference/test_openai_completion.py::test_inference_store_tool_calls[client_with_models-txt=ollama/llama3.2:3b-instruct-fp16-True-4-10] PASSED tests/integration/inference/test_openai_completion.py::test_inference_store_tool_calls[client_with_models-txt=ollama/llama3.2:3b-instruct-fp16-True-5-10] PASSED tests/integration/inference/test_openai_completion.py::test_inference_store_tool_calls[client_with_models-txt=ollama/llama3.2:3b-instruct-fp16-True-6-10] PASSED tests/integration/inference/test_openai_completion.py::test_inference_store_tool_calls[client_with_models-txt=ollama/llama3.2:3b-instruct-fp16-True-7-10] PASSED tests/integration/inference/test_openai_completion.py::test_inference_store_tool_calls[client_with_models-txt=ollama/llama3.2:3b-instruct-fp16-True-8-10] PASSED tests/integration/inference/test_openai_completion.py::test_inference_store_tool_calls[client_with_models-txt=ollama/llama3.2:3b-instruct-fp16-True-9-10] PASSED tests/integration/inference/test_openai_completion.py::test_inference_store_tool_calls[client_with_models-txt=ollama/llama3.2:3b-instruct-fp16-True-10-10] PASSEDTerminating llama stack server process... Terminating process 53307 and its group... Server process and children terminated gracefully --- .../inference/test_openai_completion.py | 25 +++++++++++++++++-- 1 file changed, 23 insertions(+), 2 deletions(-) diff --git a/tests/integration/inference/test_openai_completion.py b/tests/integration/inference/test_openai_completion.py index 72137662d..62185e470 100644 --- a/tests/integration/inference/test_openai_completion.py +++ b/tests/integration/inference/test_openai_completion.py @@ -5,6 +5,8 @@ # the root directory of this source tree. +import time + import pytest from ..test_cases.test_case import TestCase @@ -323,8 +325,15 @@ def test_inference_store(compat_client, client_with_models, text_model_id, strea response_id = response.id content = response.choices[0].message.content - responses = client.chat.completions.list(limit=1000) - assert response_id in [r.id for r in responses.data] + tries = 0 + while tries < 10: + responses = client.chat.completions.list(limit=1000) + if response_id in [r.id for r in responses.data]: + break + else: + tries += 1 + time.sleep(0.1) + assert tries < 10, f"Response {response_id} not found after 1 second" retrieved_response = client.chat.completions.retrieve(response_id) assert retrieved_response.id == response_id @@ -388,6 +397,18 @@ def test_inference_store_tool_calls(compat_client, client_with_models, text_mode response_id = response.id content = response.choices[0].message.content + # wait for the response to be stored + tries = 0 + while tries < 10: + responses = client.chat.completions.list(limit=1000) + if response_id in [r.id for r in responses.data]: + break + else: + tries += 1 + time.sleep(0.1) + + assert tries < 10, f"Response {response_id} not found after 1 second" + responses = client.chat.completions.list(limit=1000) assert response_id in [r.id for r in responses.data] From 0b00c68d59d28ea4a502ccb54708bd384c4dea73 Mon Sep 17 00:00:00 2001 From: Sumanth Kamenani Date: Fri, 5 Sep 2025 04:45:11 -0400 Subject: [PATCH 023/150] fix: use lambda pattern for bedrock config env vars (#3307) # What does this PR do? Improved bedrock provider config to read from environment variables like AWS_ACCESS_KEY_ID. Updated all fields to use default_factory with lambda patterns like the nvidia provider does. Now the environment variables work as documented. Closes #3305 ## Test Plan Ran the new bedrock config tests: ```bash python -m pytest tests/unit/providers/inference/bedrock/test_config.py -v Verified existing provider tests still work: python -m pytest tests/unit/providers/test_configs.py -v --- .../providers/inference/remote_bedrock.md | 4 +- .../source/providers/safety/remote_bedrock.md | 4 +- llama_stack/providers/utils/bedrock/config.py | 22 ++++--- .../inference/bedrock/test_config.py | 63 +++++++++++++++++++ 4 files changed, 79 insertions(+), 14 deletions(-) create mode 100644 tests/unit/providers/inference/bedrock/test_config.py diff --git a/docs/source/providers/inference/remote_bedrock.md b/docs/source/providers/inference/remote_bedrock.md index 1454c54c2..216dd4adb 100644 --- a/docs/source/providers/inference/remote_bedrock.md +++ b/docs/source/providers/inference/remote_bedrock.md @@ -15,8 +15,8 @@ AWS Bedrock inference provider for accessing various AI models through AWS's man | `profile_name` | `str \| None` | No | | The profile name that contains credentials to use.Default use environment variable: AWS_PROFILE | | `total_max_attempts` | `int \| None` | No | | An integer representing the maximum number of attempts that will be made for a single request, including the initial attempt. Default use environment variable: AWS_MAX_ATTEMPTS | | `retry_mode` | `str \| None` | No | | A string representing the type of retries Boto3 will perform.Default use environment variable: AWS_RETRY_MODE | -| `connect_timeout` | `float \| None` | No | 60 | The time in seconds till a timeout exception is thrown when attempting to make a connection. The default is 60 seconds. | -| `read_timeout` | `float \| None` | No | 60 | The time in seconds till a timeout exception is thrown when attempting to read from a connection.The default is 60 seconds. | +| `connect_timeout` | `float \| None` | No | 60.0 | The time in seconds till a timeout exception is thrown when attempting to make a connection. The default is 60 seconds. | +| `read_timeout` | `float \| None` | No | 60.0 | The time in seconds till a timeout exception is thrown when attempting to read from a connection.The default is 60 seconds. | | `session_ttl` | `int \| None` | No | 3600 | The time in seconds till a session expires. The default is 3600 seconds (1 hour). | ## Sample Configuration diff --git a/docs/source/providers/safety/remote_bedrock.md b/docs/source/providers/safety/remote_bedrock.md index 3c1d6bcb0..99d77dd72 100644 --- a/docs/source/providers/safety/remote_bedrock.md +++ b/docs/source/providers/safety/remote_bedrock.md @@ -15,8 +15,8 @@ AWS Bedrock safety provider for content moderation using AWS's safety services. | `profile_name` | `str \| None` | No | | The profile name that contains credentials to use.Default use environment variable: AWS_PROFILE | | `total_max_attempts` | `int \| None` | No | | An integer representing the maximum number of attempts that will be made for a single request, including the initial attempt. Default use environment variable: AWS_MAX_ATTEMPTS | | `retry_mode` | `str \| None` | No | | A string representing the type of retries Boto3 will perform.Default use environment variable: AWS_RETRY_MODE | -| `connect_timeout` | `float \| None` | No | 60 | The time in seconds till a timeout exception is thrown when attempting to make a connection. The default is 60 seconds. | -| `read_timeout` | `float \| None` | No | 60 | The time in seconds till a timeout exception is thrown when attempting to read from a connection.The default is 60 seconds. | +| `connect_timeout` | `float \| None` | No | 60.0 | The time in seconds till a timeout exception is thrown when attempting to make a connection. The default is 60 seconds. | +| `read_timeout` | `float \| None` | No | 60.0 | The time in seconds till a timeout exception is thrown when attempting to read from a connection.The default is 60 seconds. | | `session_ttl` | `int \| None` | No | 3600 | The time in seconds till a session expires. The default is 3600 seconds (1 hour). | ## Sample Configuration diff --git a/llama_stack/providers/utils/bedrock/config.py b/llama_stack/providers/utils/bedrock/config.py index b25617d76..2745c88cb 100644 --- a/llama_stack/providers/utils/bedrock/config.py +++ b/llama_stack/providers/utils/bedrock/config.py @@ -4,53 +4,55 @@ # This source code is licensed under the terms described in the LICENSE file in # the root directory of this source tree. +import os + from pydantic import BaseModel, Field class BedrockBaseConfig(BaseModel): aws_access_key_id: str | None = Field( - default=None, + default_factory=lambda: os.getenv("AWS_ACCESS_KEY_ID"), description="The AWS access key to use. Default use environment variable: AWS_ACCESS_KEY_ID", ) aws_secret_access_key: str | None = Field( - default=None, + default_factory=lambda: os.getenv("AWS_SECRET_ACCESS_KEY"), description="The AWS secret access key to use. Default use environment variable: AWS_SECRET_ACCESS_KEY", ) aws_session_token: str | None = Field( - default=None, + default_factory=lambda: os.getenv("AWS_SESSION_TOKEN"), description="The AWS session token to use. Default use environment variable: AWS_SESSION_TOKEN", ) region_name: str | None = Field( - default=None, + default_factory=lambda: os.getenv("AWS_DEFAULT_REGION"), description="The default AWS Region to use, for example, us-west-1 or us-west-2." "Default use environment variable: AWS_DEFAULT_REGION", ) profile_name: str | None = Field( - default=None, + default_factory=lambda: os.getenv("AWS_PROFILE"), description="The profile name that contains credentials to use.Default use environment variable: AWS_PROFILE", ) total_max_attempts: int | None = Field( - default=None, + default_factory=lambda: int(val) if (val := os.getenv("AWS_MAX_ATTEMPTS")) else None, description="An integer representing the maximum number of attempts that will be made for a single request, " "including the initial attempt. Default use environment variable: AWS_MAX_ATTEMPTS", ) retry_mode: str | None = Field( - default=None, + default_factory=lambda: os.getenv("AWS_RETRY_MODE"), description="A string representing the type of retries Boto3 will perform." "Default use environment variable: AWS_RETRY_MODE", ) connect_timeout: float | None = Field( - default=60, + default_factory=lambda: float(os.getenv("AWS_CONNECT_TIMEOUT", "60")), description="The time in seconds till a timeout exception is thrown when attempting to make a connection. " "The default is 60 seconds.", ) read_timeout: float | None = Field( - default=60, + default_factory=lambda: float(os.getenv("AWS_READ_TIMEOUT", "60")), description="The time in seconds till a timeout exception is thrown when attempting to read from a connection." "The default is 60 seconds.", ) session_ttl: int | None = Field( - default=3600, + default_factory=lambda: int(os.getenv("AWS_SESSION_TTL", "3600")), description="The time in seconds till a session expires. The default is 3600 seconds (1 hour).", ) diff --git a/tests/unit/providers/inference/bedrock/test_config.py b/tests/unit/providers/inference/bedrock/test_config.py new file mode 100644 index 000000000..1b8639f2e --- /dev/null +++ b/tests/unit/providers/inference/bedrock/test_config.py @@ -0,0 +1,63 @@ +# Copyright (c) Meta Platforms, Inc. and affiliates. +# All rights reserved. +# +# This source code is licensed under the terms described in the LICENSE file in +# the root directory of this source tree. + +import os +from unittest.mock import patch + +from llama_stack.providers.utils.bedrock.config import BedrockBaseConfig + + +class TestBedrockBaseConfig: + def test_defaults_work_without_env_vars(self): + with patch.dict(os.environ, {}, clear=True): + config = BedrockBaseConfig() + + # Basic creds should be None + assert config.aws_access_key_id is None + assert config.aws_secret_access_key is None + assert config.region_name is None + + # Timeouts get defaults + assert config.connect_timeout == 60.0 + assert config.read_timeout == 60.0 + assert config.session_ttl == 3600 + + def test_env_vars_get_picked_up(self): + env_vars = { + "AWS_ACCESS_KEY_ID": "AKIATEST123", + "AWS_SECRET_ACCESS_KEY": "secret123", + "AWS_DEFAULT_REGION": "us-west-2", + "AWS_MAX_ATTEMPTS": "5", + "AWS_RETRY_MODE": "adaptive", + "AWS_CONNECT_TIMEOUT": "30", + } + + with patch.dict(os.environ, env_vars, clear=True): + config = BedrockBaseConfig() + + assert config.aws_access_key_id == "AKIATEST123" + assert config.aws_secret_access_key == "secret123" + assert config.region_name == "us-west-2" + assert config.total_max_attempts == 5 + assert config.retry_mode == "adaptive" + assert config.connect_timeout == 30.0 + + def test_partial_env_setup(self): + # Just setting one timeout var + with patch.dict(os.environ, {"AWS_CONNECT_TIMEOUT": "120"}, clear=True): + config = BedrockBaseConfig() + + assert config.connect_timeout == 120.0 + assert config.read_timeout == 60.0 # still default + assert config.aws_access_key_id is None + + def test_bad_max_attempts_breaks(self): + with patch.dict(os.environ, {"AWS_MAX_ATTEMPTS": "not_a_number"}, clear=True): + try: + BedrockBaseConfig() + raise AssertionError("Should have failed on bad int conversion") + except ValueError: + pass # expected From 64b297716247317a0e0714b61fc7ee77bbfb9e52 Mon Sep 17 00:00:00 2001 From: Derek Higgins Date: Fri, 5 Sep 2025 13:09:36 +0100 Subject: [PATCH 024/150] fix: Fix locations of distrubution runtime directories (#3336) The defaults were mixed up Signed-off-by: Derek Higgins --- llama_stack/distributions/ci-tests/ci_tests.py | 4 +--- llama_stack/distributions/ci-tests/run.yaml | 18 +++++++++--------- llama_stack/distributions/starter-gpu/run.yaml | 18 +++++++++--------- .../distributions/starter-gpu/starter_gpu.py | 4 +--- llama_stack/distributions/starter/starter.py | 3 +-- 5 files changed, 21 insertions(+), 26 deletions(-) diff --git a/llama_stack/distributions/ci-tests/ci_tests.py b/llama_stack/distributions/ci-tests/ci_tests.py index 8fb61faca..ab102f5f3 100644 --- a/llama_stack/distributions/ci-tests/ci_tests.py +++ b/llama_stack/distributions/ci-tests/ci_tests.py @@ -11,9 +11,7 @@ from ..starter.starter import get_distribution_template as get_starter_distribut def get_distribution_template() -> DistributionTemplate: - template = get_starter_distribution_template() - name = "ci-tests" - template.name = name + template = get_starter_distribution_template(name="ci-tests") template.description = "CI tests for Llama Stack" return template diff --git a/llama_stack/distributions/ci-tests/run.yaml b/llama_stack/distributions/ci-tests/run.yaml index 7523df581..26a677c7a 100644 --- a/llama_stack/distributions/ci-tests/run.yaml +++ b/llama_stack/distributions/ci-tests/run.yaml @@ -89,28 +89,28 @@ providers: config: kvstore: type: sqlite - db_path: ${env.SQLITE_STORE_DIR:=~/.llama/distributions/starter}/faiss_store.db + db_path: ${env.SQLITE_STORE_DIR:=~/.llama/distributions/ci-tests}/faiss_store.db - provider_id: sqlite-vec provider_type: inline::sqlite-vec config: - db_path: ${env.SQLITE_STORE_DIR:=~/.llama/distributions/starter}/sqlite_vec.db + db_path: ${env.SQLITE_STORE_DIR:=~/.llama/distributions/ci-tests}/sqlite_vec.db kvstore: type: sqlite - db_path: ${env.SQLITE_STORE_DIR:=~/.llama/distributions/starter}/sqlite_vec_registry.db + db_path: ${env.SQLITE_STORE_DIR:=~/.llama/distributions/ci-tests}/sqlite_vec_registry.db - provider_id: ${env.MILVUS_URL:+milvus} provider_type: inline::milvus config: - db_path: ${env.MILVUS_DB_PATH:=~/.llama/distributions/starter}/milvus.db + db_path: ${env.MILVUS_DB_PATH:=~/.llama/distributions/ci-tests}/milvus.db kvstore: type: sqlite - db_path: ${env.SQLITE_STORE_DIR:=~/.llama/distributions/starter}/milvus_registry.db + db_path: ${env.SQLITE_STORE_DIR:=~/.llama/distributions/ci-tests}/milvus_registry.db - provider_id: ${env.CHROMADB_URL:+chromadb} provider_type: remote::chromadb config: url: ${env.CHROMADB_URL:=} kvstore: type: sqlite - db_path: ${env.SQLITE_STORE_DIR:=~/.llama/distributions/starter/}/chroma_remote_registry.db + db_path: ${env.SQLITE_STORE_DIR:=~/.llama/distributions/ci-tests/}/chroma_remote_registry.db - provider_id: ${env.PGVECTOR_DB:+pgvector} provider_type: remote::pgvector config: @@ -121,15 +121,15 @@ providers: password: ${env.PGVECTOR_PASSWORD:=} kvstore: type: sqlite - db_path: ${env.SQLITE_STORE_DIR:=~/.llama/distributions/starter}/pgvector_registry.db + db_path: ${env.SQLITE_STORE_DIR:=~/.llama/distributions/ci-tests}/pgvector_registry.db files: - provider_id: meta-reference-files provider_type: inline::localfs config: - storage_dir: ${env.FILES_STORAGE_DIR:=~/.llama/distributions/starter/files} + storage_dir: ${env.FILES_STORAGE_DIR:=~/.llama/distributions/ci-tests/files} metadata_store: type: sqlite - db_path: ${env.SQLITE_STORE_DIR:=~/.llama/distributions/starter}/files_metadata.db + db_path: ${env.SQLITE_STORE_DIR:=~/.llama/distributions/ci-tests}/files_metadata.db safety: - provider_id: llama-guard provider_type: inline::llama-guard diff --git a/llama_stack/distributions/starter-gpu/run.yaml b/llama_stack/distributions/starter-gpu/run.yaml index 8aed61519..5d9dfcb27 100644 --- a/llama_stack/distributions/starter-gpu/run.yaml +++ b/llama_stack/distributions/starter-gpu/run.yaml @@ -89,28 +89,28 @@ providers: config: kvstore: type: sqlite - db_path: ${env.SQLITE_STORE_DIR:=~/.llama/distributions/starter}/faiss_store.db + db_path: ${env.SQLITE_STORE_DIR:=~/.llama/distributions/starter-gpu}/faiss_store.db - provider_id: sqlite-vec provider_type: inline::sqlite-vec config: - db_path: ${env.SQLITE_STORE_DIR:=~/.llama/distributions/starter}/sqlite_vec.db + db_path: ${env.SQLITE_STORE_DIR:=~/.llama/distributions/starter-gpu}/sqlite_vec.db kvstore: type: sqlite - db_path: ${env.SQLITE_STORE_DIR:=~/.llama/distributions/starter}/sqlite_vec_registry.db + db_path: ${env.SQLITE_STORE_DIR:=~/.llama/distributions/starter-gpu}/sqlite_vec_registry.db - provider_id: ${env.MILVUS_URL:+milvus} provider_type: inline::milvus config: - db_path: ${env.MILVUS_DB_PATH:=~/.llama/distributions/starter}/milvus.db + db_path: ${env.MILVUS_DB_PATH:=~/.llama/distributions/starter-gpu}/milvus.db kvstore: type: sqlite - db_path: ${env.SQLITE_STORE_DIR:=~/.llama/distributions/starter}/milvus_registry.db + db_path: ${env.SQLITE_STORE_DIR:=~/.llama/distributions/starter-gpu}/milvus_registry.db - provider_id: ${env.CHROMADB_URL:+chromadb} provider_type: remote::chromadb config: url: ${env.CHROMADB_URL:=} kvstore: type: sqlite - db_path: ${env.SQLITE_STORE_DIR:=~/.llama/distributions/starter/}/chroma_remote_registry.db + db_path: ${env.SQLITE_STORE_DIR:=~/.llama/distributions/starter-gpu/}/chroma_remote_registry.db - provider_id: ${env.PGVECTOR_DB:+pgvector} provider_type: remote::pgvector config: @@ -121,15 +121,15 @@ providers: password: ${env.PGVECTOR_PASSWORD:=} kvstore: type: sqlite - db_path: ${env.SQLITE_STORE_DIR:=~/.llama/distributions/starter}/pgvector_registry.db + db_path: ${env.SQLITE_STORE_DIR:=~/.llama/distributions/starter-gpu}/pgvector_registry.db files: - provider_id: meta-reference-files provider_type: inline::localfs config: - storage_dir: ${env.FILES_STORAGE_DIR:=~/.llama/distributions/starter/files} + storage_dir: ${env.FILES_STORAGE_DIR:=~/.llama/distributions/starter-gpu/files} metadata_store: type: sqlite - db_path: ${env.SQLITE_STORE_DIR:=~/.llama/distributions/starter}/files_metadata.db + db_path: ${env.SQLITE_STORE_DIR:=~/.llama/distributions/starter-gpu}/files_metadata.db safety: - provider_id: llama-guard provider_type: inline::llama-guard diff --git a/llama_stack/distributions/starter-gpu/starter_gpu.py b/llama_stack/distributions/starter-gpu/starter_gpu.py index 245334749..e7efcb283 100644 --- a/llama_stack/distributions/starter-gpu/starter_gpu.py +++ b/llama_stack/distributions/starter-gpu/starter_gpu.py @@ -11,9 +11,7 @@ from ..starter.starter import get_distribution_template as get_starter_distribut def get_distribution_template() -> DistributionTemplate: - template = get_starter_distribution_template() - name = "starter-gpu" - template.name = name + template = get_starter_distribution_template(name="starter-gpu") template.description = "Quick start template for running Llama Stack with several popular providers. This distribution is intended for GPU-enabled environments." template.providers["post_training"] = [ diff --git a/llama_stack/distributions/starter/starter.py b/llama_stack/distributions/starter/starter.py index a4bbc6371..2fca52700 100644 --- a/llama_stack/distributions/starter/starter.py +++ b/llama_stack/distributions/starter/starter.py @@ -99,9 +99,8 @@ def get_remote_inference_providers() -> list[Provider]: return inference_providers -def get_distribution_template() -> DistributionTemplate: +def get_distribution_template(name: str = "starter") -> DistributionTemplate: remote_inference_providers = get_remote_inference_providers() - name = "starter" providers = { "inference": [BuildProvider(provider_type=p.provider_type, module=p.module) for p in remote_inference_providers] From e2fe39aee108c1796ddc1be1e44acd25c800082e Mon Sep 17 00:00:00 2001 From: Francisco Arceo Date: Fri, 5 Sep 2025 07:40:34 -0600 Subject: [PATCH 025/150] feat!: Migrate Vector DB IDs to Vector Store IDs (breaking change) (#3253) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit # What does this PR do? This change migrates the VectorDB id generation to Vector Stores. This is a breaking change for **_some users_** that may have application code using the `vector_db_id` parameter in the request of the VectorDB protocol instead of the `VectorDB.identifier` in the response. By default we will now create a Vector Store every time we register a VectorDB. The caveat with this approach is that this maps the `vector_db_id` → `vector_store.name`. This is a reasonable tradeoff to transition users towards OpenAI Vector Stores. As an added benefit, registering VectorDBs will result in them appearing in the VectorStores admin UI. ### Why? This PR makes the `POST` API call to `/v1/vector-dbs` swap the `vector_db_id` parameter in the **request body** into the VectorStore's name field and sets the `vector_db_id` to the generated vector store id (e.g., `vs_038247dd-4bbb-4dbb-a6be-d5ecfd46cfdb`). That means that users would have to do something like follows in their application code: ```python res = client.vector_dbs.register( vector_db_id='my-vector-db-id', embedding_model='ollama/all-minilm:l6-v2', embedding_dimension=384, ) vector_db_id = res.identifier ``` And then the rest of their code would behave, including `VectorIO`'s insert protocol using `vector_db_id` in the request. An alternative implementation would be to just delete the `vector_db_id` parameter in `VectorDB` but the end result would still require users having to write `vector_db_id = res.identifier` since `VectorStores.create()` generates the ID for you. So this approach felt the easiest way to migrate users towards VectorStores (subsequent PRs will be added to trigger `files.create()` and `vector_stores.files.create()`). ## Test Plan Unit tests and integration tests have been added. Signed-off-by: Francisco Javier Arceo --- llama_stack/core/routing_tables/vector_dbs.py | 26 +++- tests/integration/vector_io/test_vector_io.py | 75 +++++++---- .../routers/test_routing_tables.py | 30 ++++- .../routing_tables/test_vector_dbs.py | 127 ++++++++++++++++-- 4 files changed, 209 insertions(+), 49 deletions(-) diff --git a/llama_stack/core/routing_tables/vector_dbs.py b/llama_stack/core/routing_tables/vector_dbs.py index 00f71b4fe..497894064 100644 --- a/llama_stack/core/routing_tables/vector_dbs.py +++ b/llama_stack/core/routing_tables/vector_dbs.py @@ -52,7 +52,6 @@ class VectorDBsRoutingTable(CommonRoutingTableImpl, VectorDBs): provider_vector_db_id: str | None = None, vector_db_name: str | None = None, ) -> VectorDB: - provider_vector_db_id = provider_vector_db_id or vector_db_id if provider_id is None: if len(self.impls_by_provider_id) > 0: provider_id = list(self.impls_by_provider_id.keys())[0] @@ -69,14 +68,33 @@ class VectorDBsRoutingTable(CommonRoutingTableImpl, VectorDBs): raise ModelTypeError(embedding_model, model.model_type, ModelType.embedding) if "embedding_dimension" not in model.metadata: raise ValueError(f"Model {embedding_model} does not have an embedding dimension") + + provider = self.impls_by_provider_id[provider_id] + logger.warning( + "VectorDB is being deprecated in future releases in favor of VectorStore. Please migrate your usage accordingly." + ) + vector_store = await provider.openai_create_vector_store( + name=vector_db_name or vector_db_id, + embedding_model=embedding_model, + embedding_dimension=model.metadata["embedding_dimension"], + provider_id=provider_id, + provider_vector_db_id=provider_vector_db_id, + ) + + vector_store_id = vector_store.id + actual_provider_vector_db_id = provider_vector_db_id or vector_store_id + logger.warning( + f"Ignoring vector_db_id {vector_db_id} and using vector_store_id {vector_store_id} instead. Setting VectorDB {vector_db_id} to VectorDB.vector_db_name" + ) + vector_db_data = { - "identifier": vector_db_id, + "identifier": vector_store_id, "type": ResourceType.vector_db.value, "provider_id": provider_id, - "provider_resource_id": provider_vector_db_id, + "provider_resource_id": actual_provider_vector_db_id, "embedding_model": embedding_model, "embedding_dimension": model.metadata["embedding_dimension"], - "vector_db_name": vector_db_name, + "vector_db_name": vector_store.name, } vector_db = TypeAdapter(VectorDBWithOwner).validate_python(vector_db_data) await self.register_object(vector_db) diff --git a/tests/integration/vector_io/test_vector_io.py b/tests/integration/vector_io/test_vector_io.py index 07faa0db1..979eff6bb 100644 --- a/tests/integration/vector_io/test_vector_io.py +++ b/tests/integration/vector_io/test_vector_io.py @@ -47,34 +47,45 @@ def client_with_empty_registry(client_with_models): def test_vector_db_retrieve(client_with_empty_registry, embedding_model_id, embedding_dimension): - # Register a memory bank first - vector_db_id = "test_vector_db" - client_with_empty_registry.vector_dbs.register( - vector_db_id=vector_db_id, + vector_db_name = "test_vector_db" + register_response = client_with_empty_registry.vector_dbs.register( + vector_db_id=vector_db_name, embedding_model=embedding_model_id, embedding_dimension=embedding_dimension, ) + actual_vector_db_id = register_response.identifier + # Retrieve the memory bank and validate its properties - response = client_with_empty_registry.vector_dbs.retrieve(vector_db_id=vector_db_id) + response = client_with_empty_registry.vector_dbs.retrieve(vector_db_id=actual_vector_db_id) assert response is not None - assert response.identifier == vector_db_id + assert response.identifier == actual_vector_db_id assert response.embedding_model == embedding_model_id - assert response.provider_resource_id == vector_db_id + assert response.identifier.startswith("vs_") def test_vector_db_register(client_with_empty_registry, embedding_model_id, embedding_dimension): - vector_db_id = "test_vector_db" - client_with_empty_registry.vector_dbs.register( - vector_db_id=vector_db_id, + vector_db_name = "test_vector_db" + response = client_with_empty_registry.vector_dbs.register( + vector_db_id=vector_db_name, embedding_model=embedding_model_id, embedding_dimension=embedding_dimension, ) - vector_dbs_after_register = [vector_db.identifier for vector_db in client_with_empty_registry.vector_dbs.list()] - assert vector_dbs_after_register == [vector_db_id] + actual_vector_db_id = response.identifier + assert actual_vector_db_id.startswith("vs_") + assert actual_vector_db_id != vector_db_name - client_with_empty_registry.vector_dbs.unregister(vector_db_id=vector_db_id) + vector_dbs_after_register = [vector_db.identifier for vector_db in client_with_empty_registry.vector_dbs.list()] + assert vector_dbs_after_register == [actual_vector_db_id] + + vector_stores = client_with_empty_registry.vector_stores.list() + assert len(vector_stores.data) == 1 + vector_store = vector_stores.data[0] + assert vector_store.id == actual_vector_db_id + assert vector_store.name == vector_db_name + + client_with_empty_registry.vector_dbs.unregister(vector_db_id=actual_vector_db_id) vector_dbs = [vector_db.identifier for vector_db in client_with_empty_registry.vector_dbs.list()] assert len(vector_dbs) == 0 @@ -91,20 +102,22 @@ def test_vector_db_register(client_with_empty_registry, embedding_model_id, embe ], ) def test_insert_chunks(client_with_empty_registry, embedding_model_id, embedding_dimension, sample_chunks, test_case): - vector_db_id = "test_vector_db" - client_with_empty_registry.vector_dbs.register( - vector_db_id=vector_db_id, + vector_db_name = "test_vector_db" + register_response = client_with_empty_registry.vector_dbs.register( + vector_db_id=vector_db_name, embedding_model=embedding_model_id, embedding_dimension=embedding_dimension, ) + actual_vector_db_id = register_response.identifier + client_with_empty_registry.vector_io.insert( - vector_db_id=vector_db_id, + vector_db_id=actual_vector_db_id, chunks=sample_chunks, ) response = client_with_empty_registry.vector_io.query( - vector_db_id=vector_db_id, + vector_db_id=actual_vector_db_id, query="What is the capital of France?", ) assert response is not None @@ -113,7 +126,7 @@ def test_insert_chunks(client_with_empty_registry, embedding_model_id, embedding query, expected_doc_id = test_case response = client_with_empty_registry.vector_io.query( - vector_db_id=vector_db_id, + vector_db_id=actual_vector_db_id, query=query, ) assert response is not None @@ -128,13 +141,15 @@ def test_insert_chunks_with_precomputed_embeddings(client_with_empty_registry, e "remote::qdrant": {"score_threshold": -1.0}, "inline::qdrant": {"score_threshold": -1.0}, } - vector_db_id = "test_precomputed_embeddings_db" - client_with_empty_registry.vector_dbs.register( - vector_db_id=vector_db_id, + vector_db_name = "test_precomputed_embeddings_db" + register_response = client_with_empty_registry.vector_dbs.register( + vector_db_id=vector_db_name, embedding_model=embedding_model_id, embedding_dimension=embedding_dimension, ) + actual_vector_db_id = register_response.identifier + chunks_with_embeddings = [ Chunk( content="This is a test chunk with precomputed embedding.", @@ -144,13 +159,13 @@ def test_insert_chunks_with_precomputed_embeddings(client_with_empty_registry, e ] client_with_empty_registry.vector_io.insert( - vector_db_id=vector_db_id, + vector_db_id=actual_vector_db_id, chunks=chunks_with_embeddings, ) provider = [p.provider_id for p in client_with_empty_registry.providers.list() if p.api == "vector_io"][0] response = client_with_empty_registry.vector_io.query( - vector_db_id=vector_db_id, + vector_db_id=actual_vector_db_id, query="precomputed embedding test", params=vector_io_provider_params_dict.get(provider, None), ) @@ -173,13 +188,15 @@ def test_query_returns_valid_object_when_identical_to_embedding_in_vdb( "remote::qdrant": {"score_threshold": 0.0}, "inline::qdrant": {"score_threshold": 0.0}, } - vector_db_id = "test_precomputed_embeddings_db" - client_with_empty_registry.vector_dbs.register( - vector_db_id=vector_db_id, + vector_db_name = "test_precomputed_embeddings_db" + register_response = client_with_empty_registry.vector_dbs.register( + vector_db_id=vector_db_name, embedding_model=embedding_model_id, embedding_dimension=embedding_dimension, ) + actual_vector_db_id = register_response.identifier + chunks_with_embeddings = [ Chunk( content="duplicate", @@ -189,13 +206,13 @@ def test_query_returns_valid_object_when_identical_to_embedding_in_vdb( ] client_with_empty_registry.vector_io.insert( - vector_db_id=vector_db_id, + vector_db_id=actual_vector_db_id, chunks=chunks_with_embeddings, ) provider = [p.provider_id for p in client_with_empty_registry.providers.list() if p.api == "vector_io"][0] response = client_with_empty_registry.vector_io.query( - vector_db_id=vector_db_id, + vector_db_id=actual_vector_db_id, query="duplicate", params=vector_io_provider_params_dict.get(provider, None), ) diff --git a/tests/unit/distribution/routers/test_routing_tables.py b/tests/unit/distribution/routers/test_routing_tables.py index 2652f5c8d..1ceee81c6 100644 --- a/tests/unit/distribution/routers/test_routing_tables.py +++ b/tests/unit/distribution/routers/test_routing_tables.py @@ -146,6 +146,20 @@ class VectorDBImpl(Impl): async def unregister_vector_db(self, vector_db_id: str): return vector_db_id + async def openai_create_vector_store(self, **kwargs): + import time + import uuid + + from llama_stack.apis.vector_io.vector_io import VectorStoreFileCounts, VectorStoreObject + + vector_store_id = kwargs.get("provider_vector_db_id") or f"vs_{uuid.uuid4()}" + return VectorStoreObject( + id=vector_store_id, + name=kwargs.get("name", vector_store_id), + created_at=int(time.time()), + file_counts=VectorStoreFileCounts(completed=0, cancelled=0, failed=0, in_progress=0, total=0), + ) + async def test_models_routing_table(cached_disk_dist_registry): table = ModelsRoutingTable({"test_provider": InferenceImpl()}, cached_disk_dist_registry, {}) @@ -247,17 +261,21 @@ async def test_vectordbs_routing_table(cached_disk_dist_registry): ) # Register multiple vector databases and verify listing - await table.register_vector_db(vector_db_id="test-vectordb", embedding_model="test_provider/test-model") - await table.register_vector_db(vector_db_id="test-vectordb-2", embedding_model="test_provider/test-model") + vdb1 = await table.register_vector_db(vector_db_id="test-vectordb", embedding_model="test_provider/test-model") + vdb2 = await table.register_vector_db(vector_db_id="test-vectordb-2", embedding_model="test_provider/test-model") vector_dbs = await table.list_vector_dbs() assert len(vector_dbs.data) == 2 vector_db_ids = {v.identifier for v in vector_dbs.data} - assert "test-vectordb" in vector_db_ids - assert "test-vectordb-2" in vector_db_ids + assert vdb1.identifier in vector_db_ids + assert vdb2.identifier in vector_db_ids - await table.unregister_vector_db(vector_db_id="test-vectordb") - await table.unregister_vector_db(vector_db_id="test-vectordb-2") + # Verify they have UUID-based identifiers + assert vdb1.identifier.startswith("vs_") + assert vdb2.identifier.startswith("vs_") + + await table.unregister_vector_db(vector_db_id=vdb1.identifier) + await table.unregister_vector_db(vector_db_id=vdb2.identifier) vector_dbs = await table.list_vector_dbs() assert len(vector_dbs.data) == 0 diff --git a/tests/unit/distribution/routing_tables/test_vector_dbs.py b/tests/unit/distribution/routing_tables/test_vector_dbs.py index 789eda433..3444f64c2 100644 --- a/tests/unit/distribution/routing_tables/test_vector_dbs.py +++ b/tests/unit/distribution/routing_tables/test_vector_dbs.py @@ -7,6 +7,7 @@ # Unit tests for the routing tables vector_dbs import time +import uuid from unittest.mock import AsyncMock import pytest @@ -34,6 +35,7 @@ from tests.unit.distribution.routers.test_routing_tables import Impl, InferenceI class VectorDBImpl(Impl): def __init__(self): super().__init__(Api.vector_io) + self.vector_stores = {} async def register_vector_db(self, vector_db: VectorDB): return vector_db @@ -114,8 +116,35 @@ class VectorDBImpl(Impl): async def openai_delete_vector_store_file(self, vector_store_id, file_id): return VectorStoreFileDeleteResponse(id=file_id, deleted=True) + async def openai_create_vector_store( + self, + name=None, + embedding_model=None, + embedding_dimension=None, + provider_id=None, + provider_vector_db_id=None, + **kwargs, + ): + vector_store_id = provider_vector_db_id or f"vs_{uuid.uuid4()}" + vector_store = VectorStoreObject( + id=vector_store_id, + name=name or vector_store_id, + created_at=int(time.time()), + file_counts=VectorStoreFileCounts(completed=0, cancelled=0, failed=0, in_progress=0, total=0), + ) + self.vector_stores[vector_store_id] = vector_store + return vector_store + + async def openai_list_vector_stores(self, **kwargs): + from llama_stack.apis.vector_io.vector_io import VectorStoreListResponse + + return VectorStoreListResponse( + data=list(self.vector_stores.values()), has_more=False, first_id=None, last_id=None + ) + async def test_vectordbs_routing_table(cached_disk_dist_registry): + n = 10 table = VectorDBsRoutingTable({"test_provider": VectorDBImpl()}, cached_disk_dist_registry, {}) await table.initialize() @@ -129,22 +158,98 @@ async def test_vectordbs_routing_table(cached_disk_dist_registry): ) # Register multiple vector databases and verify listing - await table.register_vector_db(vector_db_id="test-vectordb", embedding_model="test-model") - await table.register_vector_db(vector_db_id="test-vectordb-2", embedding_model="test-model") + vdb_dict = {} + for i in range(n): + vdb_dict[i] = await table.register_vector_db(vector_db_id=f"test-vectordb-{i}", embedding_model="test-model") + vector_dbs = await table.list_vector_dbs() - assert len(vector_dbs.data) == 2 + assert len(vector_dbs.data) == len(vdb_dict) vector_db_ids = {v.identifier for v in vector_dbs.data} - assert "test-vectordb" in vector_db_ids - assert "test-vectordb-2" in vector_db_ids - - await table.unregister_vector_db(vector_db_id="test-vectordb") - await table.unregister_vector_db(vector_db_id="test-vectordb-2") + for k in vdb_dict: + assert vdb_dict[k].identifier in vector_db_ids + for k in vdb_dict: + await table.unregister_vector_db(vector_db_id=vdb_dict[k].identifier) vector_dbs = await table.list_vector_dbs() assert len(vector_dbs.data) == 0 +async def test_vector_db_and_vector_store_id_mapping(cached_disk_dist_registry): + n = 10 + impl = VectorDBImpl() + table = VectorDBsRoutingTable({"test_provider": impl}, cached_disk_dist_registry, {}) + await table.initialize() + + m_table = ModelsRoutingTable({"test_provider": InferenceImpl()}, cached_disk_dist_registry, {}) + await m_table.initialize() + await m_table.register_model( + model_id="test-model", + provider_id="test_provider", + metadata={"embedding_dimension": 128}, + model_type=ModelType.embedding, + ) + + vdb_dict = {} + for i in range(n): + vdb_dict[i] = await table.register_vector_db(vector_db_id=f"test-vectordb-{i}", embedding_model="test-model") + + vector_dbs = await table.list_vector_dbs() + vector_db_ids = {v.identifier for v in vector_dbs.data} + + vector_stores = await impl.openai_list_vector_stores() + vector_store_ids = {v.id for v in vector_stores.data} + + assert vector_db_ids == vector_store_ids, ( + f"Vector DB IDs {vector_db_ids} don't match vector store IDs {vector_store_ids}" + ) + + for vector_store in vector_stores.data: + vector_db = await table.get_vector_db(vector_store.id) + assert vector_store.name == vector_db.vector_db_name, ( + f"Vector store name {vector_store.name} doesn't match vector store ID {vector_store.id}" + ) + + for vector_db_id in vector_db_ids: + await table.unregister_vector_db(vector_db_id) + + assert len((await table.list_vector_dbs()).data) == 0 + + +async def test_vector_db_id_becomes_vector_store_name(cached_disk_dist_registry): + impl = VectorDBImpl() + table = VectorDBsRoutingTable({"test_provider": impl}, cached_disk_dist_registry, {}) + await table.initialize() + + m_table = ModelsRoutingTable({"test_provider": InferenceImpl()}, cached_disk_dist_registry, {}) + await m_table.initialize() + await m_table.register_model( + model_id="test-model", + provider_id="test_provider", + metadata={"embedding_dimension": 128}, + model_type=ModelType.embedding, + ) + + user_provided_id = "my-custom-vector-db" + await table.register_vector_db(vector_db_id=user_provided_id, embedding_model="test-model") + + vector_stores = await impl.openai_list_vector_stores() + assert len(vector_stores.data) == 1 + + vector_store = vector_stores.data[0] + + assert vector_store.name == user_provided_id + + assert vector_store.id.startswith("vs_") + assert vector_store.id != user_provided_id + + vector_dbs = await table.list_vector_dbs() + assert len(vector_dbs.data) == 1 + assert vector_dbs.data[0].identifier == vector_store.id + + await table.unregister_vector_db(vector_store.id) + + async def test_openai_vector_stores_routing_table_roles(cached_disk_dist_registry): impl = VectorDBImpl() impl.openai_retrieve_vector_store = AsyncMock(return_value="OK") @@ -164,7 +269,8 @@ async def test_openai_vector_stores_routing_table_roles(cached_disk_dist_registr authorized_user = User(principal="alice", attributes={"roles": [authorized_team]}) with request_provider_data_context({}, authorized_user): - _ = await table.register_vector_db(vector_db_id="vs1", embedding_model="test-model") + registered_vdb = await table.register_vector_db(vector_db_id="vs1", embedding_model="test-model") + authorized_table = registered_vdb.identifier # Use the actual generated ID # Authorized reader with request_provider_data_context({}, authorized_user): @@ -227,7 +333,8 @@ async def test_openai_vector_stores_routing_table_actions(cached_disk_dist_regis ) with request_provider_data_context({}, admin_user): - await table.register_vector_db(vector_db_id=vector_db_id, embedding_model="test-model") + registered_vdb = await table.register_vector_db(vector_db_id=vector_db_id, embedding_model="test-model") + vector_db_id = registered_vdb.identifier # Use the actual generated ID read_methods = [ (table.openai_retrieve_vector_store, (vector_db_id,), {}), From df1526991f6d5cfca05d3c4f1077b67f4832d93e Mon Sep 17 00:00:00 2001 From: Matthew Farrellee Date: Fri, 5 Sep 2025 14:59:57 -0400 Subject: [PATCH 026/150] feat(batches, completions): add /v1/completions support to /v1/batches (#3309) # What does this PR do? add support for /v1/completions to the /v1/batches api ## Test Plan ci --- .../inline/batches/reference/batches.py | 69 +++++++++++++------ tests/integration/batches/test_batches.py | 55 +++++++++++++++ .../recordings/responses/41e27b9b5d09.json | 42 +++++++++++ .../unit/providers/batches/test_reference.py | 65 +++++++++++++++-- 4 files changed, 205 insertions(+), 26 deletions(-) create mode 100644 tests/integration/recordings/responses/41e27b9b5d09.json diff --git a/llama_stack/providers/inline/batches/reference/batches.py b/llama_stack/providers/inline/batches/reference/batches.py index 26f0ad15a..e049518a4 100644 --- a/llama_stack/providers/inline/batches/reference/batches.py +++ b/llama_stack/providers/inline/batches/reference/batches.py @@ -178,9 +178,9 @@ class ReferenceBatchesImpl(Batches): # TODO: set expiration time for garbage collection - if endpoint not in ["/v1/chat/completions"]: + if endpoint not in ["/v1/chat/completions", "/v1/completions"]: raise ValueError( - f"Invalid endpoint: {endpoint}. Supported values: /v1/chat/completions. Code: invalid_value. Param: endpoint", + f"Invalid endpoint: {endpoint}. Supported values: /v1/chat/completions, /v1/completions. Code: invalid_value. Param: endpoint", ) if completion_window != "24h": @@ -424,13 +424,21 @@ class ReferenceBatchesImpl(Batches): ) valid = False - for param, expected_type, type_string in [ - ("model", str, "a string"), - # messages is specific to /v1/chat/completions - # we could skip validating messages here and let inference fail. however, - # that would be a very expensive way to find out messages is wrong. - ("messages", list, "an array"), # TODO: allow messages to be a string? - ]: + if batch.endpoint == "/v1/chat/completions": + required_params = [ + ("model", str, "a string"), + # messages is specific to /v1/chat/completions + # we could skip validating messages here and let inference fail. however, + # that would be a very expensive way to find out messages is wrong. + ("messages", list, "an array"), # TODO: allow messages to be a string? + ] + else: # /v1/completions + required_params = [ + ("model", str, "a string"), + ("prompt", str, "a string"), # TODO: allow prompt to be a list of strings?? + ] + + for param, expected_type, type_string in required_params: if param not in body: errors.append( BatchError( @@ -591,20 +599,37 @@ class ReferenceBatchesImpl(Batches): try: # TODO(SECURITY): review body for security issues - request.body["messages"] = [convert_to_openai_message_param(msg) for msg in request.body["messages"]] - chat_response = await self.inference_api.openai_chat_completion(**request.body) + if request.url == "/v1/chat/completions": + request.body["messages"] = [convert_to_openai_message_param(msg) for msg in request.body["messages"]] + chat_response = await self.inference_api.openai_chat_completion(**request.body) - # this is for mypy, we don't allow streaming so we'll get the right type - assert hasattr(chat_response, "model_dump_json"), "Chat response must have model_dump_json method" - return { - "id": request_id, - "custom_id": request.custom_id, - "response": { - "status_code": 200, - "request_id": request_id, # TODO: should this be different? - "body": chat_response.model_dump_json(), - }, - } + # this is for mypy, we don't allow streaming so we'll get the right type + assert hasattr(chat_response, "model_dump_json"), "Chat response must have model_dump_json method" + return { + "id": request_id, + "custom_id": request.custom_id, + "response": { + "status_code": 200, + "request_id": request_id, # TODO: should this be different? + "body": chat_response.model_dump_json(), + }, + } + else: # /v1/completions + completion_response = await self.inference_api.openai_completion(**request.body) + + # this is for mypy, we don't allow streaming so we'll get the right type + assert hasattr(completion_response, "model_dump_json"), ( + "Completion response must have model_dump_json method" + ) + return { + "id": request_id, + "custom_id": request.custom_id, + "response": { + "status_code": 200, + "request_id": request_id, + "body": completion_response.model_dump_json(), + }, + } except Exception as e: logger.info(f"Error processing request {request.custom_id} in batch {batch_id}: {e}") return { diff --git a/tests/integration/batches/test_batches.py b/tests/integration/batches/test_batches.py index 59811b7a4..d55a68bd3 100644 --- a/tests/integration/batches/test_batches.py +++ b/tests/integration/batches/test_batches.py @@ -268,3 +268,58 @@ class TestBatchesIntegration: deleted_error_file = openai_client.files.delete(final_batch.error_file_id) assert deleted_error_file.deleted, f"Error file {final_batch.error_file_id} was not deleted successfully" + + def test_batch_e2e_completions(self, openai_client, batch_helper, text_model_id): + """Run an end-to-end batch with a single successful text completion request.""" + request_body = {"model": text_model_id, "prompt": "Say completions", "max_tokens": 20} + + batch_requests = [ + { + "custom_id": "success-1", + "method": "POST", + "url": "/v1/completions", + "body": request_body, + } + ] + + with batch_helper.create_file(batch_requests) as uploaded_file: + batch = openai_client.batches.create( + input_file_id=uploaded_file.id, + endpoint="/v1/completions", + completion_window="24h", + metadata={"test": "e2e_completions_success"}, + ) + + final_batch = batch_helper.wait_for( + batch.id, + max_wait_time=3 * 60, + expected_statuses={"completed"}, + timeout_action="skip", + ) + + assert final_batch.status == "completed" + assert final_batch.request_counts is not None + assert final_batch.request_counts.total == 1 + assert final_batch.request_counts.completed == 1 + assert final_batch.output_file_id is not None + + output_content = openai_client.files.content(final_batch.output_file_id) + if isinstance(output_content, str): + output_text = output_content + else: + output_text = output_content.content.decode("utf-8") + + output_lines = output_text.strip().split("\n") + assert len(output_lines) == 1 + + result = json.loads(output_lines[0]) + assert result["custom_id"] == "success-1" + assert "response" in result + assert result["response"]["status_code"] == 200 + + deleted_output_file = openai_client.files.delete(final_batch.output_file_id) + assert deleted_output_file.deleted + + if final_batch.error_file_id is not None: + deleted_error_file = openai_client.files.delete(final_batch.error_file_id) + assert deleted_error_file.deleted diff --git a/tests/integration/recordings/responses/41e27b9b5d09.json b/tests/integration/recordings/responses/41e27b9b5d09.json new file mode 100644 index 000000000..45d140843 --- /dev/null +++ b/tests/integration/recordings/responses/41e27b9b5d09.json @@ -0,0 +1,42 @@ +{ + "request": { + "method": "POST", + "url": "http://0.0.0.0:11434/v1/v1/completions", + "headers": {}, + "body": { + "model": "llama3.2:3b-instruct-fp16", + "prompt": "Say completions", + "max_tokens": 20 + }, + "endpoint": "/v1/completions", + "model": "llama3.2:3b-instruct-fp16" + }, + "response": { + "body": { + "__type__": "openai.types.completion.Completion", + "__data__": { + "id": "cmpl-271", + "choices": [ + { + "finish_reason": "length", + "index": 0, + "logprobs": null, + "text": "You want me to respond with a completion, but you didn't specify what I should complete. Could" + } + ], + "created": 1756846620, + "model": "llama3.2:3b-instruct-fp16", + "object": "text_completion", + "system_fingerprint": "fp_ollama", + "usage": { + "completion_tokens": 20, + "prompt_tokens": 28, + "total_tokens": 48, + "completion_tokens_details": null, + "prompt_tokens_details": null + } + } + }, + "is_streaming": false + } +} diff --git a/tests/unit/providers/batches/test_reference.py b/tests/unit/providers/batches/test_reference.py index 0ca866f7b..dfef5e040 100644 --- a/tests/unit/providers/batches/test_reference.py +++ b/tests/unit/providers/batches/test_reference.py @@ -46,7 +46,8 @@ The tests are categorized and outlined below, keep this updated: * test_validate_input_url_mismatch (negative) * test_validate_input_multiple_errors_per_request (negative) * test_validate_input_invalid_request_format (negative) - * test_validate_input_missing_parameters (parametrized negative - custom_id, method, url, body, model, messages missing validation) + * test_validate_input_missing_parameters_chat_completions (parametrized negative - custom_id, method, url, body, model, messages missing validation for chat/completions) + * test_validate_input_missing_parameters_completions (parametrized negative - custom_id, method, url, body, model, prompt missing validation for completions) * test_validate_input_invalid_parameter_types (parametrized negative - custom_id, url, method, body, model, messages type validation) The tests use temporary SQLite databases for isolation and mock external @@ -213,7 +214,6 @@ class TestReferenceBatchesImpl: "endpoint", [ "/v1/embeddings", - "/v1/completions", "/v1/invalid/endpoint", "", ], @@ -499,8 +499,10 @@ class TestReferenceBatchesImpl: ("messages", "body.messages", "invalid_request", "Messages parameter is required"), ], ) - async def test_validate_input_missing_parameters(self, provider, param_name, param_path, error_code, error_message): - """Test _validate_input when file contains request with missing required parameters.""" + async def test_validate_input_missing_parameters_chat_completions( + self, provider, param_name, param_path, error_code, error_message + ): + """Test _validate_input when file contains request with missing required parameters for chat completions.""" provider.files_api.openai_retrieve_file = AsyncMock() mock_response = MagicMock() @@ -541,6 +543,61 @@ class TestReferenceBatchesImpl: assert errors[0].message == error_message assert errors[0].param == param_path + @pytest.mark.parametrize( + "param_name,param_path,error_code,error_message", + [ + ("custom_id", "custom_id", "missing_required_parameter", "Missing required parameter: custom_id"), + ("method", "method", "missing_required_parameter", "Missing required parameter: method"), + ("url", "url", "missing_required_parameter", "Missing required parameter: url"), + ("body", "body", "missing_required_parameter", "Missing required parameter: body"), + ("model", "body.model", "invalid_request", "Model parameter is required"), + ("prompt", "body.prompt", "invalid_request", "Prompt parameter is required"), + ], + ) + async def test_validate_input_missing_parameters_completions( + self, provider, param_name, param_path, error_code, error_message + ): + """Test _validate_input when file contains request with missing required parameters for text completions.""" + provider.files_api.openai_retrieve_file = AsyncMock() + mock_response = MagicMock() + + base_request = { + "custom_id": "req-1", + "method": "POST", + "url": "/v1/completions", + "body": {"model": "test-model", "prompt": "Hello"}, + } + + # Remove the specific parameter being tested + if "." in param_path: + top_level, nested_param = param_path.split(".", 1) + del base_request[top_level][nested_param] + else: + del base_request[param_name] + + mock_response.body = json.dumps(base_request).encode() + provider.files_api.openai_retrieve_file_content = AsyncMock(return_value=mock_response) + + batch = BatchObject( + id="batch_test", + object="batch", + endpoint="/v1/completions", + input_file_id=f"missing_{param_name}_file", + completion_window="24h", + status="validating", + created_at=1234567890, + ) + + errors, requests = await provider._validate_input(batch) + + assert len(errors) == 1 + assert len(requests) == 0 + + assert errors[0].code == error_code + assert errors[0].line == 1 + assert errors[0].message == error_message + assert errors[0].param == param_path + async def test_validate_input_url_mismatch(self, provider): """Test _validate_input when file contains request with URL that doesn't match batch endpoint.""" provider.files_api.openai_retrieve_file = AsyncMock() From 0c2757a05b504bafef1bc589376712b9ac9a1c52 Mon Sep 17 00:00:00 2001 From: Matthew Farrellee Date: Fri, 5 Sep 2025 15:00:09 -0400 Subject: [PATCH 027/150] chore(sambanova test): skip with_n tests for sambanova, it is not implemented server-side (#3342) # What does this PR do? skip a test that cannot pass for sambanova see https://docs-legacy.sambanova.ai/sambastudio/latest/open-ai-api.html\#_example_requests_using_openai_client ## Test Plan ci --- .../inference/test_openai_completion.py | 14 ++++++++++---- 1 file changed, 10 insertions(+), 4 deletions(-) diff --git a/tests/integration/inference/test_openai_completion.py b/tests/integration/inference/test_openai_completion.py index 62185e470..bb447b3c1 100644 --- a/tests/integration/inference/test_openai_completion.py +++ b/tests/integration/inference/test_openai_completion.py @@ -58,6 +58,15 @@ def skip_if_model_doesnt_support_suffix(client_with_models, model_id): pytest.skip(f"Provider {provider.provider_type} doesn't support suffix.") +def skip_if_doesnt_support_n(client_with_models, model_id): + provider = provider_from_model(client_with_models, model_id) + if provider.provider_type in ( + "remote::sambanova", + "remote::ollama", + ): + pytest.skip(f"Model {model_id} hosted by {provider.provider_type} doesn't support n param.") + + def skip_if_model_doesnt_support_openai_chat_completion(client_with_models, model_id): provider = provider_from_model(client_with_models, model_id) if provider.provider_type in ( @@ -262,10 +271,7 @@ def test_openai_chat_completion_streaming(compat_client, client_with_models, tex ) def test_openai_chat_completion_streaming_with_n(compat_client, client_with_models, text_model_id, test_case): skip_if_model_doesnt_support_openai_chat_completion(client_with_models, text_model_id) - - provider = provider_from_model(client_with_models, text_model_id) - if provider.provider_type == "remote::ollama": - pytest.skip(f"Model {text_model_id} hosted by {provider.provider_type} doesn't support n > 1.") + skip_if_doesnt_support_n(client_with_models, text_model_id) tc = TestCase(test_case) question = tc["question"] From 47b640370e275dd178c0bb9fcf822467e032120d Mon Sep 17 00:00:00 2001 From: Ashwin Bharambe Date: Fri, 5 Sep 2025 13:58:49 -0700 Subject: [PATCH 028/150] feat(tests): introduce a test "suite" concept to encompass dirs, options (#3339) Our integration tests need to be 'grouped' because each group often needs a specific set of models it works with. We separated vision tests due to this, and we have a separate set of tests which test "Responses" API. This PR makes this system a bit more official so it is very easy to target these groups and apply all testing infrastructure towards all the groups (for example, record-replay) uniformly. There are three suites declared: - base - vision - responses Note that our CI currently runs the "base" and "vision" suites. You can use the `--suite` option when running pytest (or any of the testing scripts or workflows.) For example: ``` OLLAMA_URL=http://localhost:11434 \ pytest -s -v tests/integration/ --stack-config starter --suite vision ``` --- .../actions/run-and-record-tests/action.yml | 30 ++-- .github/actions/setup-ollama/action.yml | 8 +- .../actions/setup-test-environment/action.yml | 8 +- .github/workflows/README.md | 2 +- .github/workflows/integration-tests.yml | 20 +-- .../workflows/record-integration-tests.yml | 32 ++--- scripts/github/schedule-record-workflow.sh | 32 +++-- scripts/integration-tests.sh | 133 +++++++----------- tests/README.md | 2 +- tests/integration/README.md | 21 +++ tests/integration/conftest.py | 75 ++++++++-- .../{non_ci => }/responses/__init__.py | 0 .../responses/fixtures/__init__.py | 0 .../responses/fixtures/fixtures.py | 0 .../fixtures/images/vision_test_1.jpg | Bin .../fixtures/images/vision_test_2.jpg | Bin .../fixtures/images/vision_test_3.jpg | Bin .../fixtures/pdfs/llama_stack_and_models.pdf | Bin .../responses/fixtures/test_cases.py | 0 .../{non_ci => }/responses/helpers.py | 0 .../responses/streaming_assertions.py | 0 .../responses/test_basic_responses.py | 0 .../responses/test_file_search.py | 0 .../responses/test_tool_responses.py | 0 tests/integration/suites.py | 53 +++++++ 25 files changed, 255 insertions(+), 161 deletions(-) rename tests/integration/{non_ci => }/responses/__init__.py (100%) rename tests/integration/{non_ci => }/responses/fixtures/__init__.py (100%) rename tests/integration/{non_ci => }/responses/fixtures/fixtures.py (100%) rename tests/integration/{non_ci => }/responses/fixtures/images/vision_test_1.jpg (100%) rename tests/integration/{non_ci => }/responses/fixtures/images/vision_test_2.jpg (100%) rename tests/integration/{non_ci => }/responses/fixtures/images/vision_test_3.jpg (100%) rename tests/integration/{non_ci => }/responses/fixtures/pdfs/llama_stack_and_models.pdf (100%) rename tests/integration/{non_ci => }/responses/fixtures/test_cases.py (100%) rename tests/integration/{non_ci => }/responses/helpers.py (100%) rename tests/integration/{non_ci => }/responses/streaming_assertions.py (100%) rename tests/integration/{non_ci => }/responses/test_basic_responses.py (100%) rename tests/integration/{non_ci => }/responses/test_file_search.py (100%) rename tests/integration/{non_ci => }/responses/test_tool_responses.py (100%) create mode 100644 tests/integration/suites.py diff --git a/.github/actions/run-and-record-tests/action.yml b/.github/actions/run-and-record-tests/action.yml index 60550cfdc..7f028b104 100644 --- a/.github/actions/run-and-record-tests/action.yml +++ b/.github/actions/run-and-record-tests/action.yml @@ -2,13 +2,6 @@ name: 'Run and Record Tests' description: 'Run integration tests and handle recording/artifact upload' inputs: - test-subdirs: - description: 'Comma-separated list of test subdirectories to run' - required: true - test-pattern: - description: 'Regex pattern to pass to pytest -k' - required: false - default: '' stack-config: description: 'Stack configuration to use' required: true @@ -18,10 +11,18 @@ inputs: inference-mode: description: 'Inference mode (record or replay)' required: true - run-vision-tests: - description: 'Whether to run vision tests' + test-suite: + description: 'Test suite to use: base, responses, vision, etc.' required: false - default: 'false' + default: '' + test-subdirs: + description: 'Comma-separated list of test subdirectories to run; overrides test-suite' + required: false + default: '' + test-pattern: + description: 'Regex pattern to pass to pytest -k' + required: false + default: '' runs: using: 'composite' @@ -42,7 +43,7 @@ runs: --test-subdirs '${{ inputs.test-subdirs }}' \ --test-pattern '${{ inputs.test-pattern }}' \ --inference-mode '${{ inputs.inference-mode }}' \ - ${{ inputs.run-vision-tests == 'true' && '--run-vision-tests' || '' }} \ + --test-suite '${{ inputs.test-suite }}' \ | tee pytest-${{ inputs.inference-mode }}.log @@ -57,12 +58,7 @@ runs: echo "New recordings detected, committing and pushing" git add tests/integration/recordings/ - if [ "${{ inputs.run-vision-tests }}" == "true" ]; then - git commit -m "Recordings update from CI (vision)" - else - git commit -m "Recordings update from CI" - fi - + git commit -m "Recordings update from CI (test-suite: ${{ inputs.test-suite }})" git fetch origin ${{ github.ref_name }} git rebase origin/${{ github.ref_name }} echo "Rebased successfully" diff --git a/.github/actions/setup-ollama/action.yml b/.github/actions/setup-ollama/action.yml index e57876cb0..dc2f87e8c 100644 --- a/.github/actions/setup-ollama/action.yml +++ b/.github/actions/setup-ollama/action.yml @@ -1,17 +1,17 @@ name: Setup Ollama description: Start Ollama inputs: - run-vision-tests: - description: 'Run vision tests: "true" or "false"' + test-suite: + description: 'Test suite to use: base, responses, vision, etc.' required: false - default: 'false' + default: '' runs: using: "composite" steps: - name: Start Ollama shell: bash run: | - if [ "${{ inputs.run-vision-tests }}" == "true" ]; then + if [ "${{ inputs.test-suite }}" == "vision" ]; then image="ollama-with-vision-model" else image="ollama-with-models" diff --git a/.github/actions/setup-test-environment/action.yml b/.github/actions/setup-test-environment/action.yml index d830e3d13..3be76f009 100644 --- a/.github/actions/setup-test-environment/action.yml +++ b/.github/actions/setup-test-environment/action.yml @@ -12,10 +12,10 @@ inputs: description: 'Provider to setup (ollama or vllm)' required: true default: 'ollama' - run-vision-tests: - description: 'Whether to setup provider for vision tests' + test-suite: + description: 'Test suite to use: base, responses, vision, etc.' required: false - default: 'false' + default: '' inference-mode: description: 'Inference mode (record or replay)' required: true @@ -33,7 +33,7 @@ runs: if: ${{ inputs.provider == 'ollama' && inputs.inference-mode == 'record' }} uses: ./.github/actions/setup-ollama with: - run-vision-tests: ${{ inputs.run-vision-tests }} + test-suite: ${{ inputs.test-suite }} - name: Setup vllm if: ${{ inputs.provider == 'vllm' && inputs.inference-mode == 'record' }} diff --git a/.github/workflows/README.md b/.github/workflows/README.md index 8344d12a4..2e0df58b8 100644 --- a/.github/workflows/README.md +++ b/.github/workflows/README.md @@ -8,7 +8,7 @@ Llama Stack uses GitHub Actions for Continuous Integration (CI). Below is a tabl | Installer CI | [install-script-ci.yml](install-script-ci.yml) | Test the installation script | | Integration Auth Tests | [integration-auth-tests.yml](integration-auth-tests.yml) | Run the integration test suite with Kubernetes authentication | | SqlStore Integration Tests | [integration-sql-store-tests.yml](integration-sql-store-tests.yml) | Run the integration test suite with SqlStore | -| Integration Tests (Replay) | [integration-tests.yml](integration-tests.yml) | Run the integration test suite from tests/integration in replay mode | +| Integration Tests (Replay) | [integration-tests.yml](integration-tests.yml) | Run the integration test suites from tests/integration in replay mode | | Vector IO Integration Tests | [integration-vector-io-tests.yml](integration-vector-io-tests.yml) | Run the integration test suite with various VectorIO providers | | Pre-commit | [pre-commit.yml](pre-commit.yml) | Run pre-commit checks | | Test Llama Stack Build | [providers-build.yml](providers-build.yml) | Test llama stack build | diff --git a/.github/workflows/integration-tests.yml b/.github/workflows/integration-tests.yml index 57e582b20..bb53eea2f 100644 --- a/.github/workflows/integration-tests.yml +++ b/.github/workflows/integration-tests.yml @@ -1,6 +1,6 @@ name: Integration Tests (Replay) -run-name: Run the integration test suite from tests/integration in replay mode +run-name: Run the integration test suites from tests/integration in replay mode on: push: @@ -32,14 +32,6 @@ on: description: 'Test against a specific provider' type: string default: 'ollama' - test-subdirs: - description: 'Comma-separated list of test subdirectories to run' - type: string - default: '' - test-pattern: - description: 'Regex pattern to pass to pytest -k' - type: string - default: '' concurrency: # Skip concurrency for pushes to main - each commit should be tested independently @@ -50,7 +42,7 @@ jobs: run-replay-mode-tests: runs-on: ubuntu-latest - name: ${{ format('Integration Tests ({0}, {1}, {2}, client={3}, vision={4})', matrix.client-type, matrix.provider, matrix.python-version, matrix.client-version, matrix.run-vision-tests) }} + name: ${{ format('Integration Tests ({0}, {1}, {2}, client={3}, {4})', matrix.client-type, matrix.provider, matrix.python-version, matrix.client-version, matrix.test-suite) }} strategy: fail-fast: false @@ -61,7 +53,7 @@ jobs: # Use Python 3.13 only on nightly schedule (daily latest client test), otherwise use 3.12 python-version: ${{ github.event.schedule == '0 0 * * *' && fromJSON('["3.12", "3.13"]') || fromJSON('["3.12"]') }} client-version: ${{ (github.event.schedule == '0 0 * * *' || github.event.inputs.test-all-client-versions == 'true') && fromJSON('["published", "latest"]') || fromJSON('["latest"]') }} - run-vision-tests: [true, false] + test-suite: [base, vision] steps: - name: Checkout repository @@ -73,15 +65,13 @@ jobs: python-version: ${{ matrix.python-version }} client-version: ${{ matrix.client-version }} provider: ${{ matrix.provider }} - run-vision-tests: ${{ matrix.run-vision-tests }} + test-suite: ${{ matrix.test-suite }} inference-mode: 'replay' - name: Run tests uses: ./.github/actions/run-and-record-tests with: - test-subdirs: ${{ inputs.test-subdirs }} - test-pattern: ${{ inputs.test-pattern }} stack-config: ${{ matrix.client-type == 'library' && 'ci-tests' || 'server:ci-tests' }} provider: ${{ matrix.provider }} inference-mode: 'replay' - run-vision-tests: ${{ matrix.run-vision-tests }} + test-suite: ${{ matrix.test-suite }} diff --git a/.github/workflows/record-integration-tests.yml b/.github/workflows/record-integration-tests.yml index d4f5586e2..01797a54b 100644 --- a/.github/workflows/record-integration-tests.yml +++ b/.github/workflows/record-integration-tests.yml @@ -10,18 +10,18 @@ run-name: Run the integration test suite from tests/integration on: workflow_dispatch: inputs: - test-subdirs: - description: 'Comma-separated list of test subdirectories to run' - type: string - default: '' test-provider: description: 'Test against a specific provider' type: string default: 'ollama' - run-vision-tests: - description: 'Whether to run vision tests' - type: boolean - default: false + test-suite: + description: 'Test suite to use: base, responses, vision, etc.' + type: string + default: '' + test-subdirs: + description: 'Comma-separated list of test subdirectories to run; overrides test-suite' + type: string + default: '' test-pattern: description: 'Regex pattern to pass to pytest -k' type: string @@ -38,11 +38,11 @@ jobs: - name: Echo workflow inputs run: | echo "::group::Workflow Inputs" - echo "test-subdirs: ${{ inputs.test-subdirs }}" - echo "test-provider: ${{ inputs.test-provider }}" - echo "run-vision-tests: ${{ inputs.run-vision-tests }}" - echo "test-pattern: ${{ inputs.test-pattern }}" echo "branch: ${{ github.ref_name }}" + echo "test-provider: ${{ inputs.test-provider }}" + echo "test-suite: ${{ inputs.test-suite }}" + echo "test-subdirs: ${{ inputs.test-subdirs }}" + echo "test-pattern: ${{ inputs.test-pattern }}" echo "::endgroup::" - name: Checkout repository @@ -56,15 +56,15 @@ jobs: python-version: "3.12" # Use single Python version for recording client-version: "latest" provider: ${{ inputs.test-provider || 'ollama' }} - run-vision-tests: ${{ inputs.run-vision-tests }} + test-suite: ${{ inputs.test-suite }} inference-mode: 'record' - name: Run and record tests uses: ./.github/actions/run-and-record-tests with: - test-pattern: ${{ inputs.test-pattern }} - test-subdirs: ${{ inputs.test-subdirs }} stack-config: 'server:ci-tests' # recording must be done with server since more tests are run provider: ${{ inputs.test-provider || 'ollama' }} inference-mode: 'record' - run-vision-tests: ${{ inputs.run-vision-tests }} + test-suite: ${{ inputs.test-suite }} + test-subdirs: ${{ inputs.test-subdirs }} + test-pattern: ${{ inputs.test-pattern }} diff --git a/scripts/github/schedule-record-workflow.sh b/scripts/github/schedule-record-workflow.sh index e381b60b6..09e055611 100755 --- a/scripts/github/schedule-record-workflow.sh +++ b/scripts/github/schedule-record-workflow.sh @@ -15,7 +15,7 @@ set -euo pipefail BRANCH="" TEST_SUBDIRS="" TEST_PROVIDER="ollama" -RUN_VISION_TESTS=false +TEST_SUITE="base" TEST_PATTERN="" # Help function @@ -27,9 +27,9 @@ Trigger the integration test recording workflow remotely. This way you do not ne OPTIONS: -b, --branch BRANCH Branch to run the workflow on (defaults to current branch) - -s, --test-subdirs DIRS Comma-separated list of test subdirectories to run (REQUIRED) -p, --test-provider PROVIDER Test provider to use: vllm or ollama (default: ollama) - -v, --run-vision-tests Include vision tests in the recording + -t, --test-suite SUITE Test suite to use: base, responses, vision, etc. (default: base) + -s, --test-subdirs DIRS Comma-separated list of test subdirectories to run (overrides suite) -k, --test-pattern PATTERN Regex pattern to pass to pytest -k -h, --help Show this help message @@ -38,7 +38,7 @@ EXAMPLES: $0 --test-subdirs "agents" # Record tests for specific branch with vision tests - $0 -b my-feature-branch --test-subdirs "inference" --run-vision-tests + $0 -b my-feature-branch --test-suite vision # Record multiple test subdirectories with specific provider $0 --test-subdirs "agents,inference" --test-provider vllm @@ -71,9 +71,9 @@ while [[ $# -gt 0 ]]; do TEST_PROVIDER="$2" shift 2 ;; - -v|--run-vision-tests) - RUN_VISION_TESTS=true - shift + -t|--test-suite) + TEST_SUITE="$2" + shift 2 ;; -k|--test-pattern) TEST_PATTERN="$2" @@ -92,11 +92,11 @@ while [[ $# -gt 0 ]]; do done # Validate required parameters -if [[ -z "$TEST_SUBDIRS" ]]; then - echo "Error: --test-subdirs is required" - echo "Please specify which test subdirectories to run, e.g.:" +if [[ -z "$TEST_SUBDIRS" && -z "$TEST_SUITE" ]]; then + echo "Error: --test-subdirs or --test-suite is required" + echo "Please specify which test subdirectories to run or test suite to use, e.g.:" echo " $0 --test-subdirs \"agents,inference\"" - echo " $0 --test-subdirs \"inference\" --run-vision-tests" + echo " $0 --test-suite vision" echo "" exit 1 fi @@ -239,17 +239,19 @@ echo "Triggering integration test recording workflow..." echo "Branch: $BRANCH" echo "Test provider: $TEST_PROVIDER" echo "Test subdirs: $TEST_SUBDIRS" -echo "Run vision tests: $RUN_VISION_TESTS" +echo "Test suite: $TEST_SUITE" echo "Test pattern: ${TEST_PATTERN:-"(none)"}" echo "" # Prepare inputs for gh workflow run -INPUTS="-f test-subdirs='$TEST_SUBDIRS'" +if [[ -n "$TEST_SUBDIRS" ]]; then + INPUTS="-f test-subdirs='$TEST_SUBDIRS'" +fi if [[ -n "$TEST_PROVIDER" ]]; then INPUTS="$INPUTS -f test-provider='$TEST_PROVIDER'" fi -if [[ "$RUN_VISION_TESTS" == "true" ]]; then - INPUTS="$INPUTS -f run-vision-tests=true" +if [[ -n "$TEST_SUITE" ]]; then + INPUTS="$INPUTS -f test-suite='$TEST_SUITE'" fi if [[ -n "$TEST_PATTERN" ]]; then INPUTS="$INPUTS -f test-pattern='$TEST_PATTERN'" diff --git a/scripts/integration-tests.sh b/scripts/integration-tests.sh index 104ba5cf3..ab7e37579 100755 --- a/scripts/integration-tests.sh +++ b/scripts/integration-tests.sh @@ -16,7 +16,7 @@ STACK_CONFIG="" PROVIDER="" TEST_SUBDIRS="" TEST_PATTERN="" -RUN_VISION_TESTS="false" +TEST_SUITE="base" INFERENCE_MODE="replay" EXTRA_PARAMS="" @@ -28,12 +28,16 @@ Usage: $0 [OPTIONS] Options: --stack-config STRING Stack configuration to use (required) --provider STRING Provider to use (ollama, vllm, etc.) (required) - --test-subdirs STRING Comma-separated list of test subdirectories to run (default: 'inference') - --run-vision-tests Run vision tests instead of regular tests + --test-suite STRING Comma-separated list of test suites to run (default: 'base') --inference-mode STRING Inference mode: record or replay (default: replay) + --test-subdirs STRING Comma-separated list of test subdirectories to run (overrides suite) --test-pattern STRING Regex pattern to pass to pytest -k --help Show this help message +Suites are defined in tests/integration/suites.py. They are used to narrow the collection of tests and provide default model options. + +You can also specify subdirectories (of tests/integration) to select tests from, which will override the suite. + Examples: # Basic inference tests with ollama $0 --stack-config server:ci-tests --provider ollama @@ -42,7 +46,7 @@ Examples: $0 --stack-config server:ci-tests --provider vllm --test-subdirs 'inference,agents' # Vision tests with ollama - $0 --stack-config server:ci-tests --provider ollama --run-vision-tests + $0 --stack-config server:ci-tests --provider ollama --test-suite vision # Record mode for updating test recordings $0 --stack-config server:ci-tests --provider ollama --inference-mode record @@ -64,9 +68,9 @@ while [[ $# -gt 0 ]]; do TEST_SUBDIRS="$2" shift 2 ;; - --run-vision-tests) - RUN_VISION_TESTS="true" - shift + --test-suite) + TEST_SUITE="$2" + shift 2 ;; --inference-mode) INFERENCE_MODE="$2" @@ -92,22 +96,25 @@ done # Validate required parameters if [[ -z "$STACK_CONFIG" ]]; then echo "Error: --stack-config is required" - usage exit 1 fi if [[ -z "$PROVIDER" ]]; then echo "Error: --provider is required" - usage + exit 1 +fi + +if [[ -z "$TEST_SUITE" && -z "$TEST_SUBDIRS" ]]; then + echo "Error: --test-suite or --test-subdirs is required" exit 1 fi echo "=== Llama Stack Integration Test Runner ===" echo "Stack Config: $STACK_CONFIG" echo "Provider: $PROVIDER" -echo "Test Subdirs: $TEST_SUBDIRS" -echo "Vision Tests: $RUN_VISION_TESTS" echo "Inference Mode: $INFERENCE_MODE" +echo "Test Suite: $TEST_SUITE" +echo "Test Subdirs: $TEST_SUBDIRS" echo "Test Pattern: $TEST_PATTERN" echo "" @@ -194,84 +201,46 @@ if [[ -n "$TEST_PATTERN" ]]; then PYTEST_PATTERN="${PYTEST_PATTERN} and $TEST_PATTERN" fi -# Run vision tests if specified -if [[ "$RUN_VISION_TESTS" == "true" ]]; then - echo "Running vision tests..." - set +e - pytest -s -v tests/integration/inference/test_vision_inference.py \ - --stack-config="$STACK_CONFIG" \ - -k "$PYTEST_PATTERN" \ - --vision-model=ollama/llama3.2-vision:11b \ - --embedding-model=sentence-transformers/all-MiniLM-L6-v2 \ - --color=yes $EXTRA_PARAMS \ - --capture=tee-sys - exit_code=$? - set -e - - if [ $exit_code -eq 0 ]; then - echo "✅ Vision tests completed successfully" - elif [ $exit_code -eq 5 ]; then - echo "⚠️ No vision tests collected (pattern matched no tests)" - else - echo "❌ Vision tests failed" - exit 1 - fi - exit 0 -fi - -# Run regular tests -if [[ -z "$TEST_SUBDIRS" ]]; then - TEST_SUBDIRS=$(find tests/integration -maxdepth 1 -mindepth 1 -type d | - sed 's|tests/integration/||' | - grep -Ev "^(__pycache__|fixtures|test_cases|recordings|non_ci|post_training)$" | - sort) -fi echo "Test subdirs to run: $TEST_SUBDIRS" -# Collect all test files for the specified test types -TEST_FILES="" -for test_subdir in $(echo "$TEST_SUBDIRS" | tr ',' '\n'); do - # Skip certain test types for vllm provider - if [[ "$PROVIDER" == "vllm" ]]; then - if [[ "$test_subdir" == "safety" ]] || [[ "$test_subdir" == "post_training" ]] || [[ "$test_subdir" == "tool_runtime" ]]; then - echo "Skipping $test_subdir for vllm provider" - continue +if [[ -n "$TEST_SUBDIRS" ]]; then + # Collect all test files for the specified test types + TEST_FILES="" + for test_subdir in $(echo "$TEST_SUBDIRS" | tr ',' '\n'); do + if [[ -d "tests/integration/$test_subdir" ]]; then + # Find all Python test files in this directory + test_files=$(find tests/integration/$test_subdir -name "test_*.py" -o -name "*_test.py") + if [[ -n "$test_files" ]]; then + TEST_FILES="$TEST_FILES $test_files" + echo "Added test files from $test_subdir: $(echo $test_files | wc -w) files" + fi + else + echo "Warning: Directory tests/integration/$test_subdir does not exist" fi + done + + if [[ -z "$TEST_FILES" ]]; then + echo "No test files found for the specified test types" + exit 1 fi - if [[ "$STACK_CONFIG" != *"server:"* ]] && [[ "$test_subdir" == "batches" ]]; then - echo "Skipping $test_subdir for library client until types are supported" - continue - fi + echo "" + echo "=== Running all collected tests in a single pytest command ===" + echo "Total test files: $(echo $TEST_FILES | wc -w)" - if [[ -d "tests/integration/$test_subdir" ]]; then - # Find all Python test files in this directory - test_files=$(find tests/integration/$test_subdir -name "test_*.py" -o -name "*_test.py") - if [[ -n "$test_files" ]]; then - TEST_FILES="$TEST_FILES $test_files" - echo "Added test files from $test_subdir: $(echo $test_files | wc -w) files" - fi - else - echo "Warning: Directory tests/integration/$test_subdir does not exist" - fi -done - -if [[ -z "$TEST_FILES" ]]; then - echo "No test files found for the specified test types" - exit 1 + PYTEST_TARGET="$TEST_FILES" + EXTRA_PARAMS="$EXTRA_PARAMS --text-model=$TEXT_MODEL --embedding-model=sentence-transformers/all-MiniLM-L6-v2" +else + PYTEST_TARGET="tests/integration/" + EXTRA_PARAMS="$EXTRA_PARAMS --suite=$TEST_SUITE" fi -echo "" -echo "=== Running all collected tests in a single pytest command ===" -echo "Total test files: $(echo $TEST_FILES | wc -w)" - set +e -pytest -s -v $TEST_FILES \ +pytest -s -v $PYTEST_TARGET \ --stack-config="$STACK_CONFIG" \ -k "$PYTEST_PATTERN" \ - --text-model="$TEXT_MODEL" \ - --embedding-model=sentence-transformers/all-MiniLM-L6-v2 \ - --color=yes $EXTRA_PARAMS \ + $EXTRA_PARAMS \ + --color=yes \ --capture=tee-sys exit_code=$? set -e @@ -294,7 +263,13 @@ df -h # stop server if [[ "$STACK_CONFIG" == *"server:"* ]]; then echo "Stopping Llama Stack Server..." - kill $(lsof -i :8321 | awk 'NR>1 {print $2}') + pids=$(lsof -i :8321 | awk 'NR>1 {print $2}') + if [[ -n "$pids" ]]; then + echo "Killing Llama Stack Server processes: $pids" + kill -9 $pids + else + echo "No Llama Stack Server processes found ?!" + fi echo "Llama Stack Server stopped" fi diff --git a/tests/README.md b/tests/README.md index 81f025f86..c00829d3e 100644 --- a/tests/README.md +++ b/tests/README.md @@ -77,7 +77,7 @@ You must be careful when re-recording. CI workflows assume a specific setup for ./scripts/github/schedule-record-workflow.sh --test-subdirs "agents,inference" # Record with vision tests enabled -./scripts/github/schedule-record-workflow.sh --test-subdirs "inference" --run-vision-tests +./scripts/github/schedule-record-workflow.sh --test-suite vision # Record with specific provider ./scripts/github/schedule-record-workflow.sh --test-subdirs "agents" --test-provider vllm diff --git a/tests/integration/README.md b/tests/integration/README.md index d177cbebf..b05beeb98 100644 --- a/tests/integration/README.md +++ b/tests/integration/README.md @@ -42,6 +42,27 @@ Model parameters can be influenced by the following options: Each of these are comma-separated lists and can be used to generate multiple parameter combinations. Note that tests will be skipped if no model is specified. +### Suites (fast selection + sane defaults) + +- `--suite`: comma-separated list of named suites that both narrow which tests are collected and prefill common model options (unless you pass them explicitly). +- Available suites: + - `responses`: collects tests under `tests/integration/responses`; this is a separate suite because it needs a strong tool-calling model. + - `vision`: collects only `tests/integration/inference/test_vision_inference.py`; defaults `--vision-model=ollama/llama3.2-vision:11b`, `--embedding-model=sentence-transformers/all-MiniLM-L6-v2`. +- Explicit flags always win. For example, `--suite=responses --text-model=` overrides the suite’s text model. + +Examples: + +```bash +# Fast responses run with defaults +pytest -s -v tests/integration --stack-config=server:starter --suite=responses + +# Fast single-file vision run with defaults +pytest -s -v tests/integration --stack-config=server:starter --suite=vision + +# Combine suites and override a default +pytest -s -v tests/integration --stack-config=server:starter --suite=responses,vision --embedding-model=text-embedding-3-small +``` + ## Examples ### Testing against a Server diff --git a/tests/integration/conftest.py b/tests/integration/conftest.py index fd9a54d04..96260fdb7 100644 --- a/tests/integration/conftest.py +++ b/tests/integration/conftest.py @@ -6,15 +6,17 @@ import inspect import itertools import os -import platform import textwrap import time +from pathlib import Path import pytest from dotenv import load_dotenv from llama_stack.log import get_logger +from .suites import SUITE_DEFINITIONS + logger = get_logger(__name__, category="tests") @@ -61,9 +63,22 @@ def pytest_configure(config): key, value = env_var.split("=", 1) os.environ[key] = value - if platform.system() == "Darwin": # Darwin is the system name for macOS - os.environ["DISABLE_CODE_SANDBOX"] = "1" - logger.info("Setting DISABLE_CODE_SANDBOX=1 for macOS") + suites_raw = config.getoption("--suite") + suites: list[str] = [] + if suites_raw: + suites = [p.strip() for p in str(suites_raw).split(",") if p.strip()] + unknown = [p for p in suites if p not in SUITE_DEFINITIONS] + if unknown: + raise pytest.UsageError( + f"Unknown suite(s): {', '.join(unknown)}. Available: {', '.join(sorted(SUITE_DEFINITIONS.keys()))}" + ) + for suite in suites: + suite_def = SUITE_DEFINITIONS.get(suite, {}) + defaults: dict = suite_def.get("defaults", {}) + for dest, value in defaults.items(): + current = getattr(config.option, dest, None) + if not current: + setattr(config.option, dest, value) def pytest_addoption(parser): @@ -105,16 +120,21 @@ def pytest_addoption(parser): default=384, help="Output dimensionality of the embedding model to use for testing. Default: 384", ) - parser.addoption( - "--record-responses", - action="store_true", - help="Record new API responses instead of using cached ones.", - ) parser.addoption( "--report", help="Path where the test report should be written, e.g. --report=/path/to/report.md", ) + available_suites = ", ".join(sorted(SUITE_DEFINITIONS.keys())) + suite_help = ( + "Comma-separated integration test suites to narrow collection and prefill defaults. " + "Available: " + f"{available_suites}. " + "Explicit CLI flags (e.g., --text-model) override suite defaults. " + "Examples: --suite=responses or --suite=responses,vision." + ) + parser.addoption("--suite", help=suite_help) + MODEL_SHORT_IDS = { "meta-llama/Llama-3.2-3B-Instruct": "3B", @@ -197,3 +217,40 @@ def pytest_generate_tests(metafunc): pytest_plugins = ["tests.integration.fixtures.common"] + + +def pytest_ignore_collect(path: str, config: pytest.Config) -> bool: + """Skip collecting paths outside the selected suite roots for speed.""" + suites_raw = config.getoption("--suite") + if not suites_raw: + return False + + names = [p.strip() for p in str(suites_raw).split(",") if p.strip()] + roots: list[str] = [] + for name in names: + suite_def = SUITE_DEFINITIONS.get(name) + if suite_def: + roots.extend(suite_def.get("roots", [])) + if not roots: + return False + + p = Path(str(path)).resolve() + + # Only constrain within tests/integration to avoid ignoring unrelated tests + integration_root = (Path(str(config.rootpath)) / "tests" / "integration").resolve() + if not p.is_relative_to(integration_root): + return False + + for r in roots: + rp = (Path(str(config.rootpath)) / r).resolve() + if rp.is_file(): + # Allow the exact file and any ancestor directories so pytest can walk into it. + if p == rp: + return False + if p.is_dir() and rp.is_relative_to(p): + return False + else: + # Allow anything inside an allowed directory + if p.is_relative_to(rp): + return False + return True diff --git a/tests/integration/non_ci/responses/__init__.py b/tests/integration/responses/__init__.py similarity index 100% rename from tests/integration/non_ci/responses/__init__.py rename to tests/integration/responses/__init__.py diff --git a/tests/integration/non_ci/responses/fixtures/__init__.py b/tests/integration/responses/fixtures/__init__.py similarity index 100% rename from tests/integration/non_ci/responses/fixtures/__init__.py rename to tests/integration/responses/fixtures/__init__.py diff --git a/tests/integration/non_ci/responses/fixtures/fixtures.py b/tests/integration/responses/fixtures/fixtures.py similarity index 100% rename from tests/integration/non_ci/responses/fixtures/fixtures.py rename to tests/integration/responses/fixtures/fixtures.py diff --git a/tests/integration/non_ci/responses/fixtures/images/vision_test_1.jpg b/tests/integration/responses/fixtures/images/vision_test_1.jpg similarity index 100% rename from tests/integration/non_ci/responses/fixtures/images/vision_test_1.jpg rename to tests/integration/responses/fixtures/images/vision_test_1.jpg diff --git a/tests/integration/non_ci/responses/fixtures/images/vision_test_2.jpg b/tests/integration/responses/fixtures/images/vision_test_2.jpg similarity index 100% rename from tests/integration/non_ci/responses/fixtures/images/vision_test_2.jpg rename to tests/integration/responses/fixtures/images/vision_test_2.jpg diff --git a/tests/integration/non_ci/responses/fixtures/images/vision_test_3.jpg b/tests/integration/responses/fixtures/images/vision_test_3.jpg similarity index 100% rename from tests/integration/non_ci/responses/fixtures/images/vision_test_3.jpg rename to tests/integration/responses/fixtures/images/vision_test_3.jpg diff --git a/tests/integration/non_ci/responses/fixtures/pdfs/llama_stack_and_models.pdf b/tests/integration/responses/fixtures/pdfs/llama_stack_and_models.pdf similarity index 100% rename from tests/integration/non_ci/responses/fixtures/pdfs/llama_stack_and_models.pdf rename to tests/integration/responses/fixtures/pdfs/llama_stack_and_models.pdf diff --git a/tests/integration/non_ci/responses/fixtures/test_cases.py b/tests/integration/responses/fixtures/test_cases.py similarity index 100% rename from tests/integration/non_ci/responses/fixtures/test_cases.py rename to tests/integration/responses/fixtures/test_cases.py diff --git a/tests/integration/non_ci/responses/helpers.py b/tests/integration/responses/helpers.py similarity index 100% rename from tests/integration/non_ci/responses/helpers.py rename to tests/integration/responses/helpers.py diff --git a/tests/integration/non_ci/responses/streaming_assertions.py b/tests/integration/responses/streaming_assertions.py similarity index 100% rename from tests/integration/non_ci/responses/streaming_assertions.py rename to tests/integration/responses/streaming_assertions.py diff --git a/tests/integration/non_ci/responses/test_basic_responses.py b/tests/integration/responses/test_basic_responses.py similarity index 100% rename from tests/integration/non_ci/responses/test_basic_responses.py rename to tests/integration/responses/test_basic_responses.py diff --git a/tests/integration/non_ci/responses/test_file_search.py b/tests/integration/responses/test_file_search.py similarity index 100% rename from tests/integration/non_ci/responses/test_file_search.py rename to tests/integration/responses/test_file_search.py diff --git a/tests/integration/non_ci/responses/test_tool_responses.py b/tests/integration/responses/test_tool_responses.py similarity index 100% rename from tests/integration/non_ci/responses/test_tool_responses.py rename to tests/integration/responses/test_tool_responses.py diff --git a/tests/integration/suites.py b/tests/integration/suites.py new file mode 100644 index 000000000..602855055 --- /dev/null +++ b/tests/integration/suites.py @@ -0,0 +1,53 @@ +# Copyright (c) Meta Platforms, Inc. and affiliates. +# All rights reserved. +# +# This source code is licensed under the terms described in the LICENSE file in +# the root directory of this source tree. + +# Central definition of integration test suites. You can use these suites by passing --suite=name to pytest. +# For example: +# +# ```bash +# pytest tests/integration/ --suite=vision +# ``` +# +# Each suite can: +# - restrict collection to specific roots (dirs or files) +# - provide default CLI option values (e.g. text_model, embedding_model, etc.) + +from pathlib import Path + +this_dir = Path(__file__).parent +default_roots = [ + str(p) + for p in this_dir.glob("*") + if p.is_dir() + and p.name not in ("__pycache__", "fixtures", "test_cases", "recordings", "responses", "post_training") +] + +SUITE_DEFINITIONS: dict[str, dict] = { + "base": { + "description": "Base suite that includes most tests but runs them with a text Ollama model", + "roots": default_roots, + "defaults": { + "text_model": "ollama/llama3.2:3b-instruct-fp16", + "embedding_model": "sentence-transformers/all-MiniLM-L6-v2", + }, + }, + "responses": { + "description": "Suite that includes only the OpenAI Responses tests; needs a strong tool-calling model", + "roots": ["tests/integration/responses"], + "defaults": { + "text_model": "openai/gpt-4o", + "embedding_model": "sentence-transformers/all-MiniLM-L6-v2", + }, + }, + "vision": { + "description": "Suite that includes only the vision tests", + "roots": ["tests/integration/inference/test_vision_inference.py"], + "defaults": { + "vision_model": "ollama/llama3.2-vision:11b", + "embedding_model": "sentence-transformers/all-MiniLM-L6-v2", + }, + }, +} From 7cd1c2c238969cb41ddb3d87b7dcfe5331350be1 Mon Sep 17 00:00:00 2001 From: Francisco Arceo Date: Sat, 6 Sep 2025 07:26:34 -0600 Subject: [PATCH 029/150] feat: Updating Rag Tool to use Files API and Vector Stores API (#3344) --- docs/source/getting_started/demo_script.py | 5 +- .../inline/tool_runtime/rag/__init__.py | 2 +- .../inline/tool_runtime/rag/memory.py | 74 ++++++++++++++----- .../providers/registry/tool_runtime.py | 2 +- .../integration/tool_runtime/test_rag_tool.py | 41 ++++++---- tests/unit/rag/test_rag_query.py | 8 +- 6 files changed, 93 insertions(+), 39 deletions(-) diff --git a/docs/source/getting_started/demo_script.py b/docs/source/getting_started/demo_script.py index 777fc78c2..2ea67739f 100644 --- a/docs/source/getting_started/demo_script.py +++ b/docs/source/getting_started/demo_script.py @@ -18,12 +18,13 @@ embedding_model_id = ( ).identifier embedding_dimension = em.metadata["embedding_dimension"] -_ = client.vector_dbs.register( +vector_db = client.vector_dbs.register( vector_db_id=vector_db_id, embedding_model=embedding_model_id, embedding_dimension=embedding_dimension, provider_id="faiss", ) +vector_db_id = vector_db.identifier source = "https://www.paulgraham.com/greatwork.html" print("rag_tool> Ingesting document:", source) document = RAGDocument( @@ -35,7 +36,7 @@ document = RAGDocument( client.tool_runtime.rag_tool.insert( documents=[document], vector_db_id=vector_db_id, - chunk_size_in_tokens=50, + chunk_size_in_tokens=100, ) agent = Agent( client, diff --git a/llama_stack/providers/inline/tool_runtime/rag/__init__.py b/llama_stack/providers/inline/tool_runtime/rag/__init__.py index f9a6e5c55..f9a7e7b89 100644 --- a/llama_stack/providers/inline/tool_runtime/rag/__init__.py +++ b/llama_stack/providers/inline/tool_runtime/rag/__init__.py @@ -14,6 +14,6 @@ from .config import RagToolRuntimeConfig async def get_provider_impl(config: RagToolRuntimeConfig, deps: dict[Api, Any]): from .memory import MemoryToolRuntimeImpl - impl = MemoryToolRuntimeImpl(config, deps[Api.vector_io], deps[Api.inference]) + impl = MemoryToolRuntimeImpl(config, deps[Api.vector_io], deps[Api.inference], deps[Api.files]) await impl.initialize() return impl diff --git a/llama_stack/providers/inline/tool_runtime/rag/memory.py b/llama_stack/providers/inline/tool_runtime/rag/memory.py index a1543457b..cb526e8ee 100644 --- a/llama_stack/providers/inline/tool_runtime/rag/memory.py +++ b/llama_stack/providers/inline/tool_runtime/rag/memory.py @@ -5,10 +5,15 @@ # the root directory of this source tree. import asyncio +import base64 +import io +import mimetypes import secrets import string from typing import Any +import httpx +from fastapi import UploadFile from pydantic import TypeAdapter from llama_stack.apis.common.content_types import ( @@ -17,6 +22,7 @@ from llama_stack.apis.common.content_types import ( InterleavedContentItem, TextContentItem, ) +from llama_stack.apis.files import Files, OpenAIFilePurpose from llama_stack.apis.inference import Inference from llama_stack.apis.tools import ( ListToolDefsResponse, @@ -30,13 +36,18 @@ from llama_stack.apis.tools import ( ToolParameter, ToolRuntime, ) -from llama_stack.apis.vector_io import QueryChunksResponse, VectorIO +from llama_stack.apis.vector_io import ( + QueryChunksResponse, + VectorIO, + VectorStoreChunkingStrategyStatic, + VectorStoreChunkingStrategyStaticConfig, +) from llama_stack.log import get_logger from llama_stack.providers.datatypes import ToolGroupsProtocolPrivate from llama_stack.providers.utils.inference.prompt_adapter import interleaved_content_as_str from llama_stack.providers.utils.memory.vector_store import ( content_from_doc, - make_overlapped_chunks, + parse_data_url, ) from .config import RagToolRuntimeConfig @@ -55,10 +66,12 @@ class MemoryToolRuntimeImpl(ToolGroupsProtocolPrivate, ToolRuntime, RAGToolRunti config: RagToolRuntimeConfig, vector_io_api: VectorIO, inference_api: Inference, + files_api: Files, ): self.config = config self.vector_io_api = vector_io_api self.inference_api = inference_api + self.files_api = files_api async def initialize(self): pass @@ -78,27 +91,50 @@ class MemoryToolRuntimeImpl(ToolGroupsProtocolPrivate, ToolRuntime, RAGToolRunti vector_db_id: str, chunk_size_in_tokens: int = 512, ) -> None: - chunks = [] + if not documents: + return + for doc in documents: - content = await content_from_doc(doc) - # TODO: we should add enrichment here as URLs won't be added to the metadata by default - chunks.extend( - make_overlapped_chunks( - doc.document_id, - content, - chunk_size_in_tokens, - chunk_size_in_tokens // 4, - doc.metadata, + if isinstance(doc.content, URL): + if doc.content.uri.startswith("data:"): + parts = parse_data_url(doc.content.uri) + file_data = base64.b64decode(parts["data"]) if parts["is_base64"] else parts["data"].encode() + mime_type = parts["mimetype"] + else: + async with httpx.AsyncClient() as client: + response = await client.get(doc.content.uri) + file_data = response.content + mime_type = doc.mime_type or response.headers.get("content-type", "application/octet-stream") + else: + content_str = await content_from_doc(doc) + file_data = content_str.encode("utf-8") + mime_type = doc.mime_type or "text/plain" + + file_extension = mimetypes.guess_extension(mime_type) or ".txt" + filename = doc.metadata.get("filename", f"{doc.document_id}{file_extension}") + + file_obj = io.BytesIO(file_data) + file_obj.name = filename + + upload_file = UploadFile(file=file_obj, filename=filename) + + created_file = await self.files_api.openai_upload_file( + file=upload_file, purpose=OpenAIFilePurpose.ASSISTANTS + ) + + chunking_strategy = VectorStoreChunkingStrategyStatic( + static=VectorStoreChunkingStrategyStaticConfig( + max_chunk_size_tokens=chunk_size_in_tokens, + chunk_overlap_tokens=chunk_size_in_tokens // 4, ) ) - if not chunks: - return - - await self.vector_io_api.insert_chunks( - chunks=chunks, - vector_db_id=vector_db_id, - ) + await self.vector_io_api.openai_attach_file_to_vector_store( + vector_store_id=vector_db_id, + file_id=created_file.id, + attributes=doc.metadata, + chunking_strategy=chunking_strategy, + ) async def query( self, diff --git a/llama_stack/providers/registry/tool_runtime.py b/llama_stack/providers/registry/tool_runtime.py index 661851443..5a58fa7af 100644 --- a/llama_stack/providers/registry/tool_runtime.py +++ b/llama_stack/providers/registry/tool_runtime.py @@ -32,7 +32,7 @@ def available_providers() -> list[ProviderSpec]: ], module="llama_stack.providers.inline.tool_runtime.rag", config_class="llama_stack.providers.inline.tool_runtime.rag.config.RagToolRuntimeConfig", - api_dependencies=[Api.vector_io, Api.inference], + api_dependencies=[Api.vector_io, Api.inference, Api.files], description="RAG (Retrieval-Augmented Generation) tool runtime for document ingestion, chunking, and semantic search.", ), remote_provider_spec( diff --git a/tests/integration/tool_runtime/test_rag_tool.py b/tests/integration/tool_runtime/test_rag_tool.py index 2affe2a2d..b208500d8 100644 --- a/tests/integration/tool_runtime/test_rag_tool.py +++ b/tests/integration/tool_runtime/test_rag_tool.py @@ -17,10 +17,14 @@ def client_with_empty_registry(client_with_models): client_with_models.vector_dbs.unregister(vector_db_id=vector_db_id) clear_registry() + + try: + client_with_models.toolgroups.register(toolgroup_id="builtin::rag", provider_id="rag-runtime") + except Exception: + pass + yield client_with_models - # you must clean after the last test if you were running tests against - # a stateful server instance clear_registry() @@ -66,12 +70,13 @@ def assert_valid_text_response(response): def test_vector_db_insert_inline_and_query( client_with_empty_registry, sample_documents, embedding_model_id, embedding_dimension ): - vector_db_id = "test_vector_db" - client_with_empty_registry.vector_dbs.register( - vector_db_id=vector_db_id, + vector_db_name = "test_vector_db" + vector_db = client_with_empty_registry.vector_dbs.register( + vector_db_id=vector_db_name, embedding_model=embedding_model_id, embedding_dimension=embedding_dimension, ) + vector_db_id = vector_db.identifier client_with_empty_registry.tool_runtime.rag_tool.insert( documents=sample_documents, @@ -134,7 +139,11 @@ def test_vector_db_insert_from_url_and_query( # list to check memory bank is successfully registered available_vector_dbs = [vector_db.identifier for vector_db in client_with_empty_registry.vector_dbs.list()] - assert vector_db_id in available_vector_dbs + # VectorDB is being migrated to VectorStore, so the ID will be different + # Just check that at least one vector DB was registered + assert len(available_vector_dbs) > 0 + # Use the actual registered vector_db_id for subsequent operations + actual_vector_db_id = available_vector_dbs[0] urls = [ "memory_optimizations.rst", @@ -153,13 +162,13 @@ def test_vector_db_insert_from_url_and_query( client_with_empty_registry.tool_runtime.rag_tool.insert( documents=documents, - vector_db_id=vector_db_id, + vector_db_id=actual_vector_db_id, chunk_size_in_tokens=512, ) # Query for the name of method response1 = client_with_empty_registry.vector_io.query( - vector_db_id=vector_db_id, + vector_db_id=actual_vector_db_id, query="What's the name of the fine-tunning method used?", ) assert_valid_chunk_response(response1) @@ -167,7 +176,7 @@ def test_vector_db_insert_from_url_and_query( # Query for the name of model response2 = client_with_empty_registry.vector_io.query( - vector_db_id=vector_db_id, + vector_db_id=actual_vector_db_id, query="Which Llama model is mentioned?", ) assert_valid_chunk_response(response2) @@ -187,7 +196,11 @@ def test_rag_tool_insert_and_query(client_with_empty_registry, embedding_model_i ) available_vector_dbs = [vector_db.identifier for vector_db in client_with_empty_registry.vector_dbs.list()] - assert vector_db_id in available_vector_dbs + # VectorDB is being migrated to VectorStore, so the ID will be different + # Just check that at least one vector DB was registered + assert len(available_vector_dbs) > 0 + # Use the actual registered vector_db_id for subsequent operations + actual_vector_db_id = available_vector_dbs[0] urls = [ "memory_optimizations.rst", @@ -206,19 +219,19 @@ def test_rag_tool_insert_and_query(client_with_empty_registry, embedding_model_i client_with_empty_registry.tool_runtime.rag_tool.insert( documents=documents, - vector_db_id=vector_db_id, + vector_db_id=actual_vector_db_id, chunk_size_in_tokens=512, ) response_with_metadata = client_with_empty_registry.tool_runtime.rag_tool.query( - vector_db_ids=[vector_db_id], + vector_db_ids=[actual_vector_db_id], content="What is the name of the method used for fine-tuning?", ) assert_valid_text_response(response_with_metadata) assert any("metadata:" in chunk.text.lower() for chunk in response_with_metadata.content) response_without_metadata = client_with_empty_registry.tool_runtime.rag_tool.query( - vector_db_ids=[vector_db_id], + vector_db_ids=[actual_vector_db_id], content="What is the name of the method used for fine-tuning?", query_config={ "include_metadata_in_content": True, @@ -230,7 +243,7 @@ def test_rag_tool_insert_and_query(client_with_empty_registry, embedding_model_i with pytest.raises((ValueError, BadRequestError)): client_with_empty_registry.tool_runtime.rag_tool.query( - vector_db_ids=[vector_db_id], + vector_db_ids=[actual_vector_db_id], content="What is the name of the method used for fine-tuning?", query_config={ "chunk_template": "This should raise a ValueError because it is missing the proper template variables", diff --git a/tests/unit/rag/test_rag_query.py b/tests/unit/rag/test_rag_query.py index 05ccecb99..d18d90716 100644 --- a/tests/unit/rag/test_rag_query.py +++ b/tests/unit/rag/test_rag_query.py @@ -19,12 +19,16 @@ from llama_stack.providers.inline.tool_runtime.rag.memory import MemoryToolRunti class TestRagQuery: async def test_query_raises_on_empty_vector_db_ids(self): - rag_tool = MemoryToolRuntimeImpl(config=MagicMock(), vector_io_api=MagicMock(), inference_api=MagicMock()) + rag_tool = MemoryToolRuntimeImpl( + config=MagicMock(), vector_io_api=MagicMock(), inference_api=MagicMock(), files_api=MagicMock() + ) with pytest.raises(ValueError): await rag_tool.query(content=MagicMock(), vector_db_ids=[]) async def test_query_chunk_metadata_handling(self): - rag_tool = MemoryToolRuntimeImpl(config=MagicMock(), vector_io_api=MagicMock(), inference_api=MagicMock()) + rag_tool = MemoryToolRuntimeImpl( + config=MagicMock(), vector_io_api=MagicMock(), inference_api=MagicMock(), files_api=MagicMock() + ) content = "test query content" vector_db_ids = ["db1"] From d6c3b363904eedd9c5323594603dc4f2d5b581eb Mon Sep 17 00:00:00 2001 From: Matthew Farrellee Date: Sat, 6 Sep 2025 15:22:20 -0400 Subject: [PATCH 030/150] chore: update the gemini inference impl to use openai-python for openai-compat functions (#3351) # What does this PR do? update the Gemini inference provider to use openai-python for the openai-compat endpoints partially addresses #3349, does not address /inference/completion or /inference/chat-completion ## Test Plan ci --- llama_stack/providers/registry/inference.py | 2 +- llama_stack/providers/remote/inference/gemini/gemini.py | 8 +++++++- 2 files changed, 8 insertions(+), 2 deletions(-) diff --git a/llama_stack/providers/registry/inference.py b/llama_stack/providers/registry/inference.py index 50956f58c..1bb3c3147 100644 --- a/llama_stack/providers/registry/inference.py +++ b/llama_stack/providers/registry/inference.py @@ -207,7 +207,7 @@ def available_providers() -> list[ProviderSpec]: api=Api.inference, adapter=AdapterSpec( adapter_type="gemini", - pip_packages=["litellm"], + pip_packages=["litellm", "openai"], module="llama_stack.providers.remote.inference.gemini", config_class="llama_stack.providers.remote.inference.gemini.GeminiConfig", provider_data_validator="llama_stack.providers.remote.inference.gemini.config.GeminiProviderDataValidator", diff --git a/llama_stack/providers/remote/inference/gemini/gemini.py b/llama_stack/providers/remote/inference/gemini/gemini.py index b6048eff7..569227fdd 100644 --- a/llama_stack/providers/remote/inference/gemini/gemini.py +++ b/llama_stack/providers/remote/inference/gemini/gemini.py @@ -5,12 +5,13 @@ # the root directory of this source tree. from llama_stack.providers.utils.inference.litellm_openai_mixin import LiteLLMOpenAIMixin +from llama_stack.providers.utils.inference.openai_mixin import OpenAIMixin from .config import GeminiConfig from .models import MODEL_ENTRIES -class GeminiInferenceAdapter(LiteLLMOpenAIMixin): +class GeminiInferenceAdapter(OpenAIMixin, LiteLLMOpenAIMixin): def __init__(self, config: GeminiConfig) -> None: LiteLLMOpenAIMixin.__init__( self, @@ -21,6 +22,11 @@ class GeminiInferenceAdapter(LiteLLMOpenAIMixin): ) self.config = config + get_api_key = LiteLLMOpenAIMixin.get_api_key + + def get_base_url(self): + return "https://generativelanguage.googleapis.com/v1beta/openai/" + async def initialize(self) -> None: await super().initialize() From 4c28544c04ab96c5c4d188dda3a53dc2eab0415d Mon Sep 17 00:00:00 2001 From: Matthew Farrellee Date: Sat, 6 Sep 2025 15:22:44 -0400 Subject: [PATCH 031/150] chore(gemini, tests): add skips for n and completions, gemini api does not support them (#3350) # What does this PR do? the gemini api endpoints do not support the n param or completions ## Test Plan ci --- tests/integration/inference/test_openai_completion.py | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/tests/integration/inference/test_openai_completion.py b/tests/integration/inference/test_openai_completion.py index bb447b3c1..099032578 100644 --- a/tests/integration/inference/test_openai_completion.py +++ b/tests/integration/inference/test_openai_completion.py @@ -37,6 +37,7 @@ def skip_if_model_doesnt_support_openai_completion(client_with_models, model_id) "remote::sambanova", "remote::tgi", "remote::vertexai", + "remote::gemini", # https://generativelanguage.googleapis.com/v1beta/openai/completions -> 404 ): pytest.skip(f"Model {model_id} hosted by {provider.provider_type} doesn't support OpenAI completions.") @@ -63,6 +64,9 @@ def skip_if_doesnt_support_n(client_with_models, model_id): if provider.provider_type in ( "remote::sambanova", "remote::ollama", + # Error code: 400 - [{'error': {'code': 400, 'message': 'Only one candidate can be specified in the + # current model', 'status': 'INVALID_ARGUMENT'}}] + "remote::gemini", ): pytest.skip(f"Model {model_id} hosted by {provider.provider_type} doesn't support n param.") From bf02cd846fdc39db80291746e06ca547e5afdbdb Mon Sep 17 00:00:00 2001 From: Matthew Farrellee Date: Sat, 6 Sep 2025 15:25:13 -0400 Subject: [PATCH 032/150] chore: update the sambanova inference impl to use openai-python for openai-compat functions (#3345) # What does this PR do? update SambaNova inference provider to use OpenAIMixin for openai-compat endpoints ## Test Plan ``` $ SAMBANOVA_API_KEY=... uv run llama stack build --image-type venv --providers inference=remote::sambanova --run ... $ LLAMA_STACK_CONFIG=http://localhost:8321 uv run --group test pytest -v -ra --text-model sambanova/Meta-Llama-3.3-70B-Instruct tests/integration/inference -k 'not store' ... FAILED tests/integration/inference/test_text_inference.py::test_text_chat_completion_tool_calling_tools_not_in_request[txt=sambanova/Meta-Llama-3.3-70B-Instruct-inference:chat_completion:tool_calling_tools_absent-True] - AttributeError: 'NoneType' object has no attribute 'delta' FAILED tests/integration/inference/test_text_inference.py::test_text_chat_completion_tool_calling_tools_not_in_request[txt=sambanova/Meta-Llama-3.3-70B-Instruct-inference:chat_completion:tool_calling_tools_absent-False] - llama_stack_client.InternalServerError: Error code: 500 - {'detail': 'Internal server error: An une... =========== 2 failed, 16 passed, 68 skipped, 8 deselected, 3 xfailed, 13 warnings in 15.85s ============ ``` the two failures also exist before this change. they are part of the deprecated inference.chat_completion tests that flow through litellm. they can be resolved later. --- llama_stack/providers/registry/inference.py | 2 +- .../remote/inference/sambanova/sambanova.py | 26 ++++++++++++++++++- 2 files changed, 26 insertions(+), 2 deletions(-) diff --git a/llama_stack/providers/registry/inference.py b/llama_stack/providers/registry/inference.py index 1bb3c3147..7a95fd089 100644 --- a/llama_stack/providers/registry/inference.py +++ b/llama_stack/providers/registry/inference.py @@ -270,7 +270,7 @@ Available Models: api=Api.inference, adapter=AdapterSpec( adapter_type="sambanova", - pip_packages=["litellm"], + pip_packages=["litellm", "openai"], module="llama_stack.providers.remote.inference.sambanova", config_class="llama_stack.providers.remote.inference.sambanova.SambaNovaImplConfig", provider_data_validator="llama_stack.providers.remote.inference.sambanova.config.SambaNovaProviderDataValidator", diff --git a/llama_stack/providers/remote/inference/sambanova/sambanova.py b/llama_stack/providers/remote/inference/sambanova/sambanova.py index 96469acac..ee3b0f648 100644 --- a/llama_stack/providers/remote/inference/sambanova/sambanova.py +++ b/llama_stack/providers/remote/inference/sambanova/sambanova.py @@ -4,13 +4,26 @@ # This source code is licensed under the terms described in the LICENSE file in # the root directory of this source tree. + from llama_stack.providers.utils.inference.litellm_openai_mixin import LiteLLMOpenAIMixin +from llama_stack.providers.utils.inference.openai_mixin import OpenAIMixin from .config import SambaNovaImplConfig from .models import MODEL_ENTRIES -class SambaNovaInferenceAdapter(LiteLLMOpenAIMixin): +class SambaNovaInferenceAdapter(OpenAIMixin, LiteLLMOpenAIMixin): + """ + SambaNova Inference Adapter for Llama Stack. + + Note: The inheritance order is important here. OpenAIMixin must come before + LiteLLMOpenAIMixin to ensure that OpenAIMixin.check_model_availability() + is used instead of LiteLLMOpenAIMixin.check_model_availability(). + + - OpenAIMixin.check_model_availability() queries the /v1/models to check if a model exists + - LiteLLMOpenAIMixin.check_model_availability() checks the static registry within LiteLLM + """ + def __init__(self, config: SambaNovaImplConfig): self.config = config self.environment_available_models = [] @@ -24,3 +37,14 @@ class SambaNovaInferenceAdapter(LiteLLMOpenAIMixin): download_images=True, # SambaNova requires base64 image encoding json_schema_strict=False, # SambaNova doesn't support strict=True yet ) + + # Delegate the client data handling get_api_key method to LiteLLMOpenAIMixin + get_api_key = LiteLLMOpenAIMixin.get_api_key + + def get_base_url(self) -> str: + """ + Get the base URL for OpenAI mixin. + + :return: The SambaNova base URL + """ + return self.config.url From 9252d9fc018487ef7bd6ac400ed329cd5db1e8c4 Mon Sep 17 00:00:00 2001 From: Matthew Farrellee Date: Sat, 6 Sep 2025 15:35:30 -0400 Subject: [PATCH 033/150] chore(groq test): skip with_n tests for groq, it is not supported server-side (#3346) # What does this PR do? skip the with_n test for groq, because it isn't supported by the provider's service see https://console.groq.com/docs/openai#currently-unsupported-openai-features Co-authored-by: raghotham --- tests/integration/inference/test_openai_completion.py | 3 +++ 1 file changed, 3 insertions(+) diff --git a/tests/integration/inference/test_openai_completion.py b/tests/integration/inference/test_openai_completion.py index 099032578..2043f6aeb 100644 --- a/tests/integration/inference/test_openai_completion.py +++ b/tests/integration/inference/test_openai_completion.py @@ -64,6 +64,9 @@ def skip_if_doesnt_support_n(client_with_models, model_id): if provider.provider_type in ( "remote::sambanova", "remote::ollama", + # https://console.groq.com/docs/openai#currently-unsupported-openai-features + # -> Error code: 400 - {'error': {'message': "'n' : number must be at most 1", 'type': 'invalid_request_error'}} + "remote::groq", # Error code: 400 - [{'error': {'code': 400, 'message': 'Only one candidate can be specified in the # current model', 'status': 'INVALID_ARGUMENT'}}] "remote::gemini", From ecd9d8dc1a70ea70ea06253869392afac3abdb40 Mon Sep 17 00:00:00 2001 From: Charlie Doern Date: Sat, 6 Sep 2025 15:40:33 -0400 Subject: [PATCH 034/150] test: introduce api conformance test (#3257) # What does this PR do? this test runs on each PR and uses a new conformance workflow to compare the base (main) branch openapi spec to the one on this PR if one of our "stable" APIs change, the test will fail. this workflow uses `oasdiff` to identify breaking changes for paths we want to ensure comptability for. specifically this is using `oasdiff breaking` with `--match-path` which only checks breaking changes for the specified paths. As a follow up to this, we can add an optional way to make it so that it is OK to make these change if properly documented or in a changelog or something. or by using a label on the PR to override the failing test. related to #3237 ## Test Plan conformance test should pass given there are no changes Signed-off-by: Charlie Doern --- .github/workflows/README.md | 1 + .github/workflows/conformance.yml | 57 +++++++++++++++++++++++++++++++ 2 files changed, 58 insertions(+) create mode 100644 .github/workflows/conformance.yml diff --git a/.github/workflows/README.md b/.github/workflows/README.md index 2e0df58b8..059bb873f 100644 --- a/.github/workflows/README.md +++ b/.github/workflows/README.md @@ -5,6 +5,7 @@ Llama Stack uses GitHub Actions for Continuous Integration (CI). Below is a tabl | Name | File | Purpose | | ---- | ---- | ------- | | Update Changelog | [changelog.yml](changelog.yml) | Creates PR for updating the CHANGELOG.md | +| API Conformance Tests | [conformance.yml](conformance.yml) | Run the API Conformance test suite on the changes. | | Installer CI | [install-script-ci.yml](install-script-ci.yml) | Test the installation script | | Integration Auth Tests | [integration-auth-tests.yml](integration-auth-tests.yml) | Run the integration test suite with Kubernetes authentication | | SqlStore Integration Tests | [integration-sql-store-tests.yml](integration-sql-store-tests.yml) | Run the integration test suite with SqlStore | diff --git a/.github/workflows/conformance.yml b/.github/workflows/conformance.yml new file mode 100644 index 000000000..2433b0203 --- /dev/null +++ b/.github/workflows/conformance.yml @@ -0,0 +1,57 @@ +# API Conformance Tests +# This workflow ensures that API changes maintain backward compatibility and don't break existing integrations +# It runs schema validation and OpenAPI diff checks to catch breaking changes early + +name: API Conformance Tests + +run-name: Run the API Conformance test suite on the changes. + +on: + push: + branches: [ main ] + pull_request: + branches: [ main ] + types: [opened, synchronize, reopened] + paths: + - 'llama_stack/**' + - '!llama_stack/ui/**' + - 'tests/**' + - 'uv.lock' + - 'pyproject.toml' + - '.github/workflows/conformance.yml' # This workflow itself + +concurrency: + group: ${{ github.workflow }}-${{ github.ref == 'refs/heads/main' && github.run_id || github.ref }} + # Cancel in-progress runs when new commits are pushed to avoid wasting CI resources + cancel-in-progress: true + +jobs: + # Job to check if API schema changes maintain backward compatibility + check-schema-compatibility: + runs-on: ubuntu-latest + steps: + # Using specific version 4.1.7 because 5.0.0 fails when trying to run this locally using `act` + # This ensures consistent behavior between local testing and CI + - name: Checkout PR Code + uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4.1.7 + + # Checkout the base branch to compare against (usually main) + # This allows us to diff the current changes against the previous state + - name: Checkout Base Branch + uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4.1.7 + with: + ref: ${{ github.event.pull_request.base.ref }} + path: 'base' + + # Install oasdiff: https://github.com/oasdiff/oasdiff, a tool for detecting breaking changes in OpenAPI specs. + - name: Install oasdiff + run: | + curl -fsSL https://raw.githubusercontent.com/oasdiff/oasdiff/main/install.sh | sh + + # Run oasdiff to detect breaking changes in the API specification + # This step will fail if incompatible changes are detected, preventing breaking changes from being merged + - name: Run OpenAPI Breaking Change Diff + run: | + oasdiff breaking --fail-on ERR base/docs/_static/llama-stack-spec.yaml docs/_static/llama-stack-spec.yaml --match-path '^/v1/openai/v1' \ + --match-path '^/v1/vector-io' \ + --match-path '^/v1/vector-dbs' From d23607483fc8ca63ea15db5a95f672aec249d2e1 Mon Sep 17 00:00:00 2001 From: Matthew Farrellee Date: Sat, 6 Sep 2025 18:36:27 -0400 Subject: [PATCH 035/150] chore: update the groq inference impl to use openai-python for openai-compat functions (#3348) # What does this PR do? update Groq inference provider to use OpenAIMixin for openai-compat endpoints changes on api.groq.com - - json_schema is now supported for specific models, see https://console.groq.com/docs/structured-outputs#supported-models - response_format with streaming is now supported for models that support response_format - groq no longer returns a 400 error if tools are provided and tool_choice is not "required" ## Test Plan ``` $ GROQ_API_KEY=... uv run llama stack build --image-type venv --providers inference=remote::groq --run ... $ LLAMA_STACK_CONFIG=http://localhost:8321 uv run --group test pytest -v -ra --text-model groq/llama-3.3-70b-versatile tests/integration/inference/test_openai_completion.py -k 'not store' ... SKIPPED [3] tests/integration/inference/test_openai_completion.py:44: Model groq/llama-3.3-70b-versatile hosted by remote::groq doesn't support OpenAI completions. SKIPPED [3] tests/integration/inference/test_openai_completion.py:94: Model groq/llama-3.3-70b-versatile hosted by remote::groq doesn't support vllm extra_body parameters. SKIPPED [4] tests/integration/inference/test_openai_completion.py:73: Model groq/llama-3.3-70b-versatile hosted by remote::groq doesn't support n param. SKIPPED [1] tests/integration/inference/test_openai_completion.py:100: Model groq/llama-3.3-70b-versatile hosted by remote::groq doesn't support chat completion calls with base64 encoded files. ======================= 8 passed, 11 skipped, 8 deselected, 2 warnings in 5.13s ======================== ``` --------- Co-authored-by: raghotham --- llama_stack/providers/registry/inference.py | 2 +- .../providers/remote/inference/groq/groq.py | 139 +----------------- .../test_inference_client_caching.py | 3 +- 3 files changed, 10 insertions(+), 134 deletions(-) diff --git a/llama_stack/providers/registry/inference.py b/llama_stack/providers/registry/inference.py index 7a95fd089..4176f85a6 100644 --- a/llama_stack/providers/registry/inference.py +++ b/llama_stack/providers/registry/inference.py @@ -248,7 +248,7 @@ Available Models: api=Api.inference, adapter=AdapterSpec( adapter_type="groq", - pip_packages=["litellm"], + pip_packages=["litellm", "openai"], module="llama_stack.providers.remote.inference.groq", config_class="llama_stack.providers.remote.inference.groq.GroqConfig", provider_data_validator="llama_stack.providers.remote.inference.groq.config.GroqProviderDataValidator", diff --git a/llama_stack/providers/remote/inference/groq/groq.py b/llama_stack/providers/remote/inference/groq/groq.py index fd7212de4..888953af0 100644 --- a/llama_stack/providers/remote/inference/groq/groq.py +++ b/llama_stack/providers/remote/inference/groq/groq.py @@ -4,30 +4,15 @@ # This source code is licensed under the terms described in the LICENSE file in # the root directory of this source tree. -from collections.abc import AsyncIterator -from typing import Any -from openai import AsyncOpenAI - -from llama_stack.apis.inference import ( - OpenAIChatCompletion, - OpenAIChatCompletionChunk, - OpenAIChoiceDelta, - OpenAIChunkChoice, - OpenAIMessageParam, - OpenAIResponseFormatParam, - OpenAISystemMessageParam, -) from llama_stack.providers.remote.inference.groq.config import GroqConfig from llama_stack.providers.utils.inference.litellm_openai_mixin import LiteLLMOpenAIMixin -from llama_stack.providers.utils.inference.openai_compat import ( - prepare_openai_completion_params, -) +from llama_stack.providers.utils.inference.openai_mixin import OpenAIMixin from .models import MODEL_ENTRIES -class GroqInferenceAdapter(LiteLLMOpenAIMixin): +class GroqInferenceAdapter(OpenAIMixin, LiteLLMOpenAIMixin): _config: GroqConfig def __init__(self, config: GroqConfig): @@ -40,122 +25,14 @@ class GroqInferenceAdapter(LiteLLMOpenAIMixin): ) self.config = config + # Delegate the client data handling get_api_key method to LiteLLMOpenAIMixin + get_api_key = LiteLLMOpenAIMixin.get_api_key + + def get_base_url(self) -> str: + return f"{self.config.url}/openai/v1" + async def initialize(self): await super().initialize() async def shutdown(self): await super().shutdown() - - def _get_openai_client(self) -> AsyncOpenAI: - return AsyncOpenAI( - base_url=f"{self.config.url}/openai/v1", - api_key=self.get_api_key(), - ) - - async def openai_chat_completion( - self, - model: str, - messages: list[OpenAIMessageParam], - frequency_penalty: float | None = None, - function_call: str | dict[str, Any] | None = None, - functions: list[dict[str, Any]] | None = None, - logit_bias: dict[str, float] | None = None, - logprobs: bool | None = None, - max_completion_tokens: int | None = None, - max_tokens: int | None = None, - n: int | None = None, - parallel_tool_calls: bool | None = None, - presence_penalty: float | None = None, - response_format: OpenAIResponseFormatParam | None = None, - seed: int | None = None, - stop: str | list[str] | None = None, - stream: bool | None = None, - stream_options: dict[str, Any] | None = None, - temperature: float | None = None, - tool_choice: str | dict[str, Any] | None = None, - tools: list[dict[str, Any]] | None = None, - top_logprobs: int | None = None, - top_p: float | None = None, - user: str | None = None, - ) -> OpenAIChatCompletion | AsyncIterator[OpenAIChatCompletionChunk]: - model_obj = await self.model_store.get_model(model) - - # Groq does not support json_schema response format, so we need to convert it to json_object - if response_format and response_format.type == "json_schema": - response_format.type = "json_object" - schema = response_format.json_schema.get("schema", {}) - response_format.json_schema = None - json_instructions = f"\nYour response should be a JSON object that matches the following schema: {schema}" - if messages and messages[0].role == "system": - messages[0].content = messages[0].content + json_instructions - else: - messages.insert(0, OpenAISystemMessageParam(content=json_instructions)) - - # Groq returns a 400 error if tools are provided but none are called - # So, set tool_choice to "required" to attempt to force a call - if tools and (not tool_choice or tool_choice == "auto"): - tool_choice = "required" - - params = await prepare_openai_completion_params( - model=model_obj.provider_resource_id, - messages=messages, - frequency_penalty=frequency_penalty, - function_call=function_call, - functions=functions, - logit_bias=logit_bias, - logprobs=logprobs, - max_completion_tokens=max_completion_tokens, - max_tokens=max_tokens, - n=n, - parallel_tool_calls=parallel_tool_calls, - presence_penalty=presence_penalty, - response_format=response_format, - seed=seed, - stop=stop, - stream=stream, - stream_options=stream_options, - temperature=temperature, - tool_choice=tool_choice, - tools=tools, - top_logprobs=top_logprobs, - top_p=top_p, - user=user, - ) - - # Groq does not support streaming requests that set response_format - fake_stream = False - if stream and response_format: - params["stream"] = False - fake_stream = True - - response = await self._get_openai_client().chat.completions.create(**params) - - if fake_stream: - chunk_choices = [] - for choice in response.choices: - delta = OpenAIChoiceDelta( - content=choice.message.content, - role=choice.message.role, - tool_calls=choice.message.tool_calls, - ) - chunk_choice = OpenAIChunkChoice( - delta=delta, - finish_reason=choice.finish_reason, - index=choice.index, - logprobs=None, - ) - chunk_choices.append(chunk_choice) - chunk = OpenAIChatCompletionChunk( - id=response.id, - choices=chunk_choices, - object="chat.completion.chunk", - created=response.created, - model=response.model, - ) - - async def _fake_stream_generator(): - yield chunk - - return _fake_stream_generator() - else: - return response diff --git a/tests/unit/providers/inference/test_inference_client_caching.py b/tests/unit/providers/inference/test_inference_client_caching.py index b371cf907..f4b3201e9 100644 --- a/tests/unit/providers/inference/test_inference_client_caching.py +++ b/tests/unit/providers/inference/test_inference_client_caching.py @@ -33,8 +33,7 @@ def test_groq_provider_openai_client_caching(): with request_provider_data_context( {"x-llamastack-provider-data": json.dumps({inference_adapter.provider_data_api_key_field: api_key})} ): - openai_client = inference_adapter._get_openai_client() - assert openai_client.api_key == api_key + assert inference_adapter.client.api_key == api_key def test_openai_provider_openai_client_caching(): From 78cab5331a78d27b084a04c0d8e302a51d5d2c4d Mon Sep 17 00:00:00 2001 From: Matthew Farrellee Date: Sat, 6 Sep 2025 19:21:55 -0400 Subject: [PATCH 036/150] chore(groq test): skip completions tests for groq, api is not supported server-side (#3347) # What does this PR do? skip /v1/completions tests on groq, endpoint is not supported Co-authored-by: raghotham --- tests/integration/inference/test_openai_completion.py | 3 +++ 1 file changed, 3 insertions(+) diff --git a/tests/integration/inference/test_openai_completion.py b/tests/integration/inference/test_openai_completion.py index 2043f6aeb..aee75b21d 100644 --- a/tests/integration/inference/test_openai_completion.py +++ b/tests/integration/inference/test_openai_completion.py @@ -37,6 +37,9 @@ def skip_if_model_doesnt_support_openai_completion(client_with_models, model_id) "remote::sambanova", "remote::tgi", "remote::vertexai", + # {"error":{"message":"Unknown request URL: GET /openai/v1/completions. Please check the URL for typos, + # or see the docs at https://console.groq.com/docs/","type":"invalid_request_error","code":"unknown_url"}} + "remote::groq", "remote::gemini", # https://generativelanguage.googleapis.com/v1beta/openai/completions -> 404 ): pytest.skip(f"Model {model_id} hosted by {provider.provider_type} doesn't support OpenAI completions.") From 6a35bd7bb6186d2ee60bbc3de0e2a349b12796f0 Mon Sep 17 00:00:00 2001 From: Matthew Farrellee Date: Sun, 7 Sep 2025 17:00:42 -0400 Subject: [PATCH 037/150] chore: update the anthropic inference impl to use openai-python for openai-compat functions (#3366) # What does this PR do? update the Anthropic inference provider to use openai-python for the openai-compat endpoints ## Test Plan ci Co-authored-by: raghotham --- .../providers/remote/inference/anthropic/anthropic.py | 8 +++++++- tests/integration/inference/test_openai_completion.py | 3 +++ 2 files changed, 10 insertions(+), 1 deletion(-) diff --git a/llama_stack/providers/remote/inference/anthropic/anthropic.py b/llama_stack/providers/remote/inference/anthropic/anthropic.py index 31626082b..0f247218d 100644 --- a/llama_stack/providers/remote/inference/anthropic/anthropic.py +++ b/llama_stack/providers/remote/inference/anthropic/anthropic.py @@ -5,12 +5,13 @@ # the root directory of this source tree. from llama_stack.providers.utils.inference.litellm_openai_mixin import LiteLLMOpenAIMixin +from llama_stack.providers.utils.inference.openai_mixin import OpenAIMixin from .config import AnthropicConfig from .models import MODEL_ENTRIES -class AnthropicInferenceAdapter(LiteLLMOpenAIMixin): +class AnthropicInferenceAdapter(OpenAIMixin, LiteLLMOpenAIMixin): def __init__(self, config: AnthropicConfig) -> None: LiteLLMOpenAIMixin.__init__( self, @@ -26,3 +27,8 @@ class AnthropicInferenceAdapter(LiteLLMOpenAIMixin): async def shutdown(self) -> None: await super().shutdown() + + get_api_key = LiteLLMOpenAIMixin.get_api_key + + def get_base_url(self): + return "https://api.anthropic.com/v1" diff --git a/tests/integration/inference/test_openai_completion.py b/tests/integration/inference/test_openai_completion.py index aee75b21d..df1184f1c 100644 --- a/tests/integration/inference/test_openai_completion.py +++ b/tests/integration/inference/test_openai_completion.py @@ -41,6 +41,7 @@ def skip_if_model_doesnt_support_openai_completion(client_with_models, model_id) # or see the docs at https://console.groq.com/docs/","type":"invalid_request_error","code":"unknown_url"}} "remote::groq", "remote::gemini", # https://generativelanguage.googleapis.com/v1beta/openai/completions -> 404 + "remote::anthropic", # at least claude-3-{5,7}-{haiku,sonnet}-* / claude-{sonnet,opus}-4-* are not supported ): pytest.skip(f"Model {model_id} hosted by {provider.provider_type} doesn't support OpenAI completions.") @@ -73,6 +74,8 @@ def skip_if_doesnt_support_n(client_with_models, model_id): # Error code: 400 - [{'error': {'code': 400, 'message': 'Only one candidate can be specified in the # current model', 'status': 'INVALID_ARGUMENT'}}] "remote::gemini", + # https://docs.anthropic.com/en/api/openai-sdk#simple-fields + "remote::anthropic", ): pytest.skip(f"Model {model_id} hosted by {provider.provider_type} doesn't support n param.") From fe134d90e5488725da179d5283f126787d61a89b Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 8 Sep 2025 09:58:45 +0200 Subject: [PATCH 038/150] chore(ui-deps): bump react-dom and @types/react-dom in /llama_stack/ui (#3360) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Bumps [react-dom](https://github.com/facebook/react/tree/HEAD/packages/react-dom) and [@types/react-dom](https://github.com/DefinitelyTyped/DefinitelyTyped/tree/HEAD/types/react-dom). These dependencies needed to be updated together. Updates `react-dom` from 19.1.0 to 19.1.1
Release notes

Sourced from react-dom's releases.

19.1.1 (July 28, 2025)

React

  • Fixed Owner Stacks to work with ES2015 function.name semantics (#33680 by @​hoxyq)
Changelog

Sourced from react-dom's changelog.

19.1.1 (July 28, 2025)

React

  • Fixed Owner Stacks to work with ES2015 function.name semantics (#33680 by @​hoxyq)
Commits

Updates `@types/react-dom` from 19.1.5 to 19.1.9
Commits

Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting `@dependabot rebase`. [//]: # (dependabot-automerge-start) [//]: # (dependabot-automerge-end) ---
Dependabot commands and options
You can trigger Dependabot actions by commenting on this PR: - `@dependabot rebase` will rebase this PR - `@dependabot recreate` will recreate this PR, overwriting any edits that have been made to it - `@dependabot merge` will merge this PR after your CI passes on it - `@dependabot squash and merge` will squash and merge this PR after your CI passes on it - `@dependabot cancel merge` will cancel a previously requested merge and block automerging - `@dependabot reopen` will reopen this PR if it is closed - `@dependabot close` will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually - `@dependabot show ignore conditions` will show all of the ignore conditions of the specified dependency - `@dependabot ignore this major version` will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this minor version` will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this dependency` will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)
Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- llama_stack/ui/package-lock.json | 22 +++++++++++----------- llama_stack/ui/package.json | 2 +- 2 files changed, 12 insertions(+), 12 deletions(-) diff --git a/llama_stack/ui/package-lock.json b/llama_stack/ui/package-lock.json index 7873cdfd5..05ccdb708 100644 --- a/llama_stack/ui/package-lock.json +++ b/llama_stack/ui/package-lock.json @@ -24,7 +24,7 @@ "next-auth": "^4.24.11", "next-themes": "^0.4.6", "react": "^19.0.0", - "react-dom": "^19.0.0", + "react-dom": "^19.1.1", "react-markdown": "^10.1.0", "remark-gfm": "^4.0.1", "remeda": "^2.30.0", @@ -4079,9 +4079,9 @@ } }, "node_modules/@types/react-dom": { - "version": "19.1.5", - "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-19.1.5.tgz", - "integrity": "sha512-CMCjrWucUBZvohgZxkjd6S9h0nZxXjzus6yDfUb+xLxYM7VvjKNH1tQrE9GWLql1XoOP4/Ds3bwFqShHUYraGg==", + "version": "19.1.9", + "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-19.1.9.tgz", + "integrity": "sha512-qXRuZaOsAdXKFyOhRBg6Lqqc0yay13vN7KrIg4L7N4aaHN68ma9OK3NE1BoDFgFOTfM7zg+3/8+2n8rLUH3OKQ==", "devOptional": true, "license": "MIT", "peerDependencies": { @@ -12448,24 +12448,24 @@ } }, "node_modules/react": { - "version": "19.1.0", - "resolved": "https://registry.npmjs.org/react/-/react-19.1.0.tgz", - "integrity": "sha512-FS+XFBNvn3GTAWq26joslQgWNoFu08F4kl0J4CgdNKADkdSGXQyTCnKteIAJy96Br6YbpEU1LSzV5dYtjMkMDg==", + "version": "19.1.1", + "resolved": "https://registry.npmjs.org/react/-/react-19.1.1.tgz", + "integrity": "sha512-w8nqGImo45dmMIfljjMwOGtbmC/mk4CMYhWIicdSflH91J9TyCyczcPFXJzrZ/ZXcgGRFeP6BU0BEJTw6tZdfQ==", "license": "MIT", "engines": { "node": ">=0.10.0" } }, "node_modules/react-dom": { - "version": "19.1.0", - "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-19.1.0.tgz", - "integrity": "sha512-Xs1hdnE+DyKgeHJeJznQmYMIBG3TKIHJJT95Q58nHLSrElKlGQqDTR2HQ9fx5CN/Gk6Vh/kupBTDLU11/nDk/g==", + "version": "19.1.1", + "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-19.1.1.tgz", + "integrity": "sha512-Dlq/5LAZgF0Gaz6yiqZCf6VCcZs1ghAJyrsu84Q/GT0gV+mCxbfmKNoGRKBYMJ8IEdGPqu49YWXD02GCknEDkw==", "license": "MIT", "dependencies": { "scheduler": "^0.26.0" }, "peerDependencies": { - "react": "^19.1.0" + "react": "^19.1.1" } }, "node_modules/react-is": { diff --git a/llama_stack/ui/package.json b/llama_stack/ui/package.json index b37ff233f..558a9fe2f 100644 --- a/llama_stack/ui/package.json +++ b/llama_stack/ui/package.json @@ -29,7 +29,7 @@ "next-auth": "^4.24.11", "next-themes": "^0.4.6", "react": "^19.0.0", - "react-dom": "^19.0.0", + "react-dom": "^19.1.1", "react-markdown": "^10.1.0", "remark-gfm": "^4.0.1", "remeda": "^2.30.0", From 91c7c4570e3abc3f9571795a8fd6ae520a0d9853 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 8 Sep 2025 09:59:02 +0200 Subject: [PATCH 039/150] chore(ui-deps): bump sonner from 2.0.6 to 2.0.7 in /llama_stack/ui (#3364) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Bumps [sonner](https://github.com/emilkowalski/sonner) from 2.0.6 to 2.0.7.
Release notes

Sourced from sonner's releases.

v2.0.7

Sonner now supports multiple <Toaster /> components, see more here.

What's Changed

New Contributors

Full Changelog: https://github.com/emilkowalski/sonner/compare/v2.0.6...v2.0.7

Commits

[![Dependabot compatibility score](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name=sonner&package-manager=npm_and_yarn&previous-version=2.0.6&new-version=2.0.7)](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores) Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting `@dependabot rebase`. [//]: # (dependabot-automerge-start) [//]: # (dependabot-automerge-end) ---
Dependabot commands and options
You can trigger Dependabot actions by commenting on this PR: - `@dependabot rebase` will rebase this PR - `@dependabot recreate` will recreate this PR, overwriting any edits that have been made to it - `@dependabot merge` will merge this PR after your CI passes on it - `@dependabot squash and merge` will squash and merge this PR after your CI passes on it - `@dependabot cancel merge` will cancel a previously requested merge and block automerging - `@dependabot reopen` will reopen this PR if it is closed - `@dependabot close` will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually - `@dependabot show ignore conditions` will show all of the ignore conditions of the specified dependency - `@dependabot ignore this major version` will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this minor version` will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this dependency` will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)
Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- llama_stack/ui/package-lock.json | 8 ++++---- llama_stack/ui/package.json | 2 +- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/llama_stack/ui/package-lock.json b/llama_stack/ui/package-lock.json index 05ccdb708..f0ca72e92 100644 --- a/llama_stack/ui/package-lock.json +++ b/llama_stack/ui/package-lock.json @@ -29,7 +29,7 @@ "remark-gfm": "^4.0.1", "remeda": "^2.30.0", "shiki": "^1.29.2", - "sonner": "^2.0.6", + "sonner": "^2.0.7", "tailwind-merge": "^3.3.1" }, "devDependencies": { @@ -13285,9 +13285,9 @@ } }, "node_modules/sonner": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/sonner/-/sonner-2.0.6.tgz", - "integrity": "sha512-yHFhk8T/DK3YxjFQXIrcHT1rGEeTLliVzWbO0xN8GberVun2RiBnxAjXAYpZrqwEVHBG9asI/Li8TAAhN9m59Q==", + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/sonner/-/sonner-2.0.7.tgz", + "integrity": "sha512-W6ZN4p58k8aDKA4XPcx2hpIQXBRAgyiWVkYhT7CvK6D3iAu7xjvVyhQHg2/iaKJZ1XVJ4r7XuwGL+WGEK37i9w==", "license": "MIT", "peerDependencies": { "react": "^18.0.0 || ^19.0.0 || ^19.0.0-rc", diff --git a/llama_stack/ui/package.json b/llama_stack/ui/package.json index 558a9fe2f..6f35fc83f 100644 --- a/llama_stack/ui/package.json +++ b/llama_stack/ui/package.json @@ -34,7 +34,7 @@ "remark-gfm": "^4.0.1", "remeda": "^2.30.0", "shiki": "^1.29.2", - "sonner": "^2.0.6", + "sonner": "^2.0.7", "tailwind-merge": "^3.3.1" }, "devDependencies": { From e508aef320f209d8ed9bb37c64a1fc5be35c05db Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 8 Sep 2025 09:59:24 +0200 Subject: [PATCH 040/150] chore(ui-deps): bump lucide-react from 0.510.0 to 0.542.0 in /llama_stack/ui (#3363) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Bumps [lucide-react](https://github.com/lucide-icons/lucide/tree/HEAD/packages/lucide-react) from 0.510.0 to 0.542.0.
Release notes

Sourced from lucide-react's releases.

Version 0.542.0

What's Changed

New Contributors

Full Changelog: https://github.com/lucide-icons/lucide/compare/0.541.0...0.542.0

Version 0.541.0

What's Changed

Full Changelog: https://github.com/lucide-icons/lucide/compare/0.540.0...0.541.0

Version 0.540.0

What's Changed

Full Changelog: https://github.com/lucide-icons/lucide/compare/0.539.0...0.540.0

Version 0.539.0

What's Changed

Full Changelog: https://github.com/lucide-icons/lucide/compare/0.538.0...0.539.0

Version 0.538.0

What's Changed

... (truncated)

Commits

[![Dependabot compatibility score](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name=lucide-react&package-manager=npm_and_yarn&previous-version=0.510.0&new-version=0.542.0)](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores) Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting `@dependabot rebase`. [//]: # (dependabot-automerge-start) [//]: # (dependabot-automerge-end) ---
Dependabot commands and options
You can trigger Dependabot actions by commenting on this PR: - `@dependabot rebase` will rebase this PR - `@dependabot recreate` will recreate this PR, overwriting any edits that have been made to it - `@dependabot merge` will merge this PR after your CI passes on it - `@dependabot squash and merge` will squash and merge this PR after your CI passes on it - `@dependabot cancel merge` will cancel a previously requested merge and block automerging - `@dependabot reopen` will reopen this PR if it is closed - `@dependabot close` will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually - `@dependabot show ignore conditions` will show all of the ignore conditions of the specified dependency - `@dependabot ignore this major version` will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this minor version` will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this dependency` will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)
Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- llama_stack/ui/package-lock.json | 8 ++++---- llama_stack/ui/package.json | 2 +- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/llama_stack/ui/package-lock.json b/llama_stack/ui/package-lock.json index f0ca72e92..198b98fdf 100644 --- a/llama_stack/ui/package-lock.json +++ b/llama_stack/ui/package-lock.json @@ -19,7 +19,7 @@ "clsx": "^2.1.1", "framer-motion": "^12.23.12", "llama-stack-client": "^0.2.20", - "lucide-react": "^0.510.0", + "lucide-react": "^0.542.0", "next": "15.3.3", "next-auth": "^4.24.11", "next-themes": "^0.4.6", @@ -10240,9 +10240,9 @@ "license": "ISC" }, "node_modules/lucide-react": { - "version": "0.510.0", - "resolved": "https://registry.npmjs.org/lucide-react/-/lucide-react-0.510.0.tgz", - "integrity": "sha512-p8SQRAMVh7NhsAIETokSqDrc5CHnDLbV29mMnzaXx+Vc/hnqQzwI2r0FMWCcoTXnbw2KEjy48xwpGdEL+ck06Q==", + "version": "0.542.0", + "resolved": "https://registry.npmjs.org/lucide-react/-/lucide-react-0.542.0.tgz", + "integrity": "sha512-w3hD8/SQB7+lzU2r4VdFyzzOzKnUjTZIF/MQJGSSvni7Llewni4vuViRppfRAa2guOsY5k4jZyxw/i9DQHv+dw==", "license": "ISC", "peerDependencies": { "react": "^16.5.1 || ^17.0.0 || ^18.0.0 || ^19.0.0" diff --git a/llama_stack/ui/package.json b/llama_stack/ui/package.json index 6f35fc83f..f892f4f9b 100644 --- a/llama_stack/ui/package.json +++ b/llama_stack/ui/package.json @@ -24,7 +24,7 @@ "clsx": "^2.1.1", "framer-motion": "^12.23.12", "llama-stack-client": "^0.2.20", - "lucide-react": "^0.510.0", + "lucide-react": "^0.542.0", "next": "15.3.3", "next-auth": "^4.24.11", "next-themes": "^0.4.6", From e1b81ce1fc4820480a95471bbe0f504a952110b6 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 8 Sep 2025 09:59:44 +0200 Subject: [PATCH 041/150] chore(ui-deps): bump @radix-ui/react-dropdown-menu from 2.1.14 to 2.1.16 in /llama_stack/ui (#3361) Bumps [@radix-ui/react-dropdown-menu](https://github.com/radix-ui/primitives) from 2.1.14 to 2.1.16.
Commits

[![Dependabot compatibility score](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name=@radix-ui/react-dropdown-menu&package-manager=npm_and_yarn&previous-version=2.1.14&new-version=2.1.16)](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores) Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting `@dependabot rebase`. [//]: # (dependabot-automerge-start) [//]: # (dependabot-automerge-end) ---
Dependabot commands and options
You can trigger Dependabot actions by commenting on this PR: - `@dependabot rebase` will rebase this PR - `@dependabot recreate` will recreate this PR, overwriting any edits that have been made to it - `@dependabot merge` will merge this PR after your CI passes on it - `@dependabot squash and merge` will squash and merge this PR after your CI passes on it - `@dependabot cancel merge` will cancel a previously requested merge and block automerging - `@dependabot reopen` will reopen this PR if it is closed - `@dependabot close` will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually - `@dependabot show ignore conditions` will show all of the ignore conditions of the specified dependency - `@dependabot ignore this major version` will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this minor version` will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this dependency` will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)
Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- llama_stack/ui/package-lock.json | 443 ++++++++++++++++++++----------- llama_stack/ui/package.json | 2 +- 2 files changed, 288 insertions(+), 157 deletions(-) diff --git a/llama_stack/ui/package-lock.json b/llama_stack/ui/package-lock.json index 198b98fdf..cbe8e5557 100644 --- a/llama_stack/ui/package-lock.json +++ b/llama_stack/ui/package-lock.json @@ -10,7 +10,7 @@ "dependencies": { "@radix-ui/react-collapsible": "^1.1.12", "@radix-ui/react-dialog": "^1.1.13", - "@radix-ui/react-dropdown-menu": "^2.1.14", + "@radix-ui/react-dropdown-menu": "^2.1.16", "@radix-ui/react-select": "^2.2.5", "@radix-ui/react-separator": "^1.1.7", "@radix-ui/react-slot": "^1.2.3", @@ -2066,12 +2066,35 @@ "license": "MIT" }, "node_modules/@radix-ui/react-arrow": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/@radix-ui/react-arrow/-/react-arrow-1.1.6.tgz", - "integrity": "sha512-2JMfHJf/eVnwq+2dewT3C0acmCWD3XiVA1Da+jTDqo342UlU13WvXtqHhG+yJw5JeQmu4ue2eMy6gcEArLBlcw==", + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/@radix-ui/react-arrow/-/react-arrow-1.1.7.tgz", + "integrity": "sha512-F+M1tLhO+mlQaOWspE8Wstg+z6PwxwRd8oQ8IXceWz92kfAmalTRf0EjrouQeo7QssEPfCn05B4Ihs1K9WQ/7w==", "license": "MIT", "dependencies": { - "@radix-ui/react-primitive": "2.1.2" + "@radix-ui/react-primitive": "2.1.3" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-arrow/node_modules/@radix-ui/react-primitive": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/@radix-ui/react-primitive/-/react-primitive-2.1.3.tgz", + "integrity": "sha512-m9gTwRkhy2lvCPe6QJp4d3G1TYEUHn/FzJUtq9MjH46an1wJU+GdoGC5VLof8RX8Ft/DlpshApkhswDLZzHIcQ==", + "license": "MIT", + "dependencies": { + "@radix-ui/react-slot": "1.2.3" }, "peerDependencies": { "@types/react": "*", @@ -2172,15 +2195,15 @@ } }, "node_modules/@radix-ui/react-collection": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/@radix-ui/react-collection/-/react-collection-1.1.6.tgz", - "integrity": "sha512-PbhRFK4lIEw9ADonj48tiYWzkllz81TM7KVYyyMMw2cwHO7D5h4XKEblL8NlaRisTK3QTe6tBEhDccFUryxHBQ==", + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/@radix-ui/react-collection/-/react-collection-1.1.7.tgz", + "integrity": "sha512-Fh9rGN0MoI4ZFUNyfFVNU4y9LUz93u9/0K+yLgA2bwRojxM8JU1DyvvMBabnZPBgMWREAJvU2jjVzq+LrFUglw==", "license": "MIT", "dependencies": { "@radix-ui/react-compose-refs": "1.1.2", "@radix-ui/react-context": "1.1.2", - "@radix-ui/react-primitive": "2.1.2", - "@radix-ui/react-slot": "1.2.2" + "@radix-ui/react-primitive": "2.1.3", + "@radix-ui/react-slot": "1.2.3" }, "peerDependencies": { "@types/react": "*", @@ -2197,21 +2220,26 @@ } } }, - "node_modules/@radix-ui/react-collection/node_modules/@radix-ui/react-slot": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/@radix-ui/react-slot/-/react-slot-1.2.2.tgz", - "integrity": "sha512-y7TBO4xN4Y94FvcWIOIh18fM4R1A8S4q1jhoz4PNzOoHsFcN8pogcFmZrTYAm4F9VRUrWP/Mw7xSKybIeRI+CQ==", + "node_modules/@radix-ui/react-collection/node_modules/@radix-ui/react-primitive": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/@radix-ui/react-primitive/-/react-primitive-2.1.3.tgz", + "integrity": "sha512-m9gTwRkhy2lvCPe6QJp4d3G1TYEUHn/FzJUtq9MjH46an1wJU+GdoGC5VLof8RX8Ft/DlpshApkhswDLZzHIcQ==", "license": "MIT", "dependencies": { - "@radix-ui/react-compose-refs": "1.1.2" + "@radix-ui/react-slot": "1.2.3" }, "peerDependencies": { "@types/react": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "peerDependenciesMeta": { "@types/react": { "optional": true + }, + "@types/react-dom": { + "optional": true } } }, @@ -2342,17 +2370,17 @@ } }, "node_modules/@radix-ui/react-dropdown-menu": { - "version": "2.1.14", - "resolved": "https://registry.npmjs.org/@radix-ui/react-dropdown-menu/-/react-dropdown-menu-2.1.14.tgz", - "integrity": "sha512-lzuyNjoWOoaMFE/VC5FnAAYM16JmQA8ZmucOXtlhm2kKR5TSU95YLAueQ4JYuRmUJmBvSqXaVFGIfuukybwZJQ==", + "version": "2.1.16", + "resolved": "https://registry.npmjs.org/@radix-ui/react-dropdown-menu/-/react-dropdown-menu-2.1.16.tgz", + "integrity": "sha512-1PLGQEynI/3OX/ftV54COn+3Sud/Mn8vALg2rWnBLnRaGtJDduNW/22XjlGgPdpcIbiQxjKtb7BkcjP00nqfJw==", "license": "MIT", "dependencies": { - "@radix-ui/primitive": "1.1.2", + "@radix-ui/primitive": "1.1.3", "@radix-ui/react-compose-refs": "1.1.2", "@radix-ui/react-context": "1.1.2", "@radix-ui/react-id": "1.1.1", - "@radix-ui/react-menu": "2.1.14", - "@radix-ui/react-primitive": "2.1.2", + "@radix-ui/react-menu": "2.1.16", + "@radix-ui/react-primitive": "2.1.3", "@radix-ui/react-use-controllable-state": "1.2.2" }, "peerDependencies": { @@ -2370,6 +2398,35 @@ } } }, + "node_modules/@radix-ui/react-dropdown-menu/node_modules/@radix-ui/primitive": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/@radix-ui/primitive/-/primitive-1.1.3.tgz", + "integrity": "sha512-JTF99U/6XIjCBo0wqkU5sK10glYe27MRRsfwoiq5zzOEZLHU3A3KCMa5X/azekYRCJ0HlwI0crAXS/5dEHTzDg==", + "license": "MIT" + }, + "node_modules/@radix-ui/react-dropdown-menu/node_modules/@radix-ui/react-primitive": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/@radix-ui/react-primitive/-/react-primitive-2.1.3.tgz", + "integrity": "sha512-m9gTwRkhy2lvCPe6QJp4d3G1TYEUHn/FzJUtq9MjH46an1wJU+GdoGC5VLof8RX8Ft/DlpshApkhswDLZzHIcQ==", + "license": "MIT", + "dependencies": { + "@radix-ui/react-slot": "1.2.3" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, "node_modules/@radix-ui/react-focus-guards": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/@radix-ui/react-focus-guards/-/react-focus-guards-1.1.2.tgz", @@ -2429,26 +2486,26 @@ } }, "node_modules/@radix-ui/react-menu": { - "version": "2.1.14", - "resolved": "https://registry.npmjs.org/@radix-ui/react-menu/-/react-menu-2.1.14.tgz", - "integrity": "sha512-0zSiBAIFq9GSKoSH5PdEaQeRB3RnEGxC+H2P0egtnKoKKLNBH8VBHyVO6/jskhjAezhOIplyRUj7U2lds9A+Yg==", + "version": "2.1.16", + "resolved": "https://registry.npmjs.org/@radix-ui/react-menu/-/react-menu-2.1.16.tgz", + "integrity": "sha512-72F2T+PLlphrqLcAotYPp0uJMr5SjP5SL01wfEspJbru5Zs5vQaSHb4VB3ZMJPimgHHCHG7gMOeOB9H3Hdmtxg==", "license": "MIT", "dependencies": { - "@radix-ui/primitive": "1.1.2", - "@radix-ui/react-collection": "1.1.6", + "@radix-ui/primitive": "1.1.3", + "@radix-ui/react-collection": "1.1.7", "@radix-ui/react-compose-refs": "1.1.2", "@radix-ui/react-context": "1.1.2", "@radix-ui/react-direction": "1.1.1", - "@radix-ui/react-dismissable-layer": "1.1.9", - "@radix-ui/react-focus-guards": "1.1.2", - "@radix-ui/react-focus-scope": "1.1.6", + "@radix-ui/react-dismissable-layer": "1.1.11", + "@radix-ui/react-focus-guards": "1.1.3", + "@radix-ui/react-focus-scope": "1.1.7", "@radix-ui/react-id": "1.1.1", - "@radix-ui/react-popper": "1.2.6", - "@radix-ui/react-portal": "1.1.8", - "@radix-ui/react-presence": "1.1.4", - "@radix-ui/react-primitive": "2.1.2", - "@radix-ui/react-roving-focus": "1.1.9", - "@radix-ui/react-slot": "1.2.2", + "@radix-ui/react-popper": "1.2.8", + "@radix-ui/react-portal": "1.1.9", + "@radix-ui/react-presence": "1.1.5", + "@radix-ui/react-primitive": "2.1.3", + "@radix-ui/react-roving-focus": "1.1.11", + "@radix-ui/react-slot": "1.2.3", "@radix-ui/react-use-callback-ref": "1.1.1", "aria-hidden": "^1.2.4", "react-remove-scroll": "^2.6.3" @@ -2468,14 +2525,44 @@ } } }, - "node_modules/@radix-ui/react-menu/node_modules/@radix-ui/react-slot": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/@radix-ui/react-slot/-/react-slot-1.2.2.tgz", - "integrity": "sha512-y7TBO4xN4Y94FvcWIOIh18fM4R1A8S4q1jhoz4PNzOoHsFcN8pogcFmZrTYAm4F9VRUrWP/Mw7xSKybIeRI+CQ==", + "node_modules/@radix-ui/react-menu/node_modules/@radix-ui/primitive": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/@radix-ui/primitive/-/primitive-1.1.3.tgz", + "integrity": "sha512-JTF99U/6XIjCBo0wqkU5sK10glYe27MRRsfwoiq5zzOEZLHU3A3KCMa5X/azekYRCJ0HlwI0crAXS/5dEHTzDg==", + "license": "MIT" + }, + "node_modules/@radix-ui/react-menu/node_modules/@radix-ui/react-dismissable-layer": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/@radix-ui/react-dismissable-layer/-/react-dismissable-layer-1.1.11.tgz", + "integrity": "sha512-Nqcp+t5cTB8BinFkZgXiMJniQH0PsUt2k51FUhbdfeKvc4ACcG2uQniY/8+h1Yv6Kza4Q7lD7PQV0z0oicE0Mg==", "license": "MIT", "dependencies": { - "@radix-ui/react-compose-refs": "1.1.2" + "@radix-ui/primitive": "1.1.3", + "@radix-ui/react-compose-refs": "1.1.2", + "@radix-ui/react-primitive": "2.1.3", + "@radix-ui/react-use-callback-ref": "1.1.1", + "@radix-ui/react-use-escape-keydown": "1.1.1" }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-menu/node_modules/@radix-ui/react-focus-guards": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/@radix-ui/react-focus-guards/-/react-focus-guards-1.1.3.tgz", + "integrity": "sha512-0rFg/Rj2Q62NCm62jZw0QX7a3sz6QCQU0LpZdNrJX8byRGaGVTqbrW9jAoIAHyMQqsNpeZ81YgSizOt5WXq0Pw==", + "license": "MIT", "peerDependencies": { "@types/react": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" @@ -2486,17 +2573,113 @@ } } }, + "node_modules/@radix-ui/react-menu/node_modules/@radix-ui/react-focus-scope": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/@radix-ui/react-focus-scope/-/react-focus-scope-1.1.7.tgz", + "integrity": "sha512-t2ODlkXBQyn7jkl6TNaw/MtVEVvIGelJDCG41Okq/KwUsJBwQ4XVZsHAVUkK4mBv3ewiAS3PGuUWuY2BoK4ZUw==", + "license": "MIT", + "dependencies": { + "@radix-ui/react-compose-refs": "1.1.2", + "@radix-ui/react-primitive": "2.1.3", + "@radix-ui/react-use-callback-ref": "1.1.1" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-menu/node_modules/@radix-ui/react-portal": { + "version": "1.1.9", + "resolved": "https://registry.npmjs.org/@radix-ui/react-portal/-/react-portal-1.1.9.tgz", + "integrity": "sha512-bpIxvq03if6UNwXZ+HTK71JLh4APvnXntDc6XOX8UVq4XQOVl7lwok0AvIl+b8zgCw3fSaVTZMpAPPagXbKmHQ==", + "license": "MIT", + "dependencies": { + "@radix-ui/react-primitive": "2.1.3", + "@radix-ui/react-use-layout-effect": "1.1.1" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-menu/node_modules/@radix-ui/react-presence": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/@radix-ui/react-presence/-/react-presence-1.1.5.tgz", + "integrity": "sha512-/jfEwNDdQVBCNvjkGit4h6pMOzq8bHkopq458dPt2lMjx+eBQUohZNG9A7DtO/O5ukSbxuaNGXMjHicgwy6rQQ==", + "license": "MIT", + "dependencies": { + "@radix-ui/react-compose-refs": "1.1.2", + "@radix-ui/react-use-layout-effect": "1.1.1" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-menu/node_modules/@radix-ui/react-primitive": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/@radix-ui/react-primitive/-/react-primitive-2.1.3.tgz", + "integrity": "sha512-m9gTwRkhy2lvCPe6QJp4d3G1TYEUHn/FzJUtq9MjH46an1wJU+GdoGC5VLof8RX8Ft/DlpshApkhswDLZzHIcQ==", + "license": "MIT", + "dependencies": { + "@radix-ui/react-slot": "1.2.3" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, "node_modules/@radix-ui/react-popper": { - "version": "1.2.6", - "resolved": "https://registry.npmjs.org/@radix-ui/react-popper/-/react-popper-1.2.6.tgz", - "integrity": "sha512-7iqXaOWIjDBfIG7aq8CUEeCSsQMLFdn7VEE8TaFz704DtEzpPHR7w/uuzRflvKgltqSAImgcmxQ7fFX3X7wasg==", + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/@radix-ui/react-popper/-/react-popper-1.2.8.tgz", + "integrity": "sha512-0NJQ4LFFUuWkE7Oxf0htBKS6zLkkjBH+hM1uk7Ng705ReR8m/uelduy1DBo0PyBXPKVnBA6YBlU94MBGXrSBCw==", "license": "MIT", "dependencies": { "@floating-ui/react-dom": "^2.0.0", - "@radix-ui/react-arrow": "1.1.6", + "@radix-ui/react-arrow": "1.1.7", "@radix-ui/react-compose-refs": "1.1.2", "@radix-ui/react-context": "1.1.2", - "@radix-ui/react-primitive": "2.1.2", + "@radix-ui/react-primitive": "2.1.3", "@radix-ui/react-use-callback-ref": "1.1.1", "@radix-ui/react-use-layout-effect": "1.1.1", "@radix-ui/react-use-rect": "1.1.1", @@ -2518,6 +2701,29 @@ } } }, + "node_modules/@radix-ui/react-popper/node_modules/@radix-ui/react-primitive": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/@radix-ui/react-primitive/-/react-primitive-2.1.3.tgz", + "integrity": "sha512-m9gTwRkhy2lvCPe6QJp4d3G1TYEUHn/FzJUtq9MjH46an1wJU+GdoGC5VLof8RX8Ft/DlpshApkhswDLZzHIcQ==", + "license": "MIT", + "dependencies": { + "@radix-ui/react-slot": "1.2.3" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, "node_modules/@radix-ui/react-portal": { "version": "1.1.8", "resolved": "https://registry.npmjs.org/@radix-ui/react-portal/-/react-portal-1.1.8.tgz", @@ -2608,18 +2814,18 @@ } }, "node_modules/@radix-ui/react-roving-focus": { - "version": "1.1.9", - "resolved": "https://registry.npmjs.org/@radix-ui/react-roving-focus/-/react-roving-focus-1.1.9.tgz", - "integrity": "sha512-ZzrIFnMYHHCNqSNCsuN6l7wlewBEq0O0BCSBkabJMFXVO51LRUTq71gLP1UxFvmrXElqmPjA5VX7IqC9VpazAQ==", + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/@radix-ui/react-roving-focus/-/react-roving-focus-1.1.11.tgz", + "integrity": "sha512-7A6S9jSgm/S+7MdtNDSb+IU859vQqJ/QAtcYQcfFC6W8RS4IxIZDldLR0xqCFZ6DCyrQLjLPsxtTNch5jVA4lA==", "license": "MIT", "dependencies": { - "@radix-ui/primitive": "1.1.2", - "@radix-ui/react-collection": "1.1.6", + "@radix-ui/primitive": "1.1.3", + "@radix-ui/react-collection": "1.1.7", "@radix-ui/react-compose-refs": "1.1.2", "@radix-ui/react-context": "1.1.2", "@radix-ui/react-direction": "1.1.1", "@radix-ui/react-id": "1.1.1", - "@radix-ui/react-primitive": "2.1.2", + "@radix-ui/react-primitive": "2.1.3", "@radix-ui/react-use-callback-ref": "1.1.1", "@radix-ui/react-use-controllable-state": "1.2.2" }, @@ -2638,6 +2844,35 @@ } } }, + "node_modules/@radix-ui/react-roving-focus/node_modules/@radix-ui/primitive": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/@radix-ui/primitive/-/primitive-1.1.3.tgz", + "integrity": "sha512-JTF99U/6XIjCBo0wqkU5sK10glYe27MRRsfwoiq5zzOEZLHU3A3KCMa5X/azekYRCJ0HlwI0crAXS/5dEHTzDg==", + "license": "MIT" + }, + "node_modules/@radix-ui/react-roving-focus/node_modules/@radix-ui/react-primitive": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/@radix-ui/react-primitive/-/react-primitive-2.1.3.tgz", + "integrity": "sha512-m9gTwRkhy2lvCPe6QJp4d3G1TYEUHn/FzJUtq9MjH46an1wJU+GdoGC5VLof8RX8Ft/DlpshApkhswDLZzHIcQ==", + "license": "MIT", + "dependencies": { + "@radix-ui/react-slot": "1.2.3" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, "node_modules/@radix-ui/react-select": { "version": "2.2.5", "resolved": "https://registry.npmjs.org/@radix-ui/react-select/-/react-select-2.2.5.tgz", @@ -2681,55 +2916,6 @@ } } }, - "node_modules/@radix-ui/react-select/node_modules/@radix-ui/react-arrow": { - "version": "1.1.7", - "resolved": "https://registry.npmjs.org/@radix-ui/react-arrow/-/react-arrow-1.1.7.tgz", - "integrity": "sha512-F+M1tLhO+mlQaOWspE8Wstg+z6PwxwRd8oQ8IXceWz92kfAmalTRf0EjrouQeo7QssEPfCn05B4Ihs1K9WQ/7w==", - "license": "MIT", - "dependencies": { - "@radix-ui/react-primitive": "2.1.3" - }, - "peerDependencies": { - "@types/react": "*", - "@types/react-dom": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", - "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - }, - "@types/react-dom": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-select/node_modules/@radix-ui/react-collection": { - "version": "1.1.7", - "resolved": "https://registry.npmjs.org/@radix-ui/react-collection/-/react-collection-1.1.7.tgz", - "integrity": "sha512-Fh9rGN0MoI4ZFUNyfFVNU4y9LUz93u9/0K+yLgA2bwRojxM8JU1DyvvMBabnZPBgMWREAJvU2jjVzq+LrFUglw==", - "license": "MIT", - "dependencies": { - "@radix-ui/react-compose-refs": "1.1.2", - "@radix-ui/react-context": "1.1.2", - "@radix-ui/react-primitive": "2.1.3", - "@radix-ui/react-slot": "1.2.3" - }, - "peerDependencies": { - "@types/react": "*", - "@types/react-dom": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", - "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - }, - "@types/react-dom": { - "optional": true - } - } - }, "node_modules/@radix-ui/react-select/node_modules/@radix-ui/react-dismissable-layer": { "version": "1.1.10", "resolved": "https://registry.npmjs.org/@radix-ui/react-dismissable-layer/-/react-dismissable-layer-1.1.10.tgz", @@ -2965,29 +3151,6 @@ "integrity": "sha512-JTF99U/6XIjCBo0wqkU5sK10glYe27MRRsfwoiq5zzOEZLHU3A3KCMa5X/azekYRCJ0HlwI0crAXS/5dEHTzDg==", "license": "MIT" }, - "node_modules/@radix-ui/react-tooltip/node_modules/@radix-ui/react-arrow": { - "version": "1.1.7", - "resolved": "https://registry.npmjs.org/@radix-ui/react-arrow/-/react-arrow-1.1.7.tgz", - "integrity": "sha512-F+M1tLhO+mlQaOWspE8Wstg+z6PwxwRd8oQ8IXceWz92kfAmalTRf0EjrouQeo7QssEPfCn05B4Ihs1K9WQ/7w==", - "license": "MIT", - "dependencies": { - "@radix-ui/react-primitive": "2.1.3" - }, - "peerDependencies": { - "@types/react": "*", - "@types/react-dom": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", - "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - }, - "@types/react-dom": { - "optional": true - } - } - }, "node_modules/@radix-ui/react-tooltip/node_modules/@radix-ui/react-dismissable-layer": { "version": "1.1.11", "resolved": "https://registry.npmjs.org/@radix-ui/react-dismissable-layer/-/react-dismissable-layer-1.1.11.tgz", @@ -3015,38 +3178,6 @@ } } }, - "node_modules/@radix-ui/react-tooltip/node_modules/@radix-ui/react-popper": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/@radix-ui/react-popper/-/react-popper-1.2.8.tgz", - "integrity": "sha512-0NJQ4LFFUuWkE7Oxf0htBKS6zLkkjBH+hM1uk7Ng705ReR8m/uelduy1DBo0PyBXPKVnBA6YBlU94MBGXrSBCw==", - "license": "MIT", - "dependencies": { - "@floating-ui/react-dom": "^2.0.0", - "@radix-ui/react-arrow": "1.1.7", - "@radix-ui/react-compose-refs": "1.1.2", - "@radix-ui/react-context": "1.1.2", - "@radix-ui/react-primitive": "2.1.3", - "@radix-ui/react-use-callback-ref": "1.1.1", - "@radix-ui/react-use-layout-effect": "1.1.1", - "@radix-ui/react-use-rect": "1.1.1", - "@radix-ui/react-use-size": "1.1.1", - "@radix-ui/rect": "1.1.1" - }, - "peerDependencies": { - "@types/react": "*", - "@types/react-dom": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", - "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - }, - "@types/react-dom": { - "optional": true - } - } - }, "node_modules/@radix-ui/react-tooltip/node_modules/@radix-ui/react-portal": { "version": "1.1.9", "resolved": "https://registry.npmjs.org/@radix-ui/react-portal/-/react-portal-1.1.9.tgz", diff --git a/llama_stack/ui/package.json b/llama_stack/ui/package.json index f892f4f9b..e817e9ae3 100644 --- a/llama_stack/ui/package.json +++ b/llama_stack/ui/package.json @@ -15,7 +15,7 @@ "dependencies": { "@radix-ui/react-collapsible": "^1.1.12", "@radix-ui/react-dialog": "^1.1.13", - "@radix-ui/react-dropdown-menu": "^2.1.14", + "@radix-ui/react-dropdown-menu": "^2.1.16", "@radix-ui/react-select": "^2.2.5", "@radix-ui/react-separator": "^1.1.7", "@radix-ui/react-slot": "^1.2.3", From 51012a82a38e6b8aa2b31907487cacbfd1d8b645 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 8 Sep 2025 10:00:41 +0200 Subject: [PATCH 042/150] chore(github-deps): bump astral-sh/setup-uv from 6.6.0 to 6.6.1 (#3355) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Bumps [astral-sh/setup-uv](https://github.com/astral-sh/setup-uv) from 6.6.0 to 6.6.1.
Release notes

Sourced from astral-sh/setup-uv's releases.

v6.6.1 🌈 Fix exclusions in cache-dependency-glob

Changes

Exclusions with a leading ! in the cache-dependency-glob did not work and got fixed with this release. Thank you @​KnisterPeter for raising this!

🐛 Bug fixes

🧰 Maintenance

Commits

[![Dependabot compatibility score](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name=astral-sh/setup-uv&package-manager=github_actions&previous-version=6.6.0&new-version=6.6.1)](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores) Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting `@dependabot rebase`. [//]: # (dependabot-automerge-start) [//]: # (dependabot-automerge-end) ---
Dependabot commands and options
You can trigger Dependabot actions by commenting on this PR: - `@dependabot rebase` will rebase this PR - `@dependabot recreate` will recreate this PR, overwriting any edits that have been made to it - `@dependabot merge` will merge this PR after your CI passes on it - `@dependabot squash and merge` will squash and merge this PR after your CI passes on it - `@dependabot cancel merge` will cancel a previously requested merge and block automerging - `@dependabot reopen` will reopen this PR if it is closed - `@dependabot close` will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually - `@dependabot show ignore conditions` will show all of the ignore conditions of the specified dependency - `@dependabot ignore this major version` will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this minor version` will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this dependency` will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)
Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- .github/workflows/python-build-test.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/python-build-test.yml b/.github/workflows/python-build-test.yml index bf9a3e057..00f0950c7 100644 --- a/.github/workflows/python-build-test.yml +++ b/.github/workflows/python-build-test.yml @@ -24,7 +24,7 @@ jobs: uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0 - name: Install uv - uses: astral-sh/setup-uv@4959332f0f014c5280e7eac8b70c90cb574c9f9b # v6.6.0 + uses: astral-sh/setup-uv@557e51de59eb14aaaba2ed9621916900a91d50c6 # v6.6.1 with: python-version: ${{ matrix.python-version }} activate-environment: true From 2f91344c1faf8fdb10b31d74cba07d46de694382 Mon Sep 17 00:00:00 2001 From: Yuan Tang Date: Mon, 8 Sep 2025 04:01:41 -0400 Subject: [PATCH 043/150] docs: Update changelog (#3343) This updates the changelog doc to include the latest updates. Signed-off-by: Yuan Tang --- CHANGELOG.md | 98 ++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 98 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 2f47c3ae3..c51a1b2aa 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,103 @@ # Changelog +# v0.2.20 +Published on: 2025-08-29T22:25:32Z + +Here are some key changes that are coming as part of this release. + +### Build and Environment + +- Environment improvements: fixed env var replacement to preserve types. +- Docker stability: fixed container startup failures for Fireworks AI provider. +- Removed absolute paths in build for better portability. + +### Features + +- UI Enhancements: Implemented file upload and VectorDB creation/configuration directly in UI. +- Vector Store Improvements: Added keyword, vector, and hybrid search inside vector store. +- Added S3 authorization support for file providers. +- SQL Store: Added inequality support to where clause. + +### Documentation + +- Fixed post-training docs. +- Added Contributor Guidelines for creating Internal vs. External providers. + +### Fixes + +- Removed unsupported bfcl scoring function. +- Multiple reliability and configuration fixes for providers and environment handling. + +### Engineering / Chores + +- Cleaner internal development setup with consistent paths. +- Incremental improvements to provider integration and vector store behavior. + + +### New Contributors +- @omertuc made their first contribution in #3270 +- @r3v5 made their first contribution in vector store hybrid search + +--- + +# v0.2.19 +Published on: 2025-08-26T22:06:55Z + +## Highlights +* feat: Add CORS configuration support for server by @skamenan7 in https://github.com/llamastack/llama-stack/pull/3201 +* feat(api): introduce /rerank by @ehhuang in https://github.com/llamastack/llama-stack/pull/2940 +* feat: Add S3 Files Provider by @mattf in https://github.com/llamastack/llama-stack/pull/3202 + + +--- + +# v0.2.18 +Published on: 2025-08-20T01:09:27Z + +## Highlights +* Add moderations create API +* Hybrid search in Milvus +* Numerous Responses API improvements +* Documentation updates + + +--- + +# v0.2.17 +Published on: 2025-08-05T01:51:14Z + +## Highlights + +* feat(tests): introduce inference record/replay to increase test reliability by @ashwinb in https://github.com/meta-llama/llama-stack/pull/2941 +* fix(library_client): improve initialization error handling and prevent AttributeError by @mattf in https://github.com/meta-llama/llama-stack/pull/2944 +* fix: use OLLAMA_URL to activate Ollama provider in starter by @ashwinb in https://github.com/meta-llama/llama-stack/pull/2963 +* feat(UI): adding MVP playground UI by @franciscojavierarceo in https://github.com/meta-llama/llama-stack/pull/2828 +* Standardization of errors (@nathan-weinberg) +* feat: Enable DPO training with HuggingFace inline provider by @Nehanth in https://github.com/meta-llama/llama-stack/pull/2825 +* chore: rename templates to distributions by @ashwinb in https://github.com/meta-llama/llama-stack/pull/3035 + + +--- + +# v0.2.16 +Published on: 2025-07-28T23:35:23Z + +## Highlights + +* Automatic model registration for self-hosted providers (ollama and vllm currently). No need for `INFERENCE_MODEL` environment variables which need to be updated, etc. +* Much simplified starter distribution. Most `ENABLE_` env variables are now gone. When you set `VLLM_URL`, the `vllm` provider is auto-enabled. Similar for `MILVUS_URL`, `PGVECTOR_DB`, etc. Check the [run.yaml](https://github.com/meta-llama/llama-stack/blob/main/llama_stack/templates/starter/run.yaml) for more details. +* All tests migrated to pytest now (thanks @Elbehery) +* DPO implementation in the post-training provider (thanks @Nehanth) +* (Huge!) Support for external APIs and providers thereof (thanks @leseb, @cdoern and others). This is a really big deal -- you can now add more APIs completely out of tree and experiment with them before (optionally) wanting to contribute back. +* `inline::vllm` provider is gone thank you very much +* several improvements to OpenAI inference implementations and LiteLLM backend (thanks @mattf) +* Chroma now supports Vector Store API (thanks @franciscojavierarceo). +* Authorization improvements: Vector Store/File APIs now supports access control (thanks @franciscojavierarceo); Telemetry read APIs are gated according to logged-in user's roles. + + + +--- + # v0.2.15 Published on: 2025-07-16T03:30:01Z From 58c61d85c86029bf0935b6f21d1750117ef861ac Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 8 Sep 2025 10:04:41 +0200 Subject: [PATCH 044/150] chore(github-deps): bump actions/stale from 9.1.0 to 10.0.0 (#3352) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Bumps [actions/stale](https://github.com/actions/stale) from 9.1.0 to 10.0.0.
Release notes

Sourced from actions/stale's releases.

v10.0.0

What's Changed

Breaking Changes

Enhancement

Dependency Upgrades

Documentation changes

New Contributors

Full Changelog: https://github.com/actions/stale/compare/v9...v10.0.0

Commits

[![Dependabot compatibility score](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name=actions/stale&package-manager=github_actions&previous-version=9.1.0&new-version=10.0.0)](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores) Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting `@dependabot rebase`. [//]: # (dependabot-automerge-start) [//]: # (dependabot-automerge-end) ---
Dependabot commands and options
You can trigger Dependabot actions by commenting on this PR: - `@dependabot rebase` will rebase this PR - `@dependabot recreate` will recreate this PR, overwriting any edits that have been made to it - `@dependabot merge` will merge this PR after your CI passes on it - `@dependabot squash and merge` will squash and merge this PR after your CI passes on it - `@dependabot cancel merge` will cancel a previously requested merge and block automerging - `@dependabot reopen` will reopen this PR if it is closed - `@dependabot close` will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually - `@dependabot show ignore conditions` will show all of the ignore conditions of the specified dependency - `@dependabot ignore this major version` will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this minor version` will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this dependency` will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)
Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- .github/workflows/stale_bot.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/stale_bot.yml b/.github/workflows/stale_bot.yml index 087df72d7..502a78f8e 100644 --- a/.github/workflows/stale_bot.yml +++ b/.github/workflows/stale_bot.yml @@ -24,7 +24,7 @@ jobs: runs-on: ubuntu-latest steps: - name: Stale Action - uses: actions/stale@5bef64f19d7facfb25b37b414482c7164d639639 # v9.1.0 + uses: actions/stale@3a9db7e6a41a89f618792c92c0e97cc736e1b13f # v10.0.0 with: stale-issue-label: 'stale' stale-issue-message: > From dfa13d68f193b7f701c725d705251458c065e64a Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 8 Sep 2025 10:05:00 +0200 Subject: [PATCH 045/150] chore(github-deps): bump actions/setup-node from 4.4.0 to 5.0.0 (#3353) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Bumps [actions/setup-node](https://github.com/actions/setup-node) from 4.4.0 to 5.0.0.
Release notes

Sourced from actions/setup-node's releases.

v5.0.0

What's Changed

Breaking Changes

This update, introduces automatic caching when a valid packageManager field is present in your package.json. This aims to improve workflow performance and make dependency management more seamless. To disable this automatic caching, set package-manager-cache: false

steps:
- uses: actions/checkout@v5
- uses: actions/setup-node@v5
  with:
    package-manager-cache: false

Make sure your runner is on version v2.327.1 or later to ensure compatibility with this release. See Release Notes

Dependency Upgrades

New Contributors

Full Changelog: https://github.com/actions/setup-node/compare/v4...v5.0.0

Commits

[![Dependabot compatibility score](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name=actions/setup-node&package-manager=github_actions&previous-version=4.4.0&new-version=5.0.0)](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores) Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting `@dependabot rebase`. [//]: # (dependabot-automerge-start) [//]: # (dependabot-automerge-end) ---
Dependabot commands and options
You can trigger Dependabot actions by commenting on this PR: - `@dependabot rebase` will rebase this PR - `@dependabot recreate` will recreate this PR, overwriting any edits that have been made to it - `@dependabot merge` will merge this PR after your CI passes on it - `@dependabot squash and merge` will squash and merge this PR after your CI passes on it - `@dependabot cancel merge` will cancel a previously requested merge and block automerging - `@dependabot reopen` will reopen this PR if it is closed - `@dependabot close` will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually - `@dependabot show ignore conditions` will show all of the ignore conditions of the specified dependency - `@dependabot ignore this major version` will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this minor version` will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this dependency` will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)
Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- .github/workflows/pre-commit.yml | 2 +- .github/workflows/ui-unit-tests.yml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/pre-commit.yml b/.github/workflows/pre-commit.yml index 5f13620f7..27db5fbe7 100644 --- a/.github/workflows/pre-commit.yml +++ b/.github/workflows/pre-commit.yml @@ -37,7 +37,7 @@ jobs: .pre-commit-config.yaml - name: Set up Node.js - uses: actions/setup-node@49933ea5288caeca8642d1e84afbd3f7d6820020 # v4.4.0 + uses: actions/setup-node@a0853c24544627f65ddf259abe73b1d18a591444 # v5.0.0 with: node-version: '20' cache: 'npm' diff --git a/.github/workflows/ui-unit-tests.yml b/.github/workflows/ui-unit-tests.yml index 2afb92bee..c16f512d1 100644 --- a/.github/workflows/ui-unit-tests.yml +++ b/.github/workflows/ui-unit-tests.yml @@ -29,7 +29,7 @@ jobs: uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0 - name: Setup Node.js - uses: actions/setup-node@49933ea5288caeca8642d1e84afbd3f7d6820020 # v4.4.0 + uses: actions/setup-node@a0853c24544627f65ddf259abe73b1d18a591444 # v5.0.0 with: node-version: ${{ matrix.node-version }} cache: 'npm' From d458817af51a59b1f00c0860a3d8a9d9418153a0 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 8 Sep 2025 10:05:34 +0200 Subject: [PATCH 046/150] chore(github-deps): bump actions/setup-python from 5.6.0 to 6.0.0 (#3354) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Bumps [actions/setup-python](https://github.com/actions/setup-python) from 5.6.0 to 6.0.0.
Release notes

Sourced from actions/setup-python's releases.

v6.0.0

What's Changed

Breaking Changes

Make sure your runner is on version v2.327.1 or later to ensure compatibility with this release. See Release Notes

Enhancements:

Bug fixes:

Dependency updates:

New Contributors

Full Changelog: https://github.com/actions/setup-python/compare/v5...v6.0.0

Commits
  • e797f83 Upgrade to node 24 (#1164)
  • 3d1e2d2 Revert "Enhance cache-dependency-path handling to support files outside the w...
  • 65b0712 Clarify pythonLocation behavior for PyPy and GraalPy in environment variables...
  • 5b668cf Bump actions/checkout from 4 to 5 (#1181)
  • f62a0e2 Change missing cache directory error to warning (#1182)
  • 9322b3c Upgrade setuptools to 78.1.1 to fix path traversal vulnerability in PackageIn...
  • fbeb884 Bump form-data to fix critical vulnerabilities #182 & #183 (#1163)
  • 03bb615 Bump idna from 2.9 to 3.7 in /tests/data (#843)
  • 36da51d Add version parsing from Pipfile (#1067)
  • 3c6f142 update documentation (#1156)
  • Additional commits viewable in compare view

[![Dependabot compatibility score](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name=actions/setup-python&package-manager=github_actions&previous-version=5.6.0&new-version=6.0.0)](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores) Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting `@dependabot rebase`. [//]: # (dependabot-automerge-start) [//]: # (dependabot-automerge-end) ---
Dependabot commands and options
You can trigger Dependabot actions by commenting on this PR: - `@dependabot rebase` will rebase this PR - `@dependabot recreate` will recreate this PR, overwriting any edits that have been made to it - `@dependabot merge` will merge this PR after your CI passes on it - `@dependabot squash and merge` will squash and merge this PR after your CI passes on it - `@dependabot cancel merge` will cancel a previously requested merge and block automerging - `@dependabot reopen` will reopen this PR if it is closed - `@dependabot close` will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually - `@dependabot show ignore conditions` will show all of the ignore conditions of the specified dependency - `@dependabot ignore this major version` will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this minor version` will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this dependency` will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)
Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- .github/workflows/pre-commit.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/pre-commit.yml b/.github/workflows/pre-commit.yml index 27db5fbe7..792162262 100644 --- a/.github/workflows/pre-commit.yml +++ b/.github/workflows/pre-commit.yml @@ -28,7 +28,7 @@ jobs: fetch-depth: ${{ github.actor == 'dependabot[bot]' && 0 || 1 }} - name: Set up Python - uses: actions/setup-python@a26af69be951a213d495a4c3e4e4022e16d87065 # v5.6.0 + uses: actions/setup-python@e797f83bcb11b83ae66e0230d6156d7c80228e7c # v6.0.0 with: python-version: '3.12' cache: pip From 44e1a405950f773354ae06c7062ce146f3ea8219 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 8 Sep 2025 10:07:03 +0200 Subject: [PATCH 047/150] chore(github-deps): bump actions/checkout from 4.1.7 to 5.0.0 (#3357) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit [//]: # (dependabot-start) ⚠️ **Dependabot is rebasing this PR** ⚠️ Rebasing might not happen immediately, so don't worry if this takes some time. Note: if you make any changes to this PR yourself, they will take precedence over the rebase. --- [//]: # (dependabot-end) Bumps [actions/checkout](https://github.com/actions/checkout) from 4.1.7 to 5.0.0.
Release notes

Sourced from actions/checkout's releases.

v5.0.0

What's Changed

⚠️ Minimum Compatible Runner Version

v2.327.1
Release Notes

Make sure your runner is updated to this version or newer to use this release.

Full Changelog: https://github.com/actions/checkout/compare/v4...v5.0.0

v4.3.0

What's Changed

New Contributors

Full Changelog: https://github.com/actions/checkout/compare/v4...v4.3.0

v4.2.2

What's Changed

Full Changelog: https://github.com/actions/checkout/compare/v4.2.1...v4.2.2

v4.2.1

What's Changed

New Contributors

Full Changelog: https://github.com/actions/checkout/compare/v4.2.0...v4.2.1

... (truncated)

Changelog

Sourced from actions/checkout's changelog.

Changelog

V5.0.0

V4.3.0

v4.2.2

v4.2.1

v4.2.0

v4.1.7

v4.1.6

v4.1.5

v4.1.4

v4.1.3

... (truncated)

Commits

[![Dependabot compatibility score](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name=actions/checkout&package-manager=github_actions&previous-version=4.1.7&new-version=5.0.0)](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores) Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting `@dependabot rebase`. [//]: # (dependabot-automerge-start) [//]: # (dependabot-automerge-end) ---
Dependabot commands and options
You can trigger Dependabot actions by commenting on this PR: - `@dependabot rebase` will rebase this PR - `@dependabot recreate` will recreate this PR, overwriting any edits that have been made to it - `@dependabot merge` will merge this PR after your CI passes on it - `@dependabot squash and merge` will squash and merge this PR after your CI passes on it - `@dependabot cancel merge` will cancel a previously requested merge and block automerging - `@dependabot reopen` will reopen this PR if it is closed - `@dependabot close` will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually - `@dependabot show ignore conditions` will show all of the ignore conditions of the specified dependency - `@dependabot ignore this major version` will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this minor version` will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this dependency` will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)
Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- .github/workflows/conformance.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/conformance.yml b/.github/workflows/conformance.yml index 2433b0203..c0a7795a3 100644 --- a/.github/workflows/conformance.yml +++ b/.github/workflows/conformance.yml @@ -33,12 +33,12 @@ jobs: # Using specific version 4.1.7 because 5.0.0 fails when trying to run this locally using `act` # This ensures consistent behavior between local testing and CI - name: Checkout PR Code - uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4.1.7 + uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0 # Checkout the base branch to compare against (usually main) # This allows us to diff the current changes against the previous state - name: Checkout Base Branch - uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4.1.7 + uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0 with: ref: ${{ github.event.pull_request.base.ref }} path: 'base' From 072dca0609c55205cd8a8ada5a727c631ce0cc3b Mon Sep 17 00:00:00 2001 From: Akram Ben Aissi Date: Mon, 8 Sep 2025 11:25:10 +0200 Subject: [PATCH 048/150] feat: Add Kubernetes auth provider to use SelfSubjectReview and kubernetes api server (#2559) # What does this PR do? Add Kubernetes authentication provider support - Add KubernetesAuthProvider class for token validation using Kubernetes SelfSubjectReview API - Add KubernetesAuthProviderConfig with configurable API server URL, TLS settings, and claims mapping - Implement authentication via POST requests to /apis/authentication.k8s.io/v1/selfsubjectreviews endpoint - Add support for parsing Kubernetes SelfSubjectReview response format to extract user information - Add KUBERNETES provider type to AuthProviderType enum - Update create_auth_provider factory function to handle 'kubernetes' provider type - Add comprehensive unit tests for KubernetesAuthProvider functionality - Add documentation with configuration examples and usage instructions The provider validates tokens by sending SelfSubjectReview requests to the Kubernetes API server and extracts user information from the userInfo structure in the response. ## Test Plan What This Verifies: Authentication header validation Token validation with Kubernetes SelfSubjectReview and kubernetes server API endpoint Error handling for invalid tokens and HTTP errors Request payload structure and headers ``` python -m pytest tests/unit/server/test_auth.py -k "kubernetes" -v ``` Signed-off-by: Akram Ben Aissi --- docs/source/distributions/configuration.md | 41 +++++++ llama_stack/apis/common/errors.py | 7 ++ llama_stack/core/datatypes.py | 41 ++++++- llama_stack/core/server/auth_providers.py | 93 +++++++++++++- tests/unit/server/test_auth.py | 133 +++++++++++++++++++++ 5 files changed, 311 insertions(+), 4 deletions(-) diff --git a/docs/source/distributions/configuration.md b/docs/source/distributions/configuration.md index c9677b3b6..452c3d95f 100644 --- a/docs/source/distributions/configuration.md +++ b/docs/source/distributions/configuration.md @@ -354,6 +354,47 @@ You can easily validate a request by running: curl -s -L -H "Authorization: Bearer $(cat llama-stack-auth-token)" http://127.0.0.1:8321/v1/providers ``` +#### Kubernetes Authentication Provider + +The server can be configured to use Kubernetes SelfSubjectReview API to validate tokens directly against the Kubernetes API server: + +```yaml +server: + auth: + provider_config: + type: "kubernetes" + api_server_url: "https://kubernetes.default.svc" + claims_mapping: + username: "roles" + groups: "roles" + uid: "uid_attr" + verify_tls: true + tls_cafile: "/path/to/ca.crt" +``` + +Configuration options: +- `api_server_url`: The Kubernetes API server URL (e.g., https://kubernetes.default.svc:6443) +- `verify_tls`: Whether to verify TLS certificates (default: true) +- `tls_cafile`: Path to CA certificate file for TLS verification +- `claims_mapping`: Mapping of Kubernetes user claims to access attributes + +The provider validates tokens by sending a SelfSubjectReview request to the Kubernetes API server at `/apis/authentication.k8s.io/v1/selfsubjectreviews`. The provider extracts user information from the response: +- Username from the `userInfo.username` field +- Groups from the `userInfo.groups` field +- UID from the `userInfo.uid` field + +To obtain a token for testing: +```bash +kubectl create namespace llama-stack +kubectl create serviceaccount llama-stack-auth -n llama-stack +kubectl create token llama-stack-auth -n llama-stack > llama-stack-auth-token +``` + +You can validate a request by running: +```bash +curl -s -L -H "Authorization: Bearer $(cat llama-stack-auth-token)" http://127.0.0.1:8321/v1/providers +``` + #### GitHub Token Provider Validates GitHub personal access tokens or OAuth tokens directly: ```yaml diff --git a/llama_stack/apis/common/errors.py b/llama_stack/apis/common/errors.py index ec3d2b1ce..4c9c0a818 100644 --- a/llama_stack/apis/common/errors.py +++ b/llama_stack/apis/common/errors.py @@ -79,3 +79,10 @@ class ConflictError(ValueError): def __init__(self, message: str) -> None: super().__init__(message) + + +class TokenValidationError(ValueError): + """raised when token validation fails during authentication""" + + def __init__(self, message: str) -> None: + super().__init__(message) diff --git a/llama_stack/core/datatypes.py b/llama_stack/core/datatypes.py index c3940fcbd..0f348b067 100644 --- a/llama_stack/core/datatypes.py +++ b/llama_stack/core/datatypes.py @@ -7,6 +7,7 @@ from enum import StrEnum from pathlib import Path from typing import Annotated, Any, Literal, Self +from urllib.parse import urlparse from pydantic import BaseModel, Field, field_validator, model_validator @@ -212,6 +213,7 @@ class AuthProviderType(StrEnum): OAUTH2_TOKEN = "oauth2_token" GITHUB_TOKEN = "github_token" CUSTOM = "custom" + KUBERNETES = "kubernetes" class OAuth2TokenAuthConfig(BaseModel): @@ -282,8 +284,45 @@ class GitHubTokenAuthConfig(BaseModel): ) +class KubernetesAuthProviderConfig(BaseModel): + """Configuration for Kubernetes authentication provider.""" + + type: Literal[AuthProviderType.KUBERNETES] = AuthProviderType.KUBERNETES + api_server_url: str = Field( + default="https://kubernetes.default.svc", + description="Kubernetes API server URL (e.g., https://api.cluster.domain:6443)", + ) + verify_tls: bool = Field(default=True, description="Whether to verify TLS certificates") + tls_cafile: Path | None = Field(default=None, description="Path to CA certificate file for TLS verification") + claims_mapping: dict[str, str] = Field( + default_factory=lambda: { + "username": "roles", + "groups": "roles", + }, + description="Mapping of Kubernetes user claims to access attributes", + ) + + @field_validator("api_server_url") + @classmethod + def validate_api_server_url(cls, v): + parsed = urlparse(v) + if not parsed.scheme or not parsed.netloc: + raise ValueError(f"api_server_url must be a valid URL with scheme and host: {v}") + if parsed.scheme not in ["http", "https"]: + raise ValueError(f"api_server_url scheme must be http or https: {v}") + return v + + @field_validator("claims_mapping") + @classmethod + def validate_claims_mapping(cls, v): + for key, value in v.items(): + if not value: + raise ValueError(f"claims_mapping value cannot be empty: {key}") + return v + + AuthProviderConfig = Annotated[ - OAuth2TokenAuthConfig | GitHubTokenAuthConfig | CustomAuthConfig, + OAuth2TokenAuthConfig | GitHubTokenAuthConfig | CustomAuthConfig | KubernetesAuthProviderConfig, Field(discriminator="type"), ] diff --git a/llama_stack/core/server/auth_providers.py b/llama_stack/core/server/auth_providers.py index a8af6f75a..38188c49a 100644 --- a/llama_stack/core/server/auth_providers.py +++ b/llama_stack/core/server/auth_providers.py @@ -8,16 +8,18 @@ import ssl import time from abc import ABC, abstractmethod from asyncio import Lock -from urllib.parse import parse_qs, urlparse +from urllib.parse import parse_qs, urljoin, urlparse import httpx from jose import jwt from pydantic import BaseModel, Field +from llama_stack.apis.common.errors import TokenValidationError from llama_stack.core.datatypes import ( AuthenticationConfig, CustomAuthConfig, GitHubTokenAuthConfig, + KubernetesAuthProviderConfig, OAuth2TokenAuthConfig, User, ) @@ -162,7 +164,7 @@ class OAuth2TokenAuthProvider(AuthProvider): auth=auth, timeout=10.0, # Add a reasonable timeout ) - if response.status_code != 200: + if response.status_code != httpx.codes.OK: logger.warning(f"Token introspection failed with status code: {response.status_code}") raise ValueError(f"Token introspection failed: {response.status_code}") @@ -272,7 +274,7 @@ class CustomAuthProvider(AuthProvider): json=auth_request.model_dump(), timeout=10.0, # Add a reasonable timeout ) - if response.status_code != 200: + if response.status_code != httpx.codes.OK: logger.warning(f"Authentication failed with status code: {response.status_code}") raise ValueError(f"Authentication failed: {response.status_code}") @@ -374,6 +376,89 @@ async def _get_github_user_info(access_token: str, github_api_base_url: str) -> } +class KubernetesAuthProvider(AuthProvider): + """ + Kubernetes authentication provider that validates tokens using the Kubernetes SelfSubjectReview API. + This provider integrates with Kubernetes API server by using the + /apis/authentication.k8s.io/v1/selfsubjectreviews endpoint to validate tokens and extract user information. + """ + + def __init__(self, config: KubernetesAuthProviderConfig): + self.config = config + + def _httpx_verify_value(self) -> bool | str: + """ + Build the value for httpx's `verify` parameter. + - False disables verification. + - Path string points to a CA bundle. + - True uses system defaults. + """ + if not self.config.verify_tls: + return False + if self.config.tls_cafile: + return self.config.tls_cafile.as_posix() + return True + + async def validate_token(self, token: str, scope: dict | None = None) -> User: + """Validate a token using Kubernetes SelfSubjectReview API endpoint.""" + # Build the Kubernetes SelfSubjectReview API endpoint URL + review_api_url = urljoin(self.config.api_server_url, "/apis/authentication.k8s.io/v1/selfsubjectreviews") + + # Create SelfSubjectReview request body + review_request = {"apiVersion": "authentication.k8s.io/v1", "kind": "SelfSubjectReview"} + verify = self._httpx_verify_value() + + try: + async with httpx.AsyncClient(verify=verify, timeout=10.0) as client: + response = await client.post( + review_api_url, + json=review_request, + headers={ + "Authorization": f"Bearer {token}", + "Content-Type": "application/json", + }, + ) + + if response.status_code == httpx.codes.UNAUTHORIZED: + raise TokenValidationError("Invalid token") + if response.status_code != httpx.codes.CREATED: + logger.warning(f"Kubernetes SelfSubjectReview API failed with status code: {response.status_code}") + raise TokenValidationError(f"Token validation failed: {response.status_code}") + + review_response = response.json() + # Extract user information from SelfSubjectReview response + status = review_response.get("status", {}) + if not status: + raise ValueError("No status found in SelfSubjectReview response") + + user_info = status.get("userInfo", {}) + if not user_info: + raise ValueError("No userInfo found in SelfSubjectReview response") + + username = user_info.get("username") + if not username: + raise ValueError("No username found in SelfSubjectReview response") + + # Build user attributes from Kubernetes user info + user_attributes = get_attributes_from_claims(user_info, self.config.claims_mapping) + + return User( + principal=username, + attributes=user_attributes, + ) + + except httpx.TimeoutException: + logger.warning("Kubernetes SelfSubjectReview API request timed out") + raise ValueError("Token validation timeout") from None + except Exception as e: + logger.warning(f"Error during token validation: {str(e)}") + raise ValueError(f"Token validation error: {str(e)}") from e + + async def close(self): + """Close any resources.""" + pass + + def create_auth_provider(config: AuthenticationConfig) -> AuthProvider: """Factory function to create the appropriate auth provider.""" provider_config = config.provider_config @@ -384,5 +469,7 @@ def create_auth_provider(config: AuthenticationConfig) -> AuthProvider: return OAuth2TokenAuthProvider(provider_config) elif isinstance(provider_config, GitHubTokenAuthConfig): return GitHubTokenAuthProvider(provider_config) + elif isinstance(provider_config, KubernetesAuthProviderConfig): + return KubernetesAuthProvider(provider_config) else: raise ValueError(f"Unknown authentication provider config type: {type(provider_config)}") diff --git a/tests/unit/server/test_auth.py b/tests/unit/server/test_auth.py index 37b543976..205e0ce65 100644 --- a/tests/unit/server/test_auth.py +++ b/tests/unit/server/test_auth.py @@ -774,3 +774,136 @@ def test_has_required_scope_function(): # Test no user (auth disabled) assert _has_required_scope("test.read", None) + + +@pytest.fixture +def mock_kubernetes_api_server(): + return "https://api.cluster.example.com:6443" + + +@pytest.fixture +def kubernetes_auth_app(mock_kubernetes_api_server): + app = FastAPI() + auth_config = AuthenticationConfig( + provider_config={ + "type": "kubernetes", + "api_server_url": mock_kubernetes_api_server, + "verify_tls": False, + "claims_mapping": { + "username": "roles", + "groups": "roles", + "uid": "uid_attr", + }, + }, + ) + app.add_middleware(AuthenticationMiddleware, auth_config=auth_config, impls={}) + + @app.get("/test") + def test_endpoint(): + return {"message": "Authentication successful"} + + return app + + +@pytest.fixture +def kubernetes_auth_client(kubernetes_auth_app): + return TestClient(kubernetes_auth_app) + + +def test_missing_auth_header_kubernetes_auth(kubernetes_auth_client): + response = kubernetes_auth_client.get("/test") + assert response.status_code == 401 + assert "Authentication required" in response.json()["error"]["message"] + + +def test_invalid_auth_header_format_kubernetes_auth(kubernetes_auth_client): + response = kubernetes_auth_client.get("/test", headers={"Authorization": "InvalidFormat token123"}) + assert response.status_code == 401 + assert "Invalid Authorization header format" in response.json()["error"]["message"] + + +async def mock_kubernetes_selfsubjectreview_success(*args, **kwargs): + return MockResponse( + 201, + { + "apiVersion": "authentication.k8s.io/v1", + "kind": "SelfSubjectReview", + "metadata": {"creationTimestamp": "2025-07-15T13:53:56Z"}, + "status": { + "userInfo": { + "username": "alice", + "uid": "alice-uid-123", + "groups": ["system:authenticated", "developers", "admins"], + "extra": {"scopes.authorization.openshift.io": ["user:full"]}, + } + }, + }, + ) + + +async def mock_kubernetes_selfsubjectreview_failure(*args, **kwargs): + return MockResponse(401, {"message": "Unauthorized"}) + + +async def mock_kubernetes_selfsubjectreview_http_error(*args, **kwargs): + return MockResponse(500, {"message": "Internal Server Error"}) + + +@patch("httpx.AsyncClient.post", new=mock_kubernetes_selfsubjectreview_success) +def test_valid_kubernetes_auth_authentication(kubernetes_auth_client, valid_token): + response = kubernetes_auth_client.get("/test", headers={"Authorization": f"Bearer {valid_token}"}) + assert response.status_code == 200 + assert response.json() == {"message": "Authentication successful"} + + +@patch("httpx.AsyncClient.post", new=mock_kubernetes_selfsubjectreview_failure) +def test_invalid_kubernetes_auth_authentication(kubernetes_auth_client, invalid_token): + response = kubernetes_auth_client.get("/test", headers={"Authorization": f"Bearer {invalid_token}"}) + assert response.status_code == 401 + assert "Invalid token" in response.json()["error"]["message"] + + +@patch("httpx.AsyncClient.post", new=mock_kubernetes_selfsubjectreview_http_error) +def test_kubernetes_auth_http_error(kubernetes_auth_client, valid_token): + response = kubernetes_auth_client.get("/test", headers={"Authorization": f"Bearer {valid_token}"}) + assert response.status_code == 401 + assert "Token validation failed" in response.json()["error"]["message"] + + +def test_kubernetes_auth_request_payload(kubernetes_auth_client, valid_token, mock_kubernetes_api_server): + with patch("httpx.AsyncClient.post") as mock_post: + mock_response = MockResponse( + 200, + { + "apiVersion": "authentication.k8s.io/v1", + "kind": "SelfSubjectReview", + "metadata": {"creationTimestamp": "2025-07-15T13:53:56Z"}, + "status": { + "userInfo": { + "username": "test-user", + "uid": "test-uid", + "groups": ["test-group"], + } + }, + }, + ) + mock_post.return_value = mock_response + + kubernetes_auth_client.get("/test", headers={"Authorization": f"Bearer {valid_token}"}) + + # Verify the request was made with correct parameters + mock_post.assert_called_once() + call_args = mock_post.call_args + + # Check URL (passed as positional argument) + assert call_args[0][0] == f"{mock_kubernetes_api_server}/apis/authentication.k8s.io/v1/selfsubjectreviews" + + # Check headers (passed as keyword argument) + headers = call_args[1]["headers"] + assert headers["Authorization"] == f"Bearer {valid_token}" + assert headers["Content-Type"] == "application/json" + + # Check request body (passed as keyword argument) + request_body = call_args[1]["json"] + assert request_body["apiVersion"] == "authentication.k8s.io/v1" + assert request_body["kind"] == "SelfSubjectReview" From 9618adba8990f1404f1c4de48c3ff03780622f76 Mon Sep 17 00:00:00 2001 From: Mohammad Daoud Farooqi Date: Mon, 8 Sep 2025 17:39:13 +0530 Subject: [PATCH 049/150] docs: add MongoDB to external provider list (#3369) The MongoDB integration - Vector search, Full-Text search and Hybrid search have now been added as an external provider offering for Llama Stack: https://github.com/mongodb-partners/mongodb-llama-stack --- docs/source/providers/external/external-providers-list.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/docs/source/providers/external/external-providers-list.md b/docs/source/providers/external/external-providers-list.md index 49f49076b..45fcc50fb 100644 --- a/docs/source/providers/external/external-providers-list.md +++ b/docs/source/providers/external/external-providers-list.md @@ -7,4 +7,5 @@ Here's a list of known external providers that you can use with Llama Stack: | KubeFlow Training | Train models with KubeFlow | Post Training | Remote | [llama-stack-provider-kft](https://github.com/opendatahub-io/llama-stack-provider-kft) | | KubeFlow Pipelines | Train models with KubeFlow Pipelines | Post Training | Inline **and** Remote | [llama-stack-provider-kfp-trainer](https://github.com/opendatahub-io/llama-stack-provider-kfp-trainer) | | RamaLama | Inference models with RamaLama | Inference | Remote | [ramalama-stack](https://github.com/containers/ramalama-stack) | -| TrustyAI LM-Eval | Evaluate models with TrustyAI LM-Eval | Eval | Remote | [llama-stack-provider-lmeval](https://github.com/trustyai-explainability/llama-stack-provider-lmeval) | \ No newline at end of file +| TrustyAI LM-Eval | Evaluate models with TrustyAI LM-Eval | Eval | Remote | [llama-stack-provider-lmeval](https://github.com/trustyai-explainability/llama-stack-provider-lmeval) | +| MongoDB | VectorIO with MongoDB | Vector_IO | Remote | [mongodb-llama-stack](https://github.com/mongodb-partners/mongodb-llama-stack) | From ad6ea7fb91f79023f821462286e69da2642e297c Mon Sep 17 00:00:00 2001 From: Francisco Arceo Date: Mon, 8 Sep 2025 09:05:13 -0600 Subject: [PATCH 050/150] feat: Adding OpenAI Prompts API (#3319) # What does this PR do? This PR adds support for OpenAI Prompts API. Note, OpenAI does not explicitly expose the Prompts API but instead makes it available in the Responses API and in the [Prompts Dashboard](https://platform.openai.com/docs/guides/prompting#create-a-prompt). I have added the following APIs: - CREATE - GET - LIST - UPDATE - Set Default Version The Set Default Version API is made available only in the Prompts Dashboard and configures which prompt version is returned in the GET (the latest version is the default). Overall, the expected functionality in Responses will look like this: ```python from openai import OpenAI client = OpenAI() response = client.responses.create( prompt={ "id": "pmpt_68b0c29740048196bd3a6e6ac3c4d0e20ed9a13f0d15bf5e", "version": "2", "variables": { "city": "San Francisco", "age": 30, } } ) ``` ### Resolves https://github.com/llamastack/llama-stack/issues/3276 ## Test Plan Unit tests added. Integration tests can be added after client generation. ## Next Steps 1. Update Responses API to support Prompt API 2. I'll enhance the UI to implement the Prompt Dashboard. 3. Add cache for lower latency --------- Signed-off-by: Francisco Javier Arceo --- docs/_static/llama-stack-spec.html | 457 ++++++++++++++++++++- docs/_static/llama-stack-spec.yaml | 332 +++++++++++++++ llama_stack/apis/datatypes.py | 2 + llama_stack/apis/prompts/__init__.py | 9 + llama_stack/apis/prompts/prompts.py | 189 +++++++++ llama_stack/apis/resource.py | 1 + llama_stack/core/prompts/__init__.py | 5 + llama_stack/core/prompts/prompts.py | 233 +++++++++++ llama_stack/core/resolver.py | 2 + llama_stack/core/server/server.py | 1 + llama_stack/core/stack.py | 12 + tests/unit/prompts/prompts/__init__.py | 5 + tests/unit/prompts/prompts/conftest.py | 30 ++ tests/unit/prompts/prompts/test_prompts.py | 144 +++++++ 14 files changed, 1414 insertions(+), 8 deletions(-) create mode 100644 llama_stack/apis/prompts/__init__.py create mode 100644 llama_stack/apis/prompts/prompts.py create mode 100644 llama_stack/core/prompts/__init__.py create mode 100644 llama_stack/core/prompts/prompts.py create mode 100644 tests/unit/prompts/prompts/__init__.py create mode 100644 tests/unit/prompts/prompts/conftest.py create mode 100644 tests/unit/prompts/prompts/test_prompts.py diff --git a/docs/_static/llama-stack-spec.html b/docs/_static/llama-stack-spec.html index 7cb2a73f3..a036e5dc0 100644 --- a/docs/_static/llama-stack-spec.html +++ b/docs/_static/llama-stack-spec.html @@ -633,6 +633,80 @@ } } }, + "/v1/prompts": { + "get": { + "responses": { + "200": { + "description": "A ListPromptsResponse containing all prompts.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ListPromptsResponse" + } + } + } + }, + "400": { + "$ref": "#/components/responses/BadRequest400" + }, + "429": { + "$ref": "#/components/responses/TooManyRequests429" + }, + "500": { + "$ref": "#/components/responses/InternalServerError500" + }, + "default": { + "$ref": "#/components/responses/DefaultError" + } + }, + "tags": [ + "Prompts" + ], + "description": "List all prompts.", + "parameters": [] + }, + "post": { + "responses": { + "200": { + "description": "The created Prompt resource.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Prompt" + } + } + } + }, + "400": { + "$ref": "#/components/responses/BadRequest400" + }, + "429": { + "$ref": "#/components/responses/TooManyRequests429" + }, + "500": { + "$ref": "#/components/responses/InternalServerError500" + }, + "default": { + "$ref": "#/components/responses/DefaultError" + } + }, + "tags": [ + "Prompts" + ], + "description": "Create a new prompt.", + "parameters": [], + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/CreatePromptRequest" + } + } + }, + "required": true + } + } + }, "/v1/agents/{agent_id}": { "get": { "responses": { @@ -901,6 +975,143 @@ ] } }, + "/v1/prompts/{prompt_id}": { + "get": { + "responses": { + "200": { + "description": "A Prompt resource.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Prompt" + } + } + } + }, + "400": { + "$ref": "#/components/responses/BadRequest400" + }, + "429": { + "$ref": "#/components/responses/TooManyRequests429" + }, + "500": { + "$ref": "#/components/responses/InternalServerError500" + }, + "default": { + "$ref": "#/components/responses/DefaultError" + } + }, + "tags": [ + "Prompts" + ], + "description": "Get a prompt by its identifier and optional version.", + "parameters": [ + { + "name": "prompt_id", + "in": "path", + "description": "The identifier of the prompt to get.", + "required": true, + "schema": { + "type": "string" + } + }, + { + "name": "version", + "in": "query", + "description": "The version of the prompt to get (defaults to latest).", + "required": false, + "schema": { + "type": "integer" + } + } + ] + }, + "post": { + "responses": { + "200": { + "description": "The updated Prompt resource with incremented version.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Prompt" + } + } + } + }, + "400": { + "$ref": "#/components/responses/BadRequest400" + }, + "429": { + "$ref": "#/components/responses/TooManyRequests429" + }, + "500": { + "$ref": "#/components/responses/InternalServerError500" + }, + "default": { + "$ref": "#/components/responses/DefaultError" + } + }, + "tags": [ + "Prompts" + ], + "description": "Update an existing prompt (increments version).", + "parameters": [ + { + "name": "prompt_id", + "in": "path", + "description": "The identifier of the prompt to update.", + "required": true, + "schema": { + "type": "string" + } + } + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/UpdatePromptRequest" + } + } + }, + "required": true + } + }, + "delete": { + "responses": { + "200": { + "description": "OK" + }, + "400": { + "$ref": "#/components/responses/BadRequest400" + }, + "429": { + "$ref": "#/components/responses/TooManyRequests429" + }, + "500": { + "$ref": "#/components/responses/InternalServerError500" + }, + "default": { + "$ref": "#/components/responses/DefaultError" + } + }, + "tags": [ + "Prompts" + ], + "description": "Delete a prompt.", + "parameters": [ + { + "name": "prompt_id", + "in": "path", + "description": "The identifier of the prompt to delete.", + "required": true, + "schema": { + "type": "string" + } + } + ] + } + }, "/v1/inference/embeddings": { "post": { "responses": { @@ -2836,6 +3047,49 @@ ] } }, + "/v1/prompts/{prompt_id}/versions": { + "get": { + "responses": { + "200": { + "description": "A ListPromptsResponse containing all versions of the prompt.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ListPromptsResponse" + } + } + } + }, + "400": { + "$ref": "#/components/responses/BadRequest400" + }, + "429": { + "$ref": "#/components/responses/TooManyRequests429" + }, + "500": { + "$ref": "#/components/responses/InternalServerError500" + }, + "default": { + "$ref": "#/components/responses/DefaultError" + } + }, + "tags": [ + "Prompts" + ], + "description": "List all versions of a specific prompt.", + "parameters": [ + { + "name": "prompt_id", + "in": "path", + "description": "The identifier of the prompt to list versions for.", + "required": true, + "schema": { + "type": "string" + } + } + ] + } + }, "/v1/providers": { "get": { "responses": { @@ -5007,6 +5261,59 @@ } } }, + "/v1/prompts/{prompt_id}/set-default-version": { + "post": { + "responses": { + "200": { + "description": "The prompt with the specified version now set as default.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Prompt" + } + } + } + }, + "400": { + "$ref": "#/components/responses/BadRequest400" + }, + "429": { + "$ref": "#/components/responses/TooManyRequests429" + }, + "500": { + "$ref": "#/components/responses/InternalServerError500" + }, + "default": { + "$ref": "#/components/responses/DefaultError" + } + }, + "tags": [ + "Prompts" + ], + "description": "Set which version of a prompt should be the default in get_prompt (latest).", + "parameters": [ + { + "name": "prompt_id", + "in": "path", + "description": "The identifier of the prompt.", + "required": true, + "schema": { + "type": "string" + } + } + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/SetDefaultVersionRequest" + } + } + }, + "required": true + } + } + }, "/v1/post-training/supervised-fine-tune": { "post": { "responses": { @@ -9670,6 +9977,65 @@ ], "title": "OpenAIResponseObjectStreamResponseWebSearchCallSearching" }, + "CreatePromptRequest": { + "type": "object", + "properties": { + "prompt": { + "type": "string", + "description": "The prompt text content with variable placeholders." + }, + "variables": { + "type": "array", + "items": { + "type": "string" + }, + "description": "List of variable names that can be used in the prompt template." + } + }, + "additionalProperties": false, + "required": [ + "prompt" + ], + "title": "CreatePromptRequest" + }, + "Prompt": { + "type": "object", + "properties": { + "prompt": { + "type": "string", + "description": "The system prompt text with variable placeholders. Variables are only supported when using the Responses API." + }, + "version": { + "type": "integer", + "description": "Version (integer starting at 1, incremented on save)" + }, + "prompt_id": { + "type": "string", + "description": "Unique identifier formatted as 'pmpt_<48-digit-hash>'" + }, + "variables": { + "type": "array", + "items": { + "type": "string" + }, + "description": "List of prompt variable names that can be used in the prompt template" + }, + "is_default": { + "type": "boolean", + "default": false, + "description": "Boolean indicating whether this version is the default version for this prompt" + } + }, + "additionalProperties": false, + "required": [ + "version", + "prompt_id", + "variables", + "is_default" + ], + "title": "Prompt", + "description": "A prompt resource representing a stored OpenAI Compatible prompt template in Llama Stack." + }, "OpenAIDeleteResponseObject": { "type": "object", "properties": { @@ -10296,7 +10662,8 @@ "scoring_function", "benchmark", "tool", - "tool_group" + "tool_group", + "prompt" ], "const": "benchmark", "default": "benchmark", @@ -10923,7 +11290,8 @@ "scoring_function", "benchmark", "tool", - "tool_group" + "tool_group", + "prompt" ], "const": "dataset", "default": "dataset", @@ -11073,7 +11441,8 @@ "scoring_function", "benchmark", "tool", - "tool_group" + "tool_group", + "prompt" ], "const": "model", "default": "model", @@ -11338,7 +11707,8 @@ "scoring_function", "benchmark", "tool", - "tool_group" + "tool_group", + "prompt" ], "const": "scoring_function", "default": "scoring_function", @@ -11446,7 +11816,8 @@ "scoring_function", "benchmark", "tool", - "tool_group" + "tool_group", + "prompt" ], "const": "shield", "default": "shield", @@ -11691,7 +12062,8 @@ "scoring_function", "benchmark", "tool", - "tool_group" + "tool_group", + "prompt" ], "const": "tool", "default": "tool", @@ -11773,7 +12145,8 @@ "scoring_function", "benchmark", "tool", - "tool_group" + "tool_group", + "prompt" ], "const": "tool_group", "default": "tool_group", @@ -12067,7 +12440,8 @@ "scoring_function", "benchmark", "tool", - "tool_group" + "tool_group", + "prompt" ], "const": "vector_db", "default": "vector_db", @@ -12882,6 +13256,23 @@ "title": "OpenAIResponseObjectWithInput", "description": "OpenAI response object extended with input context information." }, + "ListPromptsResponse": { + "type": "object", + "properties": { + "data": { + "type": "array", + "items": { + "$ref": "#/components/schemas/Prompt" + } + } + }, + "additionalProperties": false, + "required": [ + "data" + ], + "title": "ListPromptsResponse", + "description": "Response model to list prompts." + }, "ListProvidersResponse": { "type": "object", "properties": { @@ -17128,6 +17519,20 @@ "title": "ScoreBatchResponse", "description": "Response from batch scoring operations on datasets." }, + "SetDefaultVersionRequest": { + "type": "object", + "properties": { + "version": { + "type": "integer", + "description": "The version to set as default." + } + }, + "additionalProperties": false, + "required": [ + "version" + ], + "title": "SetDefaultVersionRequest" + }, "AlgorithmConfig": { "oneOf": [ { @@ -17412,6 +17817,37 @@ "title": "SyntheticDataGenerationResponse", "description": "Response from the synthetic data generation. Batch of (prompt, response, score) tuples that pass the threshold." }, + "UpdatePromptRequest": { + "type": "object", + "properties": { + "prompt": { + "type": "string", + "description": "The updated prompt text content." + }, + "version": { + "type": "integer", + "description": "The current version of the prompt being updated." + }, + "variables": { + "type": "array", + "items": { + "type": "string" + }, + "description": "Updated list of variable names that can be used in the prompt template." + }, + "set_as_default": { + "type": "boolean", + "description": "Set the new version as the default (default=True)." + } + }, + "additionalProperties": false, + "required": [ + "prompt", + "version", + "set_as_default" + ], + "title": "UpdatePromptRequest" + }, "VersionInfo": { "type": "object", "properties": { @@ -17537,6 +17973,10 @@ { "name": "PostTraining (Coming Soon)" }, + { + "name": "Prompts", + "x-displayName": "Protocol for prompt management operations." + }, { "name": "Providers", "x-displayName": "Providers API for inspecting, listing, and modifying providers and their configurations." @@ -17587,6 +18027,7 @@ "Inspect", "Models", "PostTraining (Coming Soon)", + "Prompts", "Providers", "Safety", "Scoring", diff --git a/docs/_static/llama-stack-spec.yaml b/docs/_static/llama-stack-spec.yaml index 25089868c..8ed04c1f8 100644 --- a/docs/_static/llama-stack-spec.yaml +++ b/docs/_static/llama-stack-spec.yaml @@ -427,6 +427,58 @@ paths: schema: $ref: '#/components/schemas/CreateOpenaiResponseRequest' required: true + /v1/prompts: + get: + responses: + '200': + description: >- + A ListPromptsResponse containing all prompts. + content: + application/json: + schema: + $ref: '#/components/schemas/ListPromptsResponse' + '400': + $ref: '#/components/responses/BadRequest400' + '429': + $ref: >- + #/components/responses/TooManyRequests429 + '500': + $ref: >- + #/components/responses/InternalServerError500 + default: + $ref: '#/components/responses/DefaultError' + tags: + - Prompts + description: List all prompts. + parameters: [] + post: + responses: + '200': + description: The created Prompt resource. + content: + application/json: + schema: + $ref: '#/components/schemas/Prompt' + '400': + $ref: '#/components/responses/BadRequest400' + '429': + $ref: >- + #/components/responses/TooManyRequests429 + '500': + $ref: >- + #/components/responses/InternalServerError500 + default: + $ref: '#/components/responses/DefaultError' + tags: + - Prompts + description: Create a new prompt. + parameters: [] + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/CreatePromptRequest' + required: true /v1/agents/{agent_id}: get: responses: @@ -616,6 +668,103 @@ paths: required: true schema: type: string + /v1/prompts/{prompt_id}: + get: + responses: + '200': + description: A Prompt resource. + content: + application/json: + schema: + $ref: '#/components/schemas/Prompt' + '400': + $ref: '#/components/responses/BadRequest400' + '429': + $ref: >- + #/components/responses/TooManyRequests429 + '500': + $ref: >- + #/components/responses/InternalServerError500 + default: + $ref: '#/components/responses/DefaultError' + tags: + - Prompts + description: >- + Get a prompt by its identifier and optional version. + parameters: + - name: prompt_id + in: path + description: The identifier of the prompt to get. + required: true + schema: + type: string + - name: version + in: query + description: >- + The version of the prompt to get (defaults to latest). + required: false + schema: + type: integer + post: + responses: + '200': + description: >- + The updated Prompt resource with incremented version. + content: + application/json: + schema: + $ref: '#/components/schemas/Prompt' + '400': + $ref: '#/components/responses/BadRequest400' + '429': + $ref: >- + #/components/responses/TooManyRequests429 + '500': + $ref: >- + #/components/responses/InternalServerError500 + default: + $ref: '#/components/responses/DefaultError' + tags: + - Prompts + description: >- + Update an existing prompt (increments version). + parameters: + - name: prompt_id + in: path + description: The identifier of the prompt to update. + required: true + schema: + type: string + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/UpdatePromptRequest' + required: true + delete: + responses: + '200': + description: OK + '400': + $ref: '#/components/responses/BadRequest400' + '429': + $ref: >- + #/components/responses/TooManyRequests429 + '500': + $ref: >- + #/components/responses/InternalServerError500 + default: + $ref: '#/components/responses/DefaultError' + tags: + - Prompts + description: Delete a prompt. + parameters: + - name: prompt_id + in: path + description: The identifier of the prompt to delete. + required: true + schema: + type: string /v1/inference/embeddings: post: responses: @@ -1983,6 +2132,37 @@ paths: required: false schema: $ref: '#/components/schemas/Order' + /v1/prompts/{prompt_id}/versions: + get: + responses: + '200': + description: >- + A ListPromptsResponse containing all versions of the prompt. + content: + application/json: + schema: + $ref: '#/components/schemas/ListPromptsResponse' + '400': + $ref: '#/components/responses/BadRequest400' + '429': + $ref: >- + #/components/responses/TooManyRequests429 + '500': + $ref: >- + #/components/responses/InternalServerError500 + default: + $ref: '#/components/responses/DefaultError' + tags: + - Prompts + description: List all versions of a specific prompt. + parameters: + - name: prompt_id + in: path + description: >- + The identifier of the prompt to list versions for. + required: true + schema: + type: string /v1/providers: get: responses: @@ -3546,6 +3726,43 @@ paths: schema: $ref: '#/components/schemas/ScoreBatchRequest' required: true + /v1/prompts/{prompt_id}/set-default-version: + post: + responses: + '200': + description: >- + The prompt with the specified version now set as default. + content: + application/json: + schema: + $ref: '#/components/schemas/Prompt' + '400': + $ref: '#/components/responses/BadRequest400' + '429': + $ref: >- + #/components/responses/TooManyRequests429 + '500': + $ref: >- + #/components/responses/InternalServerError500 + default: + $ref: '#/components/responses/DefaultError' + tags: + - Prompts + description: >- + Set which version of a prompt should be the default in get_prompt (latest). + parameters: + - name: prompt_id + in: path + description: The identifier of the prompt. + required: true + schema: + type: string + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/SetDefaultVersionRequest' + required: true /v1/post-training/supervised-fine-tune: post: responses: @@ -7148,6 +7365,61 @@ components: - type title: >- OpenAIResponseObjectStreamResponseWebSearchCallSearching + CreatePromptRequest: + type: object + properties: + prompt: + type: string + description: >- + The prompt text content with variable placeholders. + variables: + type: array + items: + type: string + description: >- + List of variable names that can be used in the prompt template. + additionalProperties: false + required: + - prompt + title: CreatePromptRequest + Prompt: + type: object + properties: + prompt: + type: string + description: >- + The system prompt text with variable placeholders. Variables are only + supported when using the Responses API. + version: + type: integer + description: >- + Version (integer starting at 1, incremented on save) + prompt_id: + type: string + description: >- + Unique identifier formatted as 'pmpt_<48-digit-hash>' + variables: + type: array + items: + type: string + description: >- + List of prompt variable names that can be used in the prompt template + is_default: + type: boolean + default: false + description: >- + Boolean indicating whether this version is the default version for this + prompt + additionalProperties: false + required: + - version + - prompt_id + - variables + - is_default + title: Prompt + description: >- + A prompt resource representing a stored OpenAI Compatible prompt template + in Llama Stack. OpenAIDeleteResponseObject: type: object properties: @@ -7621,6 +7893,7 @@ components: - benchmark - tool - tool_group + - prompt const: benchmark default: benchmark description: The resource type, always benchmark @@ -8107,6 +8380,7 @@ components: - benchmark - tool - tool_group + - prompt const: dataset default: dataset description: >- @@ -8219,6 +8493,7 @@ components: - benchmark - tool - tool_group + - prompt const: model default: model description: >- @@ -8410,6 +8685,7 @@ components: - benchmark - tool - tool_group + - prompt const: scoring_function default: scoring_function description: >- @@ -8486,6 +8762,7 @@ components: - benchmark - tool - tool_group + - prompt const: shield default: shield description: The resource type, always shield @@ -8665,6 +8942,7 @@ components: - benchmark - tool - tool_group + - prompt const: tool default: tool description: Type of resource, always 'tool' @@ -8723,6 +9001,7 @@ components: - benchmark - tool - tool_group + - prompt const: tool_group default: tool_group description: Type of resource, always 'tool_group' @@ -8951,6 +9230,7 @@ components: - benchmark - tool - tool_group + - prompt const: vector_db default: vector_db description: >- @@ -9577,6 +9857,18 @@ components: title: OpenAIResponseObjectWithInput description: >- OpenAI response object extended with input context information. + ListPromptsResponse: + type: object + properties: + data: + type: array + items: + $ref: '#/components/schemas/Prompt' + additionalProperties: false + required: + - data + title: ListPromptsResponse + description: Response model to list prompts. ListProvidersResponse: type: object properties: @@ -12722,6 +13014,16 @@ components: title: ScoreBatchResponse description: >- Response from batch scoring operations on datasets. + SetDefaultVersionRequest: + type: object + properties: + version: + type: integer + description: The version to set as default. + additionalProperties: false + required: + - version + title: SetDefaultVersionRequest AlgorithmConfig: oneOf: - $ref: '#/components/schemas/LoraFinetuningConfig' @@ -12918,6 +13220,32 @@ components: description: >- Response from the synthetic data generation. Batch of (prompt, response, score) tuples that pass the threshold. + UpdatePromptRequest: + type: object + properties: + prompt: + type: string + description: The updated prompt text content. + version: + type: integer + description: >- + The current version of the prompt being updated. + variables: + type: array + items: + type: string + description: >- + Updated list of variable names that can be used in the prompt template. + set_as_default: + type: boolean + description: >- + Set the new version as the default (default=True). + additionalProperties: false + required: + - prompt + - version + - set_as_default + title: UpdatePromptRequest VersionInfo: type: object properties: @@ -13029,6 +13357,9 @@ tags: - name: Inspect - name: Models - name: PostTraining (Coming Soon) + - name: Prompts + x-displayName: >- + Protocol for prompt management operations. - name: Providers x-displayName: >- Providers API for inspecting, listing, and modifying providers and their configurations. @@ -13056,6 +13387,7 @@ x-tagGroups: - Inspect - Models - PostTraining (Coming Soon) + - Prompts - Providers - Safety - Scoring diff --git a/llama_stack/apis/datatypes.py b/llama_stack/apis/datatypes.py index 87fc95917..8d0f2e26d 100644 --- a/llama_stack/apis/datatypes.py +++ b/llama_stack/apis/datatypes.py @@ -102,6 +102,7 @@ class Api(Enum, metaclass=DynamicApiMeta): :cvar benchmarks: Benchmark suite management :cvar tool_groups: Tool group organization :cvar files: File storage and management + :cvar prompts: Prompt versions and management :cvar inspect: Built-in system inspection and introspection """ @@ -127,6 +128,7 @@ class Api(Enum, metaclass=DynamicApiMeta): benchmarks = "benchmarks" tool_groups = "tool_groups" files = "files" + prompts = "prompts" # built-in API inspect = "inspect" diff --git a/llama_stack/apis/prompts/__init__.py b/llama_stack/apis/prompts/__init__.py new file mode 100644 index 000000000..6070f3450 --- /dev/null +++ b/llama_stack/apis/prompts/__init__.py @@ -0,0 +1,9 @@ +# Copyright (c) Meta Platforms, Inc. and affiliates. +# All rights reserved. +# +# This source code is licensed under the terms described in the LICENSE file in +# the root directory of this source tree. + +from .prompts import ListPromptsResponse, Prompt, Prompts + +__all__ = ["Prompt", "Prompts", "ListPromptsResponse"] diff --git a/llama_stack/apis/prompts/prompts.py b/llama_stack/apis/prompts/prompts.py new file mode 100644 index 000000000..e6a376c3f --- /dev/null +++ b/llama_stack/apis/prompts/prompts.py @@ -0,0 +1,189 @@ +# Copyright (c) Meta Platforms, Inc. and affiliates. +# All rights reserved. +# +# This source code is licensed under the terms described in the LICENSE file in +# the root directory of this source tree. + +import re +import secrets +from typing import Protocol, runtime_checkable + +from pydantic import BaseModel, Field, field_validator, model_validator + +from llama_stack.providers.utils.telemetry.trace_protocol import trace_protocol +from llama_stack.schema_utils import json_schema_type, webmethod + + +@json_schema_type +class Prompt(BaseModel): + """A prompt resource representing a stored OpenAI Compatible prompt template in Llama Stack. + + :param prompt: The system prompt text with variable placeholders. Variables are only supported when using the Responses API. + :param version: Version (integer starting at 1, incremented on save) + :param prompt_id: Unique identifier formatted as 'pmpt_<48-digit-hash>' + :param variables: List of prompt variable names that can be used in the prompt template + :param is_default: Boolean indicating whether this version is the default version for this prompt + """ + + prompt: str | None = Field(default=None, description="The system prompt with variable placeholders") + version: int = Field(description="Version (integer starting at 1, incremented on save)", ge=1) + prompt_id: str = Field(description="Unique identifier in format 'pmpt_<48-digit-hash>'") + variables: list[str] = Field( + default_factory=list, description="List of variable names that can be used in the prompt template" + ) + is_default: bool = Field( + default=False, description="Boolean indicating whether this version is the default version" + ) + + @field_validator("prompt_id") + @classmethod + def validate_prompt_id(cls, prompt_id: str) -> str: + if not isinstance(prompt_id, str): + raise TypeError("prompt_id must be a string in format 'pmpt_<48-digit-hash>'") + + if not prompt_id.startswith("pmpt_"): + raise ValueError("prompt_id must start with 'pmpt_' prefix") + + hex_part = prompt_id[5:] + if len(hex_part) != 48: + raise ValueError("prompt_id must be in format 'pmpt_<48-digit-hash>' (48 lowercase hex chars)") + + for char in hex_part: + if char not in "0123456789abcdef": + raise ValueError("prompt_id hex part must contain only lowercase hex characters [0-9a-f]") + + return prompt_id + + @field_validator("version") + @classmethod + def validate_version(cls, prompt_version: int) -> int: + if prompt_version < 1: + raise ValueError("version must be >= 1") + return prompt_version + + @model_validator(mode="after") + def validate_prompt_variables(self): + """Validate that all variables used in the prompt are declared in the variables list.""" + if not self.prompt: + return self + + prompt_variables = set(re.findall(r"{{\s*(\w+)\s*}}", self.prompt)) + declared_variables = set(self.variables) + + undeclared = prompt_variables - declared_variables + if undeclared: + raise ValueError(f"Prompt contains undeclared variables: {sorted(undeclared)}") + + return self + + @classmethod + def generate_prompt_id(cls) -> str: + # Generate 48 hex characters (24 bytes) + random_bytes = secrets.token_bytes(24) + hex_string = random_bytes.hex() + return f"pmpt_{hex_string}" + + +class ListPromptsResponse(BaseModel): + """Response model to list prompts.""" + + data: list[Prompt] + + +@runtime_checkable +@trace_protocol +class Prompts(Protocol): + """Protocol for prompt management operations.""" + + @webmethod(route="/prompts", method="GET") + async def list_prompts(self) -> ListPromptsResponse: + """List all prompts. + + :returns: A ListPromptsResponse containing all prompts. + """ + ... + + @webmethod(route="/prompts/{prompt_id}/versions", method="GET") + async def list_prompt_versions( + self, + prompt_id: str, + ) -> ListPromptsResponse: + """List all versions of a specific prompt. + + :param prompt_id: The identifier of the prompt to list versions for. + :returns: A ListPromptsResponse containing all versions of the prompt. + """ + ... + + @webmethod(route="/prompts/{prompt_id}", method="GET") + async def get_prompt( + self, + prompt_id: str, + version: int | None = None, + ) -> Prompt: + """Get a prompt by its identifier and optional version. + + :param prompt_id: The identifier of the prompt to get. + :param version: The version of the prompt to get (defaults to latest). + :returns: A Prompt resource. + """ + ... + + @webmethod(route="/prompts", method="POST") + async def create_prompt( + self, + prompt: str, + variables: list[str] | None = None, + ) -> Prompt: + """Create a new prompt. + + :param prompt: The prompt text content with variable placeholders. + :param variables: List of variable names that can be used in the prompt template. + :returns: The created Prompt resource. + """ + ... + + @webmethod(route="/prompts/{prompt_id}", method="PUT") + async def update_prompt( + self, + prompt_id: str, + prompt: str, + version: int, + variables: list[str] | None = None, + set_as_default: bool = True, + ) -> Prompt: + """Update an existing prompt (increments version). + + :param prompt_id: The identifier of the prompt to update. + :param prompt: The updated prompt text content. + :param version: The current version of the prompt being updated. + :param variables: Updated list of variable names that can be used in the prompt template. + :param set_as_default: Set the new version as the default (default=True). + :returns: The updated Prompt resource with incremented version. + """ + ... + + @webmethod(route="/prompts/{prompt_id}", method="DELETE") + async def delete_prompt( + self, + prompt_id: str, + ) -> None: + """Delete a prompt. + + :param prompt_id: The identifier of the prompt to delete. + """ + ... + + @webmethod(route="/prompts/{prompt_id}/set-default-version", method="PUT") + async def set_default_version( + self, + prompt_id: str, + version: int, + ) -> Prompt: + """Set which version of a prompt should be the default in get_prompt (latest). + + :param prompt_id: The identifier of the prompt. + :param version: The version to set as default. + :returns: The prompt with the specified version now set as default. + """ + ... diff --git a/llama_stack/apis/resource.py b/llama_stack/apis/resource.py index 3731fbf1d..7c4130f7d 100644 --- a/llama_stack/apis/resource.py +++ b/llama_stack/apis/resource.py @@ -19,6 +19,7 @@ class ResourceType(StrEnum): benchmark = "benchmark" tool = "tool" tool_group = "tool_group" + prompt = "prompt" class Resource(BaseModel): diff --git a/llama_stack/core/prompts/__init__.py b/llama_stack/core/prompts/__init__.py new file mode 100644 index 000000000..756f351d8 --- /dev/null +++ b/llama_stack/core/prompts/__init__.py @@ -0,0 +1,5 @@ +# Copyright (c) Meta Platforms, Inc. and affiliates. +# All rights reserved. +# +# This source code is licensed under the terms described in the LICENSE file in +# the root directory of this source tree. diff --git a/llama_stack/core/prompts/prompts.py b/llama_stack/core/prompts/prompts.py new file mode 100644 index 000000000..26e8f5cef --- /dev/null +++ b/llama_stack/core/prompts/prompts.py @@ -0,0 +1,233 @@ +# Copyright (c) Meta Platforms, Inc. and affiliates. +# All rights reserved. +# +# This source code is licensed under the terms described in the LICENSE file in +# the root directory of this source tree. + +import json +from typing import Any + +from pydantic import BaseModel + +from llama_stack.apis.prompts import ListPromptsResponse, Prompt, Prompts +from llama_stack.core.datatypes import StackRunConfig +from llama_stack.core.utils.config_dirs import DISTRIBS_BASE_DIR +from llama_stack.providers.utils.kvstore import KVStore, kvstore_impl +from llama_stack.providers.utils.kvstore.config import SqliteKVStoreConfig + + +class PromptServiceConfig(BaseModel): + """Configuration for the built-in prompt service. + + :param run_config: Stack run configuration containing distribution info + """ + + run_config: StackRunConfig + + +async def get_provider_impl(config: PromptServiceConfig, deps: dict[Any, Any]): + """Get the prompt service implementation.""" + impl = PromptServiceImpl(config, deps) + await impl.initialize() + return impl + + +class PromptServiceImpl(Prompts): + """Built-in prompt service implementation using KVStore.""" + + def __init__(self, config: PromptServiceConfig, deps: dict[Any, Any]): + self.config = config + self.deps = deps + self.kvstore: KVStore + + async def initialize(self) -> None: + kvstore_config = SqliteKVStoreConfig( + db_path=(DISTRIBS_BASE_DIR / self.config.run_config.image_name / "prompts.db").as_posix() + ) + self.kvstore = await kvstore_impl(kvstore_config) + + def _get_default_key(self, prompt_id: str) -> str: + """Get the KVStore key that stores the default version number.""" + return f"prompts:v1:{prompt_id}:default" + + async def _get_prompt_key(self, prompt_id: str, version: int | None = None) -> str: + """Get the KVStore key for prompt data, returning default version if applicable.""" + if version: + return self._get_version_key(prompt_id, str(version)) + + default_key = self._get_default_key(prompt_id) + resolved_version = await self.kvstore.get(default_key) + if resolved_version is None: + raise ValueError(f"Prompt {prompt_id}:default not found") + return self._get_version_key(prompt_id, resolved_version) + + def _get_version_key(self, prompt_id: str, version: str) -> str: + """Get the KVStore key for a specific prompt version.""" + return f"prompts:v1:{prompt_id}:{version}" + + def _get_list_key_prefix(self) -> str: + """Get the key prefix for listing prompts.""" + return "prompts:v1:" + + def _serialize_prompt(self, prompt: Prompt) -> str: + """Serialize a prompt to JSON string for storage.""" + return json.dumps( + { + "prompt_id": prompt.prompt_id, + "prompt": prompt.prompt, + "version": prompt.version, + "variables": prompt.variables or [], + "is_default": prompt.is_default, + } + ) + + def _deserialize_prompt(self, data: str) -> Prompt: + """Deserialize a prompt from JSON string.""" + obj = json.loads(data) + return Prompt( + prompt_id=obj["prompt_id"], + prompt=obj["prompt"], + version=obj["version"], + variables=obj.get("variables", []), + is_default=obj.get("is_default", False), + ) + + async def list_prompts(self) -> ListPromptsResponse: + """List all prompts (default versions only).""" + prefix = self._get_list_key_prefix() + keys = await self.kvstore.keys_in_range(prefix, prefix + "\xff") + + prompts = [] + for key in keys: + if key.endswith(":default"): + try: + default_version = await self.kvstore.get(key) + if default_version: + prompt_id = key.replace(prefix, "").replace(":default", "") + version_key = self._get_version_key(prompt_id, default_version) + data = await self.kvstore.get(version_key) + if data: + prompt = self._deserialize_prompt(data) + prompts.append(prompt) + except (json.JSONDecodeError, KeyError): + continue + + prompts.sort(key=lambda p: p.prompt_id or "", reverse=True) + return ListPromptsResponse(data=prompts) + + async def get_prompt(self, prompt_id: str, version: int | None = None) -> Prompt: + """Get a prompt by its identifier and optional version.""" + key = await self._get_prompt_key(prompt_id, version) + data = await self.kvstore.get(key) + if data is None: + raise ValueError(f"Prompt {prompt_id}:{version if version else 'default'} not found") + return self._deserialize_prompt(data) + + async def create_prompt( + self, + prompt: str, + variables: list[str] | None = None, + ) -> Prompt: + """Create a new prompt.""" + if variables is None: + variables = [] + + prompt_obj = Prompt( + prompt_id=Prompt.generate_prompt_id(), + prompt=prompt, + version=1, + variables=variables, + ) + + version_key = self._get_version_key(prompt_obj.prompt_id, str(prompt_obj.version)) + data = self._serialize_prompt(prompt_obj) + await self.kvstore.set(version_key, data) + + default_key = self._get_default_key(prompt_obj.prompt_id) + await self.kvstore.set(default_key, str(prompt_obj.version)) + + return prompt_obj + + async def update_prompt( + self, + prompt_id: str, + prompt: str, + version: int, + variables: list[str] | None = None, + set_as_default: bool = True, + ) -> Prompt: + """Update an existing prompt (increments version).""" + if version < 1: + raise ValueError("Version must be >= 1") + if variables is None: + variables = [] + + prompt_versions = await self.list_prompt_versions(prompt_id) + latest_prompt = max(prompt_versions.data, key=lambda x: int(x.version)) + + if version and latest_prompt.version != version: + raise ValueError( + f"'{version}' is not the latest prompt version for prompt_id='{prompt_id}'. Use the latest version '{latest_prompt.version}' in request." + ) + + current_version = latest_prompt.version if version is None else version + new_version = current_version + 1 + + updated_prompt = Prompt(prompt_id=prompt_id, prompt=prompt, version=new_version, variables=variables) + + version_key = self._get_version_key(prompt_id, str(new_version)) + data = self._serialize_prompt(updated_prompt) + await self.kvstore.set(version_key, data) + + if set_as_default: + await self.set_default_version(prompt_id, new_version) + + return updated_prompt + + async def delete_prompt(self, prompt_id: str) -> None: + """Delete a prompt and all its versions.""" + await self.get_prompt(prompt_id) + + prefix = f"prompts:v1:{prompt_id}:" + keys = await self.kvstore.keys_in_range(prefix, prefix + "\xff") + + for key in keys: + await self.kvstore.delete(key) + + async def list_prompt_versions(self, prompt_id: str) -> ListPromptsResponse: + """List all versions of a specific prompt.""" + prefix = f"prompts:v1:{prompt_id}:" + keys = await self.kvstore.keys_in_range(prefix, prefix + "\xff") + + default_version = None + prompts = [] + + for key in keys: + data = await self.kvstore.get(key) + if key.endswith(":default"): + default_version = data + else: + if data: + prompt_obj = self._deserialize_prompt(data) + prompts.append(prompt_obj) + + if not prompts: + raise ValueError(f"Prompt {prompt_id} not found") + + for prompt in prompts: + prompt.is_default = str(prompt.version) == default_version + + prompts.sort(key=lambda x: x.version) + return ListPromptsResponse(data=prompts) + + async def set_default_version(self, prompt_id: str, version: int) -> Prompt: + """Set which version of a prompt should be the default, If not set. the default is the latest.""" + version_key = self._get_version_key(prompt_id, str(version)) + data = await self.kvstore.get(version_key) + if data is None: + raise ValueError(f"Prompt {prompt_id} version {version} not found") + + default_key = self._get_default_key(prompt_id) + await self.kvstore.set(default_key, str(version)) + + return self._deserialize_prompt(data) diff --git a/llama_stack/core/resolver.py b/llama_stack/core/resolver.py index a8ad03e1a..373446de6 100644 --- a/llama_stack/core/resolver.py +++ b/llama_stack/core/resolver.py @@ -19,6 +19,7 @@ from llama_stack.apis.inference import Inference, InferenceProvider from llama_stack.apis.inspect import Inspect from llama_stack.apis.models import Models from llama_stack.apis.post_training import PostTraining +from llama_stack.apis.prompts import Prompts from llama_stack.apis.providers import Providers as ProvidersAPI from llama_stack.apis.safety import Safety from llama_stack.apis.scoring import Scoring @@ -93,6 +94,7 @@ def api_protocol_map(external_apis: dict[Api, ExternalApiSpec] | None = None) -> Api.tool_groups: ToolGroups, Api.tool_runtime: ToolRuntime, Api.files: Files, + Api.prompts: Prompts, } if external_apis: diff --git a/llama_stack/core/server/server.py b/llama_stack/core/server/server.py index 288bf46e1..d3e875fec 100644 --- a/llama_stack/core/server/server.py +++ b/llama_stack/core/server/server.py @@ -515,6 +515,7 @@ def main(args: argparse.Namespace | None = None): apis_to_serve.add("inspect") apis_to_serve.add("providers") + apis_to_serve.add("prompts") for api_str in apis_to_serve: api = Api(api_str) diff --git a/llama_stack/core/stack.py b/llama_stack/core/stack.py index bccea48d3..7ab8d2c64 100644 --- a/llama_stack/core/stack.py +++ b/llama_stack/core/stack.py @@ -24,6 +24,7 @@ from llama_stack.apis.inference import Inference from llama_stack.apis.inspect import Inspect from llama_stack.apis.models import Models from llama_stack.apis.post_training import PostTraining +from llama_stack.apis.prompts import Prompts from llama_stack.apis.providers import Providers from llama_stack.apis.safety import Safety from llama_stack.apis.scoring import Scoring @@ -37,6 +38,7 @@ from llama_stack.apis.vector_io import VectorIO from llama_stack.core.datatypes import Provider, StackRunConfig from llama_stack.core.distribution import get_provider_registry from llama_stack.core.inspect import DistributionInspectConfig, DistributionInspectImpl +from llama_stack.core.prompts.prompts import PromptServiceConfig, PromptServiceImpl from llama_stack.core.providers import ProviderImpl, ProviderImplConfig from llama_stack.core.resolver import ProviderRegistry, resolve_impls from llama_stack.core.routing_tables.common import CommonRoutingTableImpl @@ -72,6 +74,7 @@ class LlamaStack( ToolRuntime, RAGToolRuntime, Files, + Prompts, ): pass @@ -305,6 +308,12 @@ def add_internal_implementations(impls: dict[Api, Any], run_config: StackRunConf ) impls[Api.providers] = providers_impl + prompts_impl = PromptServiceImpl( + PromptServiceConfig(run_config=run_config), + deps=impls, + ) + impls[Api.prompts] = prompts_impl + # Produces a stack of providers for the given run config. Not all APIs may be # asked for in the run config. @@ -329,6 +338,9 @@ async def construct_stack( # Add internal implementations after all other providers are resolved add_internal_implementations(impls, run_config) + if Api.prompts in impls: + await impls[Api.prompts].initialize() + await register_resources(run_config, impls) await refresh_registry_once(impls) diff --git a/tests/unit/prompts/prompts/__init__.py b/tests/unit/prompts/prompts/__init__.py new file mode 100644 index 000000000..756f351d8 --- /dev/null +++ b/tests/unit/prompts/prompts/__init__.py @@ -0,0 +1,5 @@ +# Copyright (c) Meta Platforms, Inc. and affiliates. +# All rights reserved. +# +# This source code is licensed under the terms described in the LICENSE file in +# the root directory of this source tree. diff --git a/tests/unit/prompts/prompts/conftest.py b/tests/unit/prompts/prompts/conftest.py new file mode 100644 index 000000000..b2c619e49 --- /dev/null +++ b/tests/unit/prompts/prompts/conftest.py @@ -0,0 +1,30 @@ +# Copyright (c) Meta Platforms, Inc. and affiliates. +# All rights reserved. +# +# This source code is licensed under the terms described in the LICENSE file in +# the root directory of this source tree. + +import random + +import pytest + +from llama_stack.core.prompts.prompts import PromptServiceConfig, PromptServiceImpl +from llama_stack.providers.utils.kvstore.config import SqliteKVStoreConfig + + +@pytest.fixture +async def temp_prompt_store(tmp_path_factory): + unique_id = f"prompt_store_{random.randint(1, 1000000)}" + temp_dir = tmp_path_factory.getbasetemp() + db_path = str(temp_dir / f"{unique_id}.db") + + from llama_stack.core.datatypes import StackRunConfig + from llama_stack.providers.utils.kvstore import kvstore_impl + + mock_run_config = StackRunConfig(image_name="test-distribution", apis=[], providers={}) + config = PromptServiceConfig(run_config=mock_run_config) + store = PromptServiceImpl(config, deps={}) + + store.kvstore = await kvstore_impl(SqliteKVStoreConfig(db_path=db_path)) + + yield store diff --git a/tests/unit/prompts/prompts/test_prompts.py b/tests/unit/prompts/prompts/test_prompts.py new file mode 100644 index 000000000..792e55530 --- /dev/null +++ b/tests/unit/prompts/prompts/test_prompts.py @@ -0,0 +1,144 @@ +# Copyright (c) Meta Platforms, Inc. and affiliates. +# All rights reserved. +# +# This source code is licensed under the terms described in the LICENSE file in +# the root directory of this source tree. + + +import pytest + + +class TestPrompts: + async def test_create_and_get_prompt(self, temp_prompt_store): + prompt = await temp_prompt_store.create_prompt("Hello world!", ["name"]) + assert prompt.prompt == "Hello world!" + assert prompt.version == 1 + assert prompt.prompt_id.startswith("pmpt_") + assert prompt.variables == ["name"] + + retrieved = await temp_prompt_store.get_prompt(prompt.prompt_id) + assert retrieved.prompt_id == prompt.prompt_id + assert retrieved.prompt == prompt.prompt + + async def test_update_prompt(self, temp_prompt_store): + prompt = await temp_prompt_store.create_prompt("Original") + updated = await temp_prompt_store.update_prompt(prompt.prompt_id, "Updated", 1, ["v"]) + assert updated.version == 2 + assert updated.prompt == "Updated" + + async def test_update_prompt_with_version(self, temp_prompt_store): + version_for_update = 1 + + prompt = await temp_prompt_store.create_prompt("Original") + assert prompt.version == 1 + prompt = await temp_prompt_store.update_prompt(prompt.prompt_id, "Updated", version_for_update, ["v"]) + assert prompt.version == 2 + + with pytest.raises(ValueError): + # now this is a stale version + await temp_prompt_store.update_prompt(prompt.prompt_id, "Another Update", version_for_update, ["v"]) + + with pytest.raises(ValueError): + # this version does not exist + await temp_prompt_store.update_prompt(prompt.prompt_id, "Another Update", 99, ["v"]) + + async def test_delete_prompt(self, temp_prompt_store): + prompt = await temp_prompt_store.create_prompt("to be deleted") + await temp_prompt_store.delete_prompt(prompt.prompt_id) + with pytest.raises(ValueError): + await temp_prompt_store.get_prompt(prompt.prompt_id) + + async def test_list_prompts(self, temp_prompt_store): + response = await temp_prompt_store.list_prompts() + assert response.data == [] + + await temp_prompt_store.create_prompt("first") + await temp_prompt_store.create_prompt("second") + + response = await temp_prompt_store.list_prompts() + assert len(response.data) == 2 + + async def test_version(self, temp_prompt_store): + prompt = await temp_prompt_store.create_prompt("V1") + await temp_prompt_store.update_prompt(prompt.prompt_id, "V2", 1) + + v1 = await temp_prompt_store.get_prompt(prompt.prompt_id, version=1) + assert v1.version == 1 and v1.prompt == "V1" + + latest = await temp_prompt_store.get_prompt(prompt.prompt_id) + assert latest.version == 2 and latest.prompt == "V2" + + async def test_set_default_version(self, temp_prompt_store): + prompt0 = await temp_prompt_store.create_prompt("V1") + prompt1 = await temp_prompt_store.update_prompt(prompt0.prompt_id, "V2", 1) + + assert (await temp_prompt_store.get_prompt(prompt0.prompt_id)).version == 2 + prompt_default = await temp_prompt_store.set_default_version(prompt0.prompt_id, 1) + assert (await temp_prompt_store.get_prompt(prompt0.prompt_id)).version == 1 + assert prompt_default.version == 1 + + prompt2 = await temp_prompt_store.update_prompt(prompt0.prompt_id, "V3", prompt1.version) + assert prompt2.version == 3 + + async def test_prompt_id_generation_and_validation(self, temp_prompt_store): + prompt = await temp_prompt_store.create_prompt("Test") + assert prompt.prompt_id.startswith("pmpt_") + assert len(prompt.prompt_id) == 53 + + with pytest.raises(ValueError): + await temp_prompt_store.get_prompt("invalid_id") + + async def test_list_shows_default_versions(self, temp_prompt_store): + prompt = await temp_prompt_store.create_prompt("V1") + await temp_prompt_store.update_prompt(prompt.prompt_id, "V2", 1) + await temp_prompt_store.update_prompt(prompt.prompt_id, "V3", 2) + + response = await temp_prompt_store.list_prompts() + listed_prompt = response.data[0] + assert listed_prompt.version == 3 and listed_prompt.prompt == "V3" + + await temp_prompt_store.set_default_version(prompt.prompt_id, 1) + + response = await temp_prompt_store.list_prompts() + listed_prompt = response.data[0] + assert listed_prompt.version == 1 and listed_prompt.prompt == "V1" + assert not (await temp_prompt_store.get_prompt(prompt.prompt_id, 3)).is_default + + async def test_get_all_prompt_versions(self, temp_prompt_store): + prompt = await temp_prompt_store.create_prompt("V1") + await temp_prompt_store.update_prompt(prompt.prompt_id, "V2", 1) + await temp_prompt_store.update_prompt(prompt.prompt_id, "V3", 2) + + versions = (await temp_prompt_store.list_prompt_versions(prompt.prompt_id)).data + assert len(versions) == 3 + assert [v.version for v in versions] == [1, 2, 3] + assert [v.is_default for v in versions] == [False, False, True] + + await temp_prompt_store.set_default_version(prompt.prompt_id, 2) + versions = (await temp_prompt_store.list_prompt_versions(prompt.prompt_id)).data + assert [v.is_default for v in versions] == [False, True, False] + + with pytest.raises(ValueError): + await temp_prompt_store.list_prompt_versions("nonexistent") + + async def test_prompt_variable_validation(self, temp_prompt_store): + prompt = await temp_prompt_store.create_prompt("Hello {{ name }}, you live in {{ city }}!", ["name", "city"]) + assert prompt.variables == ["name", "city"] + + prompt_no_vars = await temp_prompt_store.create_prompt("Hello world!", []) + assert prompt_no_vars.variables == [] + + with pytest.raises(ValueError, match="undeclared variables"): + await temp_prompt_store.create_prompt("Hello {{ name }}, invalid {{ unknown }}!", ["name"]) + + async def test_update_prompt_set_as_default_behavior(self, temp_prompt_store): + prompt = await temp_prompt_store.create_prompt("V1") + assert (await temp_prompt_store.get_prompt(prompt.prompt_id)).version == 1 + + prompt_v2 = await temp_prompt_store.update_prompt(prompt.prompt_id, "V2", 1, [], set_as_default=True) + assert prompt_v2.version == 2 + assert (await temp_prompt_store.get_prompt(prompt.prompt_id)).version == 2 + + prompt_v3 = await temp_prompt_store.update_prompt(prompt.prompt_id, "V3", 2, [], set_as_default=False) + assert prompt_v3.version == 3 + assert (await temp_prompt_store.get_prompt(prompt.prompt_id)).version == 2 From ef02b9ea101487ca1829795f18274ad96b211ff6 Mon Sep 17 00:00:00 2001 From: Derek Higgins Date: Mon, 8 Sep 2025 16:51:38 +0100 Subject: [PATCH 051/150] fix: environment variable typo in inference recorder error message (#3374) The error message was referencing LLAMA_STACK_INFERENCE_MODE instead of the correct LLAMA_STACK_TEST_INFERENCE_MODE environment variable. --- llama_stack/testing/inference_recorder.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/llama_stack/testing/inference_recorder.py b/llama_stack/testing/inference_recorder.py index 5b64e26d3..298758c92 100644 --- a/llama_stack/testing/inference_recorder.py +++ b/llama_stack/testing/inference_recorder.py @@ -292,7 +292,7 @@ async def _patched_inference_method(original_method, self, client_type, endpoint f"No recorded response found for request hash: {request_hash}\n" f"Request: {method} {url} {body}\n" f"Model: {body.get('model', 'unknown')}\n" - f"To record this response, run with LLAMA_STACK_INFERENCE_MODE=record" + f"To record this response, run with LLAMA_STACK_TEST_INFERENCE_MODE=record" ) elif _current_mode == InferenceMode.RECORD: From 09141361fbec54acb25ef0d13c542d6cc41c3b5c Mon Sep 17 00:00:00 2001 From: Swapna Lekkala Date: Mon, 8 Sep 2025 13:22:43 -0700 Subject: [PATCH 052/150] fix: use dataset version 4.0.0 or above --- pyproject.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pyproject.toml b/pyproject.toml index fb6d3a330..133b78dbf 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -114,7 +114,7 @@ test = [ "psycopg2-binary>=2.9.0", "pypdf", "mcp", - "datasets", + "datasets>=4.0.0", "autoevals", "transformers", "sqlalchemy", From c9268a7a8cf57e72e1facdb0e41e444575cc5170 Mon Sep 17 00:00:00 2001 From: slekkala1 Date: Mon, 8 Sep 2025 14:46:46 -0700 Subject: [PATCH 053/150] fix: pre-commit failing (#3381) # What does this PR do? Fix failing pre-commit, https://github.com/llamastack/llama-stack/actions/workflows/pre-commit.yml ## Test Plan CI --- uv.lock | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/uv.lock b/uv.lock index 43cc59c7a..b38177245 100644 --- a/uv.lock +++ b/uv.lock @@ -1,5 +1,5 @@ version = 1 -revision = 3 +revision = 2 requires-python = ">=3.12" resolution-markers = [ "(python_full_version >= '3.13' and platform_machine != 'aarch64' and sys_platform == 'linux') or (python_full_version >= '3.13' and sys_platform != 'darwin' and sys_platform != 'linux')", @@ -895,7 +895,6 @@ dependencies = [ { name = "numpy" }, { name = "packaging" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/5c/f4/7c2136f4660ca504266cc08b38df2aa1db14fea93393b82e099ff34d7290/faiss_cpu-1.11.0.post1.tar.gz", hash = "sha256:06b1ea9ddec9e4d9a41c8ef7478d493b08d770e9a89475056e963081eed757d1", size = 70543, upload-time = "2025-07-15T09:15:02.127Z" } wheels = [ { url = "https://files.pythonhosted.org/packages/30/1e/9980758efa55b4e7a5d6df1ae17c9ddbe5a636bfbf7d22d47c67f7a530f4/faiss_cpu-1.11.0.post1-cp312-cp312-macosx_13_0_x86_64.whl", hash = "sha256:68f6ce2d9c510a5765af2f5711bd76c2c37bd598af747f3300224bdccf45378c", size = 7913676, upload-time = "2025-07-15T09:14:06.077Z" }, { url = "https://files.pythonhosted.org/packages/05/d1/bd785887085faa02916c52320527b8bb54288835b0a3138df89a0e323cc8/faiss_cpu-1.11.0.post1-cp312-cp312-macosx_14_0_arm64.whl", hash = "sha256:b940c530a8236cc0b9fd9d6e87b3d70b9c6c216bc2baf2649356c908902e52c9", size = 3313952, upload-time = "2025-07-15T09:14:07.584Z" }, @@ -1748,7 +1747,6 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/5f/e4/f1546746049c99c6b8b247e2f34485b9eae36faa9322b84e2a17262e6712/litellm-1.74.9-py3-none-any.whl", hash = "sha256:ab8f8a6e4d8689d3c7c4f9c3bbc7e46212cc3ebc74ddd0f3c0c921bb459c9874", size = 8740449, upload-time = "2025-07-28T16:42:36.8Z" }, ] - [[package]] name = "llama-stack" version = "0.2.20" @@ -1958,7 +1956,7 @@ test = [ { name = "aiosqlite" }, { name = "autoevals" }, { name = "chardet" }, - { name = "datasets" }, + { name = "datasets", specifier = ">=4.0.0" }, { name = "mcp" }, { name = "milvus-lite", specifier = ">=2.5.0" }, { name = "openai", specifier = ">=1.100.0" }, From 30468d0c43277f066397cc94a6d44c3965b0409f Mon Sep 17 00:00:00 2001 From: Ashwin Bharambe Date: Mon, 8 Sep 2025 15:13:42 -0700 Subject: [PATCH 054/150] fix(deps): bump datasets versions for all providers (#3382) Not doing so results in errors of the kind you see in: https://github.com/llamastack/llama-stack-ops/actions/runs/17565092546/job/49890264353 --- llama_stack/providers/registry/datasetio.py | 4 ++-- llama_stack/providers/registry/post_training.py | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/llama_stack/providers/registry/datasetio.py b/llama_stack/providers/registry/datasetio.py index 43cde83fb..f641b4ce3 100644 --- a/llama_stack/providers/registry/datasetio.py +++ b/llama_stack/providers/registry/datasetio.py @@ -30,7 +30,7 @@ def available_providers() -> list[ProviderSpec]: adapter=AdapterSpec( adapter_type="huggingface", pip_packages=[ - "datasets", + "datasets>=4.0.0", ], module="llama_stack.providers.remote.datasetio.huggingface", config_class="llama_stack.providers.remote.datasetio.huggingface.HuggingfaceDatasetIOConfig", @@ -42,7 +42,7 @@ def available_providers() -> list[ProviderSpec]: adapter=AdapterSpec( adapter_type="nvidia", pip_packages=[ - "datasets", + "datasets>=4.0.0", ], module="llama_stack.providers.remote.datasetio.nvidia", config_class="llama_stack.providers.remote.datasetio.nvidia.NvidiaDatasetIOConfig", diff --git a/llama_stack/providers/registry/post_training.py b/llama_stack/providers/registry/post_training.py index 67238e3fc..47aeb401e 100644 --- a/llama_stack/providers/registry/post_training.py +++ b/llama_stack/providers/registry/post_training.py @@ -48,7 +48,7 @@ def available_providers() -> list[ProviderSpec]: InlineProviderSpec( api=Api.post_training, provider_type="inline::huggingface-gpu", - pip_packages=["trl", "transformers", "peft", "datasets", "torch"], + pip_packages=["trl", "transformers", "peft", "datasets>=4.0.0", "torch"], module="llama_stack.providers.inline.post_training.huggingface", config_class="llama_stack.providers.inline.post_training.huggingface.HuggingFacePostTrainingConfig", api_dependencies=[ From 28696c3f30468677fb851b82846acae21deb3e66 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Mon, 8 Sep 2025 22:30:03 +0000 Subject: [PATCH 055/150] build: Bump version to 0.2.21 --- llama_stack/ui/package-lock.json | 8 ++++---- llama_stack/ui/package.json | 2 +- pyproject.toml | 6 +++--- uv.lock | 14 +++++++------- 4 files changed, 15 insertions(+), 15 deletions(-) diff --git a/llama_stack/ui/package-lock.json b/llama_stack/ui/package-lock.json index cbe8e5557..1db1c61cd 100644 --- a/llama_stack/ui/package-lock.json +++ b/llama_stack/ui/package-lock.json @@ -18,7 +18,7 @@ "class-variance-authority": "^0.7.1", "clsx": "^2.1.1", "framer-motion": "^12.23.12", - "llama-stack-client": "^0.2.20", + "llama-stack-client": "^0.2.21", "lucide-react": "^0.542.0", "next": "15.3.3", "next-auth": "^4.24.11", @@ -10278,9 +10278,9 @@ "license": "MIT" }, "node_modules/llama-stack-client": { - "version": "0.2.20", - "resolved": "https://registry.npmjs.org/llama-stack-client/-/llama-stack-client-0.2.20.tgz", - "integrity": "sha512-1vD5nizTX5JEW8TADxKgy/P1W8YZoPSpdnmfxbdYbWgpQ3BWtbvLS6jmDk7VwVA5fRC4895VfHsRDfS1liHarw==", + "version": "0.2.21", + "resolved": "https://registry.npmjs.org/llama-stack-client/-/llama-stack-client-0.2.21.tgz", + "integrity": "sha512-rjU2Vx5xStxDYavU8K1An/SYXiQQjroLcK98B+p0Paz/a7OgRao2S0YwvThJjPUyChY4fO03UIXP9LpmHqlXWQ==", "license": "MIT", "dependencies": { "@types/node": "^18.11.18", diff --git a/llama_stack/ui/package.json b/llama_stack/ui/package.json index e817e9ae3..e50401fa6 100644 --- a/llama_stack/ui/package.json +++ b/llama_stack/ui/package.json @@ -23,7 +23,7 @@ "class-variance-authority": "^0.7.1", "clsx": "^2.1.1", "framer-motion": "^12.23.12", - "llama-stack-client": "^0.2.20", + "llama-stack-client": "^0.2.21", "lucide-react": "^0.542.0", "next": "15.3.3", "next-auth": "^4.24.11", diff --git a/pyproject.toml b/pyproject.toml index 133b78dbf..0414aafb0 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -7,7 +7,7 @@ required-version = ">=0.7.0" [project] name = "llama_stack" -version = "0.2.20" +version = "0.2.21" authors = [{ name = "Meta Llama", email = "llama-oss@meta.com" }] description = "Llama Stack" readme = "README.md" @@ -31,7 +31,7 @@ dependencies = [ "huggingface-hub>=0.34.0,<1.0", "jinja2>=3.1.6", "jsonschema", - "llama-stack-client>=0.2.20", + "llama-stack-client>=0.2.21", "openai>=1.99.6", "prompt-toolkit", "python-dotenv", @@ -55,7 +55,7 @@ dependencies = [ ui = [ "streamlit", "pandas", - "llama-stack-client>=0.2.20", + "llama-stack-client>=0.2.21", "streamlit-option-menu", ] diff --git a/uv.lock b/uv.lock index b38177245..2788c6fef 100644 --- a/uv.lock +++ b/uv.lock @@ -1,5 +1,5 @@ version = 1 -revision = 2 +revision = 3 requires-python = ">=3.12" resolution-markers = [ "(python_full_version >= '3.13' and platform_machine != 'aarch64' and sys_platform == 'linux') or (python_full_version >= '3.13' and sys_platform != 'darwin' and sys_platform != 'linux')", @@ -1749,7 +1749,7 @@ wheels = [ [[package]] name = "llama-stack" -version = "0.2.20" +version = "0.2.21" source = { editable = "." } dependencies = [ { name = "aiohttp" }, @@ -1887,8 +1887,8 @@ requires-dist = [ { name = "huggingface-hub", specifier = ">=0.34.0,<1.0" }, { name = "jinja2", specifier = ">=3.1.6" }, { name = "jsonschema" }, - { name = "llama-stack-client", specifier = ">=0.2.20" }, - { name = "llama-stack-client", marker = "extra == 'ui'", specifier = ">=0.2.20" }, + { name = "llama-stack-client", specifier = ">=0.2.21" }, + { name = "llama-stack-client", marker = "extra == 'ui'", specifier = ">=0.2.21" }, { name = "openai", specifier = ">=1.99.6" }, { name = "opentelemetry-exporter-otlp-proto-http", specifier = ">=1.30.0" }, { name = "opentelemetry-sdk", specifier = ">=1.30.0" }, @@ -1997,7 +1997,7 @@ unit = [ [[package]] name = "llama-stack-client" -version = "0.2.20" +version = "0.2.21" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "anyio" }, @@ -2016,9 +2016,9 @@ dependencies = [ { name = "tqdm" }, { name = "typing-extensions" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/21/91/c5e32219a5192825dd601700e68205c815c5cfee60c64c22172e46a0c83e/llama_stack_client-0.2.20.tar.gz", hash = "sha256:356257f0a4bbb64205f89e113d715925853d5e34ec744e72466da72790ba415b", size = 318311, upload-time = "2025-08-29T21:10:12.854Z" } +sdist = { url = "https://files.pythonhosted.org/packages/f1/d3/8c50561d167f1e9b601b8fffe852b44c1ff97aaa6db6cdedd611d9e02a65/llama_stack_client-0.2.21.tar.gz", hash = "sha256:bd931fdcadedec5ccdbaa3c54d0c17761af1c227711ad6150dc0dd33d7b66ce2", size = 318319, upload-time = "2025-09-08T22:26:57.668Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/b0/ba/84914c4eead2fd9251c149fd6a7da28b78acd620793e3c4506116645cb60/llama_stack_client-0.2.20-py3-none-any.whl", hash = "sha256:6e178981d2ce971da2145c79d5b2b123fa50e063ed431494975c2ba01c5b8016", size = 369899, upload-time = "2025-08-29T21:10:11.113Z" }, + { url = "https://files.pythonhosted.org/packages/02/77/dadc682046a2c7ad68be8d2d2afac7007bf4d22efb0d3929d85ab9706ffe/llama_stack_client-0.2.21-py3-none-any.whl", hash = "sha256:adba82fdf18ab3b8ac218cedba4927bd5d26c23c2318e75c8763a44bb6b40693", size = 369902, upload-time = "2025-09-08T22:26:56.308Z" }, ] [[package]] From a8aa815b6a194fad76e4e5f7e73faf588b5d0e01 Mon Sep 17 00:00:00 2001 From: Ashwin Bharambe Date: Tue, 9 Sep 2025 15:50:56 -0700 Subject: [PATCH 056/150] feat(tests): migrate to global "setups" system for test configuration (#3390) This PR refactors the integration test system to use global "setups" which provides better separation of concerns: **suites = what to test, setups = how to configure.** NOTE: if you naming suggestions, please provide feedback Changes: - New `tests/integration/setups.py` with global, reusable configurations (ollama, vllm, gpt, claude) - Modified `scripts/integration-tests.sh` options to match with the underlying pytest options - Updated documentation to reflect the new global setup system The main benefit is that setups can be reused across multiple suites (e.g., use "gpt" with any suite) even though sometimes they could specifically tailored for a suite (vision <> ollama-vision). It is now easier to add new configurations without modifying existing suites. Usage examples: - `pytest tests/integration --suite=responses --setup=gpt` - `pytest tests/integration --suite=vision` # auto-selects "ollama-vision" setup - `pytest tests/integration --suite=base --setup=vllm` --- .../actions/run-and-record-tests/action.yml | 42 +++--- .github/actions/setup-ollama/action.yml | 4 +- .../actions/setup-test-environment/action.yml | 14 +- .github/workflows/integration-tests.yml | 20 +-- .../workflows/record-integration-tests.yml | 32 ++--- scripts/get_setup_env.py | 71 ++++++++++ scripts/github/schedule-record-workflow.sh | 57 ++++---- scripts/integration-tests.sh | 106 ++++++++------- tests/integration/README.md | 48 ++++--- tests/integration/conftest.py | 71 ++++++---- tests/integration/suites.py | 126 +++++++++++++----- 11 files changed, 385 insertions(+), 206 deletions(-) create mode 100644 scripts/get_setup_env.py diff --git a/.github/actions/run-and-record-tests/action.yml b/.github/actions/run-and-record-tests/action.yml index 7f028b104..a3eb31d9f 100644 --- a/.github/actions/run-and-record-tests/action.yml +++ b/.github/actions/run-and-record-tests/action.yml @@ -5,21 +5,22 @@ inputs: stack-config: description: 'Stack configuration to use' required: true - provider: - description: 'Provider to use for tests' - required: true + setup: + description: 'Setup to use for tests (e.g., ollama, gpt, vllm)' + required: false + default: '' inference-mode: description: 'Inference mode (record or replay)' required: true - test-suite: + suite: description: 'Test suite to use: base, responses, vision, etc.' required: false default: '' - test-subdirs: - description: 'Comma-separated list of test subdirectories to run; overrides test-suite' + subdirs: + description: 'Comma-separated list of test subdirectories to run; overrides suite' required: false default: '' - test-pattern: + pattern: description: 'Regex pattern to pass to pytest -k' required: false default: '' @@ -37,14 +38,23 @@ runs: - name: Run Integration Tests shell: bash run: | - uv run --no-sync ./scripts/integration-tests.sh \ - --stack-config '${{ inputs.stack-config }}' \ - --provider '${{ inputs.provider }}' \ - --test-subdirs '${{ inputs.test-subdirs }}' \ - --test-pattern '${{ inputs.test-pattern }}' \ - --inference-mode '${{ inputs.inference-mode }}' \ - --test-suite '${{ inputs.test-suite }}' \ - | tee pytest-${{ inputs.inference-mode }}.log + SCRIPT_ARGS="--stack-config ${{ inputs.stack-config }} --inference-mode ${{ inputs.inference-mode }}" + + # Add optional arguments only if they are provided + if [ -n '${{ inputs.setup }}' ]; then + SCRIPT_ARGS="$SCRIPT_ARGS --setup ${{ inputs.setup }}" + fi + if [ -n '${{ inputs.suite }}' ]; then + SCRIPT_ARGS="$SCRIPT_ARGS --suite ${{ inputs.suite }}" + fi + if [ -n '${{ inputs.subdirs }}' ]; then + SCRIPT_ARGS="$SCRIPT_ARGS --subdirs ${{ inputs.subdirs }}" + fi + if [ -n '${{ inputs.pattern }}' ]; then + SCRIPT_ARGS="$SCRIPT_ARGS --pattern ${{ inputs.pattern }}" + fi + + uv run --no-sync ./scripts/integration-tests.sh $SCRIPT_ARGS | tee pytest-${{ inputs.inference-mode }}.log - name: Commit and push recordings @@ -58,7 +68,7 @@ runs: echo "New recordings detected, committing and pushing" git add tests/integration/recordings/ - git commit -m "Recordings update from CI (test-suite: ${{ inputs.test-suite }})" + git commit -m "Recordings update from CI (suite: ${{ inputs.suite }})" git fetch origin ${{ github.ref_name }} git rebase origin/${{ github.ref_name }} echo "Rebased successfully" diff --git a/.github/actions/setup-ollama/action.yml b/.github/actions/setup-ollama/action.yml index dc2f87e8c..5c95d131d 100644 --- a/.github/actions/setup-ollama/action.yml +++ b/.github/actions/setup-ollama/action.yml @@ -1,7 +1,7 @@ name: Setup Ollama description: Start Ollama inputs: - test-suite: + suite: description: 'Test suite to use: base, responses, vision, etc.' required: false default: '' @@ -11,7 +11,7 @@ runs: - name: Start Ollama shell: bash run: | - if [ "${{ inputs.test-suite }}" == "vision" ]; then + if [ "${{ inputs.suite }}" == "vision" ]; then image="ollama-with-vision-model" else image="ollama-with-models" diff --git a/.github/actions/setup-test-environment/action.yml b/.github/actions/setup-test-environment/action.yml index 3be76f009..478e8f598 100644 --- a/.github/actions/setup-test-environment/action.yml +++ b/.github/actions/setup-test-environment/action.yml @@ -8,11 +8,11 @@ inputs: client-version: description: 'Client version (latest or published)' required: true - provider: - description: 'Provider to setup (ollama or vllm)' - required: true + setup: + description: 'Setup to configure (ollama, vllm, gpt, etc.)' + required: false default: 'ollama' - test-suite: + suite: description: 'Test suite to use: base, responses, vision, etc.' required: false default: '' @@ -30,13 +30,13 @@ runs: client-version: ${{ inputs.client-version }} - name: Setup ollama - if: ${{ inputs.provider == 'ollama' && inputs.inference-mode == 'record' }} + if: ${{ (inputs.setup == 'ollama' || inputs.setup == 'ollama-vision') && inputs.inference-mode == 'record' }} uses: ./.github/actions/setup-ollama with: - test-suite: ${{ inputs.test-suite }} + suite: ${{ inputs.suite }} - name: Setup vllm - if: ${{ inputs.provider == 'vllm' && inputs.inference-mode == 'record' }} + if: ${{ inputs.setup == 'vllm' && inputs.inference-mode == 'record' }} uses: ./.github/actions/setup-vllm - name: Build Llama Stack diff --git a/.github/workflows/integration-tests.yml b/.github/workflows/integration-tests.yml index bb53eea2f..711eccd9e 100644 --- a/.github/workflows/integration-tests.yml +++ b/.github/workflows/integration-tests.yml @@ -28,8 +28,8 @@ on: description: 'Test against both the latest and published versions' type: boolean default: false - test-provider: - description: 'Test against a specific provider' + test-setup: + description: 'Test against a specific setup' type: string default: 'ollama' @@ -42,18 +42,18 @@ jobs: run-replay-mode-tests: runs-on: ubuntu-latest - name: ${{ format('Integration Tests ({0}, {1}, {2}, client={3}, {4})', matrix.client-type, matrix.provider, matrix.python-version, matrix.client-version, matrix.test-suite) }} + name: ${{ format('Integration Tests ({0}, {1}, {2}, client={3}, {4})', matrix.client-type, matrix.setup, matrix.python-version, matrix.client-version, matrix.suite) }} strategy: fail-fast: false matrix: client-type: [library, server] - # Use vllm on weekly schedule, otherwise use test-provider input (defaults to ollama) - provider: ${{ (github.event.schedule == '1 0 * * 0') && fromJSON('["vllm"]') || fromJSON(format('["{0}"]', github.event.inputs.test-provider || 'ollama')) }} + # Use vllm on weekly schedule, otherwise use test-setup input (defaults to ollama) + setup: ${{ (github.event.schedule == '1 0 * * 0') && fromJSON('["vllm"]') || fromJSON(format('["{0}"]', github.event.inputs.test-setup || 'ollama')) }} # Use Python 3.13 only on nightly schedule (daily latest client test), otherwise use 3.12 python-version: ${{ github.event.schedule == '0 0 * * *' && fromJSON('["3.12", "3.13"]') || fromJSON('["3.12"]') }} client-version: ${{ (github.event.schedule == '0 0 * * *' || github.event.inputs.test-all-client-versions == 'true') && fromJSON('["published", "latest"]') || fromJSON('["latest"]') }} - test-suite: [base, vision] + suite: [base, vision] steps: - name: Checkout repository @@ -64,14 +64,14 @@ jobs: with: python-version: ${{ matrix.python-version }} client-version: ${{ matrix.client-version }} - provider: ${{ matrix.provider }} - test-suite: ${{ matrix.test-suite }} + setup: ${{ matrix.setup }} + suite: ${{ matrix.suite }} inference-mode: 'replay' - name: Run tests uses: ./.github/actions/run-and-record-tests with: stack-config: ${{ matrix.client-type == 'library' && 'ci-tests' || 'server:ci-tests' }} - provider: ${{ matrix.provider }} + setup: ${{ matrix.setup }} inference-mode: 'replay' - test-suite: ${{ matrix.test-suite }} + suite: ${{ matrix.suite }} diff --git a/.github/workflows/record-integration-tests.yml b/.github/workflows/record-integration-tests.yml index 01797a54b..65a04f125 100644 --- a/.github/workflows/record-integration-tests.yml +++ b/.github/workflows/record-integration-tests.yml @@ -10,19 +10,19 @@ run-name: Run the integration test suite from tests/integration on: workflow_dispatch: inputs: - test-provider: - description: 'Test against a specific provider' + test-setup: + description: 'Test against a specific setup' type: string default: 'ollama' - test-suite: + suite: description: 'Test suite to use: base, responses, vision, etc.' type: string default: '' - test-subdirs: - description: 'Comma-separated list of test subdirectories to run; overrides test-suite' + subdirs: + description: 'Comma-separated list of test subdirectories to run; overrides suite' type: string default: '' - test-pattern: + pattern: description: 'Regex pattern to pass to pytest -k' type: string default: '' @@ -39,10 +39,10 @@ jobs: run: | echo "::group::Workflow Inputs" echo "branch: ${{ github.ref_name }}" - echo "test-provider: ${{ inputs.test-provider }}" - echo "test-suite: ${{ inputs.test-suite }}" - echo "test-subdirs: ${{ inputs.test-subdirs }}" - echo "test-pattern: ${{ inputs.test-pattern }}" + echo "test-setup: ${{ inputs.test-setup }}" + echo "suite: ${{ inputs.suite }}" + echo "subdirs: ${{ inputs.subdirs }}" + echo "pattern: ${{ inputs.pattern }}" echo "::endgroup::" - name: Checkout repository @@ -55,16 +55,16 @@ jobs: with: python-version: "3.12" # Use single Python version for recording client-version: "latest" - provider: ${{ inputs.test-provider || 'ollama' }} - test-suite: ${{ inputs.test-suite }} + setup: ${{ inputs.test-setup || 'ollama' }} + suite: ${{ inputs.suite }} inference-mode: 'record' - name: Run and record tests uses: ./.github/actions/run-and-record-tests with: stack-config: 'server:ci-tests' # recording must be done with server since more tests are run - provider: ${{ inputs.test-provider || 'ollama' }} + setup: ${{ inputs.test-setup || 'ollama' }} inference-mode: 'record' - test-suite: ${{ inputs.test-suite }} - test-subdirs: ${{ inputs.test-subdirs }} - test-pattern: ${{ inputs.test-pattern }} + suite: ${{ inputs.suite }} + subdirs: ${{ inputs.subdirs }} + pattern: ${{ inputs.pattern }} diff --git a/scripts/get_setup_env.py b/scripts/get_setup_env.py new file mode 100644 index 000000000..fad601e76 --- /dev/null +++ b/scripts/get_setup_env.py @@ -0,0 +1,71 @@ +#!/usr/bin/env python3 +# Copyright (c) Meta Platforms, Inc. and affiliates. +# All rights reserved. +# +# This source code is licensed under the terms described in the LICENSE file in +# the root directory of this source tree. + +""" +Small helper script to extract environment variables from a test setup. +Used by integration-tests.sh to set environment variables before starting the server. +""" + +import argparse +import sys + +from tests.integration.suites import SETUP_DEFINITIONS, SUITE_DEFINITIONS + + +def get_setup_env_vars(setup_name, suite_name=None): + """ + Get environment variables for a setup, with optional suite default fallback. + + Args: + setup_name: Name of the setup (e.g., 'ollama', 'gpt') + suite_name: Optional suite name to get default setup if setup_name is None + + Returns: + Dictionary of environment variables + """ + # If no setup specified, try to get default from suite + if not setup_name and suite_name: + suite = SUITE_DEFINITIONS.get(suite_name) + if suite and suite.default_setup: + setup_name = suite.default_setup + + if not setup_name: + return {} + + setup = SETUP_DEFINITIONS.get(setup_name) + if not setup: + print( + f"Error: Unknown setup '{setup_name}'. Available: {', '.join(sorted(SETUP_DEFINITIONS.keys()))}", + file=sys.stderr, + ) + sys.exit(1) + + return setup.env + + +def main(): + parser = argparse.ArgumentParser(description="Extract environment variables from a test setup") + parser.add_argument("--setup", help="Setup name (e.g., ollama, gpt)") + parser.add_argument("--suite", help="Suite name to get default setup from if --setup not provided") + parser.add_argument("--format", choices=["bash", "json"], default="bash", help="Output format (default: bash)") + + args = parser.parse_args() + + env_vars = get_setup_env_vars(args.setup, args.suite) + + if args.format == "bash": + # Output as bash export statements + for key, value in env_vars.items(): + print(f"export {key}='{value}'") + elif args.format == "json": + import json + + print(json.dumps(env_vars)) + + +if __name__ == "__main__": + main() diff --git a/scripts/github/schedule-record-workflow.sh b/scripts/github/schedule-record-workflow.sh index 09e055611..c292e53e6 100755 --- a/scripts/github/schedule-record-workflow.sh +++ b/scripts/github/schedule-record-workflow.sh @@ -14,7 +14,7 @@ set -euo pipefail # Default values BRANCH="" TEST_SUBDIRS="" -TEST_PROVIDER="ollama" +TEST_SETUP="ollama" TEST_SUITE="base" TEST_PATTERN="" @@ -27,24 +27,24 @@ Trigger the integration test recording workflow remotely. This way you do not ne OPTIONS: -b, --branch BRANCH Branch to run the workflow on (defaults to current branch) - -p, --test-provider PROVIDER Test provider to use: vllm or ollama (default: ollama) - -t, --test-suite SUITE Test suite to use: base, responses, vision, etc. (default: base) - -s, --test-subdirs DIRS Comma-separated list of test subdirectories to run (overrides suite) - -k, --test-pattern PATTERN Regex pattern to pass to pytest -k + -t, --suite SUITE Test suite to use: base, responses, vision, etc. (default: base) + -p, --setup SETUP Test setup to use: vllm, ollama, gpt, etc. (default: ollama) + -s, --subdirs DIRS Comma-separated list of test subdirectories to run (overrides suite) + -k, --pattern PATTERN Regex pattern to pass to pytest -k -h, --help Show this help message EXAMPLES: # Record tests for current branch with agents subdirectory - $0 --test-subdirs "agents" + $0 --subdirs "agents" # Record tests for specific branch with vision tests - $0 -b my-feature-branch --test-suite vision + $0 -b my-feature-branch --suite vision - # Record multiple test subdirectories with specific provider - $0 --test-subdirs "agents,inference" --test-provider vllm + # Record multiple test subdirectories with specific setup + $0 --subdirs "agents,inference" --setup vllm # Record tests matching a specific pattern - $0 --test-subdirs "inference" --test-pattern "test_streaming" + $0 --subdirs "inference" --pattern "test_streaming" EOF } @@ -63,19 +63,19 @@ while [[ $# -gt 0 ]]; do BRANCH="$2" shift 2 ;; - -s|--test-subdirs) + -s|--subdirs) TEST_SUBDIRS="$2" shift 2 ;; - -p|--test-provider) - TEST_PROVIDER="$2" + -p|--setup) + TEST_SETUP="$2" shift 2 ;; - -t|--test-suite) + -t|--suite) TEST_SUITE="$2" shift 2 ;; - -k|--test-pattern) + -k|--pattern) TEST_PATTERN="$2" shift 2 ;; @@ -93,21 +93,16 @@ done # Validate required parameters if [[ -z "$TEST_SUBDIRS" && -z "$TEST_SUITE" ]]; then - echo "Error: --test-subdirs or --test-suite is required" + echo "Error: --subdirs or --suite is required" echo "Please specify which test subdirectories to run or test suite to use, e.g.:" - echo " $0 --test-subdirs \"agents,inference\"" - echo " $0 --test-suite vision" + echo " $0 --subdirs \"agents,inference\"" + echo " $0 --suite vision" echo "" exit 1 fi -# Validate test provider -if [[ "$TEST_PROVIDER" != "vllm" && "$TEST_PROVIDER" != "ollama" ]]; then - echo "❌ Error: Invalid test provider '$TEST_PROVIDER'" - echo " Supported providers: vllm, ollama" - echo " Example: $0 --test-subdirs \"agents\" --test-provider vllm" - exit 1 -fi +# Validate test setup (optional - setups are validated by the workflow itself) +# Common setups: ollama, vllm, gpt, etc. # Check if required tools are installed if ! command -v gh &> /dev/null; then @@ -237,7 +232,7 @@ fi # Build the workflow dispatch command echo "Triggering integration test recording workflow..." echo "Branch: $BRANCH" -echo "Test provider: $TEST_PROVIDER" +echo "Test setup: $TEST_SETUP" echo "Test subdirs: $TEST_SUBDIRS" echo "Test suite: $TEST_SUITE" echo "Test pattern: ${TEST_PATTERN:-"(none)"}" @@ -245,16 +240,16 @@ echo "" # Prepare inputs for gh workflow run if [[ -n "$TEST_SUBDIRS" ]]; then - INPUTS="-f test-subdirs='$TEST_SUBDIRS'" + INPUTS="-f subdirs='$TEST_SUBDIRS'" fi -if [[ -n "$TEST_PROVIDER" ]]; then - INPUTS="$INPUTS -f test-provider='$TEST_PROVIDER'" +if [[ -n "$TEST_SETUP" ]]; then + INPUTS="$INPUTS -f test-setup='$TEST_SETUP'" fi if [[ -n "$TEST_SUITE" ]]; then - INPUTS="$INPUTS -f test-suite='$TEST_SUITE'" + INPUTS="$INPUTS -f suite='$TEST_SUITE'" fi if [[ -n "$TEST_PATTERN" ]]; then - INPUTS="$INPUTS -f test-pattern='$TEST_PATTERN'" + INPUTS="$INPUTS -f pattern='$TEST_PATTERN'" fi # Run the workflow diff --git a/scripts/integration-tests.sh b/scripts/integration-tests.sh index ab7e37579..eee60951d 100755 --- a/scripts/integration-tests.sh +++ b/scripts/integration-tests.sh @@ -13,10 +13,10 @@ set -euo pipefail # Default values STACK_CONFIG="" -PROVIDER="" +TEST_SUITE="base" +TEST_SETUP="" TEST_SUBDIRS="" TEST_PATTERN="" -TEST_SUITE="base" INFERENCE_MODE="replay" EXTRA_PARAMS="" @@ -27,29 +27,30 @@ Usage: $0 [OPTIONS] Options: --stack-config STRING Stack configuration to use (required) - --provider STRING Provider to use (ollama, vllm, etc.) (required) - --test-suite STRING Comma-separated list of test suites to run (default: 'base') + --suite STRING Test suite to run (default: 'base') + --setup STRING Test setup (models, env) to use (e.g., 'ollama', 'ollama-vision', 'gpt', 'vllm') --inference-mode STRING Inference mode: record or replay (default: replay) - --test-subdirs STRING Comma-separated list of test subdirectories to run (overrides suite) - --test-pattern STRING Regex pattern to pass to pytest -k + --subdirs STRING Comma-separated list of test subdirectories to run (overrides suite) + --pattern STRING Regex pattern to pass to pytest -k --help Show this help message -Suites are defined in tests/integration/suites.py. They are used to narrow the collection of tests and provide default model options. +Suites are defined in tests/integration/suites.py and define which tests to run. +Setups are defined in tests/integration/setups.py and provide global configuration (models, env). You can also specify subdirectories (of tests/integration) to select tests from, which will override the suite. Examples: # Basic inference tests with ollama - $0 --stack-config server:ci-tests --provider ollama + $0 --stack-config server:ci-tests --suite base --setup ollama # Multiple test directories with vllm - $0 --stack-config server:ci-tests --provider vllm --test-subdirs 'inference,agents' + $0 --stack-config server:ci-tests --subdirs 'inference,agents' --setup vllm # Vision tests with ollama - $0 --stack-config server:ci-tests --provider ollama --test-suite vision + $0 --stack-config server:ci-tests --suite vision # default setup for this suite is ollama-vision # Record mode for updating test recordings - $0 --stack-config server:ci-tests --provider ollama --inference-mode record + $0 --stack-config server:ci-tests --suite base --inference-mode record EOF } @@ -60,15 +61,15 @@ while [[ $# -gt 0 ]]; do STACK_CONFIG="$2" shift 2 ;; - --provider) - PROVIDER="$2" + --setup) + TEST_SETUP="$2" shift 2 ;; - --test-subdirs) + --subdirs) TEST_SUBDIRS="$2" shift 2 ;; - --test-suite) + --suite) TEST_SUITE="$2" shift 2 ;; @@ -76,7 +77,7 @@ while [[ $# -gt 0 ]]; do INFERENCE_MODE="$2" shift 2 ;; - --test-pattern) + --pattern) TEST_PATTERN="$2" shift 2 ;; @@ -96,11 +97,13 @@ done # Validate required parameters if [[ -z "$STACK_CONFIG" ]]; then echo "Error: --stack-config is required" + usage exit 1 fi -if [[ -z "$PROVIDER" ]]; then - echo "Error: --provider is required" +if [[ -z "$TEST_SETUP" && -n "$TEST_SUBDIRS" ]]; then + echo "Error: --test-setup is required when --test-subdirs is provided" + usage exit 1 fi @@ -111,7 +114,7 @@ fi echo "=== Llama Stack Integration Test Runner ===" echo "Stack Config: $STACK_CONFIG" -echo "Provider: $PROVIDER" +echo "Setup: $TEST_SETUP" echo "Inference Mode: $INFERENCE_MODE" echo "Test Suite: $TEST_SUITE" echo "Test Subdirs: $TEST_SUBDIRS" @@ -129,21 +132,25 @@ echo "" # Set environment variables export LLAMA_STACK_CLIENT_TIMEOUT=300 -export LLAMA_STACK_TEST_INFERENCE_MODE="$INFERENCE_MODE" - -# Configure provider-specific settings -if [[ "$PROVIDER" == "ollama" ]]; then - export OLLAMA_URL="http://0.0.0.0:11434" - export TEXT_MODEL="ollama/llama3.2:3b-instruct-fp16" - export SAFETY_MODEL="ollama/llama-guard3:1b" - EXTRA_PARAMS="--safety-shield=llama-guard" -else - export VLLM_URL="http://localhost:8000/v1" - export TEXT_MODEL="vllm/meta-llama/Llama-3.2-1B-Instruct" - EXTRA_PARAMS="" -fi THIS_DIR=$(dirname "$0") + +if [[ -n "$TEST_SETUP" ]]; then + EXTRA_PARAMS="--setup=$TEST_SETUP" +fi + +# Apply setup-specific environment variables (needed for server startup and tests) +echo "=== Applying Setup Environment Variables ===" + +# the server needs this +export LLAMA_STACK_TEST_INFERENCE_MODE="$INFERENCE_MODE" + +SETUP_ENV=$(PYTHONPATH=$THIS_DIR/.. python "$THIS_DIR/get_setup_env.py" --suite "$TEST_SUITE" --setup "$TEST_SETUP" --format bash) +echo "Setting up environment variables:" +echo "$SETUP_ENV" +eval "$SETUP_ENV" +echo "" + ROOT_DIR="$THIS_DIR/.." cd $ROOT_DIR @@ -162,6 +169,18 @@ fi # Start Llama Stack Server if needed if [[ "$STACK_CONFIG" == *"server:"* ]]; then + stop_server() { + echo "Stopping Llama Stack Server..." + pids=$(lsof -i :8321 | awk 'NR>1 {print $2}') + if [[ -n "$pids" ]]; then + echo "Killing Llama Stack Server processes: $pids" + kill -9 $pids + else + echo "No Llama Stack Server processes found ?!" + fi + echo "Llama Stack Server stopped" + } + # check if server is already running if curl -s http://localhost:8321/v1/health 2>/dev/null | grep -q "OK"; then echo "Llama Stack Server is already running, skipping start" @@ -185,14 +204,16 @@ if [[ "$STACK_CONFIG" == *"server:"* ]]; then done echo "" fi + + trap stop_server EXIT ERR INT TERM fi # Run tests echo "=== Running Integration Tests ===" EXCLUDE_TESTS="builtin_tool or safety_with_image or code_interpreter or test_rag" -# Additional exclusions for vllm provider -if [[ "$PROVIDER" == "vllm" ]]; then +# Additional exclusions for vllm setup +if [[ "$TEST_SETUP" == "vllm" ]]; then EXCLUDE_TESTS="${EXCLUDE_TESTS} or test_inference_store_tool_calls" fi @@ -229,20 +250,22 @@ if [[ -n "$TEST_SUBDIRS" ]]; then echo "Total test files: $(echo $TEST_FILES | wc -w)" PYTEST_TARGET="$TEST_FILES" - EXTRA_PARAMS="$EXTRA_PARAMS --text-model=$TEXT_MODEL --embedding-model=sentence-transformers/all-MiniLM-L6-v2" else PYTEST_TARGET="tests/integration/" EXTRA_PARAMS="$EXTRA_PARAMS --suite=$TEST_SUITE" fi set +e +set -x pytest -s -v $PYTEST_TARGET \ --stack-config="$STACK_CONFIG" \ + --inference-mode="$INFERENCE_MODE" \ -k "$PYTEST_PATTERN" \ $EXTRA_PARAMS \ --color=yes \ --capture=tee-sys exit_code=$? +set +x set -e if [ $exit_code -eq 0 ]; then @@ -260,18 +283,5 @@ echo "=== System Resources After Tests ===" free -h 2>/dev/null || echo "free command not available" df -h -# stop server -if [[ "$STACK_CONFIG" == *"server:"* ]]; then - echo "Stopping Llama Stack Server..." - pids=$(lsof -i :8321 | awk 'NR>1 {print $2}') - if [[ -n "$pids" ]]; then - echo "Killing Llama Stack Server processes: $pids" - kill -9 $pids - else - echo "No Llama Stack Server processes found ?!" - fi - echo "Llama Stack Server stopped" -fi - echo "" echo "=== Integration Tests Complete ===" diff --git a/tests/integration/README.md b/tests/integration/README.md index b05beeb98..467f97e02 100644 --- a/tests/integration/README.md +++ b/tests/integration/README.md @@ -6,9 +6,7 @@ Integration tests verify complete workflows across different providers using Lla ```bash # Run all integration tests with existing recordings -LLAMA_STACK_TEST_INFERENCE_MODE=replay \ - LLAMA_STACK_TEST_RECORDING_DIR=tests/integration/recordings \ - uv run --group test \ +uv run --group test \ pytest -sv tests/integration/ --stack-config=starter ``` @@ -42,25 +40,35 @@ Model parameters can be influenced by the following options: Each of these are comma-separated lists and can be used to generate multiple parameter combinations. Note that tests will be skipped if no model is specified. -### Suites (fast selection + sane defaults) +### Suites and Setups -- `--suite`: comma-separated list of named suites that both narrow which tests are collected and prefill common model options (unless you pass them explicitly). +- `--suite`: single named suite that narrows which tests are collected. - Available suites: - - `responses`: collects tests under `tests/integration/responses`; this is a separate suite because it needs a strong tool-calling model. - - `vision`: collects only `tests/integration/inference/test_vision_inference.py`; defaults `--vision-model=ollama/llama3.2-vision:11b`, `--embedding-model=sentence-transformers/all-MiniLM-L6-v2`. -- Explicit flags always win. For example, `--suite=responses --text-model=` overrides the suite’s text model. + - `base`: collects most tests (excludes responses and post_training) + - `responses`: collects tests under `tests/integration/responses` (needs strong tool-calling models) + - `vision`: collects only `tests/integration/inference/test_vision_inference.py` +- `--setup`: global configuration that can be used with any suite. Setups prefill model/env defaults; explicit CLI flags always win. + - Available setups: + - `ollama`: Local Ollama provider with lightweight models (sets OLLAMA_URL, uses llama3.2:3b-instruct-fp16) + - `vllm`: VLLM provider for efficient local inference (sets VLLM_URL, uses Llama-3.2-1B-Instruct) + - `gpt`: OpenAI GPT models for high-quality responses (uses gpt-4o) + - `claude`: Anthropic Claude models for high-quality responses (uses claude-3-5-sonnet) -Examples: +Examples ```bash -# Fast responses run with defaults -pytest -s -v tests/integration --stack-config=server:starter --suite=responses +# Fast responses run with a strong tool-calling model +pytest -s -v tests/integration --stack-config=server:starter --suite=responses --setup=gpt -# Fast single-file vision run with defaults -pytest -s -v tests/integration --stack-config=server:starter --suite=vision +# Fast single-file vision run with Ollama defaults +pytest -s -v tests/integration --stack-config=server:starter --suite=vision --setup=ollama -# Combine suites and override a default -pytest -s -v tests/integration --stack-config=server:starter --suite=responses,vision --embedding-model=text-embedding-3-small +# Base suite with VLLM for performance +pytest -s -v tests/integration --stack-config=server:starter --suite=base --setup=vllm + +# Override a default from setup +pytest -s -v tests/integration --stack-config=server:starter \ + --suite=responses --setup=gpt --embedding-model=text-embedding-3-small ``` ## Examples @@ -127,14 +135,13 @@ pytest tests/integration/ ### RECORD Mode Captures API interactions for later replay: ```bash -LLAMA_STACK_TEST_INFERENCE_MODE=record \ -pytest tests/integration/inference/test_new_feature.py +pytest tests/integration/inference/test_new_feature.py --inference-mode=record ``` ### LIVE Mode Tests make real API calls (but not recorded): ```bash -LLAMA_STACK_TEST_INFERENCE_MODE=live pytest tests/integration/ +pytest tests/integration/ --inference-mode=live ``` By default, the recording directory is `tests/integration/recordings`. You can override this by setting the `LLAMA_STACK_TEST_RECORDING_DIR` environment variable. @@ -155,15 +162,14 @@ cat recordings/responses/abc123.json | jq '.' #### Remote Re-recording (Recommended) Use the automated workflow script for easier re-recording: ```bash -./scripts/github/schedule-record-workflow.sh --test-subdirs "inference,agents" +./scripts/github/schedule-record-workflow.sh --subdirs "inference,agents" ``` See the [main testing guide](../README.md#remote-re-recording-recommended) for full details. #### Local Re-recording ```bash # Re-record specific tests -LLAMA_STACK_TEST_INFERENCE_MODE=record \ -pytest -s -v --stack-config=server:starter tests/integration/inference/test_modified.py +pytest -s -v --stack-config=server:starter tests/integration/inference/test_modified.py --inference-mode=record ``` Note that when re-recording tests, you must use a Stack pointing to a server (i.e., `server:starter`). This subtlety exists because the set of tests run in server are a superset of the set of tests run in the library client. diff --git a/tests/integration/conftest.py b/tests/integration/conftest.py index 96260fdb7..4735264c3 100644 --- a/tests/integration/conftest.py +++ b/tests/integration/conftest.py @@ -15,7 +15,7 @@ from dotenv import load_dotenv from llama_stack.log import get_logger -from .suites import SUITE_DEFINITIONS +from .suites import SETUP_DEFINITIONS, SUITE_DEFINITIONS logger = get_logger(__name__, category="tests") @@ -63,19 +63,33 @@ def pytest_configure(config): key, value = env_var.split("=", 1) os.environ[key] = value - suites_raw = config.getoption("--suite") - suites: list[str] = [] - if suites_raw: - suites = [p.strip() for p in str(suites_raw).split(",") if p.strip()] - unknown = [p for p in suites if p not in SUITE_DEFINITIONS] - if unknown: + inference_mode = config.getoption("--inference-mode") + os.environ["LLAMA_STACK_TEST_INFERENCE_MODE"] = inference_mode + + suite = config.getoption("--suite") + if suite: + if suite not in SUITE_DEFINITIONS: + raise pytest.UsageError(f"Unknown suite: {suite}. Available: {', '.join(sorted(SUITE_DEFINITIONS.keys()))}") + + # Apply setups (global parameterizations): env + defaults + setup = config.getoption("--setup") + if suite and not setup: + setup = SUITE_DEFINITIONS[suite].default_setup + + if setup: + if setup not in SETUP_DEFINITIONS: raise pytest.UsageError( - f"Unknown suite(s): {', '.join(unknown)}. Available: {', '.join(sorted(SUITE_DEFINITIONS.keys()))}" + f"Unknown setup '{setup}'. Available: {', '.join(sorted(SETUP_DEFINITIONS.keys()))}" ) - for suite in suites: - suite_def = SUITE_DEFINITIONS.get(suite, {}) - defaults: dict = suite_def.get("defaults", {}) - for dest, value in defaults.items(): + + setup_obj = SETUP_DEFINITIONS[setup] + logger.info(f"Applying setup '{setup}'{' for suite ' + suite if suite else ''}") + # Apply env first + for k, v in setup_obj.env.items(): + if k not in os.environ: + os.environ[k] = str(v) + # Apply defaults if not provided explicitly + for dest, value in setup_obj.defaults.items(): current = getattr(config.option, dest, None) if not current: setattr(config.option, dest, value) @@ -120,6 +134,13 @@ def pytest_addoption(parser): default=384, help="Output dimensionality of the embedding model to use for testing. Default: 384", ) + + parser.addoption( + "--inference-mode", + help="Inference mode: { record, replay, live } (default: replay)", + choices=["record", "replay", "live"], + default="replay", + ) parser.addoption( "--report", help="Path where the test report should be written, e.g. --report=/path/to/report.md", @@ -127,14 +148,18 @@ def pytest_addoption(parser): available_suites = ", ".join(sorted(SUITE_DEFINITIONS.keys())) suite_help = ( - "Comma-separated integration test suites to narrow collection and prefill defaults. " - "Available: " - f"{available_suites}. " - "Explicit CLI flags (e.g., --text-model) override suite defaults. " - "Examples: --suite=responses or --suite=responses,vision." + f"Single test suite to run (narrows collection). Available: {available_suites}. Example: --suite=responses" ) parser.addoption("--suite", help=suite_help) + # Global setups for any suite + available_setups = ", ".join(sorted(SETUP_DEFINITIONS.keys())) + setup_help = ( + f"Global test setup configuration. Available: {available_setups}. " + "Can be used with any suite. Example: --setup=ollama" + ) + parser.addoption("--setup", help=setup_help) + MODEL_SHORT_IDS = { "meta-llama/Llama-3.2-3B-Instruct": "3B", @@ -221,16 +246,12 @@ pytest_plugins = ["tests.integration.fixtures.common"] def pytest_ignore_collect(path: str, config: pytest.Config) -> bool: """Skip collecting paths outside the selected suite roots for speed.""" - suites_raw = config.getoption("--suite") - if not suites_raw: + suite = config.getoption("--suite") + if not suite: return False - names = [p.strip() for p in str(suites_raw).split(",") if p.strip()] - roots: list[str] = [] - for name in names: - suite_def = SUITE_DEFINITIONS.get(name) - if suite_def: - roots.extend(suite_def.get("roots", [])) + sobj = SUITE_DEFINITIONS.get(suite) + roots: list[str] = sobj.get("roots", []) if isinstance(sobj, dict) else getattr(sobj, "roots", []) if not roots: return False diff --git a/tests/integration/suites.py b/tests/integration/suites.py index 602855055..bacd7ef52 100644 --- a/tests/integration/suites.py +++ b/tests/integration/suites.py @@ -8,46 +8,112 @@ # For example: # # ```bash -# pytest tests/integration/ --suite=vision +# pytest tests/integration/ --suite=vision --setup=ollama # ``` # -# Each suite can: -# - restrict collection to specific roots (dirs or files) -# - provide default CLI option values (e.g. text_model, embedding_model, etc.) +""" +Each suite defines what to run (roots). Suites can be run with different global setups defined in setups.py. +Setups provide environment variables and model defaults that can be reused across multiple suites. + +CLI examples: + pytest tests/integration --suite=responses --setup=gpt + pytest tests/integration --suite=vision --setup=ollama + pytest tests/integration --suite=base --setup=vllm +""" from pathlib import Path +from pydantic import BaseModel, Field + this_dir = Path(__file__).parent -default_roots = [ + + +class Suite(BaseModel): + name: str + roots: list[str] + default_setup: str | None = None + + +class Setup(BaseModel): + """A reusable test configuration with environment and CLI defaults.""" + + name: str + description: str + defaults: dict[str, str] = Field(default_factory=dict) + env: dict[str, str] = Field(default_factory=dict) + + +# Global setups - can be used with any suite "technically" but in reality, some setups might work +# only for specific test suites. +SETUP_DEFINITIONS: dict[str, Setup] = { + "ollama": Setup( + name="ollama", + description="Local Ollama provider with text + safety models", + env={ + "OLLAMA_URL": "http://0.0.0.0:11434", + "SAFETY_MODEL": "ollama/llama-guard3:1b", + }, + defaults={ + "text_model": "ollama/llama3.2:3b-instruct-fp16", + "embedding_model": "sentence-transformers/all-MiniLM-L6-v2", + "safety_model": "ollama/llama-guard3:1b", + "safety_shield": "llama-guard", + }, + ), + "ollama-vision": Setup( + name="ollama", + description="Local Ollama provider with a vision model", + env={ + "OLLAMA_URL": "http://0.0.0.0:11434", + }, + defaults={ + "vision_model": "ollama/llama3.2-vision:11b", + "embedding_model": "sentence-transformers/all-MiniLM-L6-v2", + }, + ), + "vllm": Setup( + name="vllm", + description="vLLM provider with a text model", + env={ + "VLLM_URL": "http://localhost:8000/v1", + }, + defaults={ + "text_model": "vllm/meta-llama/Llama-3.2-1B-Instruct", + "embedding_model": "sentence-transformers/all-MiniLM-L6-v2", + }, + ), + "gpt": Setup( + name="gpt", + description="OpenAI GPT models for high-quality responses and tool calling", + defaults={ + "text_model": "openai/gpt-4o", + "embedding_model": "sentence-transformers/all-MiniLM-L6-v2", + }, + ), +} + + +base_roots = [ str(p) for p in this_dir.glob("*") if p.is_dir() and p.name not in ("__pycache__", "fixtures", "test_cases", "recordings", "responses", "post_training") ] -SUITE_DEFINITIONS: dict[str, dict] = { - "base": { - "description": "Base suite that includes most tests but runs them with a text Ollama model", - "roots": default_roots, - "defaults": { - "text_model": "ollama/llama3.2:3b-instruct-fp16", - "embedding_model": "sentence-transformers/all-MiniLM-L6-v2", - }, - }, - "responses": { - "description": "Suite that includes only the OpenAI Responses tests; needs a strong tool-calling model", - "roots": ["tests/integration/responses"], - "defaults": { - "text_model": "openai/gpt-4o", - "embedding_model": "sentence-transformers/all-MiniLM-L6-v2", - }, - }, - "vision": { - "description": "Suite that includes only the vision tests", - "roots": ["tests/integration/inference/test_vision_inference.py"], - "defaults": { - "vision_model": "ollama/llama3.2-vision:11b", - "embedding_model": "sentence-transformers/all-MiniLM-L6-v2", - }, - }, +SUITE_DEFINITIONS: dict[str, Suite] = { + "base": Suite( + name="base", + roots=base_roots, + default_setup="ollama", + ), + "responses": Suite( + name="responses", + roots=["tests/integration/responses"], + default_setup="gpt", + ), + "vision": Suite( + name="vision", + roots=["tests/integration/inference/test_vision_inference.py"], + default_setup="ollama-vision", + ), } From 9d3a234bf3772083e148d8168a204b9cb2c200ac Mon Sep 17 00:00:00 2001 From: ehhuang Date: Tue, 9 Sep 2025 15:51:20 -0700 Subject: [PATCH 057/150] chore: remove unused variable (#3389) # What does this PR do? ## Test Plan --- llama_stack/core/library_client.py | 2 -- 1 file changed, 2 deletions(-) diff --git a/llama_stack/core/library_client.py b/llama_stack/core/library_client.py index 9e7a8006c..ea5a2ac8e 100644 --- a/llama_stack/core/library_client.py +++ b/llama_stack/core/library_client.py @@ -10,7 +10,6 @@ import json import logging # allow-direct-logging import os import sys -from concurrent.futures import ThreadPoolExecutor from enum import Enum from io import BytesIO from pathlib import Path @@ -148,7 +147,6 @@ class LlamaStackAsLibraryClient(LlamaStackClient): self.async_client = AsyncLlamaStackAsLibraryClient( config_path_or_distro_name, custom_provider_registry, provider_data, skip_logger_removal ) - self.pool_executor = ThreadPoolExecutor(max_workers=4) self.provider_data = provider_data self.loop = asyncio.new_event_loop() From dd1f946b3ee4232dc8e13d3836e7f19e65f5e112 Mon Sep 17 00:00:00 2001 From: Matthew Farrellee Date: Tue, 9 Sep 2025 18:54:58 -0400 Subject: [PATCH 058/150] feat: include a default inference store during llama stack build (#3373) # What does this PR do? enables completions storage when using `llama stack build --providers` - - GET /v1/chat/completions - GET /v1/chat/completions/{id} todo: llama stack build and distro codegen should use the same code paths ## Test Plan ci --- llama_stack/cli/stack/_build.py | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/llama_stack/cli/stack/_build.py b/llama_stack/cli/stack/_build.py index c6e204773..b14e6fe55 100644 --- a/llama_stack/cli/stack/_build.py +++ b/llama_stack/cli/stack/_build.py @@ -45,6 +45,7 @@ from llama_stack.core.utils.dynamic import instantiate_class_type from llama_stack.core.utils.exec import formulate_run_args, run_command from llama_stack.core.utils.image_types import LlamaStackImageType from llama_stack.providers.datatypes import Api +from llama_stack.providers.utils.sqlstore.sqlstore import SqliteSqlStoreConfig DISTRIBS_PATH = Path(__file__).parent.parent.parent / "distributions" @@ -294,6 +295,12 @@ def _generate_run_config( if build_config.external_providers_dir else EXTERNAL_PROVIDERS_DIR, ) + if not run_config.inference_store: + run_config.inference_store = SqliteSqlStoreConfig( + **SqliteSqlStoreConfig.sample_run_config( + __distro_dir__=(DISTRIBS_BASE_DIR / image_name).as_posix(), db_name="inference_store.db" + ) + ) # build providers dict provider_registry = get_provider_registry(build_config) for api in apis: From 81ad240faa48d2a2d91e5fbfc3dda21443432a6f Mon Sep 17 00:00:00 2001 From: Ashwin Bharambe Date: Tue, 9 Sep 2025 23:00:50 -0700 Subject: [PATCH 059/150] fix(k8s): unwedge run.yaml to add files --- .../k8s-benchmark/stack-configmap.yaml | 19 +- .../k8s-benchmark/stack_run_config.yaml | 9 + .../distributions/k8s/stack-configmap.yaml | 182 +++++------------- .../distributions/k8s/stack_run_config.yaml | 9 + 4 files changed, 77 insertions(+), 142 deletions(-) diff --git a/docs/source/distributions/k8s-benchmark/stack-configmap.yaml b/docs/source/distributions/k8s-benchmark/stack-configmap.yaml index edf4ebd75..bf6109b68 100644 --- a/docs/source/distributions/k8s-benchmark/stack-configmap.yaml +++ b/docs/source/distributions/k8s-benchmark/stack-configmap.yaml @@ -6,6 +6,7 @@ data: apis: - agents - inference + - files - safety - telemetry - tool_runtime @@ -19,13 +20,6 @@ data: max_tokens: ${env.VLLM_MAX_TOKENS:=4096} api_token: ${env.VLLM_API_TOKEN:=fake} tls_verify: ${env.VLLM_TLS_VERIFY:=true} - - provider_id: vllm-safety - provider_type: remote::vllm - config: - url: ${env.VLLM_SAFETY_URL:=http://localhost:8000/v1} - max_tokens: ${env.VLLM_MAX_TOKENS:=4096} - api_token: ${env.VLLM_API_TOKEN:=fake} - tls_verify: ${env.VLLM_TLS_VERIFY:=true} - provider_id: sentence-transformers provider_type: inline::sentence-transformers config: {} @@ -41,6 +35,14 @@ data: db: ${env.POSTGRES_DB:=llamastack} user: ${env.POSTGRES_USER:=llamastack} password: ${env.POSTGRES_PASSWORD:=llamastack} + files: + - provider_id: meta-reference-files + provider_type: inline::localfs + config: + storage_dir: ${env.FILES_STORAGE_DIR:=~/.llama/distributions/starter/files} + metadata_store: + type: sqlite + db_path: ${env.SQLITE_STORE_DIR:=~/.llama/distributions/starter}/files_metadata.db safety: - provider_id: llama-guard provider_type: inline::llama-guard @@ -111,9 +113,6 @@ data: - model_id: ${env.INFERENCE_MODEL} provider_id: vllm-inference model_type: llm - - model_id: ${env.SAFETY_MODEL} - provider_id: vllm-safety - model_type: llm shields: - shield_id: ${env.SAFETY_MODEL:=meta-llama/Llama-Guard-3-1B} vector_dbs: [] diff --git a/docs/source/distributions/k8s-benchmark/stack_run_config.yaml b/docs/source/distributions/k8s-benchmark/stack_run_config.yaml index 5a810639e..f8ff7811b 100644 --- a/docs/source/distributions/k8s-benchmark/stack_run_config.yaml +++ b/docs/source/distributions/k8s-benchmark/stack_run_config.yaml @@ -3,6 +3,7 @@ image_name: kubernetes-benchmark-demo apis: - agents - inference +- files - safety - telemetry - tool_runtime @@ -31,6 +32,14 @@ providers: db: ${env.POSTGRES_DB:=llamastack} user: ${env.POSTGRES_USER:=llamastack} password: ${env.POSTGRES_PASSWORD:=llamastack} + files: + - provider_id: meta-reference-files + provider_type: inline::localfs + config: + storage_dir: ${env.FILES_STORAGE_DIR:=~/.llama/distributions/starter/files} + metadata_store: + type: sqlite + db_path: ${env.SQLITE_STORE_DIR:=~/.llama/distributions/starter}/files_metadata.db safety: - provider_id: llama-guard provider_type: inline::llama-guard diff --git a/docs/source/distributions/k8s/stack-configmap.yaml b/docs/source/distributions/k8s/stack-configmap.yaml index 4f95554e3..3dbb0da97 100644 --- a/docs/source/distributions/k8s/stack-configmap.yaml +++ b/docs/source/distributions/k8s/stack-configmap.yaml @@ -1,137 +1,55 @@ apiVersion: v1 data: - stack_run_config.yaml: | - version: '2' - image_name: kubernetes-demo - apis: - - agents - - inference - - safety - - telemetry - - tool_runtime - - vector_io - providers: - inference: - - provider_id: vllm-inference - provider_type: remote::vllm - config: - url: ${env.VLLM_URL:=http://localhost:8000/v1} - max_tokens: ${env.VLLM_MAX_TOKENS:=4096} - api_token: ${env.VLLM_API_TOKEN:=fake} - tls_verify: ${env.VLLM_TLS_VERIFY:=true} - - provider_id: vllm-safety - provider_type: remote::vllm - config: - url: ${env.VLLM_SAFETY_URL:=http://localhost:8000/v1} - max_tokens: ${env.VLLM_MAX_TOKENS:=4096} - api_token: ${env.VLLM_API_TOKEN:=fake} - tls_verify: ${env.VLLM_TLS_VERIFY:=true} - - provider_id: sentence-transformers - provider_type: inline::sentence-transformers - config: {} - vector_io: - - provider_id: ${env.ENABLE_CHROMADB:+chromadb} - provider_type: remote::chromadb - config: - url: ${env.CHROMADB_URL:=} - kvstore: - type: postgres - host: ${env.POSTGRES_HOST:=localhost} - port: ${env.POSTGRES_PORT:=5432} - db: ${env.POSTGRES_DB:=llamastack} - user: ${env.POSTGRES_USER:=llamastack} - password: ${env.POSTGRES_PASSWORD:=llamastack} - safety: - - provider_id: llama-guard - provider_type: inline::llama-guard - config: - excluded_categories: [] - agents: - - provider_id: meta-reference - provider_type: inline::meta-reference - config: - persistence_store: - type: postgres - host: ${env.POSTGRES_HOST:=localhost} - port: ${env.POSTGRES_PORT:=5432} - db: ${env.POSTGRES_DB:=llamastack} - user: ${env.POSTGRES_USER:=llamastack} - password: ${env.POSTGRES_PASSWORD:=llamastack} - responses_store: - type: postgres - host: ${env.POSTGRES_HOST:=localhost} - port: ${env.POSTGRES_PORT:=5432} - db: ${env.POSTGRES_DB:=llamastack} - user: ${env.POSTGRES_USER:=llamastack} - password: ${env.POSTGRES_PASSWORD:=llamastack} - telemetry: - - provider_id: meta-reference - provider_type: inline::meta-reference - config: - service_name: "${env.OTEL_SERVICE_NAME:=\u200B}" - sinks: ${env.TELEMETRY_SINKS:=console} - tool_runtime: - - provider_id: brave-search - provider_type: remote::brave-search - config: - api_key: ${env.BRAVE_SEARCH_API_KEY:+} - max_results: 3 - - provider_id: tavily-search - provider_type: remote::tavily-search - config: - api_key: ${env.TAVILY_SEARCH_API_KEY:+} - max_results: 3 - - provider_id: rag-runtime - provider_type: inline::rag-runtime - config: {} - - provider_id: model-context-protocol - provider_type: remote::model-context-protocol - config: {} - metadata_store: - type: postgres - host: ${env.POSTGRES_HOST:=localhost} - port: ${env.POSTGRES_PORT:=5432} - db: ${env.POSTGRES_DB:=llamastack} - user: ${env.POSTGRES_USER:=llamastack} - password: ${env.POSTGRES_PASSWORD:=llamastack} - table_name: llamastack_kvstore - inference_store: - type: postgres - host: ${env.POSTGRES_HOST:=localhost} - port: ${env.POSTGRES_PORT:=5432} - db: ${env.POSTGRES_DB:=llamastack} - user: ${env.POSTGRES_USER:=llamastack} - password: ${env.POSTGRES_PASSWORD:=llamastack} - models: - - metadata: - embedding_dimension: 384 - model_id: all-MiniLM-L6-v2 - provider_id: sentence-transformers - model_type: embedding - - metadata: {} - model_id: ${env.INFERENCE_MODEL} - provider_id: vllm-inference - model_type: llm - - metadata: {} - model_id: ${env.SAFETY_MODEL:=meta-llama/Llama-Guard-3-1B} - provider_id: vllm-safety - model_type: llm - shields: - - shield_id: ${env.SAFETY_MODEL:=meta-llama/Llama-Guard-3-1B} - vector_dbs: [] - datasets: [] - scoring_fns: [] - benchmarks: [] - tool_groups: - - toolgroup_id: builtin::websearch - provider_id: tavily-search - - toolgroup_id: builtin::rag - provider_id: rag-runtime - server: - port: 8321 - auth: - provider_config: - type: github_token + stack_run_config.yaml: "version: '2'\nimage_name: kubernetes-demo\napis:\n- agents\n- + inference\n- files\n- safety\n- telemetry\n- tool_runtime\n- vector_io\nproviders:\n + \ inference:\n - provider_id: vllm-inference\n provider_type: remote::vllm\n + \ config:\n url: ${env.VLLM_URL:=http://localhost:8000/v1}\n max_tokens: + ${env.VLLM_MAX_TOKENS:=4096}\n api_token: ${env.VLLM_API_TOKEN:=fake}\n tls_verify: + ${env.VLLM_TLS_VERIFY:=true}\n - provider_id: vllm-safety\n provider_type: + remote::vllm\n config:\n url: ${env.VLLM_SAFETY_URL:=http://localhost:8000/v1}\n + \ max_tokens: ${env.VLLM_MAX_TOKENS:=4096}\n api_token: ${env.VLLM_API_TOKEN:=fake}\n + \ tls_verify: ${env.VLLM_TLS_VERIFY:=true}\n - provider_id: sentence-transformers\n + \ provider_type: inline::sentence-transformers\n config: {}\n vector_io:\n + \ - provider_id: ${env.ENABLE_CHROMADB:+chromadb}\n provider_type: remote::chromadb\n + \ config:\n url: ${env.CHROMADB_URL:=}\n kvstore:\n type: postgres\n + \ host: ${env.POSTGRES_HOST:=localhost}\n port: ${env.POSTGRES_PORT:=5432}\n + \ db: ${env.POSTGRES_DB:=llamastack}\n user: ${env.POSTGRES_USER:=llamastack}\n + \ password: ${env.POSTGRES_PASSWORD:=llamastack}\n files:\n - provider_id: + meta-reference-files\n provider_type: inline::localfs\n config:\n storage_dir: + ${env.FILES_STORAGE_DIR:=~/.llama/distributions/starter/files}\n metadata_store:\n + \ type: sqlite\n db_path: ${env.SQLITE_STORE_DIR:=~/.llama/distributions/starter}/files_metadata.db + \ \n safety:\n - provider_id: llama-guard\n provider_type: inline::llama-guard\n + \ config:\n excluded_categories: []\n agents:\n - provider_id: meta-reference\n + \ provider_type: inline::meta-reference\n config:\n persistence_store:\n + \ type: postgres\n host: ${env.POSTGRES_HOST:=localhost}\n port: + ${env.POSTGRES_PORT:=5432}\n db: ${env.POSTGRES_DB:=llamastack}\n user: + ${env.POSTGRES_USER:=llamastack}\n password: ${env.POSTGRES_PASSWORD:=llamastack}\n + \ responses_store:\n type: postgres\n host: ${env.POSTGRES_HOST:=localhost}\n + \ port: ${env.POSTGRES_PORT:=5432}\n db: ${env.POSTGRES_DB:=llamastack}\n + \ user: ${env.POSTGRES_USER:=llamastack}\n password: ${env.POSTGRES_PASSWORD:=llamastack}\n + \ telemetry:\n - provider_id: meta-reference\n provider_type: inline::meta-reference\n + \ config:\n service_name: \"${env.OTEL_SERVICE_NAME:=\\u200B}\"\n sinks: + ${env.TELEMETRY_SINKS:=console}\n tool_runtime:\n - provider_id: brave-search\n + \ provider_type: remote::brave-search\n config:\n api_key: ${env.BRAVE_SEARCH_API_KEY:+}\n + \ max_results: 3\n - provider_id: tavily-search\n provider_type: remote::tavily-search\n + \ config:\n api_key: ${env.TAVILY_SEARCH_API_KEY:+}\n max_results: + 3\n - provider_id: rag-runtime\n provider_type: inline::rag-runtime\n config: + {}\n - provider_id: model-context-protocol\n provider_type: remote::model-context-protocol\n + \ config: {}\nmetadata_store:\n type: postgres\n host: ${env.POSTGRES_HOST:=localhost}\n + \ port: ${env.POSTGRES_PORT:=5432}\n db: ${env.POSTGRES_DB:=llamastack}\n user: + ${env.POSTGRES_USER:=llamastack}\n password: ${env.POSTGRES_PASSWORD:=llamastack}\n + \ table_name: llamastack_kvstore\ninference_store:\n type: postgres\n host: + ${env.POSTGRES_HOST:=localhost}\n port: ${env.POSTGRES_PORT:=5432}\n db: ${env.POSTGRES_DB:=llamastack}\n + \ user: ${env.POSTGRES_USER:=llamastack}\n password: ${env.POSTGRES_PASSWORD:=llamastack}\nmodels:\n- + metadata:\n embedding_dimension: 384\n model_id: all-MiniLM-L6-v2\n provider_id: + sentence-transformers\n model_type: embedding\n- metadata: {}\n model_id: ${env.INFERENCE_MODEL}\n + \ provider_id: vllm-inference\n model_type: llm\n- metadata: {}\n model_id: + ${env.SAFETY_MODEL:=meta-llama/Llama-Guard-3-1B}\n provider_id: vllm-safety\n + \ model_type: llm\nshields:\n- shield_id: ${env.SAFETY_MODEL:=meta-llama/Llama-Guard-3-1B}\nvector_dbs: + []\ndatasets: []\nscoring_fns: []\nbenchmarks: []\ntool_groups:\n- toolgroup_id: + builtin::websearch\n provider_id: tavily-search\n- toolgroup_id: builtin::rag\n + \ provider_id: rag-runtime\nserver:\n port: 8321\n auth:\n provider_config:\n + \ type: github_token\n" kind: ConfigMap metadata: creationTimestamp: null diff --git a/docs/source/distributions/k8s/stack_run_config.yaml b/docs/source/distributions/k8s/stack_run_config.yaml index a2d65e1a9..b841ab977 100644 --- a/docs/source/distributions/k8s/stack_run_config.yaml +++ b/docs/source/distributions/k8s/stack_run_config.yaml @@ -3,6 +3,7 @@ image_name: kubernetes-demo apis: - agents - inference +- files - safety - telemetry - tool_runtime @@ -38,6 +39,14 @@ providers: db: ${env.POSTGRES_DB:=llamastack} user: ${env.POSTGRES_USER:=llamastack} password: ${env.POSTGRES_PASSWORD:=llamastack} + files: + - provider_id: meta-reference-files + provider_type: inline::localfs + config: + storage_dir: ${env.FILES_STORAGE_DIR:=~/.llama/distributions/starter/files} + metadata_store: + type: sqlite + db_path: ${env.SQLITE_STORE_DIR:=~/.llama/distributions/starter}/files_metadata.db safety: - provider_id: llama-guard provider_type: inline::llama-guard From 1c23aeb9372fa3e1286a7d6d8210994000efae6d Mon Sep 17 00:00:00 2001 From: Cesare Pompeiano Date: Wed, 10 Sep 2025 11:19:21 +0200 Subject: [PATCH 060/150] feat: Add vector_db_id to chunk metadata (#3304) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit # What does this PR do? When running RAG in a multi vector DB setting, it can be difficult to trace where retrieved chunks originate from. This PR adds the `vector_db_id` into each chunk’s metadata, making it easier to understand which database a given chunk came from. This is helpful for debugging and for analyzing retrieval behavior of multiple DBs. Relevant code: ```python for vector_db_id, result in zip(vector_db_ids, results): for chunk, score in zip(result.chunks, result.scores): if not hasattr(chunk, "metadata") or chunk.metadata is None: chunk.metadata = {} chunk.metadata["vector_db_id"] = vector_db_id chunks.append(chunk) scores.append(score) ``` ## Test Plan * Ran Llama Stack in debug mode. * Verified that `vector_db_id` was added to each chunk’s metadata. * Confirmed that the metadata was printed in the console when using the RAG tool. --------- Co-authored-by: are-ces Co-authored-by: Francisco Arceo --- .../inline/tool_runtime/rag/memory.py | 16 +++++- tests/unit/rag/test_rag_query.py | 55 +++++++++++++++++++ 2 files changed, 69 insertions(+), 2 deletions(-) diff --git a/llama_stack/providers/inline/tool_runtime/rag/memory.py b/llama_stack/providers/inline/tool_runtime/rag/memory.py index cb526e8ee..aa629cca8 100644 --- a/llama_stack/providers/inline/tool_runtime/rag/memory.py +++ b/llama_stack/providers/inline/tool_runtime/rag/memory.py @@ -167,8 +167,18 @@ class MemoryToolRuntimeImpl(ToolGroupsProtocolPrivate, ToolRuntime, RAGToolRunti for vector_db_id in vector_db_ids ] results: list[QueryChunksResponse] = await asyncio.gather(*tasks) - chunks = [c for r in results for c in r.chunks] - scores = [s for r in results for s in r.scores] + + chunks = [] + scores = [] + + for vector_db_id, result in zip(vector_db_ids, results, strict=False): + for chunk, score in zip(result.chunks, result.scores, strict=False): + if not hasattr(chunk, "metadata") or chunk.metadata is None: + chunk.metadata = {} + chunk.metadata["vector_db_id"] = vector_db_id + + chunks.append(chunk) + scores.append(score) if not chunks: return RAGQueryResult(content=None) @@ -203,6 +213,7 @@ class MemoryToolRuntimeImpl(ToolGroupsProtocolPrivate, ToolRuntime, RAGToolRunti metadata_keys_to_exclude_from_context = [ "token_count", "metadata_token_count", + "vector_db_id", ] metadata_for_context = {} for k in chunk_metadata_keys_to_include_from_context: @@ -227,6 +238,7 @@ class MemoryToolRuntimeImpl(ToolGroupsProtocolPrivate, ToolRuntime, RAGToolRunti "document_ids": [c.metadata["document_id"] for c in chunks[: len(picked)]], "chunks": [c.content for c in chunks[: len(picked)]], "scores": scores[: len(picked)], + "vector_db_ids": [c.metadata["vector_db_id"] for c in chunks[: len(picked)]], }, ) diff --git a/tests/unit/rag/test_rag_query.py b/tests/unit/rag/test_rag_query.py index d18d90716..7b897bfe0 100644 --- a/tests/unit/rag/test_rag_query.py +++ b/tests/unit/rag/test_rag_query.py @@ -81,3 +81,58 @@ class TestRagQuery: # Test that invalid mode raises an error with pytest.raises(ValueError): RAGQueryConfig(mode="wrong_mode") + + @pytest.mark.asyncio + async def test_query_adds_vector_db_id_to_chunk_metadata(self): + rag_tool = MemoryToolRuntimeImpl( + config=MagicMock(), + vector_io_api=MagicMock(), + inference_api=MagicMock(), + ) + + vector_db_ids = ["db1", "db2"] + + # Fake chunks from each DB + chunk_metadata1 = ChunkMetadata( + document_id="doc1", + chunk_id="chunk1", + source="test_source1", + metadata_token_count=5, + ) + chunk1 = Chunk( + content="chunk from db1", + metadata={"vector_db_id": "db1", "document_id": "doc1"}, + stored_chunk_id="c1", + chunk_metadata=chunk_metadata1, + ) + + chunk_metadata2 = ChunkMetadata( + document_id="doc2", + chunk_id="chunk2", + source="test_source2", + metadata_token_count=5, + ) + chunk2 = Chunk( + content="chunk from db2", + metadata={"vector_db_id": "db2", "document_id": "doc2"}, + stored_chunk_id="c2", + chunk_metadata=chunk_metadata2, + ) + + rag_tool.vector_io_api.query_chunks = AsyncMock( + side_effect=[ + QueryChunksResponse(chunks=[chunk1], scores=[0.9]), + QueryChunksResponse(chunks=[chunk2], scores=[0.8]), + ] + ) + + result = await rag_tool.query(content="test", vector_db_ids=vector_db_ids) + returned_chunks = result.metadata["chunks"] + returned_scores = result.metadata["scores"] + returned_doc_ids = result.metadata["document_ids"] + returned_vector_db_ids = result.metadata["vector_db_ids"] + + assert returned_chunks == ["chunk from db1", "chunk from db2"] + assert returned_scores == (0.9, 0.8) + assert returned_doc_ids == ["doc1", "doc2"] + assert returned_vector_db_ids == ["db1", "db2"] From 167143131053c8de6ea620a83ebdec41c0b24e50 Mon Sep 17 00:00:00 2001 From: Akram Ben Aissi Date: Wed, 10 Sep 2025 12:55:57 +0200 Subject: [PATCH 061/150] fix: Add missing files_api parameter to MemoryToolRuntimeImpl test (#3394) # What does this PR do? The test_query_adds_vector_db_id_to_chunk_metadata test was failing because MemoryToolRuntimeImpl.__init__() now requires a files_api parameter. Fixes failing unit tests for Python 3.12 and 3.13. ## Test Plan --- tests/unit/rag/test_rag_query.py | 1 + 1 file changed, 1 insertion(+) diff --git a/tests/unit/rag/test_rag_query.py b/tests/unit/rag/test_rag_query.py index 7b897bfe0..183b4d049 100644 --- a/tests/unit/rag/test_rag_query.py +++ b/tests/unit/rag/test_rag_query.py @@ -88,6 +88,7 @@ class TestRagQuery: config=MagicMock(), vector_io_api=MagicMock(), inference_api=MagicMock(), + files_api=MagicMock(), ) vector_db_ids = ["db1", "db2"] From c836fa29e3b9a587734764cc025551bce68fc349 Mon Sep 17 00:00:00 2001 From: Akram Ben Aissi Date: Wed, 10 Sep 2025 15:27:35 +0200 Subject: [PATCH 062/150] fix: pre-commit issues: non executable shebang file and removal of @pytest.mark.asyncio decorator (#3397) # What does this PR do? Fix pre-commit issues: non executable shebang file, @pytest.mark.asyncio decorator ## Test Plan --- scripts/get_setup_env.py | 0 tests/unit/rag/test_rag_query.py | 1 - 2 files changed, 1 deletion(-) mode change 100644 => 100755 scripts/get_setup_env.py diff --git a/scripts/get_setup_env.py b/scripts/get_setup_env.py old mode 100644 new mode 100755 diff --git a/tests/unit/rag/test_rag_query.py b/tests/unit/rag/test_rag_query.py index 183b4d049..a45b66f02 100644 --- a/tests/unit/rag/test_rag_query.py +++ b/tests/unit/rag/test_rag_query.py @@ -82,7 +82,6 @@ class TestRagQuery: with pytest.raises(ValueError): RAGQueryConfig(mode="wrong_mode") - @pytest.mark.asyncio async def test_query_adds_vector_db_id_to_chunk_metadata(self): rag_tool = MemoryToolRuntimeImpl( config=MagicMock(), From 0e27016cf23eca51a0f025897b44109b1b609b71 Mon Sep 17 00:00:00 2001 From: Matthew Farrellee Date: Wed, 10 Sep 2025 09:39:29 -0400 Subject: [PATCH 063/150] chore: update the vertexai inference impl to use openai-python for openai-compat functions (#3377) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit # What does this PR do? update VertexAI inference provider to use openai-python for openai-compat functions ## Test Plan ``` $ VERTEX_AI_PROJECT=... uv run llama stack build --image-type venv --providers inference=remote::vertexai --run ... $ LLAMA_STACK_CONFIG=http://localhost:8321 uv run --group test pytest -v -ra --text-model vertexai/vertex_ai/gemini-2.5-flash tests/integration/inference/test_openai_completion.py ... ``` i don't have an account to test this. `get_api_key` may also need to be updated per https://cloud.google.com/vertex-ai/generative-ai/docs/start/openai --------- Signed-off-by: Sébastien Han Co-authored-by: Sébastien Han --- llama_stack/providers/registry/inference.py | 2 +- .../remote/inference/vertexai/vertexai.py | 33 ++++++++++++++++--- .../inference/test_openai_completion.py | 3 ++ 3 files changed, 33 insertions(+), 5 deletions(-) diff --git a/llama_stack/providers/registry/inference.py b/llama_stack/providers/registry/inference.py index 4176f85a6..541fbb432 100644 --- a/llama_stack/providers/registry/inference.py +++ b/llama_stack/providers/registry/inference.py @@ -218,7 +218,7 @@ def available_providers() -> list[ProviderSpec]: api=Api.inference, adapter=AdapterSpec( adapter_type="vertexai", - pip_packages=["litellm", "google-cloud-aiplatform"], + pip_packages=["litellm", "google-cloud-aiplatform", "openai"], module="llama_stack.providers.remote.inference.vertexai", config_class="llama_stack.providers.remote.inference.vertexai.VertexAIConfig", provider_data_validator="llama_stack.providers.remote.inference.vertexai.config.VertexAIProviderDataValidator", diff --git a/llama_stack/providers/remote/inference/vertexai/vertexai.py b/llama_stack/providers/remote/inference/vertexai/vertexai.py index 8807fd0e6..27f953ab9 100644 --- a/llama_stack/providers/remote/inference/vertexai/vertexai.py +++ b/llama_stack/providers/remote/inference/vertexai/vertexai.py @@ -6,16 +6,20 @@ from typing import Any +import google.auth.transport.requests +from google.auth import default + from llama_stack.apis.inference import ChatCompletionRequest from llama_stack.providers.utils.inference.litellm_openai_mixin import ( LiteLLMOpenAIMixin, ) +from llama_stack.providers.utils.inference.openai_mixin import OpenAIMixin from .config import VertexAIConfig from .models import MODEL_ENTRIES -class VertexAIInferenceAdapter(LiteLLMOpenAIMixin): +class VertexAIInferenceAdapter(OpenAIMixin, LiteLLMOpenAIMixin): def __init__(self, config: VertexAIConfig) -> None: LiteLLMOpenAIMixin.__init__( self, @@ -27,9 +31,30 @@ class VertexAIInferenceAdapter(LiteLLMOpenAIMixin): self.config = config def get_api_key(self) -> str: - # Vertex AI doesn't use API keys, it uses Application Default Credentials - # Return empty string to let litellm handle authentication via ADC - return "" + """ + Get an access token for Vertex AI using Application Default Credentials. + + Vertex AI uses ADC instead of API keys. This method obtains an access token + from the default credentials and returns it for use with the OpenAI-compatible client. + """ + try: + # Get default credentials - will read from GOOGLE_APPLICATION_CREDENTIALS + credentials, _ = default(scopes=["https://www.googleapis.com/auth/cloud-platform"]) + credentials.refresh(google.auth.transport.requests.Request()) + return credentials.token + except Exception: + # If we can't get credentials, return empty string to let LiteLLM handle it + # This allows the LiteLLM mixin to work with ADC directly + return "" + + def get_base_url(self) -> str: + """ + Get the Vertex AI OpenAI-compatible API base URL. + + Returns the Vertex AI OpenAI-compatible endpoint URL. + Source: https://cloud.google.com/vertex-ai/generative-ai/docs/start/openai + """ + return f"https://{self.config.location}-aiplatform.googleapis.com/v1/projects/{self.config.project}/locations/{self.config.location}/endpoints/openapi" async def _get_params(self, request: ChatCompletionRequest) -> dict[str, Any]: # Get base parameters from parent diff --git a/tests/integration/inference/test_openai_completion.py b/tests/integration/inference/test_openai_completion.py index df1184f1c..f9c837ebd 100644 --- a/tests/integration/inference/test_openai_completion.py +++ b/tests/integration/inference/test_openai_completion.py @@ -76,6 +76,9 @@ def skip_if_doesnt_support_n(client_with_models, model_id): "remote::gemini", # https://docs.anthropic.com/en/api/openai-sdk#simple-fields "remote::anthropic", + "remote::vertexai", + # Error code: 400 - [{'error': {'code': 400, 'message': 'Unable to submit request because candidateCount must be 1 but + # the entered value was 2. Update the candidateCount value and try again.', 'status': 'INVALID_ARGUMENT'} ): pytest.skip(f"Model {model_id} hosted by {provider.provider_type} doesn't support n param.") From c86e45496e32164286eb8920d2e979a45be31ea3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C3=A9bastien=20Han?= Date: Wed, 10 Sep 2025 16:00:46 +0200 Subject: [PATCH 064/150] ci: Re-enable pre-commit to fail (#3399) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit If pre-commit fails, the workflow must fail. --------- Signed-off-by: Sébastien Han --- .github/workflows/pre-commit.yml | 1 - llama_stack/providers/remote/inference/vertexai/vertexai.py | 2 +- 2 files changed, 1 insertion(+), 2 deletions(-) diff --git a/.github/workflows/pre-commit.yml b/.github/workflows/pre-commit.yml index 792162262..000208043 100644 --- a/.github/workflows/pre-commit.yml +++ b/.github/workflows/pre-commit.yml @@ -48,7 +48,6 @@ jobs: working-directory: llama_stack/ui - uses: pre-commit/action@2c7b3805fd2a0fd8c1884dcaebf91fc102a13ecd # v3.0.1 - continue-on-error: true env: SKIP: no-commit-to-branch RUFF_OUTPUT_FORMAT: github diff --git a/llama_stack/providers/remote/inference/vertexai/vertexai.py b/llama_stack/providers/remote/inference/vertexai/vertexai.py index 27f953ab9..8996543e7 100644 --- a/llama_stack/providers/remote/inference/vertexai/vertexai.py +++ b/llama_stack/providers/remote/inference/vertexai/vertexai.py @@ -41,7 +41,7 @@ class VertexAIInferenceAdapter(OpenAIMixin, LiteLLMOpenAIMixin): # Get default credentials - will read from GOOGLE_APPLICATION_CREDENTIALS credentials, _ = default(scopes=["https://www.googleapis.com/auth/cloud-platform"]) credentials.refresh(google.auth.transport.requests.Request()) - return credentials.token + return str(credentials.token) except Exception: # If we can't get credentials, return empty string to let LiteLLM handle it # This allows the LiteLLM mixin to work with ADC directly From 935b8e28de29400a4b42d8b54169341c5244fec7 Mon Sep 17 00:00:00 2001 From: slekkala1 Date: Wed, 10 Sep 2025 08:48:01 -0700 Subject: [PATCH 065/150] fix: Fireworks chat completion broken due to telemetry (#3392) # What does this PR do? Fix fireworks chat completion broken due to telemetry expecting response.usage Closes https://github.com/llamastack/llama-stack/issues/3391 ## Test Plan 1. `uv run --with llama-stack llama stack build --distro starter --image-type venv --run` Try ``` curl -X POST http://0.0.0.0:8321/v1/openai/v1/chat/completions \ -H "Content-Type: application/json" \ -d '{ "model": "fireworks/accounts/fireworks/models/llama-v3p1-8b-instruct", "messages": [{"role": "user", "content": "Hello!"}] }' ``` ``` {"id":"chatcmpl-ee922a08-0df0-4974-b0d3-b322113e8bc0","choices":[{"message":{"role":"assistant","content":"Hello! How can I assist you today?","name":null,"tool_calls":null},"finish_reason":"stop","index":0,"logprobs":null}],"object":"chat.completion","created":1757456375,"model":"fireworks/accounts/fireworks/models/llama-v3p1-8b-instruct"}% ``` Without fix fails as mentioned in https://github.com/llamastack/llama-stack/issues/3391 Co-authored-by: Francisco Arceo --- llama_stack/core/routers/inference.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/llama_stack/core/routers/inference.py b/llama_stack/core/routers/inference.py index 045093fe0..23972deb5 100644 --- a/llama_stack/core/routers/inference.py +++ b/llama_stack/core/routers/inference.py @@ -423,7 +423,7 @@ class InferenceRouter(Inference): # response_stream = await provider.openai_completion(**params) response = await provider.openai_completion(**params) - if self.telemetry: + if self.telemetry and getattr(response, "usage", None): metrics = self._construct_metrics( prompt_tokens=response.usage.prompt_tokens, completion_tokens=response.usage.completion_tokens, @@ -529,7 +529,7 @@ class InferenceRouter(Inference): if self.store: asyncio.create_task(self.store.store_chat_completion(response, messages)) - if self.telemetry: + if self.telemetry and getattr(response, "usage", None): metrics = self._construct_metrics( prompt_tokens=response.usage.prompt_tokens, completion_tokens=response.usage.completion_tokens, From f6bf36343df7c69c9f26ae5163cbfb6491ca7247 Mon Sep 17 00:00:00 2001 From: ehhuang Date: Wed, 10 Sep 2025 11:52:23 -0700 Subject: [PATCH 066/150] chore: logging perf improvments (#3393) # What does this PR do? - Use BackgroundLogger when logging metric events. - Reuse event loop in BackgroundLogger ## Test Plan ``` cd /docs/source/distributions/k8s-benchmark # start mock server python openai-mock-server.py --port 8000 # start stack server LLAMA_STACK_LOGGING="all=WARNING" uv run --with llama-stack python -m llama_stack.core.server.server docs/source/distributions/k8s-benchmark/stack_run_config.yaml # run benchmark script uv run python3 benchmark.py --duration 120 --concurrent 50 --base-url=http://localhost:8321/v1/openai/v1 --model=vllm-inference/meta-llama/Llama-3.2-3B-Instruct ``` ### RPS from 57 -> 62 --- llama_stack/core/routers/inference.py | 14 ++++---- .../providers/utils/telemetry/tracing.py | 34 +++++++++++++------ 2 files changed, 31 insertions(+), 17 deletions(-) diff --git a/llama_stack/core/routers/inference.py b/llama_stack/core/routers/inference.py index 23972deb5..9593dd5b9 100644 --- a/llama_stack/core/routers/inference.py +++ b/llama_stack/core/routers/inference.py @@ -63,7 +63,7 @@ from llama_stack.models.llama.llama3.chat_format import ChatFormat from llama_stack.models.llama.llama3.tokenizer import Tokenizer from llama_stack.providers.datatypes import HealthResponse, HealthStatus, RoutingTable from llama_stack.providers.utils.inference.inference_store import InferenceStore -from llama_stack.providers.utils.telemetry.tracing import get_current_span +from llama_stack.providers.utils.telemetry.tracing import enqueue_event, get_current_span logger = get_logger(name=__name__, category="core::routers") @@ -160,7 +160,7 @@ class InferenceRouter(Inference): metrics = self._construct_metrics(prompt_tokens, completion_tokens, total_tokens, model) if self.telemetry: for metric in metrics: - await self.telemetry.log_event(metric) + enqueue_event(metric) return [MetricInResponse(metric=metric.metric, value=metric.value) for metric in metrics] async def _count_tokens( @@ -431,7 +431,7 @@ class InferenceRouter(Inference): model=model_obj, ) for metric in metrics: - await self.telemetry.log_event(metric) + enqueue_event(metric) # these metrics will show up in the client response. response.metrics = ( @@ -537,7 +537,7 @@ class InferenceRouter(Inference): model=model_obj, ) for metric in metrics: - await self.telemetry.log_event(metric) + enqueue_event(metric) # these metrics will show up in the client response. response.metrics = ( metrics if not hasattr(response, "metrics") or response.metrics is None else response.metrics + metrics @@ -664,7 +664,7 @@ class InferenceRouter(Inference): "completion_tokens", "total_tokens", ]: # Only log completion and total tokens - await self.telemetry.log_event(metric) + enqueue_event(metric) # Return metrics in response async_metrics = [ @@ -710,7 +710,7 @@ class InferenceRouter(Inference): ) for metric in completion_metrics: if metric.metric in ["completion_tokens", "total_tokens"]: # Only log completion and total tokens - await self.telemetry.log_event(metric) + enqueue_event(metric) # Return metrics in response return [MetricInResponse(metric=metric.metric, value=metric.value) for metric in completion_metrics] @@ -806,7 +806,7 @@ class InferenceRouter(Inference): model=model, ) for metric in metrics: - await self.telemetry.log_event(metric) + enqueue_event(metric) yield chunk finally: diff --git a/llama_stack/providers/utils/telemetry/tracing.py b/llama_stack/providers/utils/telemetry/tracing.py index 7694003b5..9969b1055 100644 --- a/llama_stack/providers/utils/telemetry/tracing.py +++ b/llama_stack/providers/utils/telemetry/tracing.py @@ -18,6 +18,7 @@ from functools import wraps from typing import Any from llama_stack.apis.telemetry import ( + Event, LogSeverity, Span, SpanEndPayload, @@ -98,7 +99,7 @@ class BackgroundLogger: def __init__(self, api: Telemetry, capacity: int = 100000): self.api = api self.log_queue: queue.Queue[Any] = queue.Queue(maxsize=capacity) - self.worker_thread = threading.Thread(target=self._process_logs, daemon=True) + self.worker_thread = threading.Thread(target=self._worker, daemon=True) self.worker_thread.start() self._last_queue_full_log_time: float = 0.0 self._dropped_since_last_notice: int = 0 @@ -118,12 +119,16 @@ class BackgroundLogger: self._last_queue_full_log_time = current_time self._dropped_since_last_notice = 0 - def _process_logs(self): + def _worker(self): + loop = asyncio.new_event_loop() + asyncio.set_event_loop(loop) + loop.run_until_complete(self._process_logs()) + + async def _process_logs(self): while True: try: event = self.log_queue.get() - # figure out how to use a thread's native loop - asyncio.run(self.api.log_event(event)) + await self.api.log_event(event) except Exception: import traceback @@ -136,6 +141,19 @@ class BackgroundLogger: self.log_queue.join() +def enqueue_event(event: Event) -> None: + """Enqueue a telemetry event to the background logger if available. + + This provides a non-blocking path for routers and other hot paths to + submit telemetry without awaiting the Telemetry API, reducing contention + with the main event loop. + """ + global BACKGROUND_LOGGER + if BACKGROUND_LOGGER is None: + raise RuntimeError("Telemetry API not initialized") + BACKGROUND_LOGGER.log_event(event) + + class TraceContext: spans: list[Span] = [] @@ -256,11 +274,7 @@ class TelemetryHandler(logging.Handler): if record.module in ("asyncio", "selector_events"): return - global CURRENT_TRACE_CONTEXT, BACKGROUND_LOGGER - - if BACKGROUND_LOGGER is None: - raise RuntimeError("Telemetry API not initialized") - + global CURRENT_TRACE_CONTEXT context = CURRENT_TRACE_CONTEXT.get() if context is None: return @@ -269,7 +283,7 @@ class TelemetryHandler(logging.Handler): if span is None: return - BACKGROUND_LOGGER.log_event( + enqueue_event( UnstructuredLogEvent( trace_id=span.trace_id, span_id=span.span_id, From a6b1588dc612df097d4fecce317547515b281ec6 Mon Sep 17 00:00:00 2001 From: Francisco Arceo Date: Wed, 10 Sep 2025 12:53:38 -0600 Subject: [PATCH 067/150] revert: Fireworks chat completion broken due to telemetry (#3402) Reverts llamastack/llama-stack#3392 --- llama_stack/core/routers/inference.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/llama_stack/core/routers/inference.py b/llama_stack/core/routers/inference.py index 9593dd5b9..2ed2d0439 100644 --- a/llama_stack/core/routers/inference.py +++ b/llama_stack/core/routers/inference.py @@ -423,7 +423,7 @@ class InferenceRouter(Inference): # response_stream = await provider.openai_completion(**params) response = await provider.openai_completion(**params) - if self.telemetry and getattr(response, "usage", None): + if self.telemetry: metrics = self._construct_metrics( prompt_tokens=response.usage.prompt_tokens, completion_tokens=response.usage.completion_tokens, @@ -529,7 +529,7 @@ class InferenceRouter(Inference): if self.store: asyncio.create_task(self.store.store_chat_completion(response, messages)) - if self.telemetry and getattr(response, "usage", None): + if self.telemetry: metrics = self._construct_metrics( prompt_tokens=response.usage.prompt_tokens, completion_tokens=response.usage.completion_tokens, From e6edc1f93425032f35f4198a197ba31b5b11d8ee Mon Sep 17 00:00:00 2001 From: Derek Higgins Date: Wed, 10 Sep 2025 19:54:10 +0100 Subject: [PATCH 068/150] fix: unbound variable error in schedule-record-workflow.sh (#3401) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Initialize INPUTS variable to prevent 'unbound variable' error Fixes: ./scripts/github/schedule-record-workflow.sh: line 246: INPUTS: unbound variable │ --- scripts/github/schedule-record-workflow.sh | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/scripts/github/schedule-record-workflow.sh b/scripts/github/schedule-record-workflow.sh index c292e53e6..44b0947b6 100755 --- a/scripts/github/schedule-record-workflow.sh +++ b/scripts/github/schedule-record-workflow.sh @@ -239,8 +239,9 @@ echo "Test pattern: ${TEST_PATTERN:-"(none)"}" echo "" # Prepare inputs for gh workflow run +INPUTS= if [[ -n "$TEST_SUBDIRS" ]]; then - INPUTS="-f subdirs='$TEST_SUBDIRS'" + INPUTS="$INPUTS -f subdirs='$TEST_SUBDIRS'" fi if [[ -n "$TEST_SETUP" ]]; then INPUTS="$INPUTS -f test-setup='$TEST_SETUP'" From e980436a2ed98dd725f76dfcec12235ed1d6cc82 Mon Sep 17 00:00:00 2001 From: ehhuang Date: Wed, 10 Sep 2025 11:57:42 -0700 Subject: [PATCH 069/150] chore: introduce write queue for inference_store (#3383) # What does this PR do? Adds a write worker queue for writes to inference store. This avoids overwhelming request processing with slow inference writes. ## Test Plan Benchmark: ``` cd /docs/source/distributions/k8s-benchmark # start mock server python openai-mock-server.py --port 8000 # start stack server LLAMA_STACK_LOGGING="all=WARNING" uv run --with llama-stack python -m llama_stack.core.server.server docs/source/distributions/k8s-benchmark/stack_run_config.yaml # run benchmark script uv run python3 benchmark.py --duration 120 --concurrent 50 --base-url=http://localhost:8321/v1/openai/v1 --model=vllm-inference/meta-llama/Llama-3.2-3B-Instruct ``` ## RPS from 21 -> 57 --- .../distributions/k8s-benchmark/benchmark.py | 19 ++-- .../k8s-benchmark/stack_run_config.yaml | 9 ++ llama_stack/core/datatypes.py | 13 ++- llama_stack/core/routers/__init__.py | 5 +- llama_stack/core/routers/inference.py | 5 + .../utils/inference/inference_store.py | 98 +++++++++++++++++-- .../utils/inference/test_inference_store.py | 12 +++ 7 files changed, 139 insertions(+), 22 deletions(-) diff --git a/docs/source/distributions/k8s-benchmark/benchmark.py b/docs/source/distributions/k8s-benchmark/benchmark.py index 3d0d18150..83ba9602a 100644 --- a/docs/source/distributions/k8s-benchmark/benchmark.py +++ b/docs/source/distributions/k8s-benchmark/benchmark.py @@ -58,14 +58,6 @@ class BenchmarkStats: print(f"\n{'='*60}") print(f"BENCHMARK RESULTS") - print(f"{'='*60}") - print(f"Total time: {total_time:.2f}s") - print(f"Concurrent users: {self.concurrent_users}") - print(f"Total requests: {self.total_requests}") - print(f"Successful requests: {self.success_count}") - print(f"Failed requests: {len(self.errors)}") - print(f"Success rate: {success_rate:.1f}%") - print(f"Requests per second: {self.success_count / total_time:.2f}") print(f"\nResponse Time Statistics:") print(f" Mean: {statistics.mean(self.response_times):.3f}s") @@ -106,6 +98,15 @@ class BenchmarkStats: print(f" Mean chunks per response: {statistics.mean(self.chunks_received):.1f}") print(f" Total chunks received: {sum(self.chunks_received)}") + print(f"{'='*60}") + print(f"Total time: {total_time:.2f}s") + print(f"Concurrent users: {self.concurrent_users}") + print(f"Total requests: {self.total_requests}") + print(f"Successful requests: {self.success_count}") + print(f"Failed requests: {len(self.errors)}") + print(f"Success rate: {success_rate:.1f}%") + print(f"Requests per second: {self.success_count / total_time:.2f}") + if self.errors: print(f"\nErrors (showing first 5):") for error in self.errors[:5]: @@ -215,7 +216,7 @@ class LlamaStackBenchmark: await asyncio.sleep(1) # Report every second if time.time() >= last_report_time + 10: # Report every 10 seconds elapsed = time.time() - stats.start_time - print(f"Completed: {stats.total_requests} requests in {elapsed:.1f}s") + print(f"Completed: {stats.total_requests} requests in {elapsed:.1f}s, RPS: {stats.total_requests / elapsed:.1f}") last_report_time = time.time() except asyncio.CancelledError: break diff --git a/docs/source/distributions/k8s-benchmark/stack_run_config.yaml b/docs/source/distributions/k8s-benchmark/stack_run_config.yaml index f8ff7811b..5a9e2ae4f 100644 --- a/docs/source/distributions/k8s-benchmark/stack_run_config.yaml +++ b/docs/source/distributions/k8s-benchmark/stack_run_config.yaml @@ -2,6 +2,7 @@ version: '2' image_name: kubernetes-benchmark-demo apis: - agents +- files - inference - files - safety @@ -20,6 +21,14 @@ providers: - provider_id: sentence-transformers provider_type: inline::sentence-transformers config: {} + files: + - provider_id: meta-reference-files + provider_type: inline::localfs + config: + storage_dir: ${env.FILES_STORAGE_DIR:=~/.llama/distributions/starter/files} + metadata_store: + type: sqlite + db_path: ${env.SQLITE_STORE_DIR:=~/.llama/distributions/starter}/files_metadata.db vector_io: - provider_id: ${env.ENABLE_CHROMADB:+chromadb} provider_type: remote::chromadb diff --git a/llama_stack/core/datatypes.py b/llama_stack/core/datatypes.py index 0f348b067..faaeefd01 100644 --- a/llama_stack/core/datatypes.py +++ b/llama_stack/core/datatypes.py @@ -431,6 +431,12 @@ class ServerConfig(BaseModel): ) +class InferenceStoreConfig(BaseModel): + sql_store_config: SqlStoreConfig + max_write_queue_size: int = Field(default=10000, description="Max queued writes for inference store") + num_writers: int = Field(default=4, description="Number of concurrent background writers") + + class StackRunConfig(BaseModel): version: int = LLAMA_STACK_RUN_CONFIG_VERSION @@ -464,11 +470,12 @@ Configuration for the persistence store used by the distribution registry. If no a default SQLite store will be used.""", ) - inference_store: SqlStoreConfig | None = Field( + inference_store: InferenceStoreConfig | SqlStoreConfig | None = Field( default=None, description=""" -Configuration for the persistence store used by the inference API. If not specified, -a default SQLite store will be used.""", +Configuration for the persistence store used by the inference API. Can be either a +InferenceStoreConfig (with queue tuning parameters) or a SqlStoreConfig (deprecated). +If not specified, a default SQLite store will be used.""", ) # registry of "resources" in the distribution diff --git a/llama_stack/core/routers/__init__.py b/llama_stack/core/routers/__init__.py index 1faace34a..f129f8ede 100644 --- a/llama_stack/core/routers/__init__.py +++ b/llama_stack/core/routers/__init__.py @@ -78,7 +78,10 @@ async def get_auto_router_impl( # TODO: move pass configs to routers instead if api == Api.inference and run_config.inference_store: - inference_store = InferenceStore(run_config.inference_store, policy) + inference_store = InferenceStore( + config=run_config.inference_store, + policy=policy, + ) await inference_store.initialize() api_to_dep_impl["store"] = inference_store diff --git a/llama_stack/core/routers/inference.py b/llama_stack/core/routers/inference.py index 2ed2d0439..762d7073e 100644 --- a/llama_stack/core/routers/inference.py +++ b/llama_stack/core/routers/inference.py @@ -90,6 +90,11 @@ class InferenceRouter(Inference): async def shutdown(self) -> None: logger.debug("InferenceRouter.shutdown") + if self.store: + try: + await self.store.shutdown() + except Exception as e: + logger.warning(f"Error during InferenceStore shutdown: {e}") async def register_model( self, diff --git a/llama_stack/providers/utils/inference/inference_store.py b/llama_stack/providers/utils/inference/inference_store.py index 43006cfd5..8c69b1683 100644 --- a/llama_stack/providers/utils/inference/inference_store.py +++ b/llama_stack/providers/utils/inference/inference_store.py @@ -3,6 +3,9 @@ # # This source code is licensed under the terms described in the LICENSE file in # the root directory of this source tree. +import asyncio +from typing import Any + from llama_stack.apis.inference import ( ListOpenAIChatCompletionResponse, OpenAIChatCompletion, @@ -10,24 +13,43 @@ from llama_stack.apis.inference import ( OpenAIMessageParam, Order, ) -from llama_stack.core.datatypes import AccessRule -from llama_stack.core.utils.config_dirs import RUNTIME_BASE_DIR +from llama_stack.core.datatypes import AccessRule, InferenceStoreConfig +from llama_stack.log import get_logger from ..sqlstore.api import ColumnDefinition, ColumnType from ..sqlstore.authorized_sqlstore import AuthorizedSqlStore -from ..sqlstore.sqlstore import SqliteSqlStoreConfig, SqlStoreConfig, sqlstore_impl +from ..sqlstore.sqlstore import SqlStoreConfig, SqlStoreType, sqlstore_impl + +logger = get_logger(name=__name__, category="inference_store") class InferenceStore: - def __init__(self, sql_store_config: SqlStoreConfig, policy: list[AccessRule]): - if not sql_store_config: - sql_store_config = SqliteSqlStoreConfig( - db_path=(RUNTIME_BASE_DIR / "sqlstore.db").as_posix(), + def __init__( + self, + config: InferenceStoreConfig | SqlStoreConfig, + policy: list[AccessRule], + ): + # Handle backward compatibility + if not isinstance(config, InferenceStoreConfig): + # Legacy: SqlStoreConfig passed directly as config + config = InferenceStoreConfig( + sql_store_config=config, ) - self.sql_store_config = sql_store_config + + self.config = config + self.sql_store_config = config.sql_store_config self.sql_store = None self.policy = policy + # Disable write queue for SQLite to avoid concurrency issues + self.enable_write_queue = self.sql_store_config.type != SqlStoreType.sqlite + + # Async write queue and worker control + self._queue: asyncio.Queue[tuple[OpenAIChatCompletion, list[OpenAIMessageParam]]] | None = None + self._worker_tasks: list[asyncio.Task[Any]] = [] + self._max_write_queue_size: int = config.max_write_queue_size + self._num_writers: int = max(1, config.num_writers) + async def initialize(self): """Create the necessary tables if they don't exist.""" self.sql_store = AuthorizedSqlStore(sqlstore_impl(self.sql_store_config)) @@ -42,10 +64,68 @@ class InferenceStore: }, ) + if self.enable_write_queue: + self._queue = asyncio.Queue(maxsize=self._max_write_queue_size) + for _ in range(self._num_writers): + self._worker_tasks.append(asyncio.create_task(self._worker_loop())) + else: + logger.info("Write queue disabled for SQLite to avoid concurrency issues") + + async def shutdown(self) -> None: + if not self._worker_tasks: + return + if self._queue is not None: + await self._queue.join() + for t in self._worker_tasks: + if not t.done(): + t.cancel() + for t in self._worker_tasks: + try: + await t + except asyncio.CancelledError: + pass + self._worker_tasks.clear() + + async def flush(self) -> None: + """Wait for all queued writes to complete. Useful for testing.""" + if self.enable_write_queue and self._queue is not None: + await self._queue.join() + async def store_chat_completion( self, chat_completion: OpenAIChatCompletion, input_messages: list[OpenAIMessageParam] ) -> None: - if not self.sql_store: + if self.enable_write_queue: + if self._queue is None: + raise ValueError("Inference store is not initialized") + try: + self._queue.put_nowait((chat_completion, input_messages)) + except asyncio.QueueFull: + logger.warning( + f"Write queue full; adding chat completion id={getattr(chat_completion, 'id', '')}" + ) + await self._queue.put((chat_completion, input_messages)) + else: + await self._write_chat_completion(chat_completion, input_messages) + + async def _worker_loop(self) -> None: + assert self._queue is not None + while True: + try: + item = await self._queue.get() + except asyncio.CancelledError: + break + chat_completion, input_messages = item + try: + await self._write_chat_completion(chat_completion, input_messages) + except Exception as e: # noqa: BLE001 + logger.error(f"Error writing chat completion: {e}") + finally: + self._queue.task_done() + + async def _write_chat_completion( + self, chat_completion: OpenAIChatCompletion, input_messages: list[OpenAIMessageParam] + ) -> None: + if self.sql_store is None: raise ValueError("Inference store is not initialized") data = chat_completion.model_dump() diff --git a/tests/unit/utils/inference/test_inference_store.py b/tests/unit/utils/inference/test_inference_store.py index 730f54a05..f6d63490a 100644 --- a/tests/unit/utils/inference/test_inference_store.py +++ b/tests/unit/utils/inference/test_inference_store.py @@ -65,6 +65,9 @@ async def test_inference_store_pagination_basic(): input_messages = [OpenAIUserMessageParam(role="user", content=f"Test message for {completion_id}")] await store.store_chat_completion(completion, input_messages) + # Wait for all queued writes to complete + await store.flush() + # Test 1: First page with limit=2, descending order (default) result = await store.list_chat_completions(limit=2, order=Order.desc) assert len(result.data) == 2 @@ -108,6 +111,9 @@ async def test_inference_store_pagination_ascending(): input_messages = [OpenAIUserMessageParam(role="user", content=f"Test message for {completion_id}")] await store.store_chat_completion(completion, input_messages) + # Wait for all queued writes to complete + await store.flush() + # Test ascending order pagination result = await store.list_chat_completions(limit=1, order=Order.asc) assert len(result.data) == 1 @@ -143,6 +149,9 @@ async def test_inference_store_pagination_with_model_filter(): input_messages = [OpenAIUserMessageParam(role="user", content=f"Test message for {completion_id}")] await store.store_chat_completion(completion, input_messages) + # Wait for all queued writes to complete + await store.flush() + # Test pagination with model filter result = await store.list_chat_completions(limit=1, model="model-a", order=Order.desc) assert len(result.data) == 1 @@ -190,6 +199,9 @@ async def test_inference_store_pagination_no_limit(): input_messages = [OpenAIUserMessageParam(role="user", content=f"Test message for {completion_id}")] await store.store_chat_completion(completion, input_messages) + # Wait for all queued writes to complete + await store.flush() + # Test without limit result = await store.list_chat_completions(order=Order.desc) assert len(result.data) == 2 From 7394828c7a84de2c3af0ca37546db17d6a703507 Mon Sep 17 00:00:00 2001 From: Alexey Rybak <50731695+reluctantfuturist@users.noreply.github.com> Date: Wed, 10 Sep 2025 12:43:36 -0700 Subject: [PATCH 070/150] docs: horizontal nav bar (#3407) # What does this PR do? * Adds a horizontal nav bar for easy access to the API reference and the Llama Stack Github repo image ## Test Plan * Built the docs and ran the local HTML server to verify changes --- docs/_static/css/my_theme.css | 101 ++++++++++++++++++++++++++++++ docs/_static/js/horizontal_nav.js | 44 +++++++++++++ docs/source/conf.py | 1 + 3 files changed, 146 insertions(+) create mode 100644 docs/_static/js/horizontal_nav.js diff --git a/docs/_static/css/my_theme.css b/docs/_static/css/my_theme.css index d078ec057..7dcd97c9b 100644 --- a/docs/_static/css/my_theme.css +++ b/docs/_static/css/my_theme.css @@ -1,5 +1,106 @@ @import url("theme.css"); +/* Horizontal Navigation Bar */ +.horizontal-nav { + background-color: #ffffff; + border-bottom: 1px solid #e5e5e5; + padding: 0; + position: fixed; + top: 0; + left: 0; + right: 0; + z-index: 1050; + height: 50px; + box-shadow: 0 2px 4px rgba(0,0,0,0.1); +} + +[data-theme="dark"] .horizontal-nav { + background-color: #1a1a1a; + border-bottom: 1px solid #333; +} + +.horizontal-nav .nav-container { + max-width: 1200px; + margin: 0 auto; + display: flex; + align-items: center; + justify-content: space-between; + padding: 0 20px; + height: 100%; +} + +.horizontal-nav .nav-brand { + font-size: 18px; + font-weight: 600; + color: #333; + text-decoration: none; +} + +[data-theme="dark"] .horizontal-nav .nav-brand { + color: #fff; +} + +.horizontal-nav .nav-links { + display: flex; + align-items: center; + gap: 30px; + list-style: none; + margin: 0; + padding: 0; +} + +.horizontal-nav .nav-links a { + color: #666; + text-decoration: none; + font-size: 14px; + font-weight: 500; + padding: 8px 12px; + border-radius: 6px; + transition: all 0.2s ease; +} + +.horizontal-nav .nav-links a:hover, +.horizontal-nav .nav-links a.active { + color: #333; + background-color: #f5f5f5; +} + +.horizontal-nav .nav-links a.active { + font-weight: 600; +} + +[data-theme="dark"] .horizontal-nav .nav-links a { + color: #ccc; +} + +[data-theme="dark"] .horizontal-nav .nav-links a:hover, +[data-theme="dark"] .horizontal-nav .nav-links a.active { + color: #fff; + background-color: #333; +} + +.horizontal-nav .nav-links .github-link { + display: flex; + align-items: center; + gap: 6px; +} + +.horizontal-nav .nav-links .github-icon { + width: 16px; + height: 16px; + fill: currentColor; +} + +/* Adjust main content to account for fixed nav */ +.wy-nav-side { + top: 50px; + height: calc(100vh - 50px); +} + +.wy-nav-content-wrap { + margin-top: 50px; +} + .wy-nav-content { max-width: 90%; } diff --git a/docs/_static/js/horizontal_nav.js b/docs/_static/js/horizontal_nav.js new file mode 100644 index 000000000..c2384f9d5 --- /dev/null +++ b/docs/_static/js/horizontal_nav.js @@ -0,0 +1,44 @@ +// Horizontal Navigation Bar for Llama Stack Documentation +document.addEventListener('DOMContentLoaded', function() { + // Create the horizontal navigation HTML + const navHTML = ` + + `; + + // Insert the navigation at the beginning of the body + document.body.insertAdjacentHTML('afterbegin', navHTML); + + // Update navigation links based on current page + updateActiveNav(); +}); + +function updateActiveNav() { + const currentPath = window.location.pathname; + const navLinks = document.querySelectorAll('.horizontal-nav .nav-links a'); + + navLinks.forEach(link => { + // Remove any existing active classes + link.classList.remove('active'); + + // Add active class based on current path + if (currentPath === '/' && link.getAttribute('href') === '/') { + link.classList.add('active'); + } else if (currentPath.includes('/references/api_reference/') && link.getAttribute('href').includes('api_reference')) { + link.classList.add('active'); + } + }); +} diff --git a/docs/source/conf.py b/docs/source/conf.py index 3f84d1310..0cbddef31 100644 --- a/docs/source/conf.py +++ b/docs/source/conf.py @@ -131,6 +131,7 @@ html_static_path = ["../_static"] def setup(app): app.add_css_file("css/my_theme.css") app.add_js_file("js/detect_theme.js") + app.add_js_file("js/horizontal_nav.js") app.add_js_file("js/keyboard_shortcuts.js") def dockerhub_role(name, rawtext, text, lineno, inliner, options={}, content=[]): From a844c4f6e189395f99a6470552876d1ba6b807f1 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 10 Sep 2025 13:17:02 -0700 Subject: [PATCH 071/150] chore(python-deps): bump pytest from 8.4.1 to 8.4.2 (#3359) Bumps [pytest](https://github.com/pytest-dev/pytest) from 8.4.1 to 8.4.2.
Release notes

Sourced from pytest's releases.

8.4.2

pytest 8.4.2 (2025-09-03)

Bug fixes

  • #13478: Fixed a crash when using console_output_style{.interpreted-text role="confval"} with times and a module is skipped.

  • #13530: Fixed a crash when using pytest.approx{.interpreted-text role="func"} and decimal.Decimal{.interpreted-text role="class"} instances with the decimal.FloatOperation{.interpreted-text role="class"} trap set.

  • #13549: No longer evaluate type annotations in Python 3.14 when inspecting function signatures.

    This prevents crashes during module collection when modules do not explicitly use from __future__ import annotations and import types for annotations within a if TYPE_CHECKING: block.

  • #13559: Added missing [int]{.title-ref} and [float]{.title-ref} variants to the [Literal]{.title-ref} type annotation of the [type]{.title-ref} parameter in pytest.Parser.addini{.interpreted-text role="meth"}.

  • #13563: pytest.approx{.interpreted-text role="func"} now only imports numpy if NumPy is already in sys.modules. This fixes unconditional import behavior introduced in [8.4.0]{.title-ref}.

Improved documentation

  • #13577: Clarify that pytest_generate_tests is discovered in test modules/classes; other hooks must be in conftest.py or plugins.

Contributor-facing changes

  • #13480: Self-testing: fixed a few test failures when run with -Wdefault or a similar override.
  • #13547: Self-testing: corrected expected message for test_doctest_unexpected_exception in Python 3.14.
  • #13684: Make pytest's own testsuite insensitive to the presence of the CI environment variable -- by ogrisel{.interpreted-text role="user"}.
Commits
  • bfae422 Prepare release version 8.4.2
  • 8990538 Fix passenv CI in tox ini and make tests insensitive to the presence of the C...
  • ca676bf Merge pull request #13687 from pytest-dev/patchback/backports/8.4.x/e63f6e51c...
  • 975a60a Merge pull request #13686 from pytest-dev/patchback/backports/8.4.x/12bde8af6...
  • 7723ce8 Merge pull request #13683 from even-even/fix_Exeption_to_Exception_in_errorMe...
  • b7f0568 Merge pull request #13685 from CoretexShadow/fix/docs-pytest-generate-tests
  • 2c94c4a add missing colon (#13640) (#13641)
  • c3d7684 Merge pull request #13606 from pytest-dev/patchback/backports/8.4.x/5f9938563...
  • dc6e3be Merge pull request #13605 from The-Compiler/training-update-2025-07
  • f87289c Fix crash with times output style and skipped module (#13573) (#13579)
  • Additional commits viewable in compare view

[![Dependabot compatibility score](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name=pytest&package-manager=uv&previous-version=8.4.1&new-version=8.4.2)](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores) Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting `@dependabot rebase`. [//]: # (dependabot-automerge-start) [//]: # (dependabot-automerge-end) ---
Dependabot commands and options
You can trigger Dependabot actions by commenting on this PR: - `@dependabot rebase` will rebase this PR - `@dependabot recreate` will recreate this PR, overwriting any edits that have been made to it - `@dependabot merge` will merge this PR after your CI passes on it - `@dependabot squash and merge` will squash and merge this PR after your CI passes on it - `@dependabot cancel merge` will cancel a previously requested merge and block automerging - `@dependabot reopen` will reopen this PR if it is closed - `@dependabot close` will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually - `@dependabot show ignore conditions` will show all of the ignore conditions of the specified dependency - `@dependabot ignore this major version` will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this minor version` will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this dependency` will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)
Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- uv.lock | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/uv.lock b/uv.lock index 2788c6fef..6f8ba7ad6 100644 --- a/uv.lock +++ b/uv.lock @@ -3540,7 +3540,7 @@ wheels = [ [[package]] name = "pytest" -version = "8.4.1" +version = "8.4.2" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "colorama", marker = "sys_platform == 'win32'" }, @@ -3549,9 +3549,9 @@ dependencies = [ { name = "pluggy" }, { name = "pygments" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/08/ba/45911d754e8eba3d5a841a5ce61a65a685ff1798421ac054f85aa8747dfb/pytest-8.4.1.tar.gz", hash = "sha256:7c67fd69174877359ed9371ec3af8a3d2b04741818c51e5e99cc1742251fa93c", size = 1517714, upload-time = "2025-06-18T05:48:06.109Z" } +sdist = { url = "https://files.pythonhosted.org/packages/a3/5c/00a0e072241553e1a7496d638deababa67c5058571567b92a7eaa258397c/pytest-8.4.2.tar.gz", hash = "sha256:86c0d0b93306b961d58d62a4db4879f27fe25513d4b969df351abdddb3c30e01", size = 1519618, upload-time = "2025-09-04T14:34:22.711Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/29/16/c8a903f4c4dffe7a12843191437d7cd8e32751d5de349d45d3fe69544e87/pytest-8.4.1-py3-none-any.whl", hash = "sha256:539c70ba6fcead8e78eebbf1115e8b589e7565830d7d006a8723f19ac8a0afb7", size = 365474, upload-time = "2025-06-18T05:48:03.955Z" }, + { url = "https://files.pythonhosted.org/packages/a8/a4/20da314d277121d6534b3a980b29035dcd51e6744bd79075a6ce8fa4eb8d/pytest-8.4.2-py3-none-any.whl", hash = "sha256:872f880de3fc3a5bdc88a11b39c9710c3497a547cfa9320bc3c5e62fbf272e79", size = 365750, upload-time = "2025-09-04T14:34:20.226Z" }, ] [[package]] From 369083c0699270d7a3fa4d10f4975a081fcc7acd Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 10 Sep 2025 13:17:28 -0700 Subject: [PATCH 072/150] chore(python-deps): bump locust from 2.39.1 to 2.40.1 (#3358) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Bumps [locust](https://github.com/locustio/locust) from 2.39.1 to 2.40.1.
Release notes

Sourced from locust's releases.

2.40.1

What's Changed

Full Changelog: https://github.com/locustio/locust/compare/2.40.0...2.40.1

2.40.0

What's Changed

New Contributors

Full Changelog: https://github.com/locustio/locust/compare/2.39.1...2.40.0

Changelog

Sourced from locust's changelog.

Detailed changelog

The most important changes can also be found in the documentation.

Commits
  • 5df19da Merge pull request #3205 from locustio/move-pytest-plugin-to-own-directory
  • d41141b Move pytest plugin to its own directory, to prevent accidental import of locu...
  • 6422848 mention that only one locustfile can be distributed
  • aa3da73 Merge pull request #3204 from locustio/delay-imports-in-pytest-plugin-to-avoi...
  • 12050de Pytest plugin: Delay imports to avoid monkey patching until someone actually ...
  • 488d1f8 docs
  • 439b7ab docs fix
  • fcd76a8 docs: rephrase
  • 70c7e9b docs: move pytest further up
  • 06dbf98 docs: fix link
  • Additional commits viewable in compare view

[![Dependabot compatibility score](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name=locust&package-manager=uv&previous-version=2.39.1&new-version=2.40.1)](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores) Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting `@dependabot rebase`. [//]: # (dependabot-automerge-start) [//]: # (dependabot-automerge-end) ---
Dependabot commands and options
You can trigger Dependabot actions by commenting on this PR: - `@dependabot rebase` will rebase this PR - `@dependabot recreate` will recreate this PR, overwriting any edits that have been made to it - `@dependabot merge` will merge this PR after your CI passes on it - `@dependabot squash and merge` will squash and merge this PR after your CI passes on it - `@dependabot cancel merge` will cancel a previously requested merge and block automerging - `@dependabot reopen` will reopen this PR if it is closed - `@dependabot close` will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually - `@dependabot show ignore conditions` will show all of the ignore conditions of the specified dependency - `@dependabot ignore this major version` will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this minor version` will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this dependency` will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)
Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- uv.lock | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/uv.lock b/uv.lock index 6f8ba7ad6..df3a23e58 100644 --- a/uv.lock +++ b/uv.lock @@ -2023,7 +2023,7 @@ wheels = [ [[package]] name = "locust" -version = "2.39.1" +version = "2.40.1" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "configargparse" }, @@ -2035,6 +2035,7 @@ dependencies = [ { name = "locust-cloud" }, { name = "msgpack" }, { name = "psutil" }, + { name = "pytest" }, { name = "python-engineio" }, { name = "python-socketio", extra = ["client"] }, { name = "pywin32", marker = "sys_platform == 'win32'" }, @@ -2043,9 +2044,9 @@ dependencies = [ { name = "setuptools" }, { name = "werkzeug" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/95/c8/10aa5445c404eed389b56877e6714c1787190cc09dd70059ce3765979ec5/locust-2.39.1.tar.gz", hash = "sha256:6bdd19e27edf9a1c84391d6cf6e9a737dfb832be7dfbf39053191ae31b9cc498", size = 1409902, upload-time = "2025-08-29T17:41:01.544Z" } +sdist = { url = "https://files.pythonhosted.org/packages/01/22/82f40176473a98c9479bed667d3ad21bb859d2cb67f6880a6b0b6a725e45/locust-2.40.1.tar.gz", hash = "sha256:5bde76c1cf7e412071670f926f34844e119210c93f07a4cf9fc4cb93c60a578a", size = 1411606, upload-time = "2025-09-05T15:57:35.76Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/ec/b3/b2f4b2ca88b1e72eba7be2b2982533b887f8b709d222db78eb9602aa5121/locust-2.39.1-py3-none-any.whl", hash = "sha256:fd5148f2f1a4ed34aee968abc4393674e69d1b5e1b54db50a397f6eb09ce0b04", size = 1428155, upload-time = "2025-08-29T17:41:00.245Z" }, + { url = "https://files.pythonhosted.org/packages/3b/e6/9c6335ab16becf4f8ad3da6083ab78793c56ec1ca496d6f7c74660c21c3f/locust-2.40.1-py3-none-any.whl", hash = "sha256:ef0517f9bb5ed0afa7035014faaf944802917e07da8649461aaaf5e5f3ba8a65", size = 1430154, upload-time = "2025-09-05T15:57:33.233Z" }, ] [[package]] From 438c037b1f16ee8123ab71b2aa39529ce32967a5 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 10 Sep 2025 13:17:43 -0700 Subject: [PATCH 073/150] chore(python-deps): bump openai from 1.102.0 to 1.106.1 (#3356) Bumps [openai](https://github.com/openai/openai-python) from 1.102.0 to 1.106.1.
Release notes

Sourced from openai's releases.

v1.106.1

1.106.1 (2025-09-04)

Full Changelog: v1.106.0...v1.106.1

Chores

  • internal: move mypy configurations to pyproject.toml file (ca413a2)

v1.106.0

1.106.0 (2025-09-04)

Full Changelog: v1.105.0...v1.106.0

Features

  • client: support callable api_key (#2588) (e1bad01)
  • improve future compat with pydantic v3 (6645d93)

v1.105.0

1.105.0 (2025-09-03)

Full Changelog: v1.104.2...v1.105.0

Features

  • api: Add gpt-realtime models (8502041)

v1.104.2

1.104.2 (2025-09-02)

Full Changelog: v1.104.1...v1.104.2

Bug Fixes

  • types: add aliases back for web search tool types (2521cd8)

v1.104.1

1.104.1 (2025-09-02)

Full Changelog: v1.104.0...v1.104.1

Chores

  • api: manual updates for ResponseInputAudio (0db5061)

v1.104.0

1.104.0 (2025-09-02)

Full Changelog: v1.103.0...v1.104.0

... (truncated)

Changelog

Sourced from openai's changelog.

1.106.1 (2025-09-04)

Full Changelog: v1.106.0...v1.106.1

Chores

  • internal: move mypy configurations to pyproject.toml file (ca413a2)

1.106.0 (2025-09-04)

Full Changelog: v1.105.0...v1.106.0

Features

  • client: support callable api_key (#2588) (e1bad01)
  • improve future compat with pydantic v3 (6645d93)

1.105.0 (2025-09-03)

Full Changelog: v1.104.2...v1.105.0

Features

  • api: Add gpt-realtime models (8502041)

1.104.2 (2025-09-02)

Full Changelog: v1.104.1...v1.104.2

Bug Fixes

  • types: add aliases back for web search tool types (2521cd8)

1.104.1 (2025-09-02)

Full Changelog: v1.104.0...v1.104.1

Chores

  • api: manual updates for ResponseInputAudio (0db5061)

1.104.0 (2025-09-02)

Full Changelog: v1.103.0...v1.104.0

Features

  • types: replace List[str] with SequenceNotStr in params (bc00bda)

... (truncated)

Commits
  • 2adf111 release: 1.106.1
  • c4f9d0b chore(internal): move mypy configurations to pyproject.toml file
  • 2de8d7c release: 1.106.0
  • 2cf4ed5 feat: improve future compat with pydantic v3
  • 25d16be feat(client): support callable api_key (#2588)
  • 8672413 release: 1.105.0
  • 2c60d78 feat(api): Add gpt-realtime models
  • a52463c release: 1.104.2
  • 5a6931d fix(types): add aliases back for web search tool types
  • fb152d9 release: 1.104.1
  • Additional commits viewable in compare view

[![Dependabot compatibility score](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name=openai&package-manager=uv&previous-version=1.102.0&new-version=1.106.1)](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores) Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting `@dependabot rebase`. [//]: # (dependabot-automerge-start) [//]: # (dependabot-automerge-end) ---
Dependabot commands and options
You can trigger Dependabot actions by commenting on this PR: - `@dependabot rebase` will rebase this PR - `@dependabot recreate` will recreate this PR, overwriting any edits that have been made to it - `@dependabot merge` will merge this PR after your CI passes on it - `@dependabot squash and merge` will squash and merge this PR after your CI passes on it - `@dependabot cancel merge` will cancel a previously requested merge and block automerging - `@dependabot reopen` will reopen this PR if it is closed - `@dependabot close` will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually - `@dependabot show ignore conditions` will show all of the ignore conditions of the specified dependency - `@dependabot ignore this major version` will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this minor version` will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this dependency` will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)
Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- uv.lock | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/uv.lock b/uv.lock index df3a23e58..3d7713f54 100644 --- a/uv.lock +++ b/uv.lock @@ -2620,7 +2620,7 @@ wheels = [ [[package]] name = "openai" -version = "1.102.0" +version = "1.107.0" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "anyio" }, @@ -2632,9 +2632,9 @@ dependencies = [ { name = "tqdm" }, { name = "typing-extensions" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/07/55/da5598ed5c6bdd9939633854049cddc5cbac0da938dfcfcb3c6b119c16c0/openai-1.102.0.tar.gz", hash = "sha256:2e0153bcd64a6523071e90211cbfca1f2bbc5ceedd0993ba932a5869f93b7fc9", size = 519027, upload-time = "2025-08-26T20:50:29.397Z" } +sdist = { url = "https://files.pythonhosted.org/packages/88/67/d6498de300f83ff57a79cb7aa96ef3bef8d6f070c3ded0f1b5b45442a6bc/openai-1.107.0.tar.gz", hash = "sha256:43e04927584e57d0e9e640ee0077c78baf8150098be96ebd5c512539b6c4e9a4", size = 566056, upload-time = "2025-09-08T19:25:47.604Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/bd/0d/c9e7016d82c53c5b5e23e2bad36daebb8921ed44f69c0a985c6529a35106/openai-1.102.0-py3-none-any.whl", hash = "sha256:d751a7e95e222b5325306362ad02a7aa96e1fab3ed05b5888ce1c7ca63451345", size = 812015, upload-time = "2025-08-26T20:50:27.219Z" }, + { url = "https://files.pythonhosted.org/packages/91/ed/e8a4fd20390f2858b95227c288df8fe0c835f7c77625f7583609161684ba/openai-1.107.0-py3-none-any.whl", hash = "sha256:3dcfa3cbb116bd6924b27913b8da28c4a787379ff60049588547a1013e6d6438", size = 950968, upload-time = "2025-09-08T19:25:45.552Z" }, ] [[package]] From d4e45cd5f1e099d9f6ac2d52ad6cd3f74cc4facf Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 10 Sep 2025 13:18:14 -0700 Subject: [PATCH 074/150] chore(ui-deps): bump tailwindcss from 4.1.6 to 4.1.13 in /llama_stack/ui (#3362) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Bumps [tailwindcss](https://github.com/tailwindlabs/tailwindcss/tree/HEAD/packages/tailwindcss) from 4.1.6 to 4.1.13.
Release notes

Sourced from tailwindcss's releases.

v4.1.13

Changed

  • Drop warning from browser build (#18731)
  • Drop exact duplicate declarations when emitting CSS (#18809)

Fixed

  • Don't transition visibility when using transition (#18795)
  • Discard matched variants with unknown named values (#18799)
  • Discard matched variants with non-string values (#18799)
  • Show suggestions for known matchVariant values (#18798)
  • Replace deprecated clip with clip-path in sr-only (#18769)
  • Hide internal fields from completions in matchUtilities (#18820)
  • Ignore .vercel folders by default (can be overridden by @source … rules) (#18855)
  • Consider variants starting with @- to be invalid (e.g. @-2xl:flex) (#18869)
  • Do not allow custom variants to start or end with a - or _ (#18867, #18872)
  • Upgrade: Migrate aria theme keys to @custom-variant (#18815)
  • Upgrade: Migrate data theme keys to @custom-variant (#18816)
  • Upgrade: Migrate supports theme keys to @custom-variant (#18817)

v4.1.12

Fixed

  • Don't consider the global important state in @apply (#18404)
  • Add missing suggestions for flex-<number> utilities (#18642)
  • Fix trailing ) from interfering with extraction in Clojure keywords (#18345)
  • Detect classes inside Elixir charlist, word list, and string sigils (#18432)
  • Track source locations through @plugin and @config (#18345)
  • Allow boolean values of process.env.DEBUG in @tailwindcss/node (#18485)
  • Ignore consecutive semicolons in the CSS parser (#18532)
  • Center the dropdown icon added to an input with a paired datalist by default (#18511)
  • Extract candidates in Slang templates (#18565)
  • Improve error messages when encountering invalid functional utility names (#18568)
  • Discard CSS AST objects with false or undefined properties (#18571)
  • Allow users to disable URL rebasing in @tailwindcss/postcss via transformAssetUrls: false (#18321)
  • Fix false-positive migrations in addEventListener and JavaScript variable names (#18718)
  • Fix Standalone CLI showing default Bun help when run via symlink on Windows (#18723)
  • Read from --border-color-* theme keys in divide-* utilities for backwards compatibility (#18704)
  • Don't scan .hdr and .exr files for classes by default (#18734)

v4.1.11

Fixed

  • Add heuristic to skip candidate migrations inside emit(…) (#18330)
  • Extract candidates with variants in Clojure/ClojureScript keywords (#18338)
  • Document --watch=always in the CLI's usage (#18337)
  • Add support for Vite 7 to @tailwindcss/vite (#18384)

v4.1.10

... (truncated)

Changelog

Sourced from tailwindcss's changelog.

[4.1.13] - 2025-09-03

Changed

  • Drop warning from browser build (#18731)
  • Drop exact duplicate declarations when emitting CSS (#18809)

Fixed

  • Don't transition visibility when using transition (#18795)
  • Discard matched variants with unknown named values (#18799)
  • Discard matched variants with non-string values (#18799)
  • Show suggestions for known matchVariant values (#18798)
  • Replace deprecated clip with clip-path in sr-only (#18769)
  • Hide internal fields from completions in matchUtilities (#18820)
  • Ignore .vercel folders by default (can be overridden by @source … rules) (#18855)
  • Consider variants starting with @- to be invalid (e.g. @-2xl:flex) (#18869)
  • Do not allow custom variants to start or end with a - or _ (#18867, #18872)
  • Upgrade: Migrate aria theme keys to @custom-variant (#18815)
  • Upgrade: Migrate data theme keys to @custom-variant (#18816)
  • Upgrade: Migrate supports theme keys to @custom-variant (#18817)

[4.1.12] - 2025-08-13

Fixed

  • Don't consider the global important state in @apply (#18404)
  • Add missing suggestions for flex-<number> utilities (#18642)
  • Fix trailing ) from interfering with extraction in Clojure keywords (#18345)
  • Detect classes inside Elixir charlist, word list, and string sigils (#18432)
  • Track source locations through @plugin and @config (#18345)
  • Allow boolean values of process.env.DEBUG in @tailwindcss/node (#18485)
  • Ignore consecutive semicolons in the CSS parser (#18532)
  • Center the dropdown icon added to an input with a paired datalist by default (#18511)
  • Extract candidates in Slang templates (#18565)
  • Improve error messages when encountering invalid functional utility names (#18568)
  • Discard CSS AST objects with false or undefined properties (#18571)
  • Allow users to disable URL rebasing in @tailwindcss/postcss via transformAssetUrls: false (#18321)
  • Fix false-positive migrations in addEventListener and JavaScript variable names (#18718)
  • Fix Standalone CLI showing default Bun help when run via symlink on Windows (#18723)
  • Read from --border-color-* theme keys in divide-* utilities for backwards compatibility (#18704)
  • Don't scan .hdr and .exr files for classes by default (#18734)

[4.1.11] - 2025-06-26

Fixed

  • Add heuristic to skip candidate migrations inside emit(…) (#18330)
  • Extract candidates with variants in Clojure/ClojureScript keywords (#18338)
  • Document --watch=always in the CLI's usage (#18337)

... (truncated)

Commits

[![Dependabot compatibility score](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name=tailwindcss&package-manager=npm_and_yarn&previous-version=4.1.6&new-version=4.1.13)](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores) Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting `@dependabot rebase`. [//]: # (dependabot-automerge-start) [//]: # (dependabot-automerge-end) ---
Dependabot commands and options
You can trigger Dependabot actions by commenting on this PR: - `@dependabot rebase` will rebase this PR - `@dependabot recreate` will recreate this PR, overwriting any edits that have been made to it - `@dependabot merge` will merge this PR after your CI passes on it - `@dependabot squash and merge` will squash and merge this PR after your CI passes on it - `@dependabot cancel merge` will cancel a previously requested merge and block automerging - `@dependabot reopen` will reopen this PR if it is closed - `@dependabot close` will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually - `@dependabot show ignore conditions` will show all of the ignore conditions of the specified dependency - `@dependabot ignore this major version` will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this minor version` will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this dependency` will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)
Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- llama_stack/ui/package-lock.json | 20 +++++++++++++++++--- 1 file changed, 17 insertions(+), 3 deletions(-) diff --git a/llama_stack/ui/package-lock.json b/llama_stack/ui/package-lock.json index 1db1c61cd..e2c0815fd 100644 --- a/llama_stack/ui/package-lock.json +++ b/llama_stack/ui/package-lock.json @@ -3578,6 +3578,13 @@ "tailwindcss": "4.1.6" } }, + "node_modules/@tailwindcss/node/node_modules/tailwindcss": { + "version": "4.1.6", + "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-4.1.6.tgz", + "integrity": "sha512-j0cGLTreM6u4OWzBeLBpycK0WIh8w7kSwcUsQZoGLHZ7xDTdM69lN64AgoIEEwFi0tnhs4wSykUa5YWxAzgFYg==", + "dev": true, + "license": "MIT" + }, "node_modules/@tailwindcss/oxide": { "version": "4.1.6", "resolved": "https://registry.npmjs.org/@tailwindcss/oxide/-/oxide-4.1.6.tgz", @@ -3838,6 +3845,13 @@ "tailwindcss": "4.1.6" } }, + "node_modules/@tailwindcss/postcss/node_modules/tailwindcss": { + "version": "4.1.6", + "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-4.1.6.tgz", + "integrity": "sha512-j0cGLTreM6u4OWzBeLBpycK0WIh8w7kSwcUsQZoGLHZ7xDTdM69lN64AgoIEEwFi0tnhs4wSykUa5YWxAzgFYg==", + "dev": true, + "license": "MIT" + }, "node_modules/@testing-library/dom": { "version": "10.4.1", "resolved": "https://registry.npmjs.org/@testing-library/dom/-/dom-10.4.1.tgz", @@ -13843,9 +13857,9 @@ } }, "node_modules/tailwindcss": { - "version": "4.1.6", - "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-4.1.6.tgz", - "integrity": "sha512-j0cGLTreM6u4OWzBeLBpycK0WIh8w7kSwcUsQZoGLHZ7xDTdM69lN64AgoIEEwFi0tnhs4wSykUa5YWxAzgFYg==", + "version": "4.1.13", + "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-4.1.13.tgz", + "integrity": "sha512-i+zidfmTqtwquj4hMEwdjshYYgMbOrPzb9a0M3ZgNa0JMoZeFC6bxZvO8yr8ozS6ix2SDz0+mvryPeBs2TFE+w==", "dev": true, "license": "MIT" }, From d2f88a10fb0cf366708ec106696c812b8c85629c Mon Sep 17 00:00:00 2001 From: ehhuang Date: Wed, 10 Sep 2025 13:19:36 -0700 Subject: [PATCH 075/150] chore: telemetry test (#3405) # What does this PR do? - removed fixed-duration sleeps ## Test Plan --- .../telemetry/test_openai_telemetry.py | 17 ++++++++--------- tests/integration/telemetry/test_telemetry.py | 5 +---- .../telemetry/test_telemetry_metrics.py | 5 +---- 3 files changed, 10 insertions(+), 17 deletions(-) diff --git a/tests/integration/telemetry/test_openai_telemetry.py b/tests/integration/telemetry/test_openai_telemetry.py index cdd9b6702..b3ffb6b09 100644 --- a/tests/integration/telemetry/test_openai_telemetry.py +++ b/tests/integration/telemetry/test_openai_telemetry.py @@ -49,16 +49,13 @@ def setup_openai_telemetry_data(llama_stack_client, text_model_id): traces = llama_stack_client.telemetry.query_traces(limit=10) if len(traces) >= 5: # 5 OpenAI completion traces break - time.sleep(1) + time.sleep(0.1) if len(traces) < 5: pytest.fail( f"Failed to create sufficient OpenAI completion telemetry data after 30s. Got {len(traces)} traces." ) - # Wait for 5 seconds to ensure traces has completed logging - time.sleep(5) - yield @@ -185,11 +182,13 @@ def test_openai_completion_creates_telemetry(llama_stack_client, text_model_id): assert len(response.choices) > 0, "Response should have at least one choice" # Wait for telemetry to be recorded - time.sleep(3) - - # Check that we have more traces now - final_traces = llama_stack_client.telemetry.query_traces(limit=20) - final_count = len(final_traces) + start_time = time.time() + while time.time() - start_time < 30: + final_traces = llama_stack_client.telemetry.query_traces(limit=20) + final_count = len(final_traces) + if final_count > initial_count: + break + time.sleep(0.1) # Should have at least as many traces as before (might have more due to other activity) assert final_count >= initial_count, "Should have at least as many traces after OpenAI call" diff --git a/tests/integration/telemetry/test_telemetry.py b/tests/integration/telemetry/test_telemetry.py index d363edbc0..e86da954e 100644 --- a/tests/integration/telemetry/test_telemetry.py +++ b/tests/integration/telemetry/test_telemetry.py @@ -42,14 +42,11 @@ def setup_telemetry_data(llama_stack_client, text_model_id): traces = llama_stack_client.telemetry.query_traces(limit=10) if len(traces) >= 4: break - time.sleep(1) + time.sleep(0.1) if len(traces) < 4: pytest.fail(f"Failed to create sufficient telemetry data after 30s. Got {len(traces)} traces.") - # Wait for 5 seconds to ensure traces has completed logging - time.sleep(5) - yield diff --git a/tests/integration/telemetry/test_telemetry_metrics.py b/tests/integration/telemetry/test_telemetry_metrics.py index 4ba2bd2d9..1d8312ae2 100644 --- a/tests/integration/telemetry/test_telemetry_metrics.py +++ b/tests/integration/telemetry/test_telemetry_metrics.py @@ -46,10 +46,7 @@ def setup_telemetry_metrics_data(openai_client, client_with_models, text_model_i break except Exception: pass - time.sleep(1) - - # Wait additional time to ensure all metrics are processed - time.sleep(5) + time.sleep(0.1) # Return the token lists for use in tests return {"prompt_tokens": prompt_tokens, "completion_tokens": completion_tokens, "total_tokens": total_tokens} From c04f1c1e8c0b8c9df80ab51ce7379476cf218317 Mon Sep 17 00:00:00 2001 From: ehhuang Date: Wed, 10 Sep 2025 13:19:44 -0700 Subject: [PATCH 076/150] chore: move benchmarking related code (#3406) # What does this PR do? - moving things and some formatting changes ## Test Plan --- .../k8s-benchmark/README.md | 4 +- .../k8s-benchmark/apply.sh | 0 .../k8s-benchmark/benchmark.py | 129 +++++++------ .../k8s-benchmark/openai-mock-server.py | 170 ++++++++++-------- .../k8s-benchmark/profile_running_server.sh | 0 .../k8s-benchmark/run-benchmark.sh | 0 .../k8s-benchmark/stack-configmap.yaml | 0 .../k8s-benchmark/stack-k8s.yaml.template | 0 .../k8s-benchmark/stack_run_config.yaml | 0 docs/source/contributing/index.md | 2 +- 10 files changed, 156 insertions(+), 149 deletions(-) rename {docs/source/distributions => benchmarking}/k8s-benchmark/README.md (98%) rename {docs/source/distributions => benchmarking}/k8s-benchmark/apply.sh (100%) rename {docs/source/distributions => benchmarking}/k8s-benchmark/benchmark.py (80%) rename {docs/source/distributions => benchmarking}/k8s-benchmark/openai-mock-server.py (60%) rename {docs/source/distributions => benchmarking}/k8s-benchmark/profile_running_server.sh (100%) rename {docs/source/distributions => benchmarking}/k8s-benchmark/run-benchmark.sh (100%) rename {docs/source/distributions => benchmarking}/k8s-benchmark/stack-configmap.yaml (100%) rename {docs/source/distributions => benchmarking}/k8s-benchmark/stack-k8s.yaml.template (100%) rename {docs/source/distributions => benchmarking}/k8s-benchmark/stack_run_config.yaml (100%) diff --git a/docs/source/distributions/k8s-benchmark/README.md b/benchmarking/k8s-benchmark/README.md similarity index 98% rename from docs/source/distributions/k8s-benchmark/README.md rename to benchmarking/k8s-benchmark/README.md index 42da4d466..3b0d0c4db 100644 --- a/docs/source/distributions/k8s-benchmark/README.md +++ b/benchmarking/k8s-benchmark/README.md @@ -34,13 +34,12 @@ This data enables data-driven architectural decisions and performance optimizati **1. Deploy base k8s infrastructure:** ```bash -cd ../k8s +cd ../../docs/source/distributions/k8s ./apply.sh ``` **2. Deploy benchmark components:** ```bash -cd ../k8s-benchmark ./apply.sh ``` @@ -56,7 +55,6 @@ kubectl get pods **Benchmark Llama Stack (default):** ```bash -cd docs/source/distributions/k8s-benchmark/ ./run-benchmark.sh ``` diff --git a/docs/source/distributions/k8s-benchmark/apply.sh b/benchmarking/k8s-benchmark/apply.sh similarity index 100% rename from docs/source/distributions/k8s-benchmark/apply.sh rename to benchmarking/k8s-benchmark/apply.sh diff --git a/docs/source/distributions/k8s-benchmark/benchmark.py b/benchmarking/k8s-benchmark/benchmark.py similarity index 80% rename from docs/source/distributions/k8s-benchmark/benchmark.py rename to benchmarking/k8s-benchmark/benchmark.py index 83ba9602a..d5e34aa23 100644 --- a/docs/source/distributions/k8s-benchmark/benchmark.py +++ b/benchmarking/k8s-benchmark/benchmark.py @@ -14,7 +14,7 @@ import os import random import statistics import time -from typing import Tuple + import aiohttp @@ -55,50 +55,50 @@ class BenchmarkStats: total_time = self.end_time - self.start_time success_rate = (self.success_count / self.total_requests) * 100 - - print(f"\n{'='*60}") - print(f"BENCHMARK RESULTS") - - print(f"\nResponse Time Statistics:") + + print(f"\n{'=' * 60}") + print("BENCHMARK RESULTS") + + print("\nResponse Time Statistics:") print(f" Mean: {statistics.mean(self.response_times):.3f}s") print(f" Median: {statistics.median(self.response_times):.3f}s") print(f" Min: {min(self.response_times):.3f}s") print(f" Max: {max(self.response_times):.3f}s") - + if len(self.response_times) > 1: print(f" Std Dev: {statistics.stdev(self.response_times):.3f}s") - + percentiles = [50, 90, 95, 99] sorted_times = sorted(self.response_times) - print(f"\nPercentiles:") + print("\nPercentiles:") for p in percentiles: idx = int(len(sorted_times) * p / 100) - 1 idx = max(0, min(idx, len(sorted_times) - 1)) print(f" P{p}: {sorted_times[idx]:.3f}s") - + if self.ttft_times: - print(f"\nTime to First Token (TTFT) Statistics:") + print("\nTime to First Token (TTFT) Statistics:") print(f" Mean: {statistics.mean(self.ttft_times):.3f}s") print(f" Median: {statistics.median(self.ttft_times):.3f}s") print(f" Min: {min(self.ttft_times):.3f}s") print(f" Max: {max(self.ttft_times):.3f}s") - + if len(self.ttft_times) > 1: print(f" Std Dev: {statistics.stdev(self.ttft_times):.3f}s") - + sorted_ttft = sorted(self.ttft_times) - print(f"\nTTFT Percentiles:") + print("\nTTFT Percentiles:") for p in percentiles: idx = int(len(sorted_ttft) * p / 100) - 1 idx = max(0, min(idx, len(sorted_ttft) - 1)) print(f" P{p}: {sorted_ttft[idx]:.3f}s") - + if self.chunks_received: - print(f"\nStreaming Statistics:") + print("\nStreaming Statistics:") print(f" Mean chunks per response: {statistics.mean(self.chunks_received):.1f}") print(f" Total chunks received: {sum(self.chunks_received)}") - - print(f"{'='*60}") + + print(f"{'=' * 60}") print(f"Total time: {total_time:.2f}s") print(f"Concurrent users: {self.concurrent_users}") print(f"Total requests: {self.total_requests}") @@ -106,16 +106,16 @@ class BenchmarkStats: print(f"Failed requests: {len(self.errors)}") print(f"Success rate: {success_rate:.1f}%") print(f"Requests per second: {self.success_count / total_time:.2f}") - + if self.errors: - print(f"\nErrors (showing first 5):") + print("\nErrors (showing first 5):") for error in self.errors[:5]: print(f" {error}") class LlamaStackBenchmark: def __init__(self, base_url: str, model_id: str): - self.base_url = base_url.rstrip('/') + self.base_url = base_url.rstrip("/") self.model_id = model_id self.headers = {"Content-Type": "application/json"} self.test_messages = [ @@ -126,74 +126,67 @@ class LlamaStackBenchmark: [ {"role": "user", "content": "What is machine learning?"}, {"role": "assistant", "content": "Machine learning is a subset of AI..."}, - {"role": "user", "content": "Can you give me a practical example?"} - ] + {"role": "user", "content": "Can you give me a practical example?"}, + ], ] - - async def make_async_streaming_request(self) -> Tuple[float, int, float | None, str | None]: + async def make_async_streaming_request(self) -> tuple[float, int, float | None, str | None]: """Make a single async streaming chat completion request.""" messages = random.choice(self.test_messages) - payload = { - "model": self.model_id, - "messages": messages, - "stream": True, - "max_tokens": 100 - } - + payload = {"model": self.model_id, "messages": messages, "stream": True, "max_tokens": 100} + start_time = time.time() chunks_received = 0 ttft = None error = None - + session = aiohttp.ClientSession() - + try: async with session.post( f"{self.base_url}/chat/completions", headers=self.headers, json=payload, - timeout=aiohttp.ClientTimeout(total=30) + timeout=aiohttp.ClientTimeout(total=30), ) as response: if response.status == 200: async for line in response.content: if line: - line_str = line.decode('utf-8').strip() - if line_str.startswith('data: '): + line_str = line.decode("utf-8").strip() + if line_str.startswith("data: "): chunks_received += 1 if ttft is None: ttft = time.time() - start_time - if line_str == 'data: [DONE]': + if line_str == "data: [DONE]": break - + if chunks_received == 0: error = "No streaming chunks received" else: text = await response.text() error = f"HTTP {response.status}: {text[:100]}" - + except Exception as e: error = f"Request error: {str(e)}" finally: await session.close() - + response_time = time.time() - start_time return response_time, chunks_received, ttft, error - async def run_benchmark(self, duration: int, concurrent_users: int) -> BenchmarkStats: """Run benchmark using async requests for specified duration.""" stats = BenchmarkStats() stats.concurrent_users = concurrent_users stats.start_time = time.time() - + print(f"Starting benchmark: {duration}s duration, {concurrent_users} concurrent users") print(f"Target URL: {self.base_url}/chat/completions") print(f"Model: {self.model_id}") - + connector = aiohttp.TCPConnector(limit=concurrent_users) - async with aiohttp.ClientSession(connector=connector) as session: - + async with aiohttp.ClientSession(connector=connector): + async def worker(worker_id: int): """Worker that sends requests sequentially until canceled.""" request_count = 0 @@ -202,12 +195,12 @@ class LlamaStackBenchmark: response_time, chunks, ttft, error = await self.make_async_streaming_request() await stats.add_result(response_time, chunks, ttft, error) request_count += 1 - + except asyncio.CancelledError: break except Exception as e: await stats.add_result(0, 0, None, f"Worker {worker_id} error: {str(e)}") - + # Progress reporting task async def progress_reporter(): last_report_time = time.time() @@ -216,48 +209,52 @@ class LlamaStackBenchmark: await asyncio.sleep(1) # Report every second if time.time() >= last_report_time + 10: # Report every 10 seconds elapsed = time.time() - stats.start_time - print(f"Completed: {stats.total_requests} requests in {elapsed:.1f}s, RPS: {stats.total_requests / elapsed:.1f}") + print( + f"Completed: {stats.total_requests} requests in {elapsed:.1f}s, RPS: {stats.total_requests / elapsed:.1f}" + ) last_report_time = time.time() except asyncio.CancelledError: break - + # Spawn concurrent workers tasks = [asyncio.create_task(worker(i)) for i in range(concurrent_users)] progress_task = asyncio.create_task(progress_reporter()) tasks.append(progress_task) - + # Wait for duration then cancel all tasks await asyncio.sleep(duration) - + for task in tasks: task.cancel() - + # Wait for all tasks to complete await asyncio.gather(*tasks, return_exceptions=True) - + stats.end_time = time.time() return stats def main(): parser = argparse.ArgumentParser(description="Llama Stack Benchmark Tool") - parser.add_argument("--base-url", default=os.getenv("BENCHMARK_BASE_URL", "http://localhost:8000/v1/openai/v1"), - help="Base URL for the API (default: http://localhost:8000/v1/openai/v1)") - parser.add_argument("--model", default=os.getenv("INFERENCE_MODEL", "test-model"), - help="Model ID to use for requests") - parser.add_argument("--duration", type=int, default=60, - help="Duration in seconds to run benchmark (default: 60)") - parser.add_argument("--concurrent", type=int, default=10, - help="Number of concurrent users (default: 10)") - + parser.add_argument( + "--base-url", + default=os.getenv("BENCHMARK_BASE_URL", "http://localhost:8000/v1/openai/v1"), + help="Base URL for the API (default: http://localhost:8000/v1/openai/v1)", + ) + parser.add_argument( + "--model", default=os.getenv("INFERENCE_MODEL", "test-model"), help="Model ID to use for requests" + ) + parser.add_argument("--duration", type=int, default=60, help="Duration in seconds to run benchmark (default: 60)") + parser.add_argument("--concurrent", type=int, default=10, help="Number of concurrent users (default: 10)") + args = parser.parse_args() - + benchmark = LlamaStackBenchmark(args.base_url, args.model) - + try: stats = asyncio.run(benchmark.run_benchmark(args.duration, args.concurrent)) stats.print_summary() - + except KeyboardInterrupt: print("\nBenchmark interrupted by user") except Exception as e: diff --git a/docs/source/distributions/k8s-benchmark/openai-mock-server.py b/benchmarking/k8s-benchmark/openai-mock-server.py similarity index 60% rename from docs/source/distributions/k8s-benchmark/openai-mock-server.py rename to benchmarking/k8s-benchmark/openai-mock-server.py index de0680842..9e898af8e 100755 --- a/docs/source/distributions/k8s-benchmark/openai-mock-server.py +++ b/benchmarking/k8s-benchmark/openai-mock-server.py @@ -11,180 +11,192 @@ OpenAI-compatible mock server that returns: - Valid OpenAI-formatted chat completion responses with dynamic content """ -from flask import Flask, request, jsonify, Response -import time -import random -import uuid -import json import argparse +import json import os +import random +import time +import uuid + +from flask import Flask, Response, jsonify, request app = Flask(__name__) + # Models from environment variables def get_models(): models_str = os.getenv("MOCK_MODELS", "meta-llama/Llama-3.2-3B-Instruct") model_ids = [m.strip() for m in models_str.split(",") if m.strip()] - + return { "object": "list", "data": [ - { - "id": model_id, - "object": "model", - "created": 1234567890, - "owned_by": "vllm" - } - for model_id in model_ids - ] + {"id": model_id, "object": "model", "created": 1234567890, "owned_by": "vllm"} for model_id in model_ids + ], } + def generate_random_text(length=50): """Generate random but coherent text for responses.""" words = [ - "Hello", "there", "I'm", "an", "AI", "assistant", "ready", "to", "help", "you", - "with", "your", "questions", "and", "tasks", "today", "Let", "me","know", "what", - "you'd", "like", "to", "discuss", "or", "explore", "together", "I", "can", "assist", - "with", "various", "topics", "including", "coding", "writing", "analysis", "and", "more" + "Hello", + "there", + "I'm", + "an", + "AI", + "assistant", + "ready", + "to", + "help", + "you", + "with", + "your", + "questions", + "and", + "tasks", + "today", + "Let", + "me", + "know", + "what", + "you'd", + "like", + "to", + "discuss", + "or", + "explore", + "together", + "I", + "can", + "assist", + "with", + "various", + "topics", + "including", + "coding", + "writing", + "analysis", + "and", + "more", ] return " ".join(random.choices(words, k=length)) -@app.route('/v1/models', methods=['GET']) + +@app.route("/v1/models", methods=["GET"]) def list_models(): models = get_models() print(f"[MOCK] Returning models: {[m['id'] for m in models['data']]}") return jsonify(models) -@app.route('/v1/chat/completions', methods=['POST']) + +@app.route("/v1/chat/completions", methods=["POST"]) def chat_completions(): """Return OpenAI-formatted chat completion responses.""" data = request.get_json() - default_model = get_models()['data'][0]['id'] - model = data.get('model', default_model) - messages = data.get('messages', []) - stream = data.get('stream', False) - + default_model = get_models()["data"][0]["id"] + model = data.get("model", default_model) + messages = data.get("messages", []) + stream = data.get("stream", False) + print(f"[MOCK] Chat completion request - model: {model}, stream: {stream}") - + if stream: return handle_streaming_completion(model, messages) else: return handle_non_streaming_completion(model, messages) + def handle_non_streaming_completion(model, messages): response_text = generate_random_text(random.randint(20, 80)) - + # Calculate realistic token counts - prompt_tokens = sum(len(str(msg.get('content', '')).split()) for msg in messages) + prompt_tokens = sum(len(str(msg.get("content", "")).split()) for msg in messages) completion_tokens = len(response_text.split()) - + response = { "id": f"chatcmpl-{uuid.uuid4().hex[:8]}", "object": "chat.completion", "created": int(time.time()), "model": model, - "choices": [ - { - "index": 0, - "message": { - "role": "assistant", - "content": response_text - }, - "finish_reason": "stop" - } - ], + "choices": [{"index": 0, "message": {"role": "assistant", "content": response_text}, "finish_reason": "stop"}], "usage": { "prompt_tokens": prompt_tokens, "completion_tokens": completion_tokens, - "total_tokens": prompt_tokens + completion_tokens - } + "total_tokens": prompt_tokens + completion_tokens, + }, } - + return jsonify(response) + def handle_streaming_completion(model, messages): def generate_stream(): # Generate response text full_response = generate_random_text(random.randint(30, 100)) words = full_response.split() - + # Send initial chunk initial_chunk = { "id": f"chatcmpl-{uuid.uuid4().hex[:8]}", "object": "chat.completion.chunk", "created": int(time.time()), "model": model, - "choices": [ - { - "index": 0, - "delta": {"role": "assistant", "content": ""} - } - ] + "choices": [{"index": 0, "delta": {"role": "assistant", "content": ""}}], } yield f"data: {json.dumps(initial_chunk)}\n\n" - + # Send word by word for i, word in enumerate(words): chunk = { "id": f"chatcmpl-{uuid.uuid4().hex[:8]}", - "object": "chat.completion.chunk", + "object": "chat.completion.chunk", "created": int(time.time()), "model": model, - "choices": [ - { - "index": 0, - "delta": {"content": f"{word} " if i < len(words) - 1 else word} - } - ] + "choices": [{"index": 0, "delta": {"content": f"{word} " if i < len(words) - 1 else word}}], } yield f"data: {json.dumps(chunk)}\n\n" # Configurable delay to simulate realistic streaming stream_delay = float(os.getenv("STREAM_DELAY_SECONDS", "0.005")) time.sleep(stream_delay) - + # Send final chunk final_chunk = { "id": f"chatcmpl-{uuid.uuid4().hex[:8]}", "object": "chat.completion.chunk", "created": int(time.time()), "model": model, - "choices": [ - { - "index": 0, - "delta": {"content": ""}, - "finish_reason": "stop" - } - ] + "choices": [{"index": 0, "delta": {"content": ""}, "finish_reason": "stop"}], } yield f"data: {json.dumps(final_chunk)}\n\n" yield "data: [DONE]\n\n" - + return Response( generate_stream(), - mimetype='text/event-stream', + mimetype="text/event-stream", headers={ - 'Cache-Control': 'no-cache', - 'Connection': 'keep-alive', - 'Access-Control-Allow-Origin': '*', - } + "Cache-Control": "no-cache", + "Connection": "keep-alive", + "Access-Control-Allow-Origin": "*", + }, ) -@app.route('/health', methods=['GET']) + +@app.route("/health", methods=["GET"]) def health(): return jsonify({"status": "healthy", "type": "openai-mock"}) -if __name__ == '__main__': - parser = argparse.ArgumentParser(description='OpenAI-compatible mock server') - parser.add_argument('--port', type=int, default=8081, - help='Port to run the server on (default: 8081)') + +if __name__ == "__main__": + parser = argparse.ArgumentParser(description="OpenAI-compatible mock server") + parser.add_argument("--port", type=int, default=8081, help="Port to run the server on (default: 8081)") args = parser.parse_args() - + port = args.port - + models = get_models() print("Starting OpenAI-compatible mock server...") print(f"- /models endpoint with: {[m['id'] for m in models['data']]}") print("- OpenAI-formatted chat/completion responses with dynamic content") print("- Streaming support with valid SSE format") print(f"- Listening on: http://0.0.0.0:{port}") - app.run(host='0.0.0.0', port=port, debug=False) + app.run(host="0.0.0.0", port=port, debug=False) diff --git a/docs/source/distributions/k8s-benchmark/profile_running_server.sh b/benchmarking/k8s-benchmark/profile_running_server.sh similarity index 100% rename from docs/source/distributions/k8s-benchmark/profile_running_server.sh rename to benchmarking/k8s-benchmark/profile_running_server.sh diff --git a/docs/source/distributions/k8s-benchmark/run-benchmark.sh b/benchmarking/k8s-benchmark/run-benchmark.sh similarity index 100% rename from docs/source/distributions/k8s-benchmark/run-benchmark.sh rename to benchmarking/k8s-benchmark/run-benchmark.sh diff --git a/docs/source/distributions/k8s-benchmark/stack-configmap.yaml b/benchmarking/k8s-benchmark/stack-configmap.yaml similarity index 100% rename from docs/source/distributions/k8s-benchmark/stack-configmap.yaml rename to benchmarking/k8s-benchmark/stack-configmap.yaml diff --git a/docs/source/distributions/k8s-benchmark/stack-k8s.yaml.template b/benchmarking/k8s-benchmark/stack-k8s.yaml.template similarity index 100% rename from docs/source/distributions/k8s-benchmark/stack-k8s.yaml.template rename to benchmarking/k8s-benchmark/stack-k8s.yaml.template diff --git a/docs/source/distributions/k8s-benchmark/stack_run_config.yaml b/benchmarking/k8s-benchmark/stack_run_config.yaml similarity index 100% rename from docs/source/distributions/k8s-benchmark/stack_run_config.yaml rename to benchmarking/k8s-benchmark/stack_run_config.yaml diff --git a/docs/source/contributing/index.md b/docs/source/contributing/index.md index 1846f4d97..71c3bd5a6 100644 --- a/docs/source/contributing/index.md +++ b/docs/source/contributing/index.md @@ -35,5 +35,5 @@ testing/record-replay ### Benchmarking -```{include} ../../../docs/source/distributions/k8s-benchmark/README.md +```{include} ../../../benchmarking/k8s-benchmark/README.md ``` From 0c7f49490cdb6ff757659469d1401b515ac4402c Mon Sep 17 00:00:00 2001 From: Ashwin Bharambe Date: Wed, 10 Sep 2025 14:34:18 -0700 Subject: [PATCH 077/150] fix(inference_store): on duplicate chat completion IDs, replace (#3408) # What does this PR do? Duplicate chat completion IDs can be generated during tests especially if they are replaying recorded responses across different tests. No need to warn or error under those circumstances. In the wild, this is not likely to happen at all (no evidence) so we aren't really hiding any problem. --- .../utils/inference/inference_store.py | 48 +++++++++++++++---- .../utils/sqlstore/authorized_sqlstore.py | 14 ++++++ 2 files changed, 53 insertions(+), 9 deletions(-) diff --git a/llama_stack/providers/utils/inference/inference_store.py b/llama_stack/providers/utils/inference/inference_store.py index 8c69b1683..17f4c6268 100644 --- a/llama_stack/providers/utils/inference/inference_store.py +++ b/llama_stack/providers/utils/inference/inference_store.py @@ -6,6 +6,8 @@ import asyncio from typing import Any +from sqlalchemy.exc import IntegrityError + from llama_stack.apis.inference import ( ListOpenAIChatCompletionResponse, OpenAIChatCompletion, @@ -129,16 +131,44 @@ class InferenceStore: raise ValueError("Inference store is not initialized") data = chat_completion.model_dump() + record_data = { + "id": data["id"], + "created": data["created"], + "model": data["model"], + "choices": data["choices"], + "input_messages": [message.model_dump() for message in input_messages], + } - await self.sql_store.insert( - table="chat_completions", - data={ - "id": data["id"], - "created": data["created"], - "model": data["model"], - "choices": data["choices"], - "input_messages": [message.model_dump() for message in input_messages], - }, + try: + await self.sql_store.insert( + table="chat_completions", + data=record_data, + ) + except IntegrityError as e: + # Duplicate chat completion IDs can be generated during tests especially if they are replaying + # recorded responses across different tests. No need to warn or error under those circumstances. + # In the wild, this is not likely to happen at all (no evidence) so we aren't really hiding any problem. + + # Check if it's a unique constraint violation + error_message = str(e.orig) if e.orig else str(e) + if self._is_unique_constraint_error(error_message): + # Update the existing record instead + await self.sql_store.update(table="chat_completions", data=record_data, where={"id": data["id"]}) + else: + # Re-raise if it's not a unique constraint error + raise + + def _is_unique_constraint_error(self, error_message: str) -> bool: + """Check if the error is specifically a unique constraint violation.""" + error_lower = error_message.lower() + return any( + indicator in error_lower + for indicator in [ + "unique constraint failed", # SQLite + "duplicate key", # PostgreSQL + "unique violation", # PostgreSQL alternative + "duplicate entry", # MySQL + ] ) async def list_chat_completions( diff --git a/llama_stack/providers/utils/sqlstore/authorized_sqlstore.py b/llama_stack/providers/utils/sqlstore/authorized_sqlstore.py index 867ba2f55..acb688f96 100644 --- a/llama_stack/providers/utils/sqlstore/authorized_sqlstore.py +++ b/llama_stack/providers/utils/sqlstore/authorized_sqlstore.py @@ -172,6 +172,20 @@ class AuthorizedSqlStore: return results.data[0] if results.data else None + async def update(self, table: str, data: Mapping[str, Any], where: Mapping[str, Any]) -> None: + """Update rows with automatic access control attribute capture.""" + enhanced_data = dict(data) + + current_user = get_authenticated_user() + if current_user: + enhanced_data["owner_principal"] = current_user.principal + enhanced_data["access_attributes"] = current_user.attributes + else: + enhanced_data["owner_principal"] = None + enhanced_data["access_attributes"] = None + + await self.sql_store.update(table, enhanced_data, where) + async def delete(self, table: str, where: Mapping[str, Any]) -> None: """Delete rows with automatic access control filtering.""" await self.sql_store.delete(table, where) From 8e05c68d159a40d54768a9473d63b68a5bfbf369 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C3=A9bastien=20Han?= Date: Thu, 11 Sep 2025 10:19:59 +0200 Subject: [PATCH 078/150] chore: remove openai dependency from providers (#3398) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit # What does this PR do? The openai package is already a dependency of the llama-stack project itself, so let's the project dictate which openai version we need and avoid potential breakage with unsatisfiable dependency resolution. Signed-off-by: Sébastien Han --- llama_stack/providers/registry/batches.py | 2 +- llama_stack/providers/registry/inference.py | 20 ++++++++------------ llama_stack/providers/registry/scoring.py | 2 +- pyproject.toml | 4 +--- uv.lock | 8 ++------ 5 files changed, 13 insertions(+), 23 deletions(-) diff --git a/llama_stack/providers/registry/batches.py b/llama_stack/providers/registry/batches.py index de7886efb..a07942486 100644 --- a/llama_stack/providers/registry/batches.py +++ b/llama_stack/providers/registry/batches.py @@ -13,7 +13,7 @@ def available_providers() -> list[ProviderSpec]: InlineProviderSpec( api=Api.batches, provider_type="inline::reference", - pip_packages=["openai"], + pip_packages=[], module="llama_stack.providers.inline.batches.reference", config_class="llama_stack.providers.inline.batches.reference.config.ReferenceBatchesImplConfig", api_dependencies=[ diff --git a/llama_stack/providers/registry/inference.py b/llama_stack/providers/registry/inference.py index 541fbb432..8912560cb 100644 --- a/llama_stack/providers/registry/inference.py +++ b/llama_stack/providers/registry/inference.py @@ -75,7 +75,7 @@ def available_providers() -> list[ProviderSpec]: api=Api.inference, adapter=AdapterSpec( adapter_type="vllm", - pip_packages=["openai"], + pip_packages=[], module="llama_stack.providers.remote.inference.vllm", config_class="llama_stack.providers.remote.inference.vllm.VLLMInferenceAdapterConfig", description="Remote vLLM inference provider for connecting to vLLM servers.", @@ -151,9 +151,7 @@ def available_providers() -> list[ProviderSpec]: api=Api.inference, adapter=AdapterSpec( adapter_type="databricks", - pip_packages=[ - "openai", - ], + pip_packages=[], module="llama_stack.providers.remote.inference.databricks", config_class="llama_stack.providers.remote.inference.databricks.DatabricksImplConfig", description="Databricks inference provider for running models on Databricks' unified analytics platform.", @@ -163,9 +161,7 @@ def available_providers() -> list[ProviderSpec]: api=Api.inference, adapter=AdapterSpec( adapter_type="nvidia", - pip_packages=[ - "openai", - ], + pip_packages=[], module="llama_stack.providers.remote.inference.nvidia", config_class="llama_stack.providers.remote.inference.nvidia.NVIDIAConfig", description="NVIDIA inference provider for accessing NVIDIA NIM models and AI services.", @@ -175,7 +171,7 @@ def available_providers() -> list[ProviderSpec]: api=Api.inference, adapter=AdapterSpec( adapter_type="runpod", - pip_packages=["openai"], + pip_packages=[], module="llama_stack.providers.remote.inference.runpod", config_class="llama_stack.providers.remote.inference.runpod.RunpodImplConfig", description="RunPod inference provider for running models on RunPod's cloud GPU platform.", @@ -207,7 +203,7 @@ def available_providers() -> list[ProviderSpec]: api=Api.inference, adapter=AdapterSpec( adapter_type="gemini", - pip_packages=["litellm", "openai"], + pip_packages=["litellm"], module="llama_stack.providers.remote.inference.gemini", config_class="llama_stack.providers.remote.inference.gemini.GeminiConfig", provider_data_validator="llama_stack.providers.remote.inference.gemini.config.GeminiProviderDataValidator", @@ -218,7 +214,7 @@ def available_providers() -> list[ProviderSpec]: api=Api.inference, adapter=AdapterSpec( adapter_type="vertexai", - pip_packages=["litellm", "google-cloud-aiplatform", "openai"], + pip_packages=["litellm", "google-cloud-aiplatform"], module="llama_stack.providers.remote.inference.vertexai", config_class="llama_stack.providers.remote.inference.vertexai.VertexAIConfig", provider_data_validator="llama_stack.providers.remote.inference.vertexai.config.VertexAIProviderDataValidator", @@ -248,7 +244,7 @@ Available Models: api=Api.inference, adapter=AdapterSpec( adapter_type="groq", - pip_packages=["litellm", "openai"], + pip_packages=["litellm"], module="llama_stack.providers.remote.inference.groq", config_class="llama_stack.providers.remote.inference.groq.GroqConfig", provider_data_validator="llama_stack.providers.remote.inference.groq.config.GroqProviderDataValidator", @@ -270,7 +266,7 @@ Available Models: api=Api.inference, adapter=AdapterSpec( adapter_type="sambanova", - pip_packages=["litellm", "openai"], + pip_packages=["litellm"], module="llama_stack.providers.remote.inference.sambanova", config_class="llama_stack.providers.remote.inference.sambanova.SambaNovaImplConfig", provider_data_validator="llama_stack.providers.remote.inference.sambanova.config.SambaNovaProviderDataValidator", diff --git a/llama_stack/providers/registry/scoring.py b/llama_stack/providers/registry/scoring.py index 79293d888..a4ec54ed2 100644 --- a/llama_stack/providers/registry/scoring.py +++ b/llama_stack/providers/registry/scoring.py @@ -38,7 +38,7 @@ def available_providers() -> list[ProviderSpec]: InlineProviderSpec( api=Api.scoring, provider_type="inline::braintrust", - pip_packages=["autoevals", "openai"], + pip_packages=["autoevals"], module="llama_stack.providers.inline.scoring.braintrust", config_class="llama_stack.providers.inline.scoring.braintrust.BraintrustScoringConfig", api_dependencies=[ diff --git a/pyproject.toml b/pyproject.toml index 0414aafb0..72c4f6f9e 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -32,7 +32,7 @@ dependencies = [ "jinja2>=3.1.6", "jsonschema", "llama-stack-client>=0.2.21", - "openai>=1.99.6", + "openai>=1.100.0", # for expires_after support "prompt-toolkit", "python-dotenv", "python-jose[cryptography]", @@ -80,7 +80,6 @@ dev = [ unit = [ "sqlite-vec", "ollama", - "openai", "aiosqlite", "aiohttp", "psycopg2-binary>=2.9.0", @@ -105,7 +104,6 @@ unit = [ # separately. If you are using "uv" to execute your tests, you can use the "--group" flag to specify extra # dependencies. test = [ - "openai>=1.100.0", # for expires_after support "aiosqlite", "aiohttp", "torch>=2.6.0", diff --git a/uv.lock b/uv.lock index 3d7713f54..065eb3876 100644 --- a/uv.lock +++ b/uv.lock @@ -1,5 +1,5 @@ version = 1 -revision = 3 +revision = 2 requires-python = ">=3.12" resolution-markers = [ "(python_full_version >= '3.13' and platform_machine != 'aarch64' and sys_platform == 'linux') or (python_full_version >= '3.13' and sys_platform != 'darwin' and sys_platform != 'linux')", @@ -1839,7 +1839,6 @@ test = [ { name = "datasets" }, { name = "mcp" }, { name = "milvus-lite" }, - { name = "openai" }, { name = "psycopg2-binary" }, { name = "pymilvus" }, { name = "pypdf" }, @@ -1865,7 +1864,6 @@ unit = [ { name = "milvus-lite" }, { name = "moto", extra = ["s3"] }, { name = "ollama" }, - { name = "openai" }, { name = "psycopg2-binary" }, { name = "pymilvus" }, { name = "pypdf" }, @@ -1889,7 +1887,7 @@ requires-dist = [ { name = "jsonschema" }, { name = "llama-stack-client", specifier = ">=0.2.21" }, { name = "llama-stack-client", marker = "extra == 'ui'", specifier = ">=0.2.21" }, - { name = "openai", specifier = ">=1.99.6" }, + { name = "openai", specifier = ">=1.100.0" }, { name = "opentelemetry-exporter-otlp-proto-http", specifier = ">=1.30.0" }, { name = "opentelemetry-sdk", specifier = ">=1.30.0" }, { name = "pandas", marker = "extra == 'ui'" }, @@ -1959,7 +1957,6 @@ test = [ { name = "datasets", specifier = ">=4.0.0" }, { name = "mcp" }, { name = "milvus-lite", specifier = ">=2.5.0" }, - { name = "openai", specifier = ">=1.100.0" }, { name = "psycopg2-binary", specifier = ">=2.9.0" }, { name = "pymilvus", specifier = ">=2.6.1" }, { name = "pypdf" }, @@ -1984,7 +1981,6 @@ unit = [ { name = "milvus-lite", specifier = ">=2.5.0" }, { name = "moto", extras = ["s3"], specifier = ">=5.1.10" }, { name = "ollama" }, - { name = "openai" }, { name = "psycopg2-binary", specifier = ">=2.9.0" }, { name = "pymilvus", specifier = ">=2.6.1" }, { name = "pypdf" }, From 2838d5a20f888c9f8fad666272dd9ca8d3bb4884 Mon Sep 17 00:00:00 2001 From: Sumanth Kamenani Date: Thu, 11 Sep 2025 05:41:53 -0400 Subject: [PATCH 079/150] fix: AWS Bedrock inference profile ID conversion for region-specific endpoints (#3386) Fixes #3370 AWS switched to requiring region-prefixed inference profile IDs instead of foundation model IDs for on-demand throughput. This was causing ValidationException errors. Added auto-detection based on boto3 client region to convert model IDs like meta.llama3-1-70b-instruct-v1:0 to us.meta.llama3-1-70b-instruct-v1:0 depending on the detected region. Also handles edge cases like ARNs, case insensitive regions, and None regions. Tested with this request. ```json { "model_id": "meta.llama3-1-8b-instruct-v1:0", "messages": [ { "role": "system", "content": "You are a helpful assistant." }, { "role": "user", "content": "tell me a riddle" } ], "sampling_params": { "strategy": { "type": "top_p", "temperature": 0.7, "top_p": 0.9 }, "max_tokens": 512 } } ``` image --- .../remote/inference/bedrock/bedrock.py | 51 +++++++++++++++++- tests/unit/providers/test_bedrock.py | 53 +++++++++++++++++++ 2 files changed, 102 insertions(+), 2 deletions(-) create mode 100644 tests/unit/providers/test_bedrock.py diff --git a/llama_stack/providers/remote/inference/bedrock/bedrock.py b/llama_stack/providers/remote/inference/bedrock/bedrock.py index 63ea196f6..106caed9b 100644 --- a/llama_stack/providers/remote/inference/bedrock/bedrock.py +++ b/llama_stack/providers/remote/inference/bedrock/bedrock.py @@ -53,6 +53,43 @@ from llama_stack.providers.utils.inference.prompt_adapter import ( from .models import MODEL_ENTRIES +REGION_PREFIX_MAP = { + "us": "us.", + "eu": "eu.", + "ap": "ap.", +} + + +def _get_region_prefix(region: str | None) -> str: + # AWS requires region prefixes for inference profiles + if region is None: + return "us." # default to US when we don't know + + # Handle case insensitive region matching + region_lower = region.lower() + for prefix in REGION_PREFIX_MAP: + if region_lower.startswith(f"{prefix}-"): + return REGION_PREFIX_MAP[prefix] + + # Fallback to US for anything we don't recognize + return "us." + + +def _to_inference_profile_id(model_id: str, region: str = None) -> str: + # Return ARNs unchanged + if model_id.startswith("arn:"): + return model_id + + # Return inference profile IDs that already have regional prefixes + if any(model_id.startswith(p) for p in REGION_PREFIX_MAP.values()): + return model_id + + # Default to US East when no region is provided + if region is None: + region = "us-east-1" + + return _get_region_prefix(region) + model_id + class BedrockInferenceAdapter( ModelRegistryHelper, @@ -166,8 +203,13 @@ class BedrockInferenceAdapter( options["repetition_penalty"] = sampling_params.repetition_penalty prompt = await chat_completion_request_to_prompt(request, self.get_llama_model(request.model)) + + # Convert foundation model ID to inference profile ID + region_name = self.client.meta.region_name + inference_profile_id = _to_inference_profile_id(bedrock_model, region_name) + return { - "modelId": bedrock_model, + "modelId": inference_profile_id, "body": json.dumps( { "prompt": prompt, @@ -185,6 +227,11 @@ class BedrockInferenceAdapter( task_type: EmbeddingTaskType | None = None, ) -> EmbeddingsResponse: model = await self.model_store.get_model(model_id) + + # Convert foundation model ID to inference profile ID + region_name = self.client.meta.region_name + inference_profile_id = _to_inference_profile_id(model.provider_resource_id, region_name) + embeddings = [] for content in contents: assert not content_has_media(content), "Bedrock does not support media for embeddings" @@ -193,7 +240,7 @@ class BedrockInferenceAdapter( body = json.dumps(input_body) response = self.client.invoke_model( body=body, - modelId=model.provider_resource_id, + modelId=inference_profile_id, accept="application/json", contentType="application/json", ) diff --git a/tests/unit/providers/test_bedrock.py b/tests/unit/providers/test_bedrock.py new file mode 100644 index 000000000..1ff07bbbe --- /dev/null +++ b/tests/unit/providers/test_bedrock.py @@ -0,0 +1,53 @@ +# Copyright (c) Meta Platforms, Inc. and affiliates. +# All rights reserved. +# +# This source code is licensed under the terms described in the LICENSE file in +# the root directory of this source tree. + +from llama_stack.providers.remote.inference.bedrock.bedrock import ( + _get_region_prefix, + _to_inference_profile_id, +) + + +def test_region_prefixes(): + assert _get_region_prefix("us-east-1") == "us." + assert _get_region_prefix("eu-west-1") == "eu." + assert _get_region_prefix("ap-south-1") == "ap." + assert _get_region_prefix("ca-central-1") == "us." + + # Test case insensitive + assert _get_region_prefix("US-EAST-1") == "us." + assert _get_region_prefix("EU-WEST-1") == "eu." + assert _get_region_prefix("Ap-South-1") == "ap." + + # Test None region + assert _get_region_prefix(None) == "us." + + +def test_model_id_conversion(): + # Basic conversion + assert ( + _to_inference_profile_id("meta.llama3-1-70b-instruct-v1:0", "us-east-1") == "us.meta.llama3-1-70b-instruct-v1:0" + ) + + # Already has prefix + assert ( + _to_inference_profile_id("us.meta.llama3-1-70b-instruct-v1:0", "us-east-1") + == "us.meta.llama3-1-70b-instruct-v1:0" + ) + + # ARN should be returned unchanged + arn = "arn:aws:bedrock:us-east-1:123456789012:inference-profile/us.meta.llama3-1-70b-instruct-v1:0" + assert _to_inference_profile_id(arn, "us-east-1") == arn + + # ARN should be returned unchanged even without region + assert _to_inference_profile_id(arn) == arn + + # Optional region parameter defaults to us-east-1 + assert _to_inference_profile_id("meta.llama3-1-70b-instruct-v1:0") == "us.meta.llama3-1-70b-instruct-v1:0" + + # Different regions work with optional parameter + assert ( + _to_inference_profile_id("meta.llama3-1-70b-instruct-v1:0", "eu-west-1") == "eu.meta.llama3-1-70b-instruct-v1:0" + ) From c2d281e01b360ba0a2db177b90df6e7ba4df8501 Mon Sep 17 00:00:00 2001 From: Matthew Farrellee Date: Thu, 11 Sep 2025 07:48:19 -0400 Subject: [PATCH 080/150] chore(replay): improve replay robustness with un-validated construction (#3414) # What does this PR do? some providers do not produce spec compliant outputs. when this happens the replay infra will fail to construct the proper types and will return a dict to the client. the client likely does not expect a dict. this was discovered with tgi, which returns finish_reason="" when valid values are "stop", "length" or "content_filter" ## Test Plan ci --- llama_stack/testing/inference_recorder.py | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/llama_stack/testing/inference_recorder.py b/llama_stack/testing/inference_recorder.py index 298758c92..e78f493a6 100644 --- a/llama_stack/testing/inference_recorder.py +++ b/llama_stack/testing/inference_recorder.py @@ -105,8 +105,12 @@ def _deserialize_response(data: dict[str, Any]) -> Any: return cls.model_validate(data["__data__"]) except (ImportError, AttributeError, TypeError, ValueError) as e: - logger.warning(f"Failed to deserialize object of type {data['__type__']}: {e}") - return data["__data__"] + logger.warning(f"Failed to deserialize object of type {data['__type__']} with model_validate: {e}") + try: + return cls.model_construct(**data["__data__"]) + except Exception as e: + logger.warning(f"Failed to deserialize object of type {data['__type__']} with model_construct: {e}") + return data["__data__"] return data From f31bcc11bc9e4a88ce82dadafea8d4b0cb5f7230 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C3=A9bastien=20Han?= Date: Thu, 11 Sep 2025 13:48:38 +0200 Subject: [PATCH 081/150] feat: add Azure OpenAI inference provider support (#3396) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit # What does this PR do? Llama-stack now supports a new OpenAI compatible endpoint with Azure OpenAI. The starter distro has been updated to add the new remote inference provider. A few tests have been modified and improved. ## Test Plan Deploy a model in the Aure portal then: ``` $ AZURE_API_KEY=... AZURE_API_BASE=... uv run llama stack build --image-type venv --providers inference=remote::azure --run ... $ LLAMA_STACK_CONFIG=http://localhost:8321 uv run --group test pytest -v -ra --text-model azure/gpt-4.1 tests/integration/inference/test_openai_completion.py ... Results: ``` ============================================= test session starts ============================================== platform darwin -- Python 3.12.8, pytest-8.4.1, pluggy-1.6.0 -- /Users/leseb/Documents/AI/llama-stack/.venv/bin/python3 cachedir: .pytest_cache metadata: {'Python': '3.12.8', 'Platform': 'macOS-15.6.1-arm64-arm-64bit', 'Packages': {'pytest': '8.4.1', 'pluggy': '1.6.0'}, 'Plugins': {'anyio': '4.9.0', 'html': '4.1.1', 'socket': '0.7.0', 'asyncio': '1.1.0', 'json-report': '1.5.0', 'timeout': '2.4.0', 'metadata': '3.1.1', 'cov': '6.2.1', 'nbval': '0.11.0', 'hydra-core': '1.3.2'}} rootdir: /Users/leseb/Documents/AI/llama-stack configfile: pyproject.toml plugins: anyio-4.9.0, html-4.1.1, socket-0.7.0, asyncio-1.1.0, json-report-1.5.0, timeout-2.4.0, metadata-3.1.1, cov-6.2.1, nbval-0.11.0, hydra-core-1.3.2 asyncio: mode=Mode.AUTO, asyncio_default_fixture_loop_scope=None, asyncio_default_test_loop_scope=function collected 27 items tests/integration/inference/test_openai_completion.py::test_openai_completion_non_streaming[txt=azure/gpt-5-mini-inference:completion:sanity] SKIPPED [ 3%] tests/integration/inference/test_openai_completion.py::test_openai_completion_non_streaming_suffix[txt=azure/gpt-5-mini-inference:completion:suffix] SKIPPED [ 7%] tests/integration/inference/test_openai_completion.py::test_openai_completion_streaming[txt=azure/gpt-5-mini-inference:completion:sanity] SKIPPED [ 11%] tests/integration/inference/test_openai_completion.py::test_openai_completion_prompt_logprobs[txt=azure/gpt-5-mini-1] SKIPPED [ 14%] tests/integration/inference/test_openai_completion.py::test_openai_completion_guided_choice[txt=azure/gpt-5-mini] SKIPPED [ 18%] tests/integration/inference/test_openai_completion.py::test_openai_chat_completion_non_streaming[openai_client-txt=azure/gpt-5-mini-inference:chat_completion:non_streaming_01] PASSED [ 22%] tests/integration/inference/test_openai_completion.py::test_openai_chat_completion_streaming[openai_client-txt=azure/gpt-5-mini-inference:chat_completion:streaming_01] PASSED [ 25%] tests/integration/inference/test_openai_completion.py::test_openai_chat_completion_streaming_with_n[openai_client-txt=azure/gpt-5-mini-inference:chat_completion:streaming_01] PASSED [ 29%] tests/integration/inference/test_openai_completion.py::test_inference_store[openai_client-txt=azure/gpt-5-mini-True] PASSED [ 33%] tests/integration/inference/test_openai_completion.py::test_inference_store_tool_calls[openai_client-txt=azure/gpt-5-mini-True] PASSED [ 37%] tests/integration/inference/test_openai_completion.py::test_openai_chat_completion_non_streaming_with_file[txt=azure/gpt-5-mini] SKIPPEDed files.) [ 40%] tests/integration/inference/test_openai_completion.py::test_openai_completion_prompt_logprobs[txt=azure/gpt-5-mini-0] SKIPPED [ 44%] tests/integration/inference/test_openai_completion.py::test_openai_chat_completion_non_streaming[openai_client-txt=azure/gpt-5-mini-inference:chat_completion:non_streaming_02] PASSED [ 48%] tests/integration/inference/test_openai_completion.py::test_openai_chat_completion_streaming[openai_client-txt=azure/gpt-5-mini-inference:chat_completion:streaming_02] PASSED [ 51%] tests/integration/inference/test_openai_completion.py::test_openai_chat_completion_streaming_with_n[openai_client-txt=azure/gpt-5-mini-inference:chat_completion:streaming_02] PASSED [ 55%] tests/integration/inference/test_openai_completion.py::test_inference_store[openai_client-txt=azure/gpt-5-mini-False] PASSED [ 59%] tests/integration/inference/test_openai_completion.py::test_inference_store_tool_calls[openai_client-txt=azure/gpt-5-mini-False] PASSED [ 62%] tests/integration/inference/test_openai_completion.py::test_openai_chat_completion_non_streaming[client_with_models-txt=azure/gpt-5-mini-inference:chat_completion:non_streaming_01] PASSED [ 66%] tests/integration/inference/test_openai_completion.py::test_openai_chat_completion_streaming[client_with_models-txt=azure/gpt-5-mini-inference:chat_completion:streaming_01] PASSED [ 70%] tests/integration/inference/test_openai_completion.py::test_openai_chat_completion_streaming_with_n[client_with_models-txt=azure/gpt-5-mini-inference:chat_completion:streaming_01] PASSED [ 74%] tests/integration/inference/test_openai_completion.py::test_inference_store[client_with_models-txt=azure/gpt-5-mini-True] PASSED [ 77%] tests/integration/inference/test_openai_completion.py::test_inference_store_tool_calls[client_with_models-txt=azure/gpt-5-mini-True] PASSED [ 81%] tests/integration/inference/test_openai_completion.py::test_openai_chat_completion_non_streaming[client_with_models-txt=azure/gpt-5-mini-inference:chat_completion:non_streaming_02] PASSED [ 85%] tests/integration/inference/test_openai_completion.py::test_openai_chat_completion_streaming[client_with_models-txt=azure/gpt-5-mini-inference:chat_completion:streaming_02] PASSED [ 88%] tests/integration/inference/test_openai_completion.py::test_openai_chat_completion_streaming_with_n[client_with_models-txt=azure/gpt-5-mini-inference:chat_completion:streaming_02] PASSED [ 92%] tests/integration/inference/test_openai_completion.py::test_inference_store[client_with_models-txt=azure/gpt-5-mini-False] PASSED [ 96%] tests/integration/inference/test_openai_completion.py::test_inference_store_tool_calls[client_with_models-txt=azure/gpt-5-mini-False] PASSED [100%] =========================================== short test summary info ============================================ SKIPPED [3] tests/integration/inference/test_openai_completion.py:63: Model azure/gpt-5-mini hosted by remote::azure doesn't support OpenAI completions. SKIPPED [3] tests/integration/inference/test_openai_completion.py:118: Model azure/gpt-5-mini hosted by remote::azure doesn't support vllm extra_body parameters. SKIPPED [1] tests/integration/inference/test_openai_completion.py:124: Model azure/gpt-5-mini hosted by remote::azure doesn't support chat completion calls with base64 encoded files. ================================== 20 passed, 7 skipped, 2 warnings in 51.77s ================================== ``` Signed-off-by: Sébastien Han --- docs/source/providers/inference/index.md | 1 + .../providers/inference/remote_azure.md | 29 + llama_stack/distributions/ci-tests/build.yaml | 1 + llama_stack/distributions/ci-tests/run.yaml | 7 + .../distributions/starter-gpu/build.yaml | 1 + .../distributions/starter-gpu/run.yaml | 7 + llama_stack/distributions/starter/build.yaml | 1 + llama_stack/distributions/starter/run.yaml | 7 + llama_stack/distributions/starter/starter.py | 18 + llama_stack/providers/registry/inference.py | 15 + .../remote/inference/azure/__init__.py | 15 + .../providers/remote/inference/azure/azure.py | 64 + .../remote/inference/azure/config.py | 63 + .../remote/inference/azure/models.py | 28 + .../inference/test_openai_completion.py | 53 +- .../inference/test_text_inference.py | 3 +- .../recordings/responses/0fda25b9241c.json | 71 + .../recordings/responses/2b2ad549510d.json | 448 ++++ .../recordings/responses/57b67d1b1a36.json | 71 + .../recordings/responses/8752115f8d0c.json | 71 + .../recordings/responses/94d11daee205.json | 1178 +++++++++ .../recordings/responses/9f3d749cc1c8.json | 1150 +++++++++ .../recordings/responses/c791119e6359.json | 98 + .../recordings/responses/d3e27b7234e2.json | 2150 +++++++++++++++++ .../recordings/responses/fb785db7fafd.json | 310 +++ .../recordings/responses/ff3271401fb4.json | 556 +++++ 26 files changed, 6403 insertions(+), 13 deletions(-) create mode 100644 docs/source/providers/inference/remote_azure.md create mode 100644 llama_stack/providers/remote/inference/azure/__init__.py create mode 100644 llama_stack/providers/remote/inference/azure/azure.py create mode 100644 llama_stack/providers/remote/inference/azure/config.py create mode 100644 llama_stack/providers/remote/inference/azure/models.py create mode 100644 tests/integration/recordings/responses/0fda25b9241c.json create mode 100644 tests/integration/recordings/responses/2b2ad549510d.json create mode 100644 tests/integration/recordings/responses/57b67d1b1a36.json create mode 100644 tests/integration/recordings/responses/8752115f8d0c.json create mode 100644 tests/integration/recordings/responses/94d11daee205.json create mode 100644 tests/integration/recordings/responses/9f3d749cc1c8.json create mode 100644 tests/integration/recordings/responses/c791119e6359.json create mode 100644 tests/integration/recordings/responses/d3e27b7234e2.json create mode 100644 tests/integration/recordings/responses/fb785db7fafd.json create mode 100644 tests/integration/recordings/responses/ff3271401fb4.json diff --git a/docs/source/providers/inference/index.md b/docs/source/providers/inference/index.md index b6d215474..c5720daef 100644 --- a/docs/source/providers/inference/index.md +++ b/docs/source/providers/inference/index.md @@ -18,6 +18,7 @@ This section contains documentation for all available providers for the **infere inline_meta-reference inline_sentence-transformers remote_anthropic +remote_azure remote_bedrock remote_cerebras remote_databricks diff --git a/docs/source/providers/inference/remote_azure.md b/docs/source/providers/inference/remote_azure.md new file mode 100644 index 000000000..19f8f418b --- /dev/null +++ b/docs/source/providers/inference/remote_azure.md @@ -0,0 +1,29 @@ +# remote::azure + +## Description + + +Azure OpenAI inference provider for accessing GPT models and other Azure services. +Provider documentation +https://learn.microsoft.com/en-us/azure/ai-foundry/openai/overview + + +## Configuration + +| Field | Type | Required | Default | Description | +|-------|------|----------|---------|-------------| +| `api_key` | `` | No | | Azure API key for Azure | +| `api_base` | `` | No | | Azure API base for Azure (e.g., https://your-resource-name.openai.azure.com) | +| `api_version` | `str \| None` | No | | Azure API version for Azure (e.g., 2024-12-01-preview) | +| `api_type` | `str \| None` | No | azure | Azure API type for Azure (e.g., azure) | + +## Sample Configuration + +```yaml +api_key: ${env.AZURE_API_KEY:=} +api_base: ${env.AZURE_API_BASE:=} +api_version: ${env.AZURE_API_VERSION:=} +api_type: ${env.AZURE_API_TYPE:=} + +``` + diff --git a/llama_stack/distributions/ci-tests/build.yaml b/llama_stack/distributions/ci-tests/build.yaml index 8e6c0bf67..a4d920cd6 100644 --- a/llama_stack/distributions/ci-tests/build.yaml +++ b/llama_stack/distributions/ci-tests/build.yaml @@ -17,6 +17,7 @@ distribution_spec: - provider_type: remote::vertexai - provider_type: remote::groq - provider_type: remote::sambanova + - provider_type: remote::azure - provider_type: inline::sentence-transformers vector_io: - provider_type: inline::faiss diff --git a/llama_stack/distributions/ci-tests/run.yaml b/llama_stack/distributions/ci-tests/run.yaml index 26a677c7a..a478a3872 100644 --- a/llama_stack/distributions/ci-tests/run.yaml +++ b/llama_stack/distributions/ci-tests/run.yaml @@ -81,6 +81,13 @@ providers: config: url: https://api.sambanova.ai/v1 api_key: ${env.SAMBANOVA_API_KEY:=} + - provider_id: ${env.AZURE_API_KEY:+azure} + provider_type: remote::azure + config: + api_key: ${env.AZURE_API_KEY:=} + api_base: ${env.AZURE_API_BASE:=} + api_version: ${env.AZURE_API_VERSION:=} + api_type: ${env.AZURE_API_TYPE:=} - provider_id: sentence-transformers provider_type: inline::sentence-transformers vector_io: diff --git a/llama_stack/distributions/starter-gpu/build.yaml b/llama_stack/distributions/starter-gpu/build.yaml index ff7c58e6f..05a2bf180 100644 --- a/llama_stack/distributions/starter-gpu/build.yaml +++ b/llama_stack/distributions/starter-gpu/build.yaml @@ -18,6 +18,7 @@ distribution_spec: - provider_type: remote::vertexai - provider_type: remote::groq - provider_type: remote::sambanova + - provider_type: remote::azure - provider_type: inline::sentence-transformers vector_io: - provider_type: inline::faiss diff --git a/llama_stack/distributions/starter-gpu/run.yaml b/llama_stack/distributions/starter-gpu/run.yaml index 5d9dfcb27..786506706 100644 --- a/llama_stack/distributions/starter-gpu/run.yaml +++ b/llama_stack/distributions/starter-gpu/run.yaml @@ -81,6 +81,13 @@ providers: config: url: https://api.sambanova.ai/v1 api_key: ${env.SAMBANOVA_API_KEY:=} + - provider_id: ${env.AZURE_API_KEY:+azure} + provider_type: remote::azure + config: + api_key: ${env.AZURE_API_KEY:=} + api_base: ${env.AZURE_API_BASE:=} + api_version: ${env.AZURE_API_VERSION:=} + api_type: ${env.AZURE_API_TYPE:=} - provider_id: sentence-transformers provider_type: inline::sentence-transformers vector_io: diff --git a/llama_stack/distributions/starter/build.yaml b/llama_stack/distributions/starter/build.yaml index e84e528da..2f0cd24fd 100644 --- a/llama_stack/distributions/starter/build.yaml +++ b/llama_stack/distributions/starter/build.yaml @@ -18,6 +18,7 @@ distribution_spec: - provider_type: remote::vertexai - provider_type: remote::groq - provider_type: remote::sambanova + - provider_type: remote::azure - provider_type: inline::sentence-transformers vector_io: - provider_type: inline::faiss diff --git a/llama_stack/distributions/starter/run.yaml b/llama_stack/distributions/starter/run.yaml index a3962b8aa..2814b2ced 100644 --- a/llama_stack/distributions/starter/run.yaml +++ b/llama_stack/distributions/starter/run.yaml @@ -81,6 +81,13 @@ providers: config: url: https://api.sambanova.ai/v1 api_key: ${env.SAMBANOVA_API_KEY:=} + - provider_id: ${env.AZURE_API_KEY:+azure} + provider_type: remote::azure + config: + api_key: ${env.AZURE_API_KEY:=} + api_base: ${env.AZURE_API_BASE:=} + api_version: ${env.AZURE_API_VERSION:=} + api_type: ${env.AZURE_API_TYPE:=} - provider_id: sentence-transformers provider_type: inline::sentence-transformers vector_io: diff --git a/llama_stack/distributions/starter/starter.py b/llama_stack/distributions/starter/starter.py index 2fca52700..c2dfe95ad 100644 --- a/llama_stack/distributions/starter/starter.py +++ b/llama_stack/distributions/starter/starter.py @@ -59,6 +59,7 @@ ENABLED_INFERENCE_PROVIDERS = [ "cerebras", "nvidia", "bedrock", + "azure", ] INFERENCE_PROVIDER_IDS = { @@ -68,6 +69,7 @@ INFERENCE_PROVIDER_IDS = { "cerebras": "${env.CEREBRAS_API_KEY:+cerebras}", "nvidia": "${env.NVIDIA_API_KEY:+nvidia}", "vertexai": "${env.VERTEX_AI_PROJECT:+vertexai}", + "azure": "${env.AZURE_API_KEY:+azure}", } @@ -277,5 +279,21 @@ def get_distribution_template(name: str = "starter") -> DistributionTemplate: "http://localhost:11434", "Ollama URL", ), + "AZURE_API_KEY": ( + "", + "Azure API Key", + ), + "AZURE_API_BASE": ( + "", + "Azure API Base", + ), + "AZURE_API_VERSION": ( + "", + "Azure API Version", + ), + "AZURE_API_TYPE": ( + "azure", + "Azure API Type", + ), }, ) diff --git a/llama_stack/providers/registry/inference.py b/llama_stack/providers/registry/inference.py index 8912560cb..64196152b 100644 --- a/llama_stack/providers/registry/inference.py +++ b/llama_stack/providers/registry/inference.py @@ -295,4 +295,19 @@ Available Models: description="IBM WatsonX inference provider for accessing AI models on IBM's WatsonX platform.", ), ), + remote_provider_spec( + api=Api.inference, + adapter=AdapterSpec( + adapter_type="azure", + pip_packages=["litellm"], + module="llama_stack.providers.remote.inference.azure", + config_class="llama_stack.providers.remote.inference.azure.AzureConfig", + provider_data_validator="llama_stack.providers.remote.inference.azure.config.AzureProviderDataValidator", + description=""" +Azure OpenAI inference provider for accessing GPT models and other Azure services. +Provider documentation +https://learn.microsoft.com/en-us/azure/ai-foundry/openai/overview +""", + ), + ), ] diff --git a/llama_stack/providers/remote/inference/azure/__init__.py b/llama_stack/providers/remote/inference/azure/__init__.py new file mode 100644 index 000000000..87bcaf309 --- /dev/null +++ b/llama_stack/providers/remote/inference/azure/__init__.py @@ -0,0 +1,15 @@ +# Copyright (c) Meta Platforms, Inc. and affiliates. +# All rights reserved. +# +# This source code is licensed under the terms described in the LICENSE file in +# the root directory of this source tree. + +from .config import AzureConfig + + +async def get_adapter_impl(config: AzureConfig, _deps): + from .azure import AzureInferenceAdapter + + impl = AzureInferenceAdapter(config) + await impl.initialize() + return impl diff --git a/llama_stack/providers/remote/inference/azure/azure.py b/llama_stack/providers/remote/inference/azure/azure.py new file mode 100644 index 000000000..449bbbb1c --- /dev/null +++ b/llama_stack/providers/remote/inference/azure/azure.py @@ -0,0 +1,64 @@ +# Copyright (c) Meta Platforms, Inc. and affiliates. +# All rights reserved. +# +# This source code is licensed under the terms described in the LICENSE file in +# the root directory of this source tree. + +from typing import Any +from urllib.parse import urljoin + +from llama_stack.apis.inference import ChatCompletionRequest +from llama_stack.providers.utils.inference.litellm_openai_mixin import ( + LiteLLMOpenAIMixin, +) +from llama_stack.providers.utils.inference.openai_mixin import OpenAIMixin + +from .config import AzureConfig +from .models import MODEL_ENTRIES + + +class AzureInferenceAdapter(OpenAIMixin, LiteLLMOpenAIMixin): + def __init__(self, config: AzureConfig) -> None: + LiteLLMOpenAIMixin.__init__( + self, + MODEL_ENTRIES, + litellm_provider_name="azure", + api_key_from_config=config.api_key.get_secret_value(), + provider_data_api_key_field="azure_api_key", + openai_compat_api_base=str(config.api_base), + ) + self.config = config + + # Delegate the client data handling get_api_key method to LiteLLMOpenAIMixin + get_api_key = LiteLLMOpenAIMixin.get_api_key + + def get_base_url(self) -> str: + """ + Get the Azure API base URL. + + Returns the Azure API base URL from the configuration. + """ + return urljoin(str(self.config.api_base), "/openai/v1") + + async def _get_params(self, request: ChatCompletionRequest) -> dict[str, Any]: + # Get base parameters from parent + params = await super()._get_params(request) + + # Add Azure specific parameters + provider_data = self.get_request_provider_data() + if provider_data: + if getattr(provider_data, "azure_api_key", None): + params["api_key"] = provider_data.azure_api_key + if getattr(provider_data, "azure_api_base", None): + params["api_base"] = provider_data.azure_api_base + if getattr(provider_data, "azure_api_version", None): + params["api_version"] = provider_data.azure_api_version + if getattr(provider_data, "azure_api_type", None): + params["api_type"] = provider_data.azure_api_type + else: + params["api_key"] = self.config.api_key.get_secret_value() + params["api_base"] = str(self.config.api_base) + params["api_version"] = self.config.api_version + params["api_type"] = self.config.api_type + + return params diff --git a/llama_stack/providers/remote/inference/azure/config.py b/llama_stack/providers/remote/inference/azure/config.py new file mode 100644 index 000000000..fe9d61d53 --- /dev/null +++ b/llama_stack/providers/remote/inference/azure/config.py @@ -0,0 +1,63 @@ +# Copyright (c) Meta Platforms, Inc. and affiliates. +# All rights reserved. +# +# This source code is licensed under the terms described in the LICENSE file in +# the root directory of this source tree. + +import os +from typing import Any + +from pydantic import BaseModel, Field, HttpUrl, SecretStr + +from llama_stack.schema_utils import json_schema_type + + +class AzureProviderDataValidator(BaseModel): + azure_api_key: SecretStr = Field( + description="Azure API key for Azure", + ) + azure_api_base: HttpUrl = Field( + description="Azure API base for Azure (e.g., https://your-resource-name.openai.azure.com)", + ) + azure_api_version: str | None = Field( + default=None, + description="Azure API version for Azure (e.g., 2024-06-01)", + ) + azure_api_type: str | None = Field( + default="azure", + description="Azure API type for Azure (e.g., azure)", + ) + + +@json_schema_type +class AzureConfig(BaseModel): + api_key: SecretStr = Field( + description="Azure API key for Azure", + ) + api_base: HttpUrl = Field( + description="Azure API base for Azure (e.g., https://your-resource-name.openai.azure.com)", + ) + api_version: str | None = Field( + default_factory=lambda: os.getenv("AZURE_API_VERSION"), + description="Azure API version for Azure (e.g., 2024-12-01-preview)", + ) + api_type: str | None = Field( + default_factory=lambda: os.getenv("AZURE_API_TYPE", "azure"), + description="Azure API type for Azure (e.g., azure)", + ) + + @classmethod + def sample_run_config( + cls, + api_key: str = "${env.AZURE_API_KEY:=}", + api_base: str = "${env.AZURE_API_BASE:=}", + api_version: str = "${env.AZURE_API_VERSION:=}", + api_type: str = "${env.AZURE_API_TYPE:=}", + **kwargs, + ) -> dict[str, Any]: + return { + "api_key": api_key, + "api_base": api_base, + "api_version": api_version, + "api_type": api_type, + } diff --git a/llama_stack/providers/remote/inference/azure/models.py b/llama_stack/providers/remote/inference/azure/models.py new file mode 100644 index 000000000..64c87969b --- /dev/null +++ b/llama_stack/providers/remote/inference/azure/models.py @@ -0,0 +1,28 @@ +# Copyright (c) Meta Platforms, Inc. and affiliates. +# All rights reserved. +# +# This source code is licensed under the terms described in the LICENSE file in +# the root directory of this source tree. + +from llama_stack.providers.utils.inference.model_registry import ( + ProviderModelEntry, +) + +# https://learn.microsoft.com/en-us/azure/ai-foundry/openai/concepts/models?tabs=global-standard%2Cstandard-chat-completions +LLM_MODEL_IDS = [ + "gpt-5", + "gpt-5-mini", + "gpt-5-nano", + "gpt-5-chat", + "o1", + "o1-mini", + "o3-mini", + "o4-mini", + "gpt-4.1", + "gpt-4.1-mini", + "gpt-4.1-nano", +] + +SAFETY_MODELS_ENTRIES = list[ProviderModelEntry]() + +MODEL_ENTRIES = [ProviderModelEntry(provider_model_id=m) for m in LLM_MODEL_IDS] + SAFETY_MODELS_ENTRIES diff --git a/tests/integration/inference/test_openai_completion.py b/tests/integration/inference/test_openai_completion.py index f9c837ebd..22dec8876 100644 --- a/tests/integration/inference/test_openai_completion.py +++ b/tests/integration/inference/test_openai_completion.py @@ -6,12 +6,25 @@ import time +import unicodedata import pytest from ..test_cases.test_case import TestCase +def _normalize_text(text: str) -> str: + """ + Normalize Unicode text by removing diacritical marks for comparison. + + The test case streaming_01 expects the answer "Sol" for the question "What's the name of the Sun + in latin?", but the model is returning "sōl" (with a macron over the 'o'), which is the correct + Latin spelling. The test is failing because it's doing a simple case-insensitive string search + for "sol" but the actual response contains the diacritical mark. + """ + return unicodedata.normalize("NFD", text).encode("ascii", "ignore").decode("ascii").lower() + + def provider_from_model(client_with_models, model_id): models = {m.identifier: m for m in client_with_models.models.list()} models.update({m.provider_resource_id: m for m in client_with_models.models.list()}) @@ -42,6 +55,10 @@ def skip_if_model_doesnt_support_openai_completion(client_with_models, model_id) "remote::groq", "remote::gemini", # https://generativelanguage.googleapis.com/v1beta/openai/completions -> 404 "remote::anthropic", # at least claude-3-{5,7}-{haiku,sonnet}-* / claude-{sonnet,opus}-4-* are not supported + "remote::azure", # {'error': {'code': 'OperationNotSupported', 'message': 'The completion operation + # does not work with the specified model, gpt-5-mini. Please choose different model and try + # again. You can learn more about which models can be used with each operation here: + # https://go.microsoft.com/fwlink/?linkid=2197993.'}}"} ): pytest.skip(f"Model {model_id} hosted by {provider.provider_type} doesn't support OpenAI completions.") @@ -157,7 +174,8 @@ def test_openai_completion_non_streaming_suffix(llama_stack_client, client_with_ assert len(response.choices) > 0 choice = response.choices[0] assert len(choice.text) > 5 - assert "france" in choice.text.lower() + normalized_text = _normalize_text(choice.text) + assert "france" in normalized_text @pytest.mark.parametrize( @@ -248,7 +266,9 @@ def test_openai_chat_completion_non_streaming(compat_client, client_with_models, ) message_content = response.choices[0].message.content.lower().strip() assert len(message_content) > 0 - assert expected.lower() in message_content + normalized_expected = _normalize_text(expected) + normalized_content = _normalize_text(message_content) + assert normalized_expected in normalized_content @pytest.mark.parametrize( @@ -272,10 +292,13 @@ def test_openai_chat_completion_streaming(compat_client, client_with_models, tex ) streamed_content = [] for chunk in response: - if chunk.choices[0].delta.content: + # On some providers like Azure, the choices are empty on the first chunk, so we need to check for that + if chunk.choices and len(chunk.choices) > 0 and chunk.choices[0].delta.content: streamed_content.append(chunk.choices[0].delta.content.lower().strip()) assert len(streamed_content) > 0 - assert expected.lower() in "".join(streamed_content) + normalized_expected = _normalize_text(expected) + normalized_content = _normalize_text("".join(streamed_content)) + assert normalized_expected in normalized_content @pytest.mark.parametrize( @@ -308,8 +331,12 @@ def test_openai_chat_completion_streaming_with_n(compat_client, client_with_mode streamed_content.get(choice.index, "") + choice.delta.content.lower().strip() ) assert len(streamed_content) == 2 + normalized_expected = _normalize_text(expected) for i, content in streamed_content.items(): - assert expected.lower() in content, f"Choice {i}: Expected {expected.lower()} in {content}" + normalized_content = _normalize_text(content) + assert normalized_expected in normalized_content, ( + f"Choice {i}: Expected {normalized_expected} in {normalized_content}" + ) @pytest.mark.parametrize( @@ -339,9 +366,9 @@ def test_inference_store(compat_client, client_with_models, text_model_id, strea content = "" response_id = None for chunk in response: - if response_id is None: + if response_id is None and chunk.id: response_id = chunk.id - if chunk.choices[0].delta.content: + if chunk.choices and len(chunk.choices) > 0 and chunk.choices[0].delta.content: content += chunk.choices[0].delta.content else: response_id = response.id @@ -410,11 +437,12 @@ def test_inference_store_tool_calls(compat_client, client_with_models, text_mode content = "" response_id = None for chunk in response: - if response_id is None: + if response_id is None and chunk.id: response_id = chunk.id - if delta := chunk.choices[0].delta: - if delta.content: - content += delta.content + if chunk.choices and len(chunk.choices) > 0: + if delta := chunk.choices[0].delta: + if delta.content: + content += delta.content else: response_id = response.id content = response.choices[0].message.content @@ -484,4 +512,5 @@ def test_openai_chat_completion_non_streaming_with_file(openai_client, client_wi stream=False, ) message_content = response.choices[0].message.content.lower().strip() - assert "hello world" in message_content + normalized_content = _normalize_text(message_content) + assert "hello world" in normalized_content diff --git a/tests/integration/inference/test_text_inference.py b/tests/integration/inference/test_text_inference.py index d7ffe5929..621084231 100644 --- a/tests/integration/inference/test_text_inference.py +++ b/tests/integration/inference/test_text_inference.py @@ -32,6 +32,7 @@ def skip_if_model_doesnt_support_completion(client_with_models, model_id): "remote::vertexai", "remote::groq", "remote::sambanova", + "remote::azure", ) or "openai-compat" in provider.provider_type ): @@ -44,7 +45,7 @@ def skip_if_model_doesnt_support_json_schema_structured_output(client_with_model provider_id = models[model_id].provider_id providers = {p.provider_id: p for p in client_with_models.providers.list()} provider = providers[provider_id] - if provider.provider_type in ("remote::sambanova",): + if provider.provider_type in ("remote::sambanova", "remote::azure"): pytest.skip( f"Model {model_id} hosted by {provider.provider_type} doesn't support json_schema structured output" ) diff --git a/tests/integration/recordings/responses/0fda25b9241c.json b/tests/integration/recordings/responses/0fda25b9241c.json new file mode 100644 index 000000000..b97ee1670 --- /dev/null +++ b/tests/integration/recordings/responses/0fda25b9241c.json @@ -0,0 +1,71 @@ +{ + "request": { + "method": "POST", + "url": "https://shan-mfbb618r-eastus2.cognitiveservices.azure.com/openai/v1/v1/chat/completions", + "headers": {}, + "body": { + "model": "gpt-5-mini", + "messages": [ + { + "role": "user", + "content": "Which planet do humans live on?" + } + ], + "stream": false + }, + "endpoint": "/v1/chat/completions", + "model": "gpt-5-mini" + }, + "response": { + "body": { + "__type__": "openai.types.chat.chat_completion.ChatCompletion", + "__data__": { + "id": "chatcmpl-CECIXqfvjuluKkZtG3q2QJoSQhBU0", + "choices": [ + { + "finish_reason": "stop", + "index": 0, + "logprobs": null, + "message": { + "content": "Humans live on Earth \u2014 the third planet from the Sun. It's the only known planet that naturally supports life, with a breathable atmosphere, liquid water, and temperatures suitable for living organisms.", + "refusal": null, + "role": "assistant", + "annotations": [], + "audio": null, + "function_call": null, + "tool_calls": null + }, + "content_filter_results": {} + } + ], + "created": 1757499901, + "model": "gpt-5-mini-2025-08-07", + "object": "chat.completion", + "service_tier": null, + "system_fingerprint": null, + "usage": { + "completion_tokens": 112, + "prompt_tokens": 13, + "total_tokens": 125, + "completion_tokens_details": { + "accepted_prediction_tokens": 0, + "audio_tokens": 0, + "reasoning_tokens": 64, + "rejected_prediction_tokens": 0 + }, + "prompt_tokens_details": { + "audio_tokens": 0, + "cached_tokens": 0 + } + }, + "prompt_filter_results": [ + { + "prompt_index": 0, + "content_filter_results": {} + } + ] + } + }, + "is_streaming": false + } +} diff --git a/tests/integration/recordings/responses/2b2ad549510d.json b/tests/integration/recordings/responses/2b2ad549510d.json new file mode 100644 index 000000000..55a9d6426 --- /dev/null +++ b/tests/integration/recordings/responses/2b2ad549510d.json @@ -0,0 +1,448 @@ +{ + "request": { + "method": "POST", + "url": "https://shan-mfbb618r-eastus2.cognitiveservices.azure.com/openai/v1/v1/chat/completions", + "headers": {}, + "body": { + "model": "gpt-5-mini", + "messages": [ + { + "role": "user", + "content": "Hello, world!" + } + ], + "stream": true + }, + "endpoint": "/v1/chat/completions", + "model": "gpt-5-mini" + }, + "response": { + "body": [ + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "", + "choices": [], + "created": 0, + "model": "", + "object": "", + "service_tier": null, + "system_fingerprint": null, + "usage": null, + "prompt_filter_results": [ + { + "prompt_index": 0, + "content_filter_results": {} + } + ] + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "chatcmpl-CECIgeXOClAuSm8xHAS6CYQ87lB8O", + "choices": [ + { + "delta": { + "content": "", + "function_call": null, + "refusal": null, + "role": "assistant", + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null, + "content_filter_results": {} + } + ], + "created": 1757499910, + "model": "gpt-5-mini-2025-08-07", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": null, + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "chatcmpl-CECIgeXOClAuSm8xHAS6CYQ87lB8O", + "choices": [ + { + "delta": { + "content": "Hello", + "function_call": null, + "refusal": null, + "role": null, + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null, + "content_filter_results": {} + } + ], + "created": 1757499910, + "model": "gpt-5-mini-2025-08-07", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": null, + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "chatcmpl-CECIgeXOClAuSm8xHAS6CYQ87lB8O", + "choices": [ + { + "delta": { + "content": ",", + "function_call": null, + "refusal": null, + "role": null, + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null, + "content_filter_results": {} + } + ], + "created": 1757499910, + "model": "gpt-5-mini-2025-08-07", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": null, + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "chatcmpl-CECIgeXOClAuSm8xHAS6CYQ87lB8O", + "choices": [ + { + "delta": { + "content": " world", + "function_call": null, + "refusal": null, + "role": null, + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null, + "content_filter_results": {} + } + ], + "created": 1757499910, + "model": "gpt-5-mini-2025-08-07", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": null, + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "chatcmpl-CECIgeXOClAuSm8xHAS6CYQ87lB8O", + "choices": [ + { + "delta": { + "content": "!", + "function_call": null, + "refusal": null, + "role": null, + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null, + "content_filter_results": {} + } + ], + "created": 1757499910, + "model": "gpt-5-mini-2025-08-07", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": null, + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "chatcmpl-CECIgeXOClAuSm8xHAS6CYQ87lB8O", + "choices": [ + { + "delta": { + "content": " Hi", + "function_call": null, + "refusal": null, + "role": null, + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null, + "content_filter_results": {} + } + ], + "created": 1757499910, + "model": "gpt-5-mini-2025-08-07", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": null, + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "chatcmpl-CECIgeXOClAuSm8xHAS6CYQ87lB8O", + "choices": [ + { + "delta": { + "content": " \u2014", + "function_call": null, + "refusal": null, + "role": null, + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null, + "content_filter_results": {} + } + ], + "created": 1757499910, + "model": "gpt-5-mini-2025-08-07", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": null, + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "chatcmpl-CECIgeXOClAuSm8xHAS6CYQ87lB8O", + "choices": [ + { + "delta": { + "content": " how", + "function_call": null, + "refusal": null, + "role": null, + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null, + "content_filter_results": {} + } + ], + "created": 1757499910, + "model": "gpt-5-mini-2025-08-07", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": null, + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "chatcmpl-CECIgeXOClAuSm8xHAS6CYQ87lB8O", + "choices": [ + { + "delta": { + "content": " can", + "function_call": null, + "refusal": null, + "role": null, + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null, + "content_filter_results": {} + } + ], + "created": 1757499910, + "model": "gpt-5-mini-2025-08-07", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": null, + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "chatcmpl-CECIgeXOClAuSm8xHAS6CYQ87lB8O", + "choices": [ + { + "delta": { + "content": " I", + "function_call": null, + "refusal": null, + "role": null, + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null, + "content_filter_results": {} + } + ], + "created": 1757499910, + "model": "gpt-5-mini-2025-08-07", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": null, + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "chatcmpl-CECIgeXOClAuSm8xHAS6CYQ87lB8O", + "choices": [ + { + "delta": { + "content": " help", + "function_call": null, + "refusal": null, + "role": null, + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null, + "content_filter_results": {} + } + ], + "created": 1757499910, + "model": "gpt-5-mini-2025-08-07", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": null, + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "chatcmpl-CECIgeXOClAuSm8xHAS6CYQ87lB8O", + "choices": [ + { + "delta": { + "content": " you", + "function_call": null, + "refusal": null, + "role": null, + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null, + "content_filter_results": {} + } + ], + "created": 1757499910, + "model": "gpt-5-mini-2025-08-07", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": null, + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "chatcmpl-CECIgeXOClAuSm8xHAS6CYQ87lB8O", + "choices": [ + { + "delta": { + "content": " today", + "function_call": null, + "refusal": null, + "role": null, + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null, + "content_filter_results": {} + } + ], + "created": 1757499910, + "model": "gpt-5-mini-2025-08-07", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": null, + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "chatcmpl-CECIgeXOClAuSm8xHAS6CYQ87lB8O", + "choices": [ + { + "delta": { + "content": "?", + "function_call": null, + "refusal": null, + "role": null, + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null, + "content_filter_results": {} + } + ], + "created": 1757499910, + "model": "gpt-5-mini-2025-08-07", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": null, + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "chatcmpl-CECIgeXOClAuSm8xHAS6CYQ87lB8O", + "choices": [ + { + "delta": { + "content": null, + "function_call": null, + "refusal": null, + "role": null, + "tool_calls": null + }, + "finish_reason": "stop", + "index": 0, + "logprobs": null, + "content_filter_results": {} + } + ], + "created": 1757499910, + "model": "gpt-5-mini-2025-08-07", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": null, + "usage": null + } + } + ], + "is_streaming": true + } +} diff --git a/tests/integration/recordings/responses/57b67d1b1a36.json b/tests/integration/recordings/responses/57b67d1b1a36.json new file mode 100644 index 000000000..14de1d85e --- /dev/null +++ b/tests/integration/recordings/responses/57b67d1b1a36.json @@ -0,0 +1,71 @@ +{ + "request": { + "method": "POST", + "url": "https://shan-mfbb618r-eastus2.cognitiveservices.azure.com/openai/v1/v1/chat/completions", + "headers": {}, + "body": { + "model": "gpt-5-mini", + "messages": [ + { + "role": "user", + "content": "Which planet has rings around it with a name starting with letter S?" + } + ], + "stream": false + }, + "endpoint": "/v1/chat/completions", + "model": "gpt-5-mini" + }, + "response": { + "body": { + "__type__": "openai.types.chat.chat_completion.ChatCompletion", + "__data__": { + "id": "chatcmpl-CECIkT5cbqFazpungtewksVePcUNa", + "choices": [ + { + "finish_reason": "stop", + "index": 0, + "logprobs": null, + "message": { + "content": "Saturn. It's the planet famous for its prominent ring system made of ice and rock.", + "refusal": null, + "role": "assistant", + "annotations": [], + "audio": null, + "function_call": null, + "tool_calls": null + }, + "content_filter_results": {} + } + ], + "created": 1757499914, + "model": "gpt-5-mini-2025-08-07", + "object": "chat.completion", + "service_tier": null, + "system_fingerprint": null, + "usage": { + "completion_tokens": 156, + "prompt_tokens": 20, + "total_tokens": 176, + "completion_tokens_details": { + "accepted_prediction_tokens": 0, + "audio_tokens": 0, + "reasoning_tokens": 128, + "rejected_prediction_tokens": 0 + }, + "prompt_tokens_details": { + "audio_tokens": 0, + "cached_tokens": 0 + } + }, + "prompt_filter_results": [ + { + "prompt_index": 0, + "content_filter_results": {} + } + ] + } + }, + "is_streaming": false + } +} diff --git a/tests/integration/recordings/responses/8752115f8d0c.json b/tests/integration/recordings/responses/8752115f8d0c.json new file mode 100644 index 000000000..0e88bbfa6 --- /dev/null +++ b/tests/integration/recordings/responses/8752115f8d0c.json @@ -0,0 +1,71 @@ +{ + "request": { + "method": "POST", + "url": "https://shan-mfbb618r-eastus2.cognitiveservices.azure.com/openai/v1/v1/chat/completions", + "headers": {}, + "body": { + "model": "gpt-5-mini", + "messages": [ + { + "role": "user", + "content": "Hello, world!" + } + ], + "stream": false + }, + "endpoint": "/v1/chat/completions", + "model": "gpt-5-mini" + }, + "response": { + "body": { + "__type__": "openai.types.chat.chat_completion.ChatCompletion", + "__data__": { + "id": "chatcmpl-CECIuyylsMNXspa83k8LrD8SQadNY", + "choices": [ + { + "finish_reason": "stop", + "index": 0, + "logprobs": null, + "message": { + "content": "Hello! \ud83d\udc4b How can I help you today \u2014 answer a question, write or edit something, debug code, brainstorm ideas, or anything else?", + "refusal": null, + "role": "assistant", + "annotations": [], + "audio": null, + "function_call": null, + "tool_calls": null + }, + "content_filter_results": {} + } + ], + "created": 1757499924, + "model": "gpt-5-mini-2025-08-07", + "object": "chat.completion", + "service_tier": null, + "system_fingerprint": null, + "usage": { + "completion_tokens": 40, + "prompt_tokens": 10, + "total_tokens": 50, + "completion_tokens_details": { + "accepted_prediction_tokens": 0, + "audio_tokens": 0, + "reasoning_tokens": 0, + "rejected_prediction_tokens": 0 + }, + "prompt_tokens_details": { + "audio_tokens": 0, + "cached_tokens": 0 + } + }, + "prompt_filter_results": [ + { + "prompt_index": 0, + "content_filter_results": {} + } + ] + } + }, + "is_streaming": false + } +} diff --git a/tests/integration/recordings/responses/94d11daee205.json b/tests/integration/recordings/responses/94d11daee205.json new file mode 100644 index 000000000..b6a6c3d68 --- /dev/null +++ b/tests/integration/recordings/responses/94d11daee205.json @@ -0,0 +1,1178 @@ +{ + "request": { + "method": "POST", + "url": "https://shan-mfbb618r-eastus2.cognitiveservices.azure.com/openai/v1/v1/chat/completions", + "headers": {}, + "body": { + "model": "gpt-5-mini", + "messages": [ + { + "role": "user", + "content": "What is the name of the US captial?" + } + ], + "n": 2, + "stream": true + }, + "endpoint": "/v1/chat/completions", + "model": "gpt-5-mini" + }, + "response": { + "body": [ + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "", + "choices": [], + "created": 0, + "model": "", + "object": "", + "service_tier": null, + "system_fingerprint": null, + "usage": null, + "prompt_filter_results": [ + { + "prompt_index": 0, + "content_filter_results": {} + } + ] + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "chatcmpl-CECIpbpLN9VO3z9pVAidTRslxRHtL", + "choices": [ + { + "delta": { + "content": "", + "function_call": null, + "refusal": null, + "role": "assistant", + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null, + "content_filter_results": {} + } + ], + "created": 1757499919, + "model": "gpt-5-mini-2025-08-07", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": null, + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "chatcmpl-CECIpbpLN9VO3z9pVAidTRslxRHtL", + "choices": [ + { + "delta": { + "content": "", + "function_call": null, + "refusal": null, + "role": "assistant", + "tool_calls": null + }, + "finish_reason": null, + "index": 1, + "logprobs": null, + "content_filter_results": {} + } + ], + "created": 1757499919, + "model": "gpt-5-mini-2025-08-07", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": null, + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "chatcmpl-CECIpbpLN9VO3z9pVAidTRslxRHtL", + "choices": [ + { + "delta": { + "content": "The", + "function_call": null, + "refusal": null, + "role": null, + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null, + "content_filter_results": {} + } + ], + "created": 1757499919, + "model": "gpt-5-mini-2025-08-07", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": null, + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "chatcmpl-CECIpbpLN9VO3z9pVAidTRslxRHtL", + "choices": [ + { + "delta": { + "content": " capital", + "function_call": null, + "refusal": null, + "role": null, + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null, + "content_filter_results": {} + } + ], + "created": 1757499919, + "model": "gpt-5-mini-2025-08-07", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": null, + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "chatcmpl-CECIpbpLN9VO3z9pVAidTRslxRHtL", + "choices": [ + { + "delta": { + "content": " of", + "function_call": null, + "refusal": null, + "role": null, + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null, + "content_filter_results": {} + } + ], + "created": 1757499919, + "model": "gpt-5-mini-2025-08-07", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": null, + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "chatcmpl-CECIpbpLN9VO3z9pVAidTRslxRHtL", + "choices": [ + { + "delta": { + "content": " the", + "function_call": null, + "refusal": null, + "role": null, + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null, + "content_filter_results": {} + } + ], + "created": 1757499919, + "model": "gpt-5-mini-2025-08-07", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": null, + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "chatcmpl-CECIpbpLN9VO3z9pVAidTRslxRHtL", + "choices": [ + { + "delta": { + "content": " United", + "function_call": null, + "refusal": null, + "role": null, + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null, + "content_filter_results": {} + } + ], + "created": 1757499919, + "model": "gpt-5-mini-2025-08-07", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": null, + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "chatcmpl-CECIpbpLN9VO3z9pVAidTRslxRHtL", + "choices": [ + { + "delta": { + "content": " States", + "function_call": null, + "refusal": null, + "role": null, + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null, + "content_filter_results": {} + } + ], + "created": 1757499919, + "model": "gpt-5-mini-2025-08-07", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": null, + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "chatcmpl-CECIpbpLN9VO3z9pVAidTRslxRHtL", + "choices": [ + { + "delta": { + "content": "The", + "function_call": null, + "refusal": null, + "role": null, + "tool_calls": null + }, + "finish_reason": null, + "index": 1, + "logprobs": null, + "content_filter_results": {} + } + ], + "created": 1757499919, + "model": "gpt-5-mini-2025-08-07", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": null, + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "chatcmpl-CECIpbpLN9VO3z9pVAidTRslxRHtL", + "choices": [ + { + "delta": { + "content": " capital", + "function_call": null, + "refusal": null, + "role": null, + "tool_calls": null + }, + "finish_reason": null, + "index": 1, + "logprobs": null, + "content_filter_results": {} + } + ], + "created": 1757499919, + "model": "gpt-5-mini-2025-08-07", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": null, + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "chatcmpl-CECIpbpLN9VO3z9pVAidTRslxRHtL", + "choices": [ + { + "delta": { + "content": " of", + "function_call": null, + "refusal": null, + "role": null, + "tool_calls": null + }, + "finish_reason": null, + "index": 1, + "logprobs": null, + "content_filter_results": {} + } + ], + "created": 1757499919, + "model": "gpt-5-mini-2025-08-07", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": null, + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "chatcmpl-CECIpbpLN9VO3z9pVAidTRslxRHtL", + "choices": [ + { + "delta": { + "content": " the", + "function_call": null, + "refusal": null, + "role": null, + "tool_calls": null + }, + "finish_reason": null, + "index": 1, + "logprobs": null, + "content_filter_results": {} + } + ], + "created": 1757499919, + "model": "gpt-5-mini-2025-08-07", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": null, + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "chatcmpl-CECIpbpLN9VO3z9pVAidTRslxRHtL", + "choices": [ + { + "delta": { + "content": " United", + "function_call": null, + "refusal": null, + "role": null, + "tool_calls": null + }, + "finish_reason": null, + "index": 1, + "logprobs": null, + "content_filter_results": {} + } + ], + "created": 1757499919, + "model": "gpt-5-mini-2025-08-07", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": null, + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "chatcmpl-CECIpbpLN9VO3z9pVAidTRslxRHtL", + "choices": [ + { + "delta": { + "content": " is", + "function_call": null, + "refusal": null, + "role": null, + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null, + "content_filter_results": {} + } + ], + "created": 1757499919, + "model": "gpt-5-mini-2025-08-07", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": null, + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "chatcmpl-CECIpbpLN9VO3z9pVAidTRslxRHtL", + "choices": [ + { + "delta": { + "content": " States", + "function_call": null, + "refusal": null, + "role": null, + "tool_calls": null + }, + "finish_reason": null, + "index": 1, + "logprobs": null, + "content_filter_results": {} + } + ], + "created": 1757499919, + "model": "gpt-5-mini-2025-08-07", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": null, + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "chatcmpl-CECIpbpLN9VO3z9pVAidTRslxRHtL", + "choices": [ + { + "delta": { + "content": " Washington", + "function_call": null, + "refusal": null, + "role": null, + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null, + "content_filter_results": {} + } + ], + "created": 1757499919, + "model": "gpt-5-mini-2025-08-07", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": null, + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "chatcmpl-CECIpbpLN9VO3z9pVAidTRslxRHtL", + "choices": [ + { + "delta": { + "content": " is", + "function_call": null, + "refusal": null, + "role": null, + "tool_calls": null + }, + "finish_reason": null, + "index": 1, + "logprobs": null, + "content_filter_results": {} + } + ], + "created": 1757499919, + "model": "gpt-5-mini-2025-08-07", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": null, + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "chatcmpl-CECIpbpLN9VO3z9pVAidTRslxRHtL", + "choices": [ + { + "delta": { + "content": ",", + "function_call": null, + "refusal": null, + "role": null, + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null, + "content_filter_results": {} + } + ], + "created": 1757499919, + "model": "gpt-5-mini-2025-08-07", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": null, + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "chatcmpl-CECIpbpLN9VO3z9pVAidTRslxRHtL", + "choices": [ + { + "delta": { + "content": " Washington", + "function_call": null, + "refusal": null, + "role": null, + "tool_calls": null + }, + "finish_reason": null, + "index": 1, + "logprobs": null, + "content_filter_results": {} + } + ], + "created": 1757499919, + "model": "gpt-5-mini-2025-08-07", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": null, + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "chatcmpl-CECIpbpLN9VO3z9pVAidTRslxRHtL", + "choices": [ + { + "delta": { + "content": " D", + "function_call": null, + "refusal": null, + "role": null, + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null, + "content_filter_results": {} + } + ], + "created": 1757499919, + "model": "gpt-5-mini-2025-08-07", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": null, + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "chatcmpl-CECIpbpLN9VO3z9pVAidTRslxRHtL", + "choices": [ + { + "delta": { + "content": ",", + "function_call": null, + "refusal": null, + "role": null, + "tool_calls": null + }, + "finish_reason": null, + "index": 1, + "logprobs": null, + "content_filter_results": {} + } + ], + "created": 1757499919, + "model": "gpt-5-mini-2025-08-07", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": null, + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "chatcmpl-CECIpbpLN9VO3z9pVAidTRslxRHtL", + "choices": [ + { + "delta": { + "content": ".C", + "function_call": null, + "refusal": null, + "role": null, + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null, + "content_filter_results": {} + } + ], + "created": 1757499919, + "model": "gpt-5-mini-2025-08-07", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": null, + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "chatcmpl-CECIpbpLN9VO3z9pVAidTRslxRHtL", + "choices": [ + { + "delta": { + "content": " D", + "function_call": null, + "refusal": null, + "role": null, + "tool_calls": null + }, + "finish_reason": null, + "index": 1, + "logprobs": null, + "content_filter_results": {} + } + ], + "created": 1757499919, + "model": "gpt-5-mini-2025-08-07", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": null, + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "chatcmpl-CECIpbpLN9VO3z9pVAidTRslxRHtL", + "choices": [ + { + "delta": { + "content": ".", + "function_call": null, + "refusal": null, + "role": null, + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null, + "content_filter_results": {} + } + ], + "created": 1757499919, + "model": "gpt-5-mini-2025-08-07", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": null, + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "chatcmpl-CECIpbpLN9VO3z9pVAidTRslxRHtL", + "choices": [ + { + "delta": { + "content": ".C", + "function_call": null, + "refusal": null, + "role": null, + "tool_calls": null + }, + "finish_reason": null, + "index": 1, + "logprobs": null, + "content_filter_results": {} + } + ], + "created": 1757499919, + "model": "gpt-5-mini-2025-08-07", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": null, + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "chatcmpl-CECIpbpLN9VO3z9pVAidTRslxRHtL", + "choices": [ + { + "delta": { + "content": " (", + "function_call": null, + "refusal": null, + "role": null, + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null, + "content_filter_results": {} + } + ], + "created": 1757499919, + "model": "gpt-5-mini-2025-08-07", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": null, + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "chatcmpl-CECIpbpLN9VO3z9pVAidTRslxRHtL", + "choices": [ + { + "delta": { + "content": ".", + "function_call": null, + "refusal": null, + "role": null, + "tool_calls": null + }, + "finish_reason": null, + "index": 1, + "logprobs": null, + "content_filter_results": {} + } + ], + "created": 1757499919, + "model": "gpt-5-mini-2025-08-07", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": null, + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "chatcmpl-CECIpbpLN9VO3z9pVAidTRslxRHtL", + "choices": [ + { + "delta": { + "content": "the", + "function_call": null, + "refusal": null, + "role": null, + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null, + "content_filter_results": {} + } + ], + "created": 1757499919, + "model": "gpt-5-mini-2025-08-07", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": null, + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "chatcmpl-CECIpbpLN9VO3z9pVAidTRslxRHtL", + "choices": [ + { + "delta": { + "content": " (", + "function_call": null, + "refusal": null, + "role": null, + "tool_calls": null + }, + "finish_reason": null, + "index": 1, + "logprobs": null, + "content_filter_results": {} + } + ], + "created": 1757499919, + "model": "gpt-5-mini-2025-08-07", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": null, + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "chatcmpl-CECIpbpLN9VO3z9pVAidTRslxRHtL", + "choices": [ + { + "delta": { + "content": " District", + "function_call": null, + "refusal": null, + "role": null, + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null, + "content_filter_results": {} + } + ], + "created": 1757499919, + "model": "gpt-5-mini-2025-08-07", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": null, + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "chatcmpl-CECIpbpLN9VO3z9pVAidTRslxRHtL", + "choices": [ + { + "delta": { + "content": "official", + "function_call": null, + "refusal": null, + "role": null, + "tool_calls": null + }, + "finish_reason": null, + "index": 1, + "logprobs": null, + "content_filter_results": {} + } + ], + "created": 1757499919, + "model": "gpt-5-mini-2025-08-07", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": null, + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "chatcmpl-CECIpbpLN9VO3z9pVAidTRslxRHtL", + "choices": [ + { + "delta": { + "content": " of", + "function_call": null, + "refusal": null, + "role": null, + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null, + "content_filter_results": {} + } + ], + "created": 1757499919, + "model": "gpt-5-mini-2025-08-07", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": null, + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "chatcmpl-CECIpbpLN9VO3z9pVAidTRslxRHtL", + "choices": [ + { + "delta": { + "content": "ly", + "function_call": null, + "refusal": null, + "role": null, + "tool_calls": null + }, + "finish_reason": null, + "index": 1, + "logprobs": null, + "content_filter_results": {} + } + ], + "created": 1757499919, + "model": "gpt-5-mini-2025-08-07", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": null, + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "chatcmpl-CECIpbpLN9VO3z9pVAidTRslxRHtL", + "choices": [ + { + "delta": { + "content": " Columbia", + "function_call": null, + "refusal": null, + "role": null, + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null, + "content_filter_results": {} + } + ], + "created": 1757499919, + "model": "gpt-5-mini-2025-08-07", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": null, + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "chatcmpl-CECIpbpLN9VO3z9pVAidTRslxRHtL", + "choices": [ + { + "delta": { + "content": " the", + "function_call": null, + "refusal": null, + "role": null, + "tool_calls": null + }, + "finish_reason": null, + "index": 1, + "logprobs": null, + "content_filter_results": {} + } + ], + "created": 1757499919, + "model": "gpt-5-mini-2025-08-07", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": null, + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "chatcmpl-CECIpbpLN9VO3z9pVAidTRslxRHtL", + "choices": [ + { + "delta": { + "content": ").", + "function_call": null, + "refusal": null, + "role": null, + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null, + "content_filter_results": {} + } + ], + "created": 1757499919, + "model": "gpt-5-mini-2025-08-07", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": null, + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "chatcmpl-CECIpbpLN9VO3z9pVAidTRslxRHtL", + "choices": [ + { + "delta": { + "content": " District", + "function_call": null, + "refusal": null, + "role": null, + "tool_calls": null + }, + "finish_reason": null, + "index": 1, + "logprobs": null, + "content_filter_results": {} + } + ], + "created": 1757499919, + "model": "gpt-5-mini-2025-08-07", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": null, + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "chatcmpl-CECIpbpLN9VO3z9pVAidTRslxRHtL", + "choices": [ + { + "delta": { + "content": " of", + "function_call": null, + "refusal": null, + "role": null, + "tool_calls": null + }, + "finish_reason": null, + "index": 1, + "logprobs": null, + "content_filter_results": {} + } + ], + "created": 1757499919, + "model": "gpt-5-mini-2025-08-07", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": null, + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "chatcmpl-CECIpbpLN9VO3z9pVAidTRslxRHtL", + "choices": [ + { + "delta": { + "content": " Columbia", + "function_call": null, + "refusal": null, + "role": null, + "tool_calls": null + }, + "finish_reason": null, + "index": 1, + "logprobs": null, + "content_filter_results": {} + } + ], + "created": 1757499919, + "model": "gpt-5-mini-2025-08-07", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": null, + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "chatcmpl-CECIpbpLN9VO3z9pVAidTRslxRHtL", + "choices": [ + { + "delta": { + "content": ").", + "function_call": null, + "refusal": null, + "role": null, + "tool_calls": null + }, + "finish_reason": null, + "index": 1, + "logprobs": null, + "content_filter_results": {} + } + ], + "created": 1757499919, + "model": "gpt-5-mini-2025-08-07", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": null, + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "chatcmpl-CECIpbpLN9VO3z9pVAidTRslxRHtL", + "choices": [ + { + "delta": { + "content": null, + "function_call": null, + "refusal": null, + "role": null, + "tool_calls": null + }, + "finish_reason": "stop", + "index": 0, + "logprobs": null, + "content_filter_results": {} + } + ], + "created": 1757499919, + "model": "gpt-5-mini-2025-08-07", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": null, + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "chatcmpl-CECIpbpLN9VO3z9pVAidTRslxRHtL", + "choices": [ + { + "delta": { + "content": null, + "function_call": null, + "refusal": null, + "role": null, + "tool_calls": null + }, + "finish_reason": "stop", + "index": 1, + "logprobs": null, + "content_filter_results": {} + } + ], + "created": 1757499919, + "model": "gpt-5-mini-2025-08-07", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": null, + "usage": null + } + } + ], + "is_streaming": true + } +} diff --git a/tests/integration/recordings/responses/9f3d749cc1c8.json b/tests/integration/recordings/responses/9f3d749cc1c8.json new file mode 100644 index 000000000..9a4539ab0 --- /dev/null +++ b/tests/integration/recordings/responses/9f3d749cc1c8.json @@ -0,0 +1,1150 @@ +{ + "request": { + "method": "POST", + "url": "https://shan-mfbb618r-eastus2.cognitiveservices.azure.com/openai/v1/v1/chat/completions", + "headers": {}, + "body": { + "model": "gpt-5-mini", + "messages": [ + { + "role": "user", + "content": "What's the name of the Sun in latin?" + } + ], + "stream": true + }, + "endpoint": "/v1/chat/completions", + "model": "gpt-5-mini" + }, + "response": { + "body": [ + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "", + "choices": [], + "created": 0, + "model": "", + "object": "", + "service_tier": null, + "system_fingerprint": null, + "usage": null, + "prompt_filter_results": [ + { + "prompt_index": 0, + "content_filter_results": {} + } + ] + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "chatcmpl-CECIZYHVRY3J0EiPODz10HVzL7cIe", + "choices": [ + { + "delta": { + "content": "", + "function_call": null, + "refusal": null, + "role": "assistant", + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null, + "content_filter_results": {} + } + ], + "created": 1757499903, + "model": "gpt-5-mini-2025-08-07", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": null, + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "chatcmpl-CECIZYHVRY3J0EiPODz10HVzL7cIe", + "choices": [ + { + "delta": { + "content": "The", + "function_call": null, + "refusal": null, + "role": null, + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null, + "content_filter_results": {} + } + ], + "created": 1757499903, + "model": "gpt-5-mini-2025-08-07", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": null, + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "chatcmpl-CECIZYHVRY3J0EiPODz10HVzL7cIe", + "choices": [ + { + "delta": { + "content": " Latin", + "function_call": null, + "refusal": null, + "role": null, + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null, + "content_filter_results": {} + } + ], + "created": 1757499903, + "model": "gpt-5-mini-2025-08-07", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": null, + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "chatcmpl-CECIZYHVRY3J0EiPODz10HVzL7cIe", + "choices": [ + { + "delta": { + "content": " name", + "function_call": null, + "refusal": null, + "role": null, + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null, + "content_filter_results": {} + } + ], + "created": 1757499903, + "model": "gpt-5-mini-2025-08-07", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": null, + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "chatcmpl-CECIZYHVRY3J0EiPODz10HVzL7cIe", + "choices": [ + { + "delta": { + "content": " is", + "function_call": null, + "refusal": null, + "role": null, + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null, + "content_filter_results": {} + } + ], + "created": 1757499903, + "model": "gpt-5-mini-2025-08-07", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": null, + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "chatcmpl-CECIZYHVRY3J0EiPODz10HVzL7cIe", + "choices": [ + { + "delta": { + "content": " \"", + "function_call": null, + "refusal": null, + "role": null, + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null, + "content_filter_results": {} + } + ], + "created": 1757499903, + "model": "gpt-5-mini-2025-08-07", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": null, + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "chatcmpl-CECIZYHVRY3J0EiPODz10HVzL7cIe", + "choices": [ + { + "delta": { + "content": "Sol", + "function_call": null, + "refusal": null, + "role": null, + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null, + "content_filter_results": {} + } + ], + "created": 1757499903, + "model": "gpt-5-mini-2025-08-07", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": null, + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "chatcmpl-CECIZYHVRY3J0EiPODz10HVzL7cIe", + "choices": [ + { + "delta": { + "content": "\"", + "function_call": null, + "refusal": null, + "role": null, + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null, + "content_filter_results": {} + } + ], + "created": 1757499903, + "model": "gpt-5-mini-2025-08-07", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": null, + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "chatcmpl-CECIZYHVRY3J0EiPODz10HVzL7cIe", + "choices": [ + { + "delta": { + "content": " (", + "function_call": null, + "refusal": null, + "role": null, + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null, + "content_filter_results": {} + } + ], + "created": 1757499903, + "model": "gpt-5-mini-2025-08-07", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": null, + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "chatcmpl-CECIZYHVRY3J0EiPODz10HVzL7cIe", + "choices": [ + { + "delta": { + "content": "gen", + "function_call": null, + "refusal": null, + "role": null, + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null, + "content_filter_results": {} + } + ], + "created": 1757499903, + "model": "gpt-5-mini-2025-08-07", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": null, + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "chatcmpl-CECIZYHVRY3J0EiPODz10HVzL7cIe", + "choices": [ + { + "delta": { + "content": "itive", + "function_call": null, + "refusal": null, + "role": null, + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null, + "content_filter_results": {} + } + ], + "created": 1757499903, + "model": "gpt-5-mini-2025-08-07", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": null, + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "chatcmpl-CECIZYHVRY3J0EiPODz10HVzL7cIe", + "choices": [ + { + "delta": { + "content": " \"", + "function_call": null, + "refusal": null, + "role": null, + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null, + "content_filter_results": {} + } + ], + "created": 1757499903, + "model": "gpt-5-mini-2025-08-07", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": null, + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "chatcmpl-CECIZYHVRY3J0EiPODz10HVzL7cIe", + "choices": [ + { + "delta": { + "content": "S", + "function_call": null, + "refusal": null, + "role": null, + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null, + "content_filter_results": {} + } + ], + "created": 1757499903, + "model": "gpt-5-mini-2025-08-07", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": null, + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "chatcmpl-CECIZYHVRY3J0EiPODz10HVzL7cIe", + "choices": [ + { + "delta": { + "content": "olis", + "function_call": null, + "refusal": null, + "role": null, + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null, + "content_filter_results": {} + } + ], + "created": 1757499903, + "model": "gpt-5-mini-2025-08-07", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": null, + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "chatcmpl-CECIZYHVRY3J0EiPODz10HVzL7cIe", + "choices": [ + { + "delta": { + "content": "\").", + "function_call": null, + "refusal": null, + "role": null, + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null, + "content_filter_results": {} + } + ], + "created": 1757499903, + "model": "gpt-5-mini-2025-08-07", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": null, + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "chatcmpl-CECIZYHVRY3J0EiPODz10HVzL7cIe", + "choices": [ + { + "delta": { + "content": " It's", + "function_call": null, + "refusal": null, + "role": null, + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null, + "content_filter_results": {} + } + ], + "created": 1757499903, + "model": "gpt-5-mini-2025-08-07", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": null, + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "chatcmpl-CECIZYHVRY3J0EiPODz10HVzL7cIe", + "choices": [ + { + "delta": { + "content": " used", + "function_call": null, + "refusal": null, + "role": null, + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null, + "content_filter_results": {} + } + ], + "created": 1757499903, + "model": "gpt-5-mini-2025-08-07", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": null, + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "chatcmpl-CECIZYHVRY3J0EiPODz10HVzL7cIe", + "choices": [ + { + "delta": { + "content": " as", + "function_call": null, + "refusal": null, + "role": null, + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null, + "content_filter_results": {} + } + ], + "created": 1757499903, + "model": "gpt-5-mini-2025-08-07", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": null, + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "chatcmpl-CECIZYHVRY3J0EiPODz10HVzL7cIe", + "choices": [ + { + "delta": { + "content": " the", + "function_call": null, + "refusal": null, + "role": null, + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null, + "content_filter_results": {} + } + ], + "created": 1757499903, + "model": "gpt-5-mini-2025-08-07", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": null, + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "chatcmpl-CECIZYHVRY3J0EiPODz10HVzL7cIe", + "choices": [ + { + "delta": { + "content": " proper", + "function_call": null, + "refusal": null, + "role": null, + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null, + "content_filter_results": {} + } + ], + "created": 1757499903, + "model": "gpt-5-mini-2025-08-07", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": null, + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "chatcmpl-CECIZYHVRY3J0EiPODz10HVzL7cIe", + "choices": [ + { + "delta": { + "content": " name", + "function_call": null, + "refusal": null, + "role": null, + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null, + "content_filter_results": {} + } + ], + "created": 1757499903, + "model": "gpt-5-mini-2025-08-07", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": null, + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "chatcmpl-CECIZYHVRY3J0EiPODz10HVzL7cIe", + "choices": [ + { + "delta": { + "content": " of", + "function_call": null, + "refusal": null, + "role": null, + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null, + "content_filter_results": {} + } + ], + "created": 1757499903, + "model": "gpt-5-mini-2025-08-07", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": null, + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "chatcmpl-CECIZYHVRY3J0EiPODz10HVzL7cIe", + "choices": [ + { + "delta": { + "content": " the", + "function_call": null, + "refusal": null, + "role": null, + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null, + "content_filter_results": {} + } + ], + "created": 1757499903, + "model": "gpt-5-mini-2025-08-07", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": null, + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "chatcmpl-CECIZYHVRY3J0EiPODz10HVzL7cIe", + "choices": [ + { + "delta": { + "content": " Sun", + "function_call": null, + "refusal": null, + "role": null, + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null, + "content_filter_results": {} + } + ], + "created": 1757499903, + "model": "gpt-5-mini-2025-08-07", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": null, + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "chatcmpl-CECIZYHVRY3J0EiPODz10HVzL7cIe", + "choices": [ + { + "delta": { + "content": ";", + "function_call": null, + "refusal": null, + "role": null, + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null, + "content_filter_results": {} + } + ], + "created": 1757499903, + "model": "gpt-5-mini-2025-08-07", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": null, + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "chatcmpl-CECIZYHVRY3J0EiPODz10HVzL7cIe", + "choices": [ + { + "delta": { + "content": " poets", + "function_call": null, + "refusal": null, + "role": null, + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null, + "content_filter_results": {} + } + ], + "created": 1757499903, + "model": "gpt-5-mini-2025-08-07", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": null, + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "chatcmpl-CECIZYHVRY3J0EiPODz10HVzL7cIe", + "choices": [ + { + "delta": { + "content": " also", + "function_call": null, + "refusal": null, + "role": null, + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null, + "content_filter_results": {} + } + ], + "created": 1757499903, + "model": "gpt-5-mini-2025-08-07", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": null, + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "chatcmpl-CECIZYHVRY3J0EiPODz10HVzL7cIe", + "choices": [ + { + "delta": { + "content": " sometimes", + "function_call": null, + "refusal": null, + "role": null, + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null, + "content_filter_results": {} + } + ], + "created": 1757499903, + "model": "gpt-5-mini-2025-08-07", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": null, + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "chatcmpl-CECIZYHVRY3J0EiPODz10HVzL7cIe", + "choices": [ + { + "delta": { + "content": " used", + "function_call": null, + "refusal": null, + "role": null, + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null, + "content_filter_results": {} + } + ], + "created": 1757499903, + "model": "gpt-5-mini-2025-08-07", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": null, + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "chatcmpl-CECIZYHVRY3J0EiPODz10HVzL7cIe", + "choices": [ + { + "delta": { + "content": " Greek", + "function_call": null, + "refusal": null, + "role": null, + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null, + "content_filter_results": {} + } + ], + "created": 1757499903, + "model": "gpt-5-mini-2025-08-07", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": null, + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "chatcmpl-CECIZYHVRY3J0EiPODz10HVzL7cIe", + "choices": [ + { + "delta": { + "content": "-derived", + "function_call": null, + "refusal": null, + "role": null, + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null, + "content_filter_results": {} + } + ], + "created": 1757499903, + "model": "gpt-5-mini-2025-08-07", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": null, + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "chatcmpl-CECIZYHVRY3J0EiPODz10HVzL7cIe", + "choices": [ + { + "delta": { + "content": " ep", + "function_call": null, + "refusal": null, + "role": null, + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null, + "content_filter_results": {} + } + ], + "created": 1757499903, + "model": "gpt-5-mini-2025-08-07", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": null, + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "chatcmpl-CECIZYHVRY3J0EiPODz10HVzL7cIe", + "choices": [ + { + "delta": { + "content": "ithe", + "function_call": null, + "refusal": null, + "role": null, + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null, + "content_filter_results": {} + } + ], + "created": 1757499903, + "model": "gpt-5-mini-2025-08-07", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": null, + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "chatcmpl-CECIZYHVRY3J0EiPODz10HVzL7cIe", + "choices": [ + { + "delta": { + "content": "ts", + "function_call": null, + "refusal": null, + "role": null, + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null, + "content_filter_results": {} + } + ], + "created": 1757499903, + "model": "gpt-5-mini-2025-08-07", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": null, + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "chatcmpl-CECIZYHVRY3J0EiPODz10HVzL7cIe", + "choices": [ + { + "delta": { + "content": " like", + "function_call": null, + "refusal": null, + "role": null, + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null, + "content_filter_results": {} + } + ], + "created": 1757499903, + "model": "gpt-5-mini-2025-08-07", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": null, + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "chatcmpl-CECIZYHVRY3J0EiPODz10HVzL7cIe", + "choices": [ + { + "delta": { + "content": " \"", + "function_call": null, + "refusal": null, + "role": null, + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null, + "content_filter_results": {} + } + ], + "created": 1757499903, + "model": "gpt-5-mini-2025-08-07", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": null, + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "chatcmpl-CECIZYHVRY3J0EiPODz10HVzL7cIe", + "choices": [ + { + "delta": { + "content": "Pho", + "function_call": null, + "refusal": null, + "role": null, + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null, + "content_filter_results": {} + } + ], + "created": 1757499903, + "model": "gpt-5-mini-2025-08-07", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": null, + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "chatcmpl-CECIZYHVRY3J0EiPODz10HVzL7cIe", + "choices": [ + { + "delta": { + "content": "eb", + "function_call": null, + "refusal": null, + "role": null, + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null, + "content_filter_results": {} + } + ], + "created": 1757499903, + "model": "gpt-5-mini-2025-08-07", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": null, + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "chatcmpl-CECIZYHVRY3J0EiPODz10HVzL7cIe", + "choices": [ + { + "delta": { + "content": "us", + "function_call": null, + "refusal": null, + "role": null, + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null, + "content_filter_results": {} + } + ], + "created": 1757499903, + "model": "gpt-5-mini-2025-08-07", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": null, + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "chatcmpl-CECIZYHVRY3J0EiPODz10HVzL7cIe", + "choices": [ + { + "delta": { + "content": ".\"", + "function_call": null, + "refusal": null, + "role": null, + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null, + "content_filter_results": {} + } + ], + "created": 1757499903, + "model": "gpt-5-mini-2025-08-07", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": null, + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "chatcmpl-CECIZYHVRY3J0EiPODz10HVzL7cIe", + "choices": [ + { + "delta": { + "content": null, + "function_call": null, + "refusal": null, + "role": null, + "tool_calls": null + }, + "finish_reason": "stop", + "index": 0, + "logprobs": null, + "content_filter_results": {} + } + ], + "created": 1757499903, + "model": "gpt-5-mini-2025-08-07", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": null, + "usage": null + } + } + ], + "is_streaming": true + } +} diff --git a/tests/integration/recordings/responses/c791119e6359.json b/tests/integration/recordings/responses/c791119e6359.json new file mode 100644 index 000000000..6ac123e92 --- /dev/null +++ b/tests/integration/recordings/responses/c791119e6359.json @@ -0,0 +1,98 @@ +{ + "request": { + "method": "POST", + "url": "https://shan-mfbb618r-eastus2.cognitiveservices.azure.com/openai/v1/v1/chat/completions", + "headers": {}, + "body": { + "model": "gpt-5-mini", + "messages": [ + { + "role": "user", + "content": "What's the weather in Tokyo? Use the get_weather function to get the weather." + } + ], + "stream": false, + "tools": [ + { + "type": "function", + "function": { + "name": "get_weather", + "description": "Get the weather in a given city", + "parameters": { + "type": "object", + "properties": { + "city": { + "type": "string", + "description": "The city to get the weather for" + } + } + } + } + } + ] + }, + "endpoint": "/v1/chat/completions", + "model": "gpt-5-mini" + }, + "response": { + "body": { + "__type__": "openai.types.chat.chat_completion.ChatCompletion", + "__data__": { + "id": "chatcmpl-CECIwq9Odd0mOJMmw7ytv8iEazH4H", + "choices": [ + { + "finish_reason": "tool_calls", + "index": 0, + "logprobs": null, + "message": { + "content": null, + "refusal": null, + "role": "assistant", + "annotations": [], + "audio": null, + "function_call": null, + "tool_calls": [ + { + "id": "call_yw18spRc1jjUlEyabbXBhB33", + "function": { + "arguments": "{\"city\":\"Tokyo\"}", + "name": "get_weather" + }, + "type": "function" + } + ] + }, + "content_filter_results": {} + } + ], + "created": 1757499926, + "model": "gpt-5-mini-2025-08-07", + "object": "chat.completion", + "service_tier": null, + "system_fingerprint": null, + "usage": { + "completion_tokens": 88, + "prompt_tokens": 151, + "total_tokens": 239, + "completion_tokens_details": { + "accepted_prediction_tokens": 0, + "audio_tokens": 0, + "reasoning_tokens": 64, + "rejected_prediction_tokens": 0 + }, + "prompt_tokens_details": { + "audio_tokens": 0, + "cached_tokens": 0 + } + }, + "prompt_filter_results": [ + { + "prompt_index": 0, + "content_filter_results": {} + } + ] + } + }, + "is_streaming": false + } +} diff --git a/tests/integration/recordings/responses/d3e27b7234e2.json b/tests/integration/recordings/responses/d3e27b7234e2.json new file mode 100644 index 000000000..7f266c392 --- /dev/null +++ b/tests/integration/recordings/responses/d3e27b7234e2.json @@ -0,0 +1,2150 @@ +{ + "request": { + "method": "POST", + "url": "https://shan-mfbb618r-eastus2.cognitiveservices.azure.com/openai/v1/v1/chat/completions", + "headers": {}, + "body": { + "model": "gpt-5-mini", + "messages": [ + { + "role": "user", + "content": "What's the name of the Sun in latin?" + } + ], + "n": 2, + "stream": true + }, + "endpoint": "/v1/chat/completions", + "model": "gpt-5-mini" + }, + "response": { + "body": [ + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "", + "choices": [], + "created": 0, + "model": "", + "object": "", + "service_tier": null, + "system_fingerprint": null, + "usage": null, + "prompt_filter_results": [ + { + "prompt_index": 0, + "content_filter_results": {} + } + ] + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "chatcmpl-CECIdmgM7bbQr6YefuUbY4cycibvm", + "choices": [ + { + "delta": { + "content": "", + "function_call": null, + "refusal": null, + "role": "assistant", + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null, + "content_filter_results": {} + } + ], + "created": 1757499907, + "model": "gpt-5-mini-2025-08-07", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": null, + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "chatcmpl-CECIdmgM7bbQr6YefuUbY4cycibvm", + "choices": [ + { + "delta": { + "content": "In", + "function_call": null, + "refusal": null, + "role": null, + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null, + "content_filter_results": {} + } + ], + "created": 1757499907, + "model": "gpt-5-mini-2025-08-07", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": null, + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "chatcmpl-CECIdmgM7bbQr6YefuUbY4cycibvm", + "choices": [ + { + "delta": { + "content": " Latin", + "function_call": null, + "refusal": null, + "role": null, + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null, + "content_filter_results": {} + } + ], + "created": 1757499907, + "model": "gpt-5-mini-2025-08-07", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": null, + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "chatcmpl-CECIdmgM7bbQr6YefuUbY4cycibvm", + "choices": [ + { + "delta": { + "content": " the", + "function_call": null, + "refusal": null, + "role": null, + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null, + "content_filter_results": {} + } + ], + "created": 1757499907, + "model": "gpt-5-mini-2025-08-07", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": null, + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "chatcmpl-CECIdmgM7bbQr6YefuUbY4cycibvm", + "choices": [ + { + "delta": { + "content": " Sun", + "function_call": null, + "refusal": null, + "role": null, + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null, + "content_filter_results": {} + } + ], + "created": 1757499907, + "model": "gpt-5-mini-2025-08-07", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": null, + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "chatcmpl-CECIdmgM7bbQr6YefuUbY4cycibvm", + "choices": [ + { + "delta": { + "content": " is", + "function_call": null, + "refusal": null, + "role": null, + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null, + "content_filter_results": {} + } + ], + "created": 1757499907, + "model": "gpt-5-mini-2025-08-07", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": null, + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "chatcmpl-CECIdmgM7bbQr6YefuUbY4cycibvm", + "choices": [ + { + "delta": { + "content": " called", + "function_call": null, + "refusal": null, + "role": null, + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null, + "content_filter_results": {} + } + ], + "created": 1757499907, + "model": "gpt-5-mini-2025-08-07", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": null, + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "chatcmpl-CECIdmgM7bbQr6YefuUbY4cycibvm", + "choices": [ + { + "delta": { + "content": " \"", + "function_call": null, + "refusal": null, + "role": null, + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null, + "content_filter_results": {} + } + ], + "created": 1757499907, + "model": "gpt-5-mini-2025-08-07", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": null, + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "chatcmpl-CECIdmgM7bbQr6YefuUbY4cycibvm", + "choices": [ + { + "delta": { + "content": "Sol", + "function_call": null, + "refusal": null, + "role": null, + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null, + "content_filter_results": {} + } + ], + "created": 1757499907, + "model": "gpt-5-mini-2025-08-07", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": null, + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "chatcmpl-CECIdmgM7bbQr6YefuUbY4cycibvm", + "choices": [ + { + "delta": { + "content": "\"", + "function_call": null, + "refusal": null, + "role": null, + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null, + "content_filter_results": {} + } + ], + "created": 1757499907, + "model": "gpt-5-mini-2025-08-07", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": null, + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "chatcmpl-CECIdmgM7bbQr6YefuUbY4cycibvm", + "choices": [ + { + "delta": { + "content": " (", + "function_call": null, + "refusal": null, + "role": null, + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null, + "content_filter_results": {} + } + ], + "created": 1757499907, + "model": "gpt-5-mini-2025-08-07", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": null, + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "chatcmpl-CECIdmgM7bbQr6YefuUbY4cycibvm", + "choices": [ + { + "delta": { + "content": "sol", + "function_call": null, + "refusal": null, + "role": null, + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null, + "content_filter_results": {} + } + ], + "created": 1757499907, + "model": "gpt-5-mini-2025-08-07", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": null, + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "chatcmpl-CECIdmgM7bbQr6YefuUbY4cycibvm", + "choices": [ + { + "delta": { + "content": ",", + "function_call": null, + "refusal": null, + "role": null, + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null, + "content_filter_results": {} + } + ], + "created": 1757499907, + "model": "gpt-5-mini-2025-08-07", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": null, + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "chatcmpl-CECIdmgM7bbQr6YefuUbY4cycibvm", + "choices": [ + { + "delta": { + "content": " gen", + "function_call": null, + "refusal": null, + "role": null, + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null, + "content_filter_results": {} + } + ], + "created": 1757499907, + "model": "gpt-5-mini-2025-08-07", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": null, + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "chatcmpl-CECIdmgM7bbQr6YefuUbY4cycibvm", + "choices": [ + { + "delta": { + "content": "", + "function_call": null, + "refusal": null, + "role": "assistant", + "tool_calls": null + }, + "finish_reason": null, + "index": 1, + "logprobs": null, + "content_filter_results": {} + } + ], + "created": 1757499907, + "model": "gpt-5-mini-2025-08-07", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": null, + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "chatcmpl-CECIdmgM7bbQr6YefuUbY4cycibvm", + "choices": [ + { + "delta": { + "content": "itive", + "function_call": null, + "refusal": null, + "role": null, + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null, + "content_filter_results": {} + } + ], + "created": 1757499907, + "model": "gpt-5-mini-2025-08-07", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": null, + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "chatcmpl-CECIdmgM7bbQr6YefuUbY4cycibvm", + "choices": [ + { + "delta": { + "content": " sol", + "function_call": null, + "refusal": null, + "role": null, + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null, + "content_filter_results": {} + } + ], + "created": 1757499907, + "model": "gpt-5-mini-2025-08-07", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": null, + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "chatcmpl-CECIdmgM7bbQr6YefuUbY4cycibvm", + "choices": [ + { + "delta": { + "content": "is", + "function_call": null, + "refusal": null, + "role": null, + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null, + "content_filter_results": {} + } + ], + "created": 1757499907, + "model": "gpt-5-mini-2025-08-07", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": null, + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "chatcmpl-CECIdmgM7bbQr6YefuUbY4cycibvm", + "choices": [ + { + "delta": { + "content": "The", + "function_call": null, + "refusal": null, + "role": null, + "tool_calls": null + }, + "finish_reason": null, + "index": 1, + "logprobs": null, + "content_filter_results": {} + } + ], + "created": 1757499907, + "model": "gpt-5-mini-2025-08-07", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": null, + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "chatcmpl-CECIdmgM7bbQr6YefuUbY4cycibvm", + "choices": [ + { + "delta": { + "content": " Latin", + "function_call": null, + "refusal": null, + "role": null, + "tool_calls": null + }, + "finish_reason": null, + "index": 1, + "logprobs": null, + "content_filter_results": {} + } + ], + "created": 1757499907, + "model": "gpt-5-mini-2025-08-07", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": null, + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "chatcmpl-CECIdmgM7bbQr6YefuUbY4cycibvm", + "choices": [ + { + "delta": { + "content": " name", + "function_call": null, + "refusal": null, + "role": null, + "tool_calls": null + }, + "finish_reason": null, + "index": 1, + "logprobs": null, + "content_filter_results": {} + } + ], + "created": 1757499907, + "model": "gpt-5-mini-2025-08-07", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": null, + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "chatcmpl-CECIdmgM7bbQr6YefuUbY4cycibvm", + "choices": [ + { + "delta": { + "content": ",", + "function_call": null, + "refusal": null, + "role": null, + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null, + "content_filter_results": {} + } + ], + "created": 1757499907, + "model": "gpt-5-mini-2025-08-07", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": null, + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "chatcmpl-CECIdmgM7bbQr6YefuUbY4cycibvm", + "choices": [ + { + "delta": { + "content": " is", + "function_call": null, + "refusal": null, + "role": null, + "tool_calls": null + }, + "finish_reason": null, + "index": 1, + "logprobs": null, + "content_filter_results": {} + } + ], + "created": 1757499907, + "model": "gpt-5-mini-2025-08-07", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": null, + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "chatcmpl-CECIdmgM7bbQr6YefuUbY4cycibvm", + "choices": [ + { + "delta": { + "content": " masculine", + "function_call": null, + "refusal": null, + "role": null, + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null, + "content_filter_results": {} + } + ], + "created": 1757499907, + "model": "gpt-5-mini-2025-08-07", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": null, + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "chatcmpl-CECIdmgM7bbQr6YefuUbY4cycibvm", + "choices": [ + { + "delta": { + "content": " \"", + "function_call": null, + "refusal": null, + "role": null, + "tool_calls": null + }, + "finish_reason": null, + "index": 1, + "logprobs": null, + "content_filter_results": {} + } + ], + "created": 1757499907, + "model": "gpt-5-mini-2025-08-07", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": null, + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "chatcmpl-CECIdmgM7bbQr6YefuUbY4cycibvm", + "choices": [ + { + "delta": { + "content": ").", + "function_call": null, + "refusal": null, + "role": null, + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null, + "content_filter_results": {} + } + ], + "created": 1757499907, + "model": "gpt-5-mini-2025-08-07", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": null, + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "chatcmpl-CECIdmgM7bbQr6YefuUbY4cycibvm", + "choices": [ + { + "delta": { + "content": "Sol", + "function_call": null, + "refusal": null, + "role": null, + "tool_calls": null + }, + "finish_reason": null, + "index": 1, + "logprobs": null, + "content_filter_results": {} + } + ], + "created": 1757499907, + "model": "gpt-5-mini-2025-08-07", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": null, + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "chatcmpl-CECIdmgM7bbQr6YefuUbY4cycibvm", + "choices": [ + { + "delta": { + "content": "\"", + "function_call": null, + "refusal": null, + "role": null, + "tool_calls": null + }, + "finish_reason": null, + "index": 1, + "logprobs": null, + "content_filter_results": {} + } + ], + "created": 1757499907, + "model": "gpt-5-mini-2025-08-07", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": null, + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "chatcmpl-CECIdmgM7bbQr6YefuUbY4cycibvm", + "choices": [ + { + "delta": { + "content": " (", + "function_call": null, + "refusal": null, + "role": null, + "tool_calls": null + }, + "finish_reason": null, + "index": 1, + "logprobs": null, + "content_filter_results": {} + } + ], + "created": 1757499907, + "model": "gpt-5-mini-2025-08-07", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": null, + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "chatcmpl-CECIdmgM7bbQr6YefuUbY4cycibvm", + "choices": [ + { + "delta": { + "content": " The", + "function_call": null, + "refusal": null, + "role": null, + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null, + "content_filter_results": {} + } + ], + "created": 1757499907, + "model": "gpt-5-mini-2025-08-07", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": null, + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "chatcmpl-CECIdmgM7bbQr6YefuUbY4cycibvm", + "choices": [ + { + "delta": { + "content": " name", + "function_call": null, + "refusal": null, + "role": null, + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null, + "content_filter_results": {} + } + ], + "created": 1757499907, + "model": "gpt-5-mini-2025-08-07", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": null, + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "chatcmpl-CECIdmgM7bbQr6YefuUbY4cycibvm", + "choices": [ + { + "delta": { + "content": " is", + "function_call": null, + "refusal": null, + "role": null, + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null, + "content_filter_results": {} + } + ], + "created": 1757499907, + "model": "gpt-5-mini-2025-08-07", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": null, + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "chatcmpl-CECIdmgM7bbQr6YefuUbY4cycibvm", + "choices": [ + { + "delta": { + "content": "s", + "function_call": null, + "refusal": null, + "role": null, + "tool_calls": null + }, + "finish_reason": null, + "index": 1, + "logprobs": null, + "content_filter_results": {} + } + ], + "created": 1757499907, + "model": "gpt-5-mini-2025-08-07", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": null, + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "chatcmpl-CECIdmgM7bbQr6YefuUbY4cycibvm", + "choices": [ + { + "delta": { + "content": " also", + "function_call": null, + "refusal": null, + "role": null, + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null, + "content_filter_results": {} + } + ], + "created": 1757499907, + "model": "gpt-5-mini-2025-08-07", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": null, + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "chatcmpl-CECIdmgM7bbQr6YefuUbY4cycibvm", + "choices": [ + { + "delta": { + "content": "\u014d", + "function_call": null, + "refusal": null, + "role": null, + "tool_calls": null + }, + "finish_reason": null, + "index": 1, + "logprobs": null, + "content_filter_results": {} + } + ], + "created": 1757499907, + "model": "gpt-5-mini-2025-08-07", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": null, + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "chatcmpl-CECIdmgM7bbQr6YefuUbY4cycibvm", + "choices": [ + { + "delta": { + "content": " used", + "function_call": null, + "refusal": null, + "role": null, + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null, + "content_filter_results": {} + } + ], + "created": 1757499907, + "model": "gpt-5-mini-2025-08-07", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": null, + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "chatcmpl-CECIdmgM7bbQr6YefuUbY4cycibvm", + "choices": [ + { + "delta": { + "content": "l", + "function_call": null, + "refusal": null, + "role": null, + "tool_calls": null + }, + "finish_reason": null, + "index": 1, + "logprobs": null, + "content_filter_results": {} + } + ], + "created": 1757499907, + "model": "gpt-5-mini-2025-08-07", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": null, + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "chatcmpl-CECIdmgM7bbQr6YefuUbY4cycibvm", + "choices": [ + { + "delta": { + "content": " for", + "function_call": null, + "refusal": null, + "role": null, + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null, + "content_filter_results": {} + } + ], + "created": 1757499907, + "model": "gpt-5-mini-2025-08-07", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": null, + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "chatcmpl-CECIdmgM7bbQr6YefuUbY4cycibvm", + "choices": [ + { + "delta": { + "content": " the", + "function_call": null, + "refusal": null, + "role": null, + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null, + "content_filter_results": {} + } + ], + "created": 1757499907, + "model": "gpt-5-mini-2025-08-07", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": null, + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "chatcmpl-CECIdmgM7bbQr6YefuUbY4cycibvm", + "choices": [ + { + "delta": { + "content": "),", + "function_call": null, + "refusal": null, + "role": null, + "tool_calls": null + }, + "finish_reason": null, + "index": 1, + "logprobs": null, + "content_filter_results": {} + } + ], + "created": 1757499907, + "model": "gpt-5-mini-2025-08-07", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": null, + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "chatcmpl-CECIdmgM7bbQr6YefuUbY4cycibvm", + "choices": [ + { + "delta": { + "content": " gen", + "function_call": null, + "refusal": null, + "role": null, + "tool_calls": null + }, + "finish_reason": null, + "index": 1, + "logprobs": null, + "content_filter_results": {} + } + ], + "created": 1757499907, + "model": "gpt-5-mini-2025-08-07", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": null, + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "chatcmpl-CECIdmgM7bbQr6YefuUbY4cycibvm", + "choices": [ + { + "delta": { + "content": " Roman", + "function_call": null, + "refusal": null, + "role": null, + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null, + "content_filter_results": {} + } + ], + "created": 1757499907, + "model": "gpt-5-mini-2025-08-07", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": null, + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "chatcmpl-CECIdmgM7bbQr6YefuUbY4cycibvm", + "choices": [ + { + "delta": { + "content": "itive", + "function_call": null, + "refusal": null, + "role": null, + "tool_calls": null + }, + "finish_reason": null, + "index": 1, + "logprobs": null, + "content_filter_results": {} + } + ], + "created": 1757499907, + "model": "gpt-5-mini-2025-08-07", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": null, + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "chatcmpl-CECIdmgM7bbQr6YefuUbY4cycibvm", + "choices": [ + { + "delta": { + "content": " sun", + "function_call": null, + "refusal": null, + "role": null, + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null, + "content_filter_results": {} + } + ], + "created": 1757499907, + "model": "gpt-5-mini-2025-08-07", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": null, + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "chatcmpl-CECIdmgM7bbQr6YefuUbY4cycibvm", + "choices": [ + { + "delta": { + "content": " \"", + "function_call": null, + "refusal": null, + "role": null, + "tool_calls": null + }, + "finish_reason": null, + "index": 1, + "logprobs": null, + "content_filter_results": {} + } + ], + "created": 1757499907, + "model": "gpt-5-mini-2025-08-07", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": null, + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "chatcmpl-CECIdmgM7bbQr6YefuUbY4cycibvm", + "choices": [ + { + "delta": { + "content": " god", + "function_call": null, + "refusal": null, + "role": null, + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null, + "content_filter_results": {} + } + ], + "created": 1757499907, + "model": "gpt-5-mini-2025-08-07", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": null, + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "chatcmpl-CECIdmgM7bbQr6YefuUbY4cycibvm", + "choices": [ + { + "delta": { + "content": "s", + "function_call": null, + "refusal": null, + "role": null, + "tool_calls": null + }, + "finish_reason": null, + "index": 1, + "logprobs": null, + "content_filter_results": {} + } + ], + "created": 1757499907, + "model": "gpt-5-mini-2025-08-07", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": null, + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "chatcmpl-CECIdmgM7bbQr6YefuUbY4cycibvm", + "choices": [ + { + "delta": { + "content": " (", + "function_call": null, + "refusal": null, + "role": null, + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null, + "content_filter_results": {} + } + ], + "created": 1757499907, + "model": "gpt-5-mini-2025-08-07", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": null, + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "chatcmpl-CECIdmgM7bbQr6YefuUbY4cycibvm", + "choices": [ + { + "delta": { + "content": "\u014d", + "function_call": null, + "refusal": null, + "role": null, + "tool_calls": null + }, + "finish_reason": null, + "index": 1, + "logprobs": null, + "content_filter_results": {} + } + ], + "created": 1757499907, + "model": "gpt-5-mini-2025-08-07", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": null, + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "chatcmpl-CECIdmgM7bbQr6YefuUbY4cycibvm", + "choices": [ + { + "delta": { + "content": "e", + "function_call": null, + "refusal": null, + "role": null, + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null, + "content_filter_results": {} + } + ], + "created": 1757499907, + "model": "gpt-5-mini-2025-08-07", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": null, + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "chatcmpl-CECIdmgM7bbQr6YefuUbY4cycibvm", + "choices": [ + { + "delta": { + "content": "lis", + "function_call": null, + "refusal": null, + "role": null, + "tool_calls": null + }, + "finish_reason": null, + "index": 1, + "logprobs": null, + "content_filter_results": {} + } + ], + "created": 1757499907, + "model": "gpt-5-mini-2025-08-07", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": null, + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "chatcmpl-CECIdmgM7bbQr6YefuUbY4cycibvm", + "choices": [ + { + "delta": { + "content": ".g", + "function_call": null, + "refusal": null, + "role": null, + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null, + "content_filter_results": {} + } + ], + "created": 1757499907, + "model": "gpt-5-mini-2025-08-07", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": null, + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "chatcmpl-CECIdmgM7bbQr6YefuUbY4cycibvm", + "choices": [ + { + "delta": { + "content": "\".", + "function_call": null, + "refusal": null, + "role": null, + "tool_calls": null + }, + "finish_reason": null, + "index": 1, + "logprobs": null, + "content_filter_results": {} + } + ], + "created": 1757499907, + "model": "gpt-5-mini-2025-08-07", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": null, + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "chatcmpl-CECIdmgM7bbQr6YefuUbY4cycibvm", + "choices": [ + { + "delta": { + "content": ".,", + "function_call": null, + "refusal": null, + "role": null, + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null, + "content_filter_results": {} + } + ], + "created": 1757499907, + "model": "gpt-5-mini-2025-08-07", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": null, + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "chatcmpl-CECIdmgM7bbQr6YefuUbY4cycibvm", + "choices": [ + { + "delta": { + "content": " ", + "function_call": null, + "refusal": null, + "role": null, + "tool_calls": null + }, + "finish_reason": null, + "index": 1, + "logprobs": null, + "content_filter_results": {} + } + ], + "created": 1757499907, + "model": "gpt-5-mini-2025-08-07", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": null, + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "chatcmpl-CECIdmgM7bbQr6YefuUbY4cycibvm", + "choices": [ + { + "delta": { + "content": " Sol", + "function_call": null, + "refusal": null, + "role": null, + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null, + "content_filter_results": {} + } + ], + "created": 1757499907, + "model": "gpt-5-mini-2025-08-07", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": null, + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "chatcmpl-CECIdmgM7bbQr6YefuUbY4cycibvm", + "choices": [ + { + "delta": { + "content": " As", + "function_call": null, + "refusal": null, + "role": null, + "tool_calls": null + }, + "finish_reason": null, + "index": 1, + "logprobs": null, + "content_filter_results": {} + } + ], + "created": 1757499907, + "model": "gpt-5-mini-2025-08-07", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": null, + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "chatcmpl-CECIdmgM7bbQr6YefuUbY4cycibvm", + "choices": [ + { + "delta": { + "content": " Inv", + "function_call": null, + "refusal": null, + "role": null, + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null, + "content_filter_results": {} + } + ], + "created": 1757499907, + "model": "gpt-5-mini-2025-08-07", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": null, + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "chatcmpl-CECIdmgM7bbQr6YefuUbY4cycibvm", + "choices": [ + { + "delta": { + "content": " an", + "function_call": null, + "refusal": null, + "role": null, + "tool_calls": null + }, + "finish_reason": null, + "index": 1, + "logprobs": null, + "content_filter_results": {} + } + ], + "created": 1757499907, + "model": "gpt-5-mini-2025-08-07", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": null, + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "chatcmpl-CECIdmgM7bbQr6YefuUbY4cycibvm", + "choices": [ + { + "delta": { + "content": "ict", + "function_call": null, + "refusal": null, + "role": null, + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null, + "content_filter_results": {} + } + ], + "created": 1757499907, + "model": "gpt-5-mini-2025-08-07", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": null, + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "chatcmpl-CECIdmgM7bbQr6YefuUbY4cycibvm", + "choices": [ + { + "delta": { + "content": " epit", + "function_call": null, + "refusal": null, + "role": null, + "tool_calls": null + }, + "finish_reason": null, + "index": 1, + "logprobs": null, + "content_filter_results": {} + } + ], + "created": 1757499907, + "model": "gpt-5-mini-2025-08-07", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": null, + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "chatcmpl-CECIdmgM7bbQr6YefuUbY4cycibvm", + "choices": [ + { + "delta": { + "content": "us", + "function_call": null, + "refusal": null, + "role": null, + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null, + "content_filter_results": {} + } + ], + "created": 1757499907, + "model": "gpt-5-mini-2025-08-07", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": null, + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "chatcmpl-CECIdmgM7bbQr6YefuUbY4cycibvm", + "choices": [ + { + "delta": { + "content": "het", + "function_call": null, + "refusal": null, + "role": null, + "tool_calls": null + }, + "finish_reason": null, + "index": 1, + "logprobs": null, + "content_filter_results": {} + } + ], + "created": 1757499907, + "model": "gpt-5-mini-2025-08-07", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": null, + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "chatcmpl-CECIdmgM7bbQr6YefuUbY4cycibvm", + "choices": [ + { + "delta": { + "content": ").", + "function_call": null, + "refusal": null, + "role": null, + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null, + "content_filter_results": {} + } + ], + "created": 1757499907, + "model": "gpt-5-mini-2025-08-07", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": null, + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "chatcmpl-CECIdmgM7bbQr6YefuUbY4cycibvm", + "choices": [ + { + "delta": { + "content": " it", + "function_call": null, + "refusal": null, + "role": null, + "tool_calls": null + }, + "finish_reason": null, + "index": 1, + "logprobs": null, + "content_filter_results": {} + } + ], + "created": 1757499907, + "model": "gpt-5-mini-2025-08-07", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": null, + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "chatcmpl-CECIdmgM7bbQr6YefuUbY4cycibvm", + "choices": [ + { + "delta": { + "content": "\u2019s", + "function_call": null, + "refusal": null, + "role": null, + "tool_calls": null + }, + "finish_reason": null, + "index": 1, + "logprobs": null, + "content_filter_results": {} + } + ], + "created": 1757499907, + "model": "gpt-5-mini-2025-08-07", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": null, + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "chatcmpl-CECIdmgM7bbQr6YefuUbY4cycibvm", + "choices": [ + { + "delta": { + "content": " also", + "function_call": null, + "refusal": null, + "role": null, + "tool_calls": null + }, + "finish_reason": null, + "index": 1, + "logprobs": null, + "content_filter_results": {} + } + ], + "created": 1757499907, + "model": "gpt-5-mini-2025-08-07", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": null, + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "chatcmpl-CECIdmgM7bbQr6YefuUbY4cycibvm", + "choices": [ + { + "delta": { + "content": " called", + "function_call": null, + "refusal": null, + "role": null, + "tool_calls": null + }, + "finish_reason": null, + "index": 1, + "logprobs": null, + "content_filter_results": {} + } + ], + "created": 1757499907, + "model": "gpt-5-mini-2025-08-07", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": null, + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "chatcmpl-CECIdmgM7bbQr6YefuUbY4cycibvm", + "choices": [ + { + "delta": { + "content": " \"", + "function_call": null, + "refusal": null, + "role": null, + "tool_calls": null + }, + "finish_reason": null, + "index": 1, + "logprobs": null, + "content_filter_results": {} + } + ], + "created": 1757499907, + "model": "gpt-5-mini-2025-08-07", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": null, + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "chatcmpl-CECIdmgM7bbQr6YefuUbY4cycibvm", + "choices": [ + { + "delta": { + "content": "Pho", + "function_call": null, + "refusal": null, + "role": null, + "tool_calls": null + }, + "finish_reason": null, + "index": 1, + "logprobs": null, + "content_filter_results": {} + } + ], + "created": 1757499907, + "model": "gpt-5-mini-2025-08-07", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": null, + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "chatcmpl-CECIdmgM7bbQr6YefuUbY4cycibvm", + "choices": [ + { + "delta": { + "content": "eb", + "function_call": null, + "refusal": null, + "role": null, + "tool_calls": null + }, + "finish_reason": null, + "index": 1, + "logprobs": null, + "content_filter_results": {} + } + ], + "created": 1757499907, + "model": "gpt-5-mini-2025-08-07", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": null, + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "chatcmpl-CECIdmgM7bbQr6YefuUbY4cycibvm", + "choices": [ + { + "delta": { + "content": "us", + "function_call": null, + "refusal": null, + "role": null, + "tool_calls": null + }, + "finish_reason": null, + "index": 1, + "logprobs": null, + "content_filter_results": {} + } + ], + "created": 1757499907, + "model": "gpt-5-mini-2025-08-07", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": null, + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "chatcmpl-CECIdmgM7bbQr6YefuUbY4cycibvm", + "choices": [ + { + "delta": { + "content": "\"", + "function_call": null, + "refusal": null, + "role": null, + "tool_calls": null + }, + "finish_reason": null, + "index": 1, + "logprobs": null, + "content_filter_results": {} + } + ], + "created": 1757499907, + "model": "gpt-5-mini-2025-08-07", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": null, + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "chatcmpl-CECIdmgM7bbQr6YefuUbY4cycibvm", + "choices": [ + { + "delta": { + "content": " in", + "function_call": null, + "refusal": null, + "role": null, + "tool_calls": null + }, + "finish_reason": null, + "index": 1, + "logprobs": null, + "content_filter_results": {} + } + ], + "created": 1757499907, + "model": "gpt-5-mini-2025-08-07", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": null, + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "chatcmpl-CECIdmgM7bbQr6YefuUbY4cycibvm", + "choices": [ + { + "delta": { + "content": " poetry", + "function_call": null, + "refusal": null, + "role": null, + "tool_calls": null + }, + "finish_reason": null, + "index": 1, + "logprobs": null, + "content_filter_results": {} + } + ], + "created": 1757499907, + "model": "gpt-5-mini-2025-08-07", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": null, + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "chatcmpl-CECIdmgM7bbQr6YefuUbY4cycibvm", + "choices": [ + { + "delta": { + "content": ".", + "function_call": null, + "refusal": null, + "role": null, + "tool_calls": null + }, + "finish_reason": null, + "index": 1, + "logprobs": null, + "content_filter_results": {} + } + ], + "created": 1757499907, + "model": "gpt-5-mini-2025-08-07", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": null, + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "chatcmpl-CECIdmgM7bbQr6YefuUbY4cycibvm", + "choices": [ + { + "delta": { + "content": null, + "function_call": null, + "refusal": null, + "role": null, + "tool_calls": null + }, + "finish_reason": "stop", + "index": 0, + "logprobs": null, + "content_filter_results": {} + } + ], + "created": 1757499907, + "model": "gpt-5-mini-2025-08-07", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": null, + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "chatcmpl-CECIdmgM7bbQr6YefuUbY4cycibvm", + "choices": [ + { + "delta": { + "content": null, + "function_call": null, + "refusal": null, + "role": null, + "tool_calls": null + }, + "finish_reason": "stop", + "index": 1, + "logprobs": null, + "content_filter_results": {} + } + ], + "created": 1757499907, + "model": "gpt-5-mini-2025-08-07", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": null, + "usage": null + } + } + ], + "is_streaming": true + } +} diff --git a/tests/integration/recordings/responses/fb785db7fafd.json b/tests/integration/recordings/responses/fb785db7fafd.json new file mode 100644 index 000000000..086d211e8 --- /dev/null +++ b/tests/integration/recordings/responses/fb785db7fafd.json @@ -0,0 +1,310 @@ +{ + "request": { + "method": "POST", + "url": "https://shan-mfbb618r-eastus2.cognitiveservices.azure.com/openai/v1/v1/chat/completions", + "headers": {}, + "body": { + "model": "gpt-5-mini", + "messages": [ + { + "role": "user", + "content": "What's the weather in Tokyo? Use the get_weather function to get the weather." + } + ], + "stream": true, + "tools": [ + { + "type": "function", + "function": { + "name": "get_weather", + "description": "Get the weather in a given city", + "parameters": { + "type": "object", + "properties": { + "city": { + "type": "string", + "description": "The city to get the weather for" + } + } + } + } + } + ] + }, + "endpoint": "/v1/chat/completions", + "model": "gpt-5-mini" + }, + "response": { + "body": [ + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "", + "choices": [], + "created": 0, + "model": "", + "object": "", + "service_tier": null, + "system_fingerprint": null, + "usage": null, + "prompt_filter_results": [ + { + "prompt_index": 0, + "content_filter_results": {} + } + ] + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "chatcmpl-CECIiMMWyfACuKUYWEyYSazcnvRVo", + "choices": [ + { + "delta": { + "content": null, + "function_call": null, + "refusal": null, + "role": "assistant", + "tool_calls": [ + { + "index": 0, + "id": "call_TMbEoYn9q0ZKtoxav5LpD9Ts", + "function": { + "arguments": "", + "name": "get_weather" + }, + "type": "function" + } + ] + }, + "finish_reason": null, + "index": 0, + "logprobs": null, + "content_filter_results": {} + } + ], + "created": 1757499912, + "model": "gpt-5-mini-2025-08-07", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": null, + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "chatcmpl-CECIiMMWyfACuKUYWEyYSazcnvRVo", + "choices": [ + { + "delta": { + "content": null, + "function_call": null, + "refusal": null, + "role": null, + "tool_calls": [ + { + "index": 0, + "id": null, + "function": { + "arguments": "{\"", + "name": null + }, + "type": null + } + ] + }, + "finish_reason": null, + "index": 0, + "logprobs": null, + "content_filter_results": {} + } + ], + "created": 1757499912, + "model": "gpt-5-mini-2025-08-07", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": null, + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "chatcmpl-CECIiMMWyfACuKUYWEyYSazcnvRVo", + "choices": [ + { + "delta": { + "content": null, + "function_call": null, + "refusal": null, + "role": null, + "tool_calls": [ + { + "index": 0, + "id": null, + "function": { + "arguments": "city", + "name": null + }, + "type": null + } + ] + }, + "finish_reason": null, + "index": 0, + "logprobs": null, + "content_filter_results": {} + } + ], + "created": 1757499912, + "model": "gpt-5-mini-2025-08-07", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": null, + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "chatcmpl-CECIiMMWyfACuKUYWEyYSazcnvRVo", + "choices": [ + { + "delta": { + "content": null, + "function_call": null, + "refusal": null, + "role": null, + "tool_calls": [ + { + "index": 0, + "id": null, + "function": { + "arguments": "\":\"", + "name": null + }, + "type": null + } + ] + }, + "finish_reason": null, + "index": 0, + "logprobs": null, + "content_filter_results": {} + } + ], + "created": 1757499912, + "model": "gpt-5-mini-2025-08-07", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": null, + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "chatcmpl-CECIiMMWyfACuKUYWEyYSazcnvRVo", + "choices": [ + { + "delta": { + "content": null, + "function_call": null, + "refusal": null, + "role": null, + "tool_calls": [ + { + "index": 0, + "id": null, + "function": { + "arguments": "Tokyo", + "name": null + }, + "type": null + } + ] + }, + "finish_reason": null, + "index": 0, + "logprobs": null, + "content_filter_results": {} + } + ], + "created": 1757499912, + "model": "gpt-5-mini-2025-08-07", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": null, + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "chatcmpl-CECIiMMWyfACuKUYWEyYSazcnvRVo", + "choices": [ + { + "delta": { + "content": null, + "function_call": null, + "refusal": null, + "role": null, + "tool_calls": [ + { + "index": 0, + "id": null, + "function": { + "arguments": "\"}", + "name": null + }, + "type": null + } + ] + }, + "finish_reason": null, + "index": 0, + "logprobs": null, + "content_filter_results": {} + } + ], + "created": 1757499912, + "model": "gpt-5-mini-2025-08-07", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": null, + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "chatcmpl-CECIiMMWyfACuKUYWEyYSazcnvRVo", + "choices": [ + { + "delta": { + "content": null, + "function_call": null, + "refusal": null, + "role": null, + "tool_calls": null + }, + "finish_reason": "tool_calls", + "index": 0, + "logprobs": null, + "content_filter_results": {} + } + ], + "created": 1757499912, + "model": "gpt-5-mini-2025-08-07", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": null, + "usage": null + } + } + ], + "is_streaming": true + } +} diff --git a/tests/integration/recordings/responses/ff3271401fb4.json b/tests/integration/recordings/responses/ff3271401fb4.json new file mode 100644 index 000000000..bf7ec89f7 --- /dev/null +++ b/tests/integration/recordings/responses/ff3271401fb4.json @@ -0,0 +1,556 @@ +{ + "request": { + "method": "POST", + "url": "https://shan-mfbb618r-eastus2.cognitiveservices.azure.com/openai/v1/v1/chat/completions", + "headers": {}, + "body": { + "model": "gpt-5-mini", + "messages": [ + { + "role": "user", + "content": "What is the name of the US captial?" + } + ], + "stream": true + }, + "endpoint": "/v1/chat/completions", + "model": "gpt-5-mini" + }, + "response": { + "body": [ + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "", + "choices": [], + "created": 0, + "model": "", + "object": "", + "service_tier": null, + "system_fingerprint": null, + "usage": null, + "prompt_filter_results": [ + { + "prompt_index": 0, + "content_filter_results": {} + } + ] + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "chatcmpl-CECImr5TLfMFiZN3FUlfVdBLr51Fs", + "choices": [ + { + "delta": { + "content": "", + "function_call": null, + "refusal": null, + "role": "assistant", + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null, + "content_filter_results": {} + } + ], + "created": 1757499916, + "model": "gpt-5-mini-2025-08-07", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": null, + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "chatcmpl-CECImr5TLfMFiZN3FUlfVdBLr51Fs", + "choices": [ + { + "delta": { + "content": "The", + "function_call": null, + "refusal": null, + "role": null, + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null, + "content_filter_results": {} + } + ], + "created": 1757499916, + "model": "gpt-5-mini-2025-08-07", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": null, + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "chatcmpl-CECImr5TLfMFiZN3FUlfVdBLr51Fs", + "choices": [ + { + "delta": { + "content": " capital", + "function_call": null, + "refusal": null, + "role": null, + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null, + "content_filter_results": {} + } + ], + "created": 1757499916, + "model": "gpt-5-mini-2025-08-07", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": null, + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "chatcmpl-CECImr5TLfMFiZN3FUlfVdBLr51Fs", + "choices": [ + { + "delta": { + "content": " of", + "function_call": null, + "refusal": null, + "role": null, + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null, + "content_filter_results": {} + } + ], + "created": 1757499916, + "model": "gpt-5-mini-2025-08-07", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": null, + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "chatcmpl-CECImr5TLfMFiZN3FUlfVdBLr51Fs", + "choices": [ + { + "delta": { + "content": " the", + "function_call": null, + "refusal": null, + "role": null, + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null, + "content_filter_results": {} + } + ], + "created": 1757499916, + "model": "gpt-5-mini-2025-08-07", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": null, + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "chatcmpl-CECImr5TLfMFiZN3FUlfVdBLr51Fs", + "choices": [ + { + "delta": { + "content": " United", + "function_call": null, + "refusal": null, + "role": null, + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null, + "content_filter_results": {} + } + ], + "created": 1757499916, + "model": "gpt-5-mini-2025-08-07", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": null, + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "chatcmpl-CECImr5TLfMFiZN3FUlfVdBLr51Fs", + "choices": [ + { + "delta": { + "content": " States", + "function_call": null, + "refusal": null, + "role": null, + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null, + "content_filter_results": {} + } + ], + "created": 1757499916, + "model": "gpt-5-mini-2025-08-07", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": null, + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "chatcmpl-CECImr5TLfMFiZN3FUlfVdBLr51Fs", + "choices": [ + { + "delta": { + "content": " is", + "function_call": null, + "refusal": null, + "role": null, + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null, + "content_filter_results": {} + } + ], + "created": 1757499916, + "model": "gpt-5-mini-2025-08-07", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": null, + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "chatcmpl-CECImr5TLfMFiZN3FUlfVdBLr51Fs", + "choices": [ + { + "delta": { + "content": " Washington", + "function_call": null, + "refusal": null, + "role": null, + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null, + "content_filter_results": {} + } + ], + "created": 1757499916, + "model": "gpt-5-mini-2025-08-07", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": null, + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "chatcmpl-CECImr5TLfMFiZN3FUlfVdBLr51Fs", + "choices": [ + { + "delta": { + "content": ",", + "function_call": null, + "refusal": null, + "role": null, + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null, + "content_filter_results": {} + } + ], + "created": 1757499916, + "model": "gpt-5-mini-2025-08-07", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": null, + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "chatcmpl-CECImr5TLfMFiZN3FUlfVdBLr51Fs", + "choices": [ + { + "delta": { + "content": " D", + "function_call": null, + "refusal": null, + "role": null, + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null, + "content_filter_results": {} + } + ], + "created": 1757499916, + "model": "gpt-5-mini-2025-08-07", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": null, + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "chatcmpl-CECImr5TLfMFiZN3FUlfVdBLr51Fs", + "choices": [ + { + "delta": { + "content": ".C", + "function_call": null, + "refusal": null, + "role": null, + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null, + "content_filter_results": {} + } + ], + "created": 1757499916, + "model": "gpt-5-mini-2025-08-07", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": null, + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "chatcmpl-CECImr5TLfMFiZN3FUlfVdBLr51Fs", + "choices": [ + { + "delta": { + "content": ".", + "function_call": null, + "refusal": null, + "role": null, + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null, + "content_filter_results": {} + } + ], + "created": 1757499916, + "model": "gpt-5-mini-2025-08-07", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": null, + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "chatcmpl-CECImr5TLfMFiZN3FUlfVdBLr51Fs", + "choices": [ + { + "delta": { + "content": " (", + "function_call": null, + "refusal": null, + "role": null, + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null, + "content_filter_results": {} + } + ], + "created": 1757499916, + "model": "gpt-5-mini-2025-08-07", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": null, + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "chatcmpl-CECImr5TLfMFiZN3FUlfVdBLr51Fs", + "choices": [ + { + "delta": { + "content": "District", + "function_call": null, + "refusal": null, + "role": null, + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null, + "content_filter_results": {} + } + ], + "created": 1757499916, + "model": "gpt-5-mini-2025-08-07", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": null, + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "chatcmpl-CECImr5TLfMFiZN3FUlfVdBLr51Fs", + "choices": [ + { + "delta": { + "content": " of", + "function_call": null, + "refusal": null, + "role": null, + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null, + "content_filter_results": {} + } + ], + "created": 1757499916, + "model": "gpt-5-mini-2025-08-07", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": null, + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "chatcmpl-CECImr5TLfMFiZN3FUlfVdBLr51Fs", + "choices": [ + { + "delta": { + "content": " Columbia", + "function_call": null, + "refusal": null, + "role": null, + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null, + "content_filter_results": {} + } + ], + "created": 1757499916, + "model": "gpt-5-mini-2025-08-07", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": null, + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "chatcmpl-CECImr5TLfMFiZN3FUlfVdBLr51Fs", + "choices": [ + { + "delta": { + "content": ").", + "function_call": null, + "refusal": null, + "role": null, + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null, + "content_filter_results": {} + } + ], + "created": 1757499916, + "model": "gpt-5-mini-2025-08-07", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": null, + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "chatcmpl-CECImr5TLfMFiZN3FUlfVdBLr51Fs", + "choices": [ + { + "delta": { + "content": null, + "function_call": null, + "refusal": null, + "role": null, + "tool_calls": null + }, + "finish_reason": "stop", + "index": 0, + "logprobs": null, + "content_filter_results": {} + } + ], + "created": 1757499916, + "model": "gpt-5-mini-2025-08-07", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": null, + "usage": null + } + } + ], + "is_streaming": true + } +} From d15368a3026450d1474f4a4db47b89fd3e6057ca Mon Sep 17 00:00:00 2001 From: Francisco Arceo Date: Thu, 11 Sep 2025 06:20:11 -0600 Subject: [PATCH 082/150] chore: Updating documentation, adding exception handling for Vector Stores in RAG Tool, more tests on migration, and migrate off of inference_api for context_retriever for RAG (#3367) # What does this PR do? - Updating documentation on migration from RAG Tool to Vector Stores and Files APIs - Adding exception handling for Vector Stores in RAG Tool - Add more tests on migration from RAG Tool to Vector Stores - Migrate off of inference_api for context_retriever for RAG ## Test Plan Integration and unit tests added Signed-off-by: Francisco Javier Arceo --- docs/source/building_applications/rag.md | 21 ++ .../tool_runtime/rag/context_retriever.py | 12 +- .../inline/tool_runtime/rag/memory.py | 121 ++++++---- .../integration/tool_runtime/test_rag_tool.py | 208 ++++++++++++++++++ .../utils/memory/test_vector_store.py | 38 ++++ 5 files changed, 355 insertions(+), 45 deletions(-) diff --git a/docs/source/building_applications/rag.md b/docs/source/building_applications/rag.md index 289c38991..802859e87 100644 --- a/docs/source/building_applications/rag.md +++ b/docs/source/building_applications/rag.md @@ -93,10 +93,31 @@ chunks_response = client.vector_io.query( ### Using the RAG Tool +> **⚠️ DEPRECATION NOTICE**: The RAG Tool is being deprecated in favor of directly using the OpenAI-compatible Search +> API. We recommend migrating to the OpenAI APIs for better compatibility and future support. + A better way to ingest documents is to use the RAG Tool. This tool allows you to ingest documents from URLs, files, etc. and automatically chunks them into smaller pieces. More examples for how to format a RAGDocument can be found in the [appendix](#more-ragdocument-examples). +#### OpenAI API Integration & Migration + +The RAG tool has been updated to use OpenAI-compatible APIs. This provides several benefits: + +- **Files API Integration**: Documents are now uploaded using OpenAI's file upload endpoints +- **Vector Stores API**: Vector storage operations use OpenAI's vector store format with configurable chunking strategies +- **Error Resilience:** When processing multiple documents, individual failures are logged but don't crash the operation. Failed documents are skipped while successful ones continue processing. + +**Migration Path:** +We recommend migrating to the OpenAI-compatible Search API for: +1. **Better OpenAI Ecosystem Integration**: Direct compatibility with OpenAI tools and workflows including the Responses API +2**Future-Proof**: Continued support and feature development +3**Full OpenAI Compatibility**: Vector Stores, Files, and Search APIs are fully compatible with OpenAI's Responses API + +The OpenAI APIs are used under the hood, so you can continue to use your existing RAG Tool code with minimal changes. +However, we recommend updating your code to use the new OpenAI-compatible APIs for better long-term support. If any +documents fail to process, they will be logged in the response but will not cause the entire operation to fail. + ```python from llama_stack_client import RAGDocument diff --git a/llama_stack/providers/inline/tool_runtime/rag/context_retriever.py b/llama_stack/providers/inline/tool_runtime/rag/context_retriever.py index be18430e4..9bc22f979 100644 --- a/llama_stack/providers/inline/tool_runtime/rag/context_retriever.py +++ b/llama_stack/providers/inline/tool_runtime/rag/context_retriever.py @@ -8,7 +8,7 @@ from jinja2 import Template from llama_stack.apis.common.content_types import InterleavedContent -from llama_stack.apis.inference import UserMessage +from llama_stack.apis.inference import OpenAIUserMessageParam from llama_stack.apis.tools.rag_tool import ( DefaultRAGQueryGeneratorConfig, LLMRAGQueryGeneratorConfig, @@ -61,16 +61,16 @@ async def llm_rag_query_generator( messages = [interleaved_content_as_str(content)] template = Template(config.template) - content = template.render({"messages": messages}) + rendered_content: str = template.render({"messages": messages}) model = config.model - message = UserMessage(content=content) - response = await inference_api.chat_completion( - model_id=model, + message = OpenAIUserMessageParam(content=rendered_content) + response = await inference_api.openai_chat_completion( + model=model, messages=[message], stream=False, ) - query = response.completion_message.content + query = response.choices[0].message.content return query diff --git a/llama_stack/providers/inline/tool_runtime/rag/memory.py b/llama_stack/providers/inline/tool_runtime/rag/memory.py index aa629cca8..bc68f198d 100644 --- a/llama_stack/providers/inline/tool_runtime/rag/memory.py +++ b/llama_stack/providers/inline/tool_runtime/rag/memory.py @@ -45,10 +45,7 @@ from llama_stack.apis.vector_io import ( from llama_stack.log import get_logger from llama_stack.providers.datatypes import ToolGroupsProtocolPrivate from llama_stack.providers.utils.inference.prompt_adapter import interleaved_content_as_str -from llama_stack.providers.utils.memory.vector_store import ( - content_from_doc, - parse_data_url, -) +from llama_stack.providers.utils.memory.vector_store import parse_data_url from .config import RagToolRuntimeConfig from .context_retriever import generate_rag_query @@ -60,6 +57,47 @@ def make_random_string(length: int = 8): return "".join(secrets.choice(string.ascii_letters + string.digits) for _ in range(length)) +async def raw_data_from_doc(doc: RAGDocument) -> tuple[bytes, str]: + """Get raw binary data and mime type from a RAGDocument for file upload.""" + if isinstance(doc.content, URL): + if doc.content.uri.startswith("data:"): + parts = parse_data_url(doc.content.uri) + mime_type = parts["mimetype"] + data = parts["data"] + + if parts["is_base64"]: + file_data = base64.b64decode(data) + else: + file_data = data.encode("utf-8") + + return file_data, mime_type + else: + async with httpx.AsyncClient() as client: + r = await client.get(doc.content.uri) + r.raise_for_status() + mime_type = r.headers.get("content-type", "application/octet-stream") + return r.content, mime_type + else: + if isinstance(doc.content, str): + content_str = doc.content + else: + content_str = interleaved_content_as_str(doc.content) + + if content_str.startswith("data:"): + parts = parse_data_url(content_str) + mime_type = parts["mimetype"] + data = parts["data"] + + if parts["is_base64"]: + file_data = base64.b64decode(data) + else: + file_data = data.encode("utf-8") + + return file_data, mime_type + else: + return content_str.encode("utf-8"), "text/plain" + + class MemoryToolRuntimeImpl(ToolGroupsProtocolPrivate, ToolRuntime, RAGToolRuntime): def __init__( self, @@ -95,46 +133,52 @@ class MemoryToolRuntimeImpl(ToolGroupsProtocolPrivate, ToolRuntime, RAGToolRunti return for doc in documents: - if isinstance(doc.content, URL): - if doc.content.uri.startswith("data:"): - parts = parse_data_url(doc.content.uri) - file_data = base64.b64decode(parts["data"]) if parts["is_base64"] else parts["data"].encode() - mime_type = parts["mimetype"] - else: - async with httpx.AsyncClient() as client: - response = await client.get(doc.content.uri) - file_data = response.content - mime_type = doc.mime_type or response.headers.get("content-type", "application/octet-stream") - else: - content_str = await content_from_doc(doc) - file_data = content_str.encode("utf-8") - mime_type = doc.mime_type or "text/plain" + try: + try: + file_data, mime_type = await raw_data_from_doc(doc) + except Exception as e: + log.error(f"Failed to extract content from document {doc.document_id}: {e}") + continue - file_extension = mimetypes.guess_extension(mime_type) or ".txt" - filename = doc.metadata.get("filename", f"{doc.document_id}{file_extension}") + file_extension = mimetypes.guess_extension(mime_type) or ".txt" + filename = doc.metadata.get("filename", f"{doc.document_id}{file_extension}") - file_obj = io.BytesIO(file_data) - file_obj.name = filename + file_obj = io.BytesIO(file_data) + file_obj.name = filename - upload_file = UploadFile(file=file_obj, filename=filename) + upload_file = UploadFile(file=file_obj, filename=filename) - created_file = await self.files_api.openai_upload_file( - file=upload_file, purpose=OpenAIFilePurpose.ASSISTANTS - ) + try: + created_file = await self.files_api.openai_upload_file( + file=upload_file, purpose=OpenAIFilePurpose.ASSISTANTS + ) + except Exception as e: + log.error(f"Failed to upload file for document {doc.document_id}: {e}") + continue - chunking_strategy = VectorStoreChunkingStrategyStatic( - static=VectorStoreChunkingStrategyStaticConfig( - max_chunk_size_tokens=chunk_size_in_tokens, - chunk_overlap_tokens=chunk_size_in_tokens // 4, + chunking_strategy = VectorStoreChunkingStrategyStatic( + static=VectorStoreChunkingStrategyStaticConfig( + max_chunk_size_tokens=chunk_size_in_tokens, + chunk_overlap_tokens=chunk_size_in_tokens // 4, + ) ) - ) - await self.vector_io_api.openai_attach_file_to_vector_store( - vector_store_id=vector_db_id, - file_id=created_file.id, - attributes=doc.metadata, - chunking_strategy=chunking_strategy, - ) + try: + await self.vector_io_api.openai_attach_file_to_vector_store( + vector_store_id=vector_db_id, + file_id=created_file.id, + attributes=doc.metadata, + chunking_strategy=chunking_strategy, + ) + except Exception as e: + log.error( + f"Failed to attach file {created_file.id} to vector store {vector_db_id} for document {doc.document_id}: {e}" + ) + continue + + except Exception as e: + log.error(f"Unexpected error processing document {doc.document_id}: {e}") + continue async def query( self, @@ -274,7 +318,6 @@ class MemoryToolRuntimeImpl(ToolGroupsProtocolPrivate, ToolRuntime, RAGToolRunti if query_config: query_config = TypeAdapter(RAGQueryConfig).validate_python(query_config) else: - # handle someone passing an empty dict query_config = RAGQueryConfig() query = kwargs["query"] @@ -285,6 +328,6 @@ class MemoryToolRuntimeImpl(ToolGroupsProtocolPrivate, ToolRuntime, RAGToolRunti ) return ToolInvocationResult( - content=result.content, + content=result.content or [], metadata=result.metadata, ) diff --git a/tests/integration/tool_runtime/test_rag_tool.py b/tests/integration/tool_runtime/test_rag_tool.py index b208500d8..b78c39af8 100644 --- a/tests/integration/tool_runtime/test_rag_tool.py +++ b/tests/integration/tool_runtime/test_rag_tool.py @@ -183,6 +183,110 @@ def test_vector_db_insert_from_url_and_query( assert any("llama2" in chunk.content.lower() for chunk in response2.chunks) +def test_rag_tool_openai_apis(client_with_empty_registry, embedding_model_id, embedding_dimension): + vector_db_id = "test_openai_vector_db" + + client_with_empty_registry.vector_dbs.register( + vector_db_id=vector_db_id, + embedding_model=embedding_model_id, + embedding_dimension=embedding_dimension, + ) + + available_vector_dbs = [vector_db.identifier for vector_db in client_with_empty_registry.vector_dbs.list()] + actual_vector_db_id = available_vector_dbs[0] + + # different document formats that should work with OpenAI APIs + documents = [ + Document( + document_id="text-doc", + content="This is a plain text document about machine learning algorithms.", + metadata={"type": "text", "category": "AI"}, + ), + Document( + document_id="url-doc", + content="https://raw.githubusercontent.com/pytorch/torchtune/main/docs/source/tutorials/chat.rst", + mime_type="text/plain", + metadata={"type": "url", "source": "pytorch"}, + ), + Document( + document_id="data-url-doc", + content="data:text/plain;base64,VGhpcyBpcyBhIGRhdGEgVVJMIGRvY3VtZW50IGFib3V0IGRlZXAgbGVhcm5pbmcu", # "This is a data URL document about deep learning." + metadata={"type": "data_url", "encoding": "base64"}, + ), + ] + + client_with_empty_registry.tool_runtime.rag_tool.insert( + documents=documents, + vector_db_id=actual_vector_db_id, + chunk_size_in_tokens=256, + ) + + files_list = client_with_empty_registry.files.list() + assert len(files_list.data) >= len(documents), ( + f"Expected at least {len(documents)} files, got {len(files_list.data)}" + ) + + vector_store_files = client_with_empty_registry.vector_io.openai_list_files_in_vector_store( + vector_store_id=actual_vector_db_id + ) + assert len(vector_store_files.data) >= len(documents), f"Expected at least {len(documents)} files in vector store" + + response = client_with_empty_registry.tool_runtime.rag_tool.query( + vector_db_ids=[actual_vector_db_id], + content="Tell me about machine learning and deep learning", + ) + + assert_valid_text_response(response) + content_text = " ".join([chunk.text for chunk in response.content]).lower() + assert "machine learning" in content_text or "deep learning" in content_text + + +def test_rag_tool_exception_handling(client_with_empty_registry, embedding_model_id, embedding_dimension): + vector_db_id = "test_exception_handling" + + client_with_empty_registry.vector_dbs.register( + vector_db_id=vector_db_id, + embedding_model=embedding_model_id, + embedding_dimension=embedding_dimension, + ) + + available_vector_dbs = [vector_db.identifier for vector_db in client_with_empty_registry.vector_dbs.list()] + actual_vector_db_id = available_vector_dbs[0] + + documents = [ + Document( + document_id="valid-doc", + content="This is a valid document that should be processed successfully.", + metadata={"status": "valid"}, + ), + Document( + document_id="invalid-url-doc", + content="https://nonexistent-domain-12345.com/invalid.txt", + metadata={"status": "invalid_url"}, + ), + Document( + document_id="another-valid-doc", + content="This is another valid document for testing resilience.", + metadata={"status": "valid"}, + ), + ] + + client_with_empty_registry.tool_runtime.rag_tool.insert( + documents=documents, + vector_db_id=actual_vector_db_id, + chunk_size_in_tokens=256, + ) + + response = client_with_empty_registry.tool_runtime.rag_tool.query( + vector_db_ids=[actual_vector_db_id], + content="valid document", + ) + + assert_valid_text_response(response) + content_text = " ".join([chunk.text for chunk in response.content]).lower() + assert "valid document" in content_text + + def test_rag_tool_insert_and_query(client_with_empty_registry, embedding_model_id, embedding_dimension): providers = [p for p in client_with_empty_registry.providers.list() if p.api == "vector_io"] assert len(providers) > 0 @@ -249,3 +353,107 @@ def test_rag_tool_insert_and_query(client_with_empty_registry, embedding_model_i "chunk_template": "This should raise a ValueError because it is missing the proper template variables", }, ) + + +def test_rag_tool_query_generation(client_with_empty_registry, embedding_model_id, embedding_dimension): + vector_db_id = "test_query_generation_db" + + client_with_empty_registry.vector_dbs.register( + vector_db_id=vector_db_id, + embedding_model=embedding_model_id, + embedding_dimension=embedding_dimension, + ) + + available_vector_dbs = [vector_db.identifier for vector_db in client_with_empty_registry.vector_dbs.list()] + actual_vector_db_id = available_vector_dbs[0] + + documents = [ + Document( + document_id="ai-doc", + content="Artificial intelligence and machine learning are transforming technology.", + metadata={"category": "AI"}, + ), + Document( + document_id="banana-doc", + content="Don't bring a banana to a knife fight.", + metadata={"category": "wisdom"}, + ), + ] + + client_with_empty_registry.tool_runtime.rag_tool.insert( + documents=documents, + vector_db_id=actual_vector_db_id, + chunk_size_in_tokens=256, + ) + + response = client_with_empty_registry.tool_runtime.rag_tool.query( + vector_db_ids=[actual_vector_db_id], + content="Tell me about AI", + ) + + assert_valid_text_response(response) + content_text = " ".join([chunk.text for chunk in response.content]).lower() + assert "artificial intelligence" in content_text or "machine learning" in content_text + + +def test_rag_tool_pdf_data_url_handling(client_with_empty_registry, embedding_model_id, embedding_dimension): + vector_db_id = "test_pdf_data_url_db" + + client_with_empty_registry.vector_dbs.register( + vector_db_id=vector_db_id, + embedding_model=embedding_model_id, + embedding_dimension=embedding_dimension, + ) + + available_vector_dbs = [vector_db.identifier for vector_db in client_with_empty_registry.vector_dbs.list()] + actual_vector_db_id = available_vector_dbs[0] + + sample_pdf = b"%PDF-1.3\n3 0 obj\n<>\nendobj\n4 0 obj\n<>\nstream\nx\x9c\x15\xcc1\x0e\x820\x18@\xe1\x9dS\xbcM]jk$\xd5\xd5(\x83!\x86\xa1\x17\xf8\xa3\xa5`LIh+\xd7W\xc6\xf7\r\xef\xc0\xbd\xd2\xaa\xb6,\xd5\xc5\xb1o\x0c\xa6VZ\xe3znn%\xf3o\xab\xb1\xe7\xa3:Y\xdc\x8bm\xeb\xf3&1\xc8\xd7\xd3\x97\xc82\xe6\x81\x87\xe42\xcb\x87Vb(\x12<\xdd<=}Jc\x0cL\x91\xee\xda$\xb5\xc3\xbd\xd7\xe9\x0f\x8d\x97 $\nendstream\nendobj\n1 0 obj\n<>\nendobj\n5 0 obj\n<>\nendobj\n2 0 obj\n<<\n/ProcSet [/PDF /Text /ImageB /ImageC /ImageI]\n/Font <<\n/F1 5 0 R\n>>\n/XObject <<\n>>\n>>\nendobj\n6 0 obj\n<<\n/Producer (PyFPDF 1.7.2 http://pyfpdf.googlecode.com/)\n/Title (This is a sample title.)\n/Author (Llama Stack Developers)\n/CreationDate (D:20250312165548)\n>>\nendobj\n7 0 obj\n<<\n/Type /Catalog\n/Pages 1 0 R\n/OpenAction [3 0 R /FitH null]\n/PageLayout /OneColumn\n>>\nendobj\nxref\n0 8\n0000000000 65535 f \n0000000272 00000 n \n0000000455 00000 n \n0000000009 00000 n \n0000000087 00000 n \n0000000359 00000 n \n0000000559 00000 n \n0000000734 00000 n \ntrailer\n<<\n/Size 8\n/Root 7 0 R\n/Info 6 0 R\n>>\nstartxref\n837\n%%EOF\n" + + import base64 + + pdf_base64 = base64.b64encode(sample_pdf).decode("utf-8") + pdf_data_url = f"data:application/pdf;base64,{pdf_base64}" + + documents = [ + Document( + document_id="test-pdf-data-url", + content=pdf_data_url, + metadata={"type": "pdf", "source": "data_url"}, + ), + ] + + client_with_empty_registry.tool_runtime.rag_tool.insert( + documents=documents, + vector_db_id=actual_vector_db_id, + chunk_size_in_tokens=256, + ) + + files_list = client_with_empty_registry.files.list() + assert len(files_list.data) >= 1, "PDF should have been uploaded to Files API" + + pdf_file = None + for file in files_list.data: + if file.filename and "test-pdf-data-url" in file.filename: + pdf_file = file + break + + assert pdf_file is not None, "PDF file should be found in Files API" + assert pdf_file.bytes == len(sample_pdf), f"File size should match original PDF ({len(sample_pdf)} bytes)" + + file_content = client_with_empty_registry.files.retrieve_content(pdf_file.id) + assert file_content.startswith(b"%PDF-"), "Retrieved file should be a valid PDF" + + vector_store_files = client_with_empty_registry.vector_io.openai_list_files_in_vector_store( + vector_store_id=actual_vector_db_id + ) + assert len(vector_store_files.data) >= 1, "PDF should be attached to vector store" + + response = client_with_empty_registry.tool_runtime.rag_tool.query( + vector_db_ids=[actual_vector_db_id], + content="sample title", + ) + + assert_valid_text_response(response) + content_text = " ".join([chunk.text for chunk in response.content]).lower() + assert "sample title" in content_text or "title" in content_text diff --git a/tests/unit/providers/utils/memory/test_vector_store.py b/tests/unit/providers/utils/memory/test_vector_store.py index 90b229262..590bdd1d2 100644 --- a/tests/unit/providers/utils/memory/test_vector_store.py +++ b/tests/unit/providers/utils/memory/test_vector_store.py @@ -178,3 +178,41 @@ def test_content_from_data_and_mime_type_both_encodings_fail(): # Should raise an exception instead of returning empty string with pytest.raises(UnicodeDecodeError): content_from_data_and_mime_type(data, mime_type) + + +async def test_memory_tool_error_handling(): + """Test that memory tool handles various failures gracefully without crashing.""" + from llama_stack.providers.inline.tool_runtime.rag.config import RagToolRuntimeConfig + from llama_stack.providers.inline.tool_runtime.rag.memory import MemoryToolRuntimeImpl + + config = RagToolRuntimeConfig() + memory_tool = MemoryToolRuntimeImpl( + config=config, + vector_io_api=AsyncMock(), + inference_api=AsyncMock(), + files_api=AsyncMock(), + ) + + docs = [ + RAGDocument(document_id="good_doc", content="Good content", metadata={}), + RAGDocument(document_id="bad_url_doc", content=URL(uri="https://bad.url"), metadata={}), + RAGDocument(document_id="another_good_doc", content="Another good content", metadata={}), + ] + + mock_file1 = MagicMock() + mock_file1.id = "file_good1" + mock_file2 = MagicMock() + mock_file2.id = "file_good2" + memory_tool.files_api.openai_upload_file.side_effect = [mock_file1, mock_file2] + + with patch("httpx.AsyncClient") as mock_client: + mock_instance = AsyncMock() + mock_instance.get.side_effect = Exception("Bad URL") + mock_client.return_value.__aenter__.return_value = mock_instance + + # won't raise exception despite one document failing + await memory_tool.insert(docs, "vector_store_123") + + # processed 2 documents successfully, skipped 1 + assert memory_tool.files_api.openai_upload_file.call_count == 2 + assert memory_tool.vector_io_api.openai_attach_file_to_vector_store.call_count == 2 From 8ef1189be7c6ea6e9fb2e3cf3f502123e0e4635a Mon Sep 17 00:00:00 2001 From: Matthew Farrellee Date: Thu, 11 Sep 2025 09:04:38 -0400 Subject: [PATCH 083/150] chore: update the vLLM inference impl to use OpenAIMixin for openai-compat functions (#3404) # What does this PR do? update vLLM inference provider to use OpenAIMixin for openai-compat functions inference recordings from Qwen3-0.6B and vLLM 0.8.3 - ``` docker run --gpus all -v ~/.cache/huggingface:/root/.cache/huggingface -p 8000:8000 --ipc=host \ vllm/vllm-openai:latest \ --model Qwen/Qwen3-0.6B --enable-auto-tool-choice --tool-call-parser hermes ``` ## Test Plan ``` ./scripts/integration-tests.sh --stack-config server:ci-tests --setup vllm --subdirs inference ``` --- .../providers/remote/inference/vllm/vllm.py | 197 +----------------- .../providers/utils/inference/openai_mixin.py | 28 ++- .../providers/inference/test_remote_vllm.py | 21 +- 3 files changed, 44 insertions(+), 202 deletions(-) diff --git a/llama_stack/providers/remote/inference/vllm/vllm.py b/llama_stack/providers/remote/inference/vllm/vllm.py index 9e9a80ca5..77f5d82af 100644 --- a/llama_stack/providers/remote/inference/vllm/vllm.py +++ b/llama_stack/providers/remote/inference/vllm/vllm.py @@ -4,7 +4,7 @@ # This source code is licensed under the terms described in the LICENSE file in # the root directory of this source tree. import json -from collections.abc import AsyncGenerator, AsyncIterator +from collections.abc import AsyncGenerator from typing import Any import httpx @@ -38,13 +38,6 @@ from llama_stack.apis.inference import ( LogProbConfig, Message, ModelStore, - OpenAIChatCompletion, - OpenAICompletion, - OpenAIEmbeddingData, - OpenAIEmbeddingsResponse, - OpenAIEmbeddingUsage, - OpenAIMessageParam, - OpenAIResponseFormatParam, ResponseFormat, SamplingParams, TextTruncation, @@ -71,11 +64,11 @@ from llama_stack.providers.utils.inference.openai_compat import ( convert_message_to_openai_dict, convert_tool_call, get_sampling_options, - prepare_openai_completion_params, process_chat_completion_stream_response, process_completion_response, process_completion_stream_response, ) +from llama_stack.providers.utils.inference.openai_mixin import OpenAIMixin from llama_stack.providers.utils.inference.prompt_adapter import ( completion_request_to_prompt, content_has_media, @@ -288,7 +281,7 @@ async def _process_vllm_chat_completion_stream_response( yield c -class VLLMInferenceAdapter(Inference, ModelsProtocolPrivate): +class VLLMInferenceAdapter(OpenAIMixin, Inference, ModelsProtocolPrivate): # automatically set by the resolver when instantiating the provider __provider_id__: str model_store: ModelStore | None = None @@ -296,7 +289,6 @@ class VLLMInferenceAdapter(Inference, ModelsProtocolPrivate): def __init__(self, config: VLLMInferenceAdapterConfig) -> None: self.register_helper = ModelRegistryHelper(build_hf_repo_model_entries()) self.config = config - self.client = None async def initialize(self) -> None: if not self.config.url: @@ -308,8 +300,6 @@ class VLLMInferenceAdapter(Inference, ModelsProtocolPrivate): return self.config.refresh_models async def list_models(self) -> list[Model] | None: - self._lazy_initialize_client() - assert self.client is not None # mypy models = [] async for m in self.client.models.list(): model_type = ModelType.llm # unclear how to determine embedding vs. llm models @@ -340,8 +330,7 @@ class VLLMInferenceAdapter(Inference, ModelsProtocolPrivate): HealthResponse: A dictionary containing the health status. """ try: - client = self._create_client() if self.client is None else self.client - _ = [m async for m in client.models.list()] # Ensure the client is initialized + _ = [m async for m in self.client.models.list()] # Ensure the client is initialized return HealthResponse(status=HealthStatus.OK) except Exception as e: return HealthResponse(status=HealthStatus.ERROR, message=f"Health check failed: {str(e)}") @@ -351,19 +340,14 @@ class VLLMInferenceAdapter(Inference, ModelsProtocolPrivate): raise ValueError("Model store not set") return await self.model_store.get_model(model_id) - def _lazy_initialize_client(self): - if self.client is not None: - return + def get_api_key(self): + return self.config.api_token - log.info(f"Initializing vLLM client with base_url={self.config.url}") - self.client = self._create_client() + def get_base_url(self): + return self.config.url - def _create_client(self): - return AsyncOpenAI( - base_url=self.config.url, - api_key=self.config.api_token, - http_client=httpx.AsyncClient(verify=self.config.tls_verify), - ) + def get_extra_client_params(self): + return {"http_client": httpx.AsyncClient(verify=self.config.tls_verify)} async def completion( self, @@ -374,7 +358,6 @@ class VLLMInferenceAdapter(Inference, ModelsProtocolPrivate): stream: bool | None = False, logprobs: LogProbConfig | None = None, ) -> CompletionResponse | AsyncGenerator[CompletionResponseStreamChunk, None]: - self._lazy_initialize_client() if sampling_params is None: sampling_params = SamplingParams() model = await self._get_model(model_id) @@ -406,7 +389,6 @@ class VLLMInferenceAdapter(Inference, ModelsProtocolPrivate): logprobs: LogProbConfig | None = None, tool_config: ToolConfig | None = None, ) -> ChatCompletionResponse | AsyncGenerator[ChatCompletionResponseStreamChunk, None]: - self._lazy_initialize_client() if sampling_params is None: sampling_params = SamplingParams() model = await self._get_model(model_id) @@ -479,16 +461,12 @@ class VLLMInferenceAdapter(Inference, ModelsProtocolPrivate): yield chunk async def register_model(self, model: Model) -> Model: - # register_model is called during Llama Stack initialization, hence we cannot init self.client if not initialized yet. - # self.client should only be created after the initialization is complete to avoid asyncio cross-context errors. - # Changing this may lead to unpredictable behavior. - client = self._create_client() if self.client is None else self.client try: model = await self.register_helper.register_model(model) except ValueError: pass # Ignore statically unknown model, will check live listing try: - res = await client.models.list() + res = await self.client.models.list() except APIConnectionError as e: raise ValueError( f"Failed to connect to vLLM at {self.config.url}. Please check if vLLM is running and accessible at that URL." @@ -543,8 +521,6 @@ class VLLMInferenceAdapter(Inference, ModelsProtocolPrivate): output_dimension: int | None = None, task_type: EmbeddingTaskType | None = None, ) -> EmbeddingsResponse: - self._lazy_initialize_client() - assert self.client is not None model = await self._get_model(model_id) kwargs = {} @@ -560,154 +536,3 @@ class VLLMInferenceAdapter(Inference, ModelsProtocolPrivate): embeddings = [data.embedding for data in response.data] return EmbeddingsResponse(embeddings=embeddings) - - async def openai_embeddings( - self, - model: str, - input: str | list[str], - encoding_format: str | None = "float", - dimensions: int | None = None, - user: str | None = None, - ) -> OpenAIEmbeddingsResponse: - self._lazy_initialize_client() - assert self.client is not None - model_obj = await self._get_model(model) - assert model_obj.model_type == ModelType.embedding - - # Convert input to list if it's a string - input_list = [input] if isinstance(input, str) else input - - # Call vLLM embeddings endpoint with encoding_format - response = await self.client.embeddings.create( - model=model_obj.provider_resource_id, - input=input_list, - dimensions=dimensions, - encoding_format=encoding_format, - ) - - # Convert response to OpenAI format - data = [ - OpenAIEmbeddingData( - embedding=embedding_data.embedding, - index=i, - ) - for i, embedding_data in enumerate(response.data) - ] - - # Not returning actual token usage since vLLM doesn't provide it - usage = OpenAIEmbeddingUsage(prompt_tokens=-1, total_tokens=-1) - - return OpenAIEmbeddingsResponse( - data=data, - model=model_obj.provider_resource_id, - usage=usage, - ) - - async def openai_completion( - self, - model: str, - prompt: str | list[str] | list[int] | list[list[int]], - best_of: int | None = None, - echo: bool | None = None, - frequency_penalty: float | None = None, - logit_bias: dict[str, float] | None = None, - logprobs: bool | None = None, - max_tokens: int | None = None, - n: int | None = None, - presence_penalty: float | None = None, - seed: int | None = None, - stop: str | list[str] | None = None, - stream: bool | None = None, - stream_options: dict[str, Any] | None = None, - temperature: float | None = None, - top_p: float | None = None, - user: str | None = None, - guided_choice: list[str] | None = None, - prompt_logprobs: int | None = None, - suffix: str | None = None, - ) -> OpenAICompletion: - self._lazy_initialize_client() - model_obj = await self._get_model(model) - - extra_body: dict[str, Any] = {} - if prompt_logprobs is not None and prompt_logprobs >= 0: - extra_body["prompt_logprobs"] = prompt_logprobs - if guided_choice: - extra_body["guided_choice"] = guided_choice - - params = await prepare_openai_completion_params( - model=model_obj.provider_resource_id, - prompt=prompt, - best_of=best_of, - echo=echo, - frequency_penalty=frequency_penalty, - logit_bias=logit_bias, - logprobs=logprobs, - max_tokens=max_tokens, - n=n, - presence_penalty=presence_penalty, - seed=seed, - stop=stop, - stream=stream, - stream_options=stream_options, - temperature=temperature, - top_p=top_p, - user=user, - extra_body=extra_body, - ) - return await self.client.completions.create(**params) # type: ignore - - async def openai_chat_completion( - self, - model: str, - messages: list[OpenAIMessageParam], - frequency_penalty: float | None = None, - function_call: str | dict[str, Any] | None = None, - functions: list[dict[str, Any]] | None = None, - logit_bias: dict[str, float] | None = None, - logprobs: bool | None = None, - max_completion_tokens: int | None = None, - max_tokens: int | None = None, - n: int | None = None, - parallel_tool_calls: bool | None = None, - presence_penalty: float | None = None, - response_format: OpenAIResponseFormatParam | None = None, - seed: int | None = None, - stop: str | list[str] | None = None, - stream: bool | None = None, - stream_options: dict[str, Any] | None = None, - temperature: float | None = None, - tool_choice: str | dict[str, Any] | None = None, - tools: list[dict[str, Any]] | None = None, - top_logprobs: int | None = None, - top_p: float | None = None, - user: str | None = None, - ) -> OpenAIChatCompletion | AsyncIterator[OpenAIChatCompletionChunk]: - self._lazy_initialize_client() - model_obj = await self._get_model(model) - params = await prepare_openai_completion_params( - model=model_obj.provider_resource_id, - messages=messages, - frequency_penalty=frequency_penalty, - function_call=function_call, - functions=functions, - logit_bias=logit_bias, - logprobs=logprobs, - max_completion_tokens=max_completion_tokens, - max_tokens=max_tokens, - n=n, - parallel_tool_calls=parallel_tool_calls, - presence_penalty=presence_penalty, - response_format=response_format, - seed=seed, - stop=stop, - stream=stream, - stream_options=stream_options, - temperature=temperature, - tool_choice=tool_choice, - tools=tools, - top_logprobs=top_logprobs, - top_p=top_p, - user=user, - ) - return await self.client.chat.completions.create(**params) # type: ignore diff --git a/llama_stack/providers/utils/inference/openai_mixin.py b/llama_stack/providers/utils/inference/openai_mixin.py index f60deee6e..a3c0ffadc 100644 --- a/llama_stack/providers/utils/inference/openai_mixin.py +++ b/llama_stack/providers/utils/inference/openai_mixin.py @@ -67,6 +67,17 @@ class OpenAIMixin(ABC): """ pass + def get_extra_client_params(self) -> dict[str, Any]: + """ + Get any extra parameters to pass to the AsyncOpenAI client. + + Child classes can override this method to provide additional parameters + such as timeout settings, proxies, etc. + + :return: A dictionary of extra parameters + """ + return {} + @property def client(self) -> AsyncOpenAI: """ @@ -78,6 +89,7 @@ class OpenAIMixin(ABC): return AsyncOpenAI( api_key=self.get_api_key(), base_url=self.get_base_url(), + **self.get_extra_client_params(), ) async def _get_provider_model_id(self, model: str) -> str: @@ -124,10 +136,15 @@ class OpenAIMixin(ABC): """ Direct OpenAI completion API call. """ - if guided_choice is not None: - logger.warning("guided_choice is not supported by the OpenAI API. Ignoring.") - if prompt_logprobs is not None: - logger.warning("prompt_logprobs is not supported by the OpenAI API. Ignoring.") + # Handle parameters that are not supported by OpenAI API, but may be by the provider + # prompt_logprobs is supported by vLLM + # guided_choice is supported by vLLM + # TODO: test coverage + extra_body: dict[str, Any] = {} + if prompt_logprobs is not None and prompt_logprobs >= 0: + extra_body["prompt_logprobs"] = prompt_logprobs + if guided_choice: + extra_body["guided_choice"] = guided_choice # TODO: fix openai_completion to return type compatible with OpenAI's API response return await self.client.completions.create( # type: ignore[no-any-return] @@ -150,7 +167,8 @@ class OpenAIMixin(ABC): top_p=top_p, user=user, suffix=suffix, - ) + ), + extra_body=extra_body, ) async def openai_chat_completion( diff --git a/tests/unit/providers/inference/test_remote_vllm.py b/tests/unit/providers/inference/test_remote_vllm.py index ce0e930b1..a48af2a1d 100644 --- a/tests/unit/providers/inference/test_remote_vllm.py +++ b/tests/unit/providers/inference/test_remote_vllm.py @@ -11,7 +11,7 @@ import threading import time from http.server import BaseHTTPRequestHandler, HTTPServer from typing import Any -from unittest.mock import AsyncMock, MagicMock, patch +from unittest.mock import AsyncMock, MagicMock, PropertyMock, patch import pytest from openai.types.chat.chat_completion_chunk import ( @@ -150,10 +150,12 @@ async def test_tool_call_response(vllm_inference_adapter): """Verify that tool call arguments from a CompletionMessage are correctly converted into the expected JSON format.""" - # Patch the call to vllm so we can inspect the arguments sent were correct - with patch.object( - vllm_inference_adapter.client.chat.completions, "create", new_callable=AsyncMock - ) as mock_nonstream_completion: + # Patch the client property to avoid instantiating a real AsyncOpenAI client + with patch.object(VLLMInferenceAdapter, "client", new_callable=PropertyMock) as mock_create_client: + mock_client = MagicMock() + mock_client.chat.completions.create = AsyncMock() + mock_create_client.return_value = mock_client + messages = [ SystemMessage(content="You are a helpful assistant"), UserMessage(content="How many?"), @@ -179,7 +181,7 @@ async def test_tool_call_response(vllm_inference_adapter): tool_config=ToolConfig(tool_choice=ToolChoice.auto), ) - assert mock_nonstream_completion.call_args.kwargs["messages"][2]["tool_calls"] == [ + assert mock_client.chat.completions.create.call_args.kwargs["messages"][2]["tool_calls"] == [ { "id": "foo", "type": "function", @@ -641,9 +643,7 @@ async def test_health_status_success(vllm_inference_adapter): This test verifies that the health method returns a HealthResponse with status OK, only when the connection to the vLLM server is successful. """ - # Set vllm_inference_adapter.client to None to ensure _create_client is called - vllm_inference_adapter.client = None - with patch.object(vllm_inference_adapter, "_create_client") as mock_create_client: + with patch.object(VLLMInferenceAdapter, "client", new_callable=PropertyMock) as mock_create_client: # Create mock client and models mock_client = MagicMock() mock_models = MagicMock() @@ -674,8 +674,7 @@ async def test_health_status_failure(vllm_inference_adapter): This test verifies that the health method returns a HealthResponse with status ERROR and an appropriate error message when the connection to the vLLM server fails. """ - vllm_inference_adapter.client = None - with patch.object(vllm_inference_adapter, "_create_client") as mock_create_client: + with patch.object(VLLMInferenceAdapter, "client", new_callable=PropertyMock) as mock_create_client: # Create mock client and models mock_client = MagicMock() mock_models = MagicMock() From 72387b4bd229bba60b43f95679da62630fc0f3c7 Mon Sep 17 00:00:00 2001 From: Matthew Farrellee Date: Thu, 11 Sep 2025 11:45:16 -0400 Subject: [PATCH 084/150] chore(unit tests): remove network use, update async test (#3418) # What does this PR do? update the async detection test for vllm - remove a network access from unit tests - remove direct logging use the idea behind the test is to mock inference w/ a sleep, initiate concurrent inference calls, verify the total execution time is close to the sleep time. in a non-async env the total time would be closer to sleep * num concurrent calls. ## Test Plan ci --- .../providers/inference/test_remote_vllm.py | 160 +++++++----------- 1 file changed, 60 insertions(+), 100 deletions(-) diff --git a/tests/unit/providers/inference/test_remote_vllm.py b/tests/unit/providers/inference/test_remote_vllm.py index a48af2a1d..61b16b5d1 100644 --- a/tests/unit/providers/inference/test_remote_vllm.py +++ b/tests/unit/providers/inference/test_remote_vllm.py @@ -6,11 +6,7 @@ import asyncio import json -import logging # allow-direct-logging -import threading import time -from http.server import BaseHTTPRequestHandler, HTTPServer -from typing import Any from unittest.mock import AsyncMock, MagicMock, PropertyMock, patch import pytest @@ -18,7 +14,7 @@ from openai.types.chat.chat_completion_chunk import ( ChatCompletionChunk as OpenAIChatCompletionChunk, ) from openai.types.chat.chat_completion_chunk import ( - Choice as OpenAIChoice, + Choice as OpenAIChoiceChunk, ) from openai.types.chat.chat_completion_chunk import ( ChoiceDelta as OpenAIChoiceDelta, @@ -35,6 +31,9 @@ from llama_stack.apis.inference import ( ChatCompletionRequest, ChatCompletionResponseEventType, CompletionMessage, + OpenAIAssistantMessageParam, + OpenAIChatCompletion, + OpenAIChoice, SystemMessage, ToolChoice, ToolConfig, @@ -61,41 +60,6 @@ from llama_stack.providers.remote.inference.vllm.vllm import ( # -v -s --tb=short --disable-warnings -class MockInferenceAdapterWithSleep: - def __init__(self, sleep_time: int, response: dict[str, Any]): - self.httpd = None - - class DelayedRequestHandler(BaseHTTPRequestHandler): - # ruff: noqa: N802 - def do_POST(self): - time.sleep(sleep_time) - response_body = json.dumps(response).encode("utf-8") - self.send_response(code=200) - self.send_header("Content-Type", "application/json") - self.send_header("Content-Length", len(response_body)) - self.end_headers() - self.wfile.write(response_body) - - self.request_handler = DelayedRequestHandler - - def __enter__(self): - httpd = HTTPServer(("", 0), self.request_handler) - self.httpd = httpd - host, port = httpd.server_address - httpd_thread = threading.Thread(target=httpd.serve_forever) - httpd_thread.daemon = True # stop server if this thread terminates - httpd_thread.start() - - config = VLLMInferenceAdapterConfig(url=f"http://{host}:{port}") - inference_adapter = VLLMInferenceAdapter(config) - return inference_adapter - - def __exit__(self, _exc_type, _exc_value, _traceback): - if self.httpd: - self.httpd.shutdown() - self.httpd.server_close() - - @pytest.fixture(scope="module") def mock_openai_models_list(): with patch("openai.resources.models.AsyncModels.list", new_callable=AsyncMock) as mock_list: @@ -201,7 +165,7 @@ async def test_tool_call_delta_empty_tool_call_buf(): async def mock_stream(): delta = OpenAIChoiceDelta(content="", tool_calls=None) - choices = [OpenAIChoice(delta=delta, finish_reason="stop", index=0)] + choices = [OpenAIChoiceChunk(delta=delta, finish_reason="stop", index=0)] mock_chunk = OpenAIChatCompletionChunk( id="chunk-1", created=1, @@ -227,7 +191,7 @@ async def test_tool_call_delta_streaming_arguments_dict(): model="foo", object="chat.completion.chunk", choices=[ - OpenAIChoice( + OpenAIChoiceChunk( delta=OpenAIChoiceDelta( content="", tool_calls=[ @@ -252,7 +216,7 @@ async def test_tool_call_delta_streaming_arguments_dict(): model="foo", object="chat.completion.chunk", choices=[ - OpenAIChoice( + OpenAIChoiceChunk( delta=OpenAIChoiceDelta( content="", tool_calls=[ @@ -277,7 +241,9 @@ async def test_tool_call_delta_streaming_arguments_dict(): model="foo", object="chat.completion.chunk", choices=[ - OpenAIChoice(delta=OpenAIChoiceDelta(content="", tool_calls=None), finish_reason="tool_calls", index=0) + OpenAIChoiceChunk( + delta=OpenAIChoiceDelta(content="", tool_calls=None), finish_reason="tool_calls", index=0 + ) ], ) for chunk in [mock_chunk_1, mock_chunk_2, mock_chunk_3]: @@ -301,7 +267,7 @@ async def test_multiple_tool_calls(): model="foo", object="chat.completion.chunk", choices=[ - OpenAIChoice( + OpenAIChoiceChunk( delta=OpenAIChoiceDelta( content="", tool_calls=[ @@ -326,7 +292,7 @@ async def test_multiple_tool_calls(): model="foo", object="chat.completion.chunk", choices=[ - OpenAIChoice( + OpenAIChoiceChunk( delta=OpenAIChoiceDelta( content="", tool_calls=[ @@ -351,7 +317,9 @@ async def test_multiple_tool_calls(): model="foo", object="chat.completion.chunk", choices=[ - OpenAIChoice(delta=OpenAIChoiceDelta(content="", tool_calls=None), finish_reason="tool_calls", index=0) + OpenAIChoiceChunk( + delta=OpenAIChoiceDelta(content="", tool_calls=None), finish_reason="tool_calls", index=0 + ) ], ) for chunk in [mock_chunk_1, mock_chunk_2, mock_chunk_3]: @@ -395,59 +363,6 @@ async def test_process_vllm_chat_completion_stream_response_no_choices(): assert chunks[0].event.event_type.value == "start" -@pytest.mark.allow_network -def test_chat_completion_doesnt_block_event_loop(caplog): - loop = asyncio.new_event_loop() - loop.set_debug(True) - caplog.set_level(logging.WARNING) - - # Log when event loop is blocked for more than 200ms - loop.slow_callback_duration = 0.5 - # Sleep for 500ms in our delayed http response - sleep_time = 0.5 - - mock_model = Model(identifier="mock-model", provider_resource_id="mock-model", provider_id="vllm-inference") - mock_response = { - "id": "chatcmpl-abc123", - "object": "chat.completion", - "created": 1, - "modle": "mock-model", - "choices": [ - { - "message": {"content": ""}, - "logprobs": None, - "finish_reason": "stop", - "index": 0, - } - ], - } - - async def do_chat_completion(): - await inference_adapter.chat_completion( - "mock-model", - [], - stream=False, - tools=None, - tool_config=ToolConfig(tool_choice=ToolChoice.auto), - ) - - with MockInferenceAdapterWithSleep(sleep_time, mock_response) as inference_adapter: - inference_adapter.model_store = AsyncMock() - inference_adapter.model_store.get_model.return_value = mock_model - loop.run_until_complete(inference_adapter.initialize()) - - # Clear the logs so far and run the actual chat completion we care about - caplog.clear() - loop.run_until_complete(do_chat_completion()) - - # Ensure we don't have any asyncio warnings in the captured log - # records from our chat completion call. A message gets logged - # here any time we exceed the slow_callback_duration configured - # above. - asyncio_warnings = [record.message for record in caplog.records if record.name == "asyncio"] - assert not asyncio_warnings - - async def test_get_params_empty_tools(vllm_inference_adapter): request = ChatCompletionRequest( tools=[], @@ -696,3 +611,48 @@ async def test_health_status_failure(vllm_inference_adapter): assert "Health check failed: Connection failed" in health_response["message"] mock_models.list.assert_called_once() + + +async def test_openai_chat_completion_is_async(vllm_inference_adapter): + """ + Verify that openai_chat_completion is async and doesn't block the event loop. + + To do this we mock the underlying inference with a sleep, start multiple + inference calls in parallel, and ensure the total time taken is less + than the sum of the individual sleep times. + """ + sleep_time = 0.5 + + async def mock_create(*args, **kwargs): + await asyncio.sleep(sleep_time) + return OpenAIChatCompletion( + id="chatcmpl-abc123", + created=1, + model="mock-model", + choices=[ + OpenAIChoice( + message=OpenAIAssistantMessageParam( + content="nothing interesting", + ), + finish_reason="stop", + index=0, + ) + ], + ) + + async def do_inference(): + await vllm_inference_adapter.openai_chat_completion( + "mock-model", messages=["one fish", "two fish"], stream=False + ) + + with patch.object(VLLMInferenceAdapter, "client", new_callable=PropertyMock) as mock_create_client: + mock_client = MagicMock() + mock_client.chat.completions.create = AsyncMock(side_effect=mock_create) + mock_create_client.return_value = mock_client + + start_time = time.time() + await asyncio.gather(do_inference(), do_inference(), do_inference(), do_inference()) + total_time = time.time() - start_time + + assert mock_create_client.call_count == 4 # no cheating + assert total_time < (sleep_time * 2), f"Total time taken: {total_time}s exceeded expected max" From c7ef1f13df981622216833578c70d98f702d9cc6 Mon Sep 17 00:00:00 2001 From: slekkala1 Date: Thu, 11 Sep 2025 11:10:41 -0700 Subject: [PATCH 085/150] feat: Add langchain llamastack Integration example notebook (#3314) # What does this PR do? The notebook was reverted(https://github.com/llamastack/llama-stack/pull/3259) as it had some local paths, I missed correcting. Trying with corrections now ## Test Plan Ran the Jupyter notebook --- .../langchain/Llama_Stack_LangChain.ipynb | 701 ++++++++++++++++++ 1 file changed, 701 insertions(+) create mode 100644 docs/notebooks/langchain/Llama_Stack_LangChain.ipynb diff --git a/docs/notebooks/langchain/Llama_Stack_LangChain.ipynb b/docs/notebooks/langchain/Llama_Stack_LangChain.ipynb new file mode 100644 index 000000000..d44ac6994 --- /dev/null +++ b/docs/notebooks/langchain/Llama_Stack_LangChain.ipynb @@ -0,0 +1,701 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "id": "1ztegmwm4sp", + "metadata": {}, + "source": [ + "## LlamaStack + LangChain Integration Tutorial\n", + "\n", + "This notebook demonstrates how to integrate **LlamaStack** with **LangChain** to build a complete RAG (Retrieval-Augmented Generation) system.\n", + "\n", + "### Overview\n", + "\n", + "- **LlamaStack**: Provides the infrastructure for running LLMs and Open AI Compatible Vector Stores\n", + "- **LangChain**: Provides the framework for chaining operations and prompt templates\n", + "- **Integration**: Uses LlamaStack's OpenAI-compatible API with LangChain\n", + "\n", + "### What You'll See\n", + "\n", + "1. Setting up LlamaStack server with Fireworks AI provider\n", + "2. Creating and Querying Vector Stores\n", + "3. Building RAG chains with LangChain + LLAMAStack\n", + "4. Querying the chain for relevant information\n", + "\n", + "### Prerequisites\n", + "\n", + "- Fireworks API key\n", + "\n", + "---\n", + "\n", + "### 1. Installation and Setup" + ] + }, + { + "cell_type": "markdown", + "id": "2ktr5ls2cas", + "metadata": {}, + "source": [ + "#### Install Required Dependencies\n", + "\n", + "First, we install all the necessary packages for LangChain and FastAPI integration." + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "id": "5b6a6a17-b931-4bea-8273-0d6e5563637a", + "metadata": { + "scrolled": true + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Requirement already satisfied: uv in /Users/swapna942/miniconda3/lib/python3.12/site-packages (0.7.20)\n", + "\u001b[2mUsing Python 3.12.11 environment at: /Users/swapna942/miniconda3\u001b[0m\n", + "\u001b[2mAudited \u001b[1m7 packages\u001b[0m \u001b[2min 42ms\u001b[0m\u001b[0m\n" + ] + } + ], + "source": [ + "!pip install uv\n", + "!uv pip install fastapi uvicorn \"langchain>=0.2\" langchain-openai \\\n", + " langchain-community langchain-text-splitters \\\n", + " faiss-cpu" + ] + }, + { + "cell_type": "markdown", + "id": "wmt9jvqzh7n", + "metadata": {}, + "source": [ + "### 2. LlamaStack Server Setup\n", + "\n", + "#### Build and Start LlamaStack Server\n", + "\n", + "This section sets up the LlamaStack server with:\n", + "- **Fireworks AI** as the inference provider\n", + "- **Sentence Transformers** for embeddings\n", + "\n", + "The server runs on `localhost:8321` and provides OpenAI-compatible endpoints." + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "id": "dd2dacf3-ec8b-4cc7-8ff4-b5b6ea4a6e9e", + "metadata": { + "scrolled": true + }, + "outputs": [], + "source": [ + "import os\n", + "import subprocess\n", + "import time\n", + "\n", + "# Remove UV_SYSTEM_PYTHON to ensure uv creates a proper virtual environment\n", + "# instead of trying to use system Python globally, which could cause permission issues\n", + "# and package conflicts with the system's Python installation\n", + "if \"UV_SYSTEM_PYTHON\" in os.environ:\n", + " del os.environ[\"UV_SYSTEM_PYTHON\"]\n", + "\n", + "def run_llama_stack_server_background():\n", + " \"\"\"Build and run LlamaStack server in one step using --run flag\"\"\"\n", + " log_file = open(\"llama_stack_server.log\", \"w\")\n", + " process = subprocess.Popen(\n", + " \"uv run --with llama-stack llama stack build --distro starter --image-type venv --run\",\n", + " shell=True,\n", + " stdout=log_file,\n", + " stderr=log_file,\n", + " text=True,\n", + " )\n", + "\n", + " print(f\"Building and starting Llama Stack server with PID: {process.pid}\")\n", + " return process\n", + "\n", + "\n", + "def wait_for_server_to_start():\n", + " import requests\n", + " from requests.exceptions import ConnectionError\n", + "\n", + " url = \"http://0.0.0.0:8321/v1/health\"\n", + " max_retries = 30\n", + " retry_interval = 1\n", + "\n", + " print(\"Waiting for server to start\", end=\"\")\n", + " for _ in range(max_retries):\n", + " try:\n", + " response = requests.get(url)\n", + " if response.status_code == 200:\n", + " print(\"\\nServer is ready!\")\n", + " return True\n", + " except ConnectionError:\n", + " print(\".\", end=\"\", flush=True)\n", + " time.sleep(retry_interval)\n", + "\n", + " print(\"\\nServer failed to start after\", max_retries * retry_interval, \"seconds\")\n", + " return False\n", + "\n", + "\n", + "def kill_llama_stack_server():\n", + " # Kill any existing llama stack server processes using pkill command\n", + " os.system(\"pkill -f llama_stack.core.server.server\")" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "id": "28bd8dbd-4576-4e76-813f-21ab94db44a2", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Building and starting Llama Stack server with PID: 19747\n", + "Waiting for server to start....\n", + "Server is ready!\n" + ] + } + ], + "source": [ + "server_process = run_llama_stack_server_background()\n", + "assert wait_for_server_to_start()" + ] + }, + { + "cell_type": "markdown", + "id": "gr9cdcg4r7n", + "metadata": {}, + "source": [ + "#### Install LlamaStack Client\n", + "\n", + "Install the client library to interact with the LlamaStack server." + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "id": "487d2dbc-d071-400e-b4f0-dcee58f8dc95", + "metadata": { + "scrolled": true + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\u001b[2mUsing Python 3.12.11 environment at: /Users/swapna942/miniconda3\u001b[0m\n", + "\u001b[2mAudited \u001b[1m1 package\u001b[0m \u001b[2min 27ms\u001b[0m\u001b[0m\n" + ] + } + ], + "source": [ + "!uv pip install llama_stack_client" + ] + }, + { + "cell_type": "markdown", + "id": "0j5hag7l9x89", + "metadata": {}, + "source": [ + "### 3. Initialize LlamaStack Client\n", + "\n", + "Create a client connection to the LlamaStack server with API keys for different providers:\n", + "\n", + "- **Fireworks API Key**: For Fireworks models\n", + "\n" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "id": "ab4eff97-4565-4c73-b1b3-0020a4c7e2a5", + "metadata": {}, + "outputs": [], + "source": [ + "from llama_stack_client import LlamaStackClient\n", + "\n", + "client = LlamaStackClient(\n", + " base_url=\"http://0.0.0.0:8321\",\n", + " provider_data={\"fireworks_api_key\": \"***\"},\n", + ")" + ] + }, + { + "cell_type": "markdown", + "id": "vwhexjy1e8o", + "metadata": {}, + "source": [ + "#### Explore Available Models and Safety Features\n", + "\n", + "Check what models and safety shields are available through your LlamaStack instance." + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "id": "880443ef-ac3c-48b1-a80a-7dab5b25ac61", + "metadata": { + "scrolled": true + }, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "INFO:httpx:HTTP Request: GET http://0.0.0.0:8321/v1/models \"HTTP/1.1 200 OK\"\n", + "INFO:httpx:HTTP Request: GET http://0.0.0.0:8321/v1/shields \"HTTP/1.1 200 OK\"\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Available Fireworks models:\n", + "- fireworks/accounts/fireworks/models/llama-v3p1-8b-instruct\n", + "- fireworks/accounts/fireworks/models/llama-v3p1-70b-instruct\n", + "- fireworks/accounts/fireworks/models/llama-v3p1-405b-instruct\n", + "- fireworks/accounts/fireworks/models/llama-v3p2-3b-instruct\n", + "- fireworks/accounts/fireworks/models/llama-v3p2-11b-vision-instruct\n", + "- fireworks/accounts/fireworks/models/llama-v3p2-90b-vision-instruct\n", + "- fireworks/accounts/fireworks/models/llama-v3p3-70b-instruct\n", + "- fireworks/accounts/fireworks/models/llama4-scout-instruct-basic\n", + "- fireworks/accounts/fireworks/models/llama4-maverick-instruct-basic\n", + "- fireworks/nomic-ai/nomic-embed-text-v1.5\n", + "- fireworks/accounts/fireworks/models/llama-guard-3-8b\n", + "- fireworks/accounts/fireworks/models/llama-guard-3-11b-vision\n", + "----\n", + "Available shields (safety models):\n", + "code-scanner\n", + "llama-guard\n", + "nemo-guardrail\n", + "----\n" + ] + } + ], + "source": [ + "print(\"Available Fireworks models:\")\n", + "for m in client.models.list():\n", + " if m.identifier.startswith(\"fireworks/\"):\n", + " print(f\"- {m.identifier}\")\n", + "\n", + "print(\"----\")\n", + "print(\"Available shields (safety models):\")\n", + "for s in client.shields.list():\n", + " print(s.identifier)\n", + "print(\"----\")" + ] + }, + { + "cell_type": "markdown", + "id": "gojp7at31ht", + "metadata": {}, + "source": [ + "### 4. Vector Store Setup\n", + "\n", + "#### Create a Vector Store with File Upload\n", + "\n", + "Create a vector store using the OpenAI-compatible vector stores API:\n", + "\n", + "- **Vector Store**: OpenAI-compatible vector store for document storage\n", + "- **File Upload**: Automatic chunking and embedding of uploaded files \n", + "- **Embedding Model**: Sentence Transformers model for text embeddings\n", + "- **Dimensions**: 384-dimensional embeddings" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "id": "be2c2899-ea53-4e5f-b6b8-ed425f5d6572", + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "INFO:httpx:HTTP Request: POST http://0.0.0.0:8321/v1/openai/v1/files \"HTTP/1.1 200 OK\"\n", + "INFO:httpx:HTTP Request: POST http://0.0.0.0:8321/v1/openai/v1/files \"HTTP/1.1 200 OK\"\n", + "INFO:httpx:HTTP Request: POST http://0.0.0.0:8321/v1/openai/v1/files \"HTTP/1.1 200 OK\"\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "File(id='file-54652c95c56c4c34918a97d7ff8a4320', bytes=41, created_at=1757442621, expires_at=1788978621, filename='shipping_policy.txt', object='file', purpose='assistants')\n", + "File(id='file-fb1227c1d1854da1bd774d21e5b7e41c', bytes=48, created_at=1757442621, expires_at=1788978621, filename='returns_policy.txt', object='file', purpose='assistants')\n", + "File(id='file-673f874852fe42798675a13d06a256e2', bytes=45, created_at=1757442621, expires_at=1788978621, filename='support.txt', object='file', purpose='assistants')\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "INFO:httpx:HTTP Request: POST http://0.0.0.0:8321/v1/openai/v1/vector_stores \"HTTP/1.1 200 OK\"\n" + ] + } + ], + "source": [ + "from io import BytesIO\n", + "\n", + "docs = [\n", + " (\"Acme ships globally in 3-5 business days.\", {\"title\": \"Shipping Policy\"}),\n", + " (\"Returns are accepted within 30 days of purchase.\", {\"title\": \"Returns Policy\"}),\n", + " (\"Support is available 24/7 via chat and email.\", {\"title\": \"Support\"}),\n", + "]\n", + "\n", + "file_ids = []\n", + "for content, metadata in docs:\n", + " with BytesIO(content.encode()) as file_buffer:\n", + " file_buffer.name = f\"{metadata['title'].replace(' ', '_').lower()}.txt\"\n", + " create_file_response = client.files.create(file=file_buffer, purpose=\"assistants\")\n", + " print(create_file_response)\n", + " file_ids.append(create_file_response.id)\n", + "\n", + "# Create vector store with files\n", + "vector_store = client.vector_stores.create(\n", + " name=\"acme_docs\",\n", + " file_ids=file_ids,\n", + " embedding_model=\"sentence-transformers/all-MiniLM-L6-v2\",\n", + " embedding_dimension=384,\n", + " provider_id=\"faiss\"\n", + ")" + ] + }, + { + "cell_type": "markdown", + "id": "9061tmi1zpq", + "metadata": {}, + "source": [ + "#### Test Vector Store Search\n", + "\n", + "Query the vector store. This performs semantic search to find relevant documents based on the query." + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "id": "ba9d1901-bd5e-4216-b3e6-19dc74551cc6", + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "INFO:httpx:HTTP Request: POST http://0.0.0.0:8321/v1/openai/v1/vector_stores/vs_708c060b-45da-423e-8354-68529b4fd1a6/search \"HTTP/1.1 200 OK\"\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Acme ships globally in 3-5 business days.\n", + "Returns are accepted within 30 days of purchase.\n" + ] + } + ], + "source": [ + "search_response = client.vector_stores.search(\n", + " vector_store_id=vector_store.id,\n", + " query=\"How long does shipping take?\",\n", + " max_num_results=2\n", + ")\n", + "for result in search_response.data:\n", + " content = result.content[0].text\n", + " print(content)" + ] + }, + { + "cell_type": "markdown", + "id": "usne6mbspms", + "metadata": {}, + "source": [ + "### 5. LangChain Integration\n", + "\n", + "#### Configure LangChain with LlamaStack\n", + "\n", + "Set up LangChain to use LlamaStack's OpenAI-compatible API:\n", + "\n", + "- **Base URL**: Points to LlamaStack's OpenAI endpoint\n", + "- **Headers**: Include Fireworks API key for model access\n", + "- **Model**: Use Meta Llama v3p1 8b instruct model for inference" + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "id": "c378bd10-09c2-417c-bdfc-1e0a2dd19084", + "metadata": {}, + "outputs": [], + "source": [ + "import os\n", + "\n", + "from langchain_openai import ChatOpenAI\n", + "\n", + "# Point LangChain to Llamastack Server\n", + "llm = ChatOpenAI(\n", + " base_url=\"http://0.0.0.0:8321/v1/openai/v1\",\n", + " api_key=\"dummy\",\n", + " model=\"fireworks/accounts/fireworks/models/llama-v3p1-8b-instruct\",\n", + " default_headers={\"X-LlamaStack-Provider-Data\": '{\"fireworks_api_key\": \"***\"}'},\n", + ")" + ] + }, + { + "cell_type": "markdown", + "id": "5a4ddpcuk3l", + "metadata": {}, + "source": [ + "#### Test LLM Connection\n", + "\n", + "Verify that LangChain can successfully communicate with the LlamaStack server." + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "id": "f88ffb5a-657b-4916-9375-c6ddc156c25e", + "metadata": { + "scrolled": true + }, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "INFO:httpx:HTTP Request: POST http://0.0.0.0:8321/v1/openai/v1/chat/completions \"HTTP/1.1 200 OK\"\n" + ] + }, + { + "data": { + "text/plain": [ + "AIMessage(content=\"A llama's gentle eyes shine bright,\\nIn the Andes, it roams through morning light.\", additional_kwargs={'refusal': None}, response_metadata={'token_usage': None, 'model_name': 'fireworks/accounts/fireworks/models/llama-v3p1-8b-instruct', 'system_fingerprint': None, 'id': 'chatcmpl-602b5967-82a3-476b-9cd2-7d3b29b76ee8', 'service_tier': None, 'finish_reason': 'stop', 'logprobs': None}, id='run--0933c465-ff4d-4a7b-b7fb-fd97dd8244f3-0')" + ] + }, + "execution_count": 10, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# Test llm with simple message\n", + "messages = [\n", + " {\"role\": \"system\", \"content\": \"You are a friendly assistant.\"},\n", + " {\"role\": \"user\", \"content\": \"Write a two-sentence poem about llama.\"},\n", + "]\n", + "llm.invoke(messages)" + ] + }, + { + "cell_type": "markdown", + "id": "0xh0jg6a0l4a", + "metadata": {}, + "source": [ + "### 6. Building the RAG Chain\n", + "\n", + "#### Create a Complete RAG Pipeline\n", + "\n", + "Build a LangChain pipeline that combines:\n", + "\n", + "1. **Vector Search**: Query LlamaStack's Open AI compatible Vector Store\n", + "2. **Context Assembly**: Format retrieved documents\n", + "3. **Prompt Template**: Structure the input for the LLM\n", + "4. **LLM Generation**: Generate answers using context\n", + "5. **Output Parsing**: Extract the final response\n", + "\n", + "**Chain Flow**: `Query → Vector Search → Context + Question → LLM → Response`" + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "id": "9684427d-dcc7-4544-9af5-8b110d014c42", + "metadata": {}, + "outputs": [], + "source": [ + "# LangChain for prompt template and chaining + LLAMA Stack Client Vector DB and LLM chat completion\n", + "from langchain_core.output_parsers import StrOutputParser\n", + "from langchain_core.prompts import ChatPromptTemplate\n", + "from langchain_core.runnables import RunnableLambda, RunnablePassthrough\n", + "\n", + "\n", + "def join_docs(docs):\n", + " return \"\\n\\n\".join([f\"[{d.filename}] {d.content[0].text}\" for d in docs.data])\n", + "\n", + "PROMPT = ChatPromptTemplate.from_messages(\n", + " [\n", + " (\"system\", \"You are a helpful assistant. Use the following context to answer.\"),\n", + " (\"user\", \"Question: {question}\\n\\nContext:\\n{context}\"),\n", + " ]\n", + ")\n", + "\n", + "vector_step = RunnableLambda(\n", + " lambda x: client.vector_stores.search(\n", + " vector_store_id=vector_store.id,\n", + " query=x,\n", + " max_num_results=2\n", + " )\n", + " )\n", + "\n", + "chain = (\n", + " {\"context\": vector_step | RunnableLambda(join_docs), \"question\": RunnablePassthrough()}\n", + " | PROMPT\n", + " | llm\n", + " | StrOutputParser()\n", + ")" + ] + }, + { + "cell_type": "markdown", + "id": "0onu6rhphlra", + "metadata": {}, + "source": [ + "### 7. Testing the RAG System\n", + "\n", + "#### Example 1: Shipping Query" + ] + }, + { + "cell_type": "code", + "execution_count": 12, + "id": "03322188-9509-446a-a4a8-ce3bb83ec87c", + "metadata": { + "scrolled": true + }, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "INFO:httpx:HTTP Request: POST http://0.0.0.0:8321/v1/openai/v1/vector_stores/vs_708c060b-45da-423e-8354-68529b4fd1a6/search \"HTTP/1.1 200 OK\"\n", + "INFO:httpx:HTTP Request: POST http://0.0.0.0:8321/v1/openai/v1/chat/completions \"HTTP/1.1 200 OK\"\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "❓ How long does shipping take?\n", + "💡 Acme ships globally in 3-5 business days. This means that shipping typically takes between 3 to 5 working days from the date of dispatch or order fulfillment.\n" + ] + } + ], + "source": [ + "query = \"How long does shipping take?\"\n", + "response = chain.invoke(query)\n", + "print(\"❓\", query)\n", + "print(\"💡\", response)" + ] + }, + { + "cell_type": "markdown", + "id": "b7krhqj88ku", + "metadata": {}, + "source": [ + "#### Example 2: Returns Policy Query" + ] + }, + { + "cell_type": "code", + "execution_count": 13, + "id": "61995550-bb0b-46a8-a5d0-023207475d60", + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "INFO:httpx:HTTP Request: POST http://0.0.0.0:8321/v1/openai/v1/vector_stores/vs_708c060b-45da-423e-8354-68529b4fd1a6/search \"HTTP/1.1 200 OK\"\n", + "INFO:httpx:HTTP Request: POST http://0.0.0.0:8321/v1/openai/v1/chat/completions \"HTTP/1.1 200 OK\"\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "❓ Can I return a product after 40 days?\n", + "💡 Based on the provided context, you cannot return a product after 40 days. The return window is limited to 30 days from the date of purchase.\n" + ] + } + ], + "source": [ + "query = \"Can I return a product after 40 days?\"\n", + "response = chain.invoke(query)\n", + "print(\"❓\", query)\n", + "print(\"💡\", response)" + ] + }, + { + "cell_type": "markdown", + "id": "h4w24fadvjs", + "metadata": {}, + "source": [ + "---\n", + "We have successfully built a RAG system that combines:\n", + "\n", + "- **LlamaStack** for infrastructure (LLM serving + Vector Store)\n", + "- **LangChain** for orchestration (prompts + chains)\n", + "- **Fireworks** for high-quality language models\n", + "\n", + "### Key Benefits\n", + "\n", + "1. **Unified Infrastructure**: Single server for LLMs and Vector Store\n", + "2. **OpenAI Compatibility**: Easy integration with existing LangChain code\n", + "3. **Multi-Provider Support**: Switch between different LLM providers\n", + "4. **Production Ready**: Built-in safety shields and monitoring\n", + "\n", + "### Next Steps\n", + "\n", + "- Add more sophisticated document processing\n", + "- Implement conversation memory\n", + "- Add safety filtering and monitoring\n", + "- Scale to larger document collections\n", + "- Integrate with web frameworks like FastAPI or Streamlit\n", + "\n", + "---\n", + "\n", + "##### 🔧 Cleanup\n", + "\n", + "Don't forget to stop the LlamaStack server when you're done:\n", + "\n", + "```python\n", + "kill_llama_stack_server()\n", + "```" + ] + }, + { + "cell_type": "code", + "execution_count": 14, + "id": "15647c46-22ce-4698-af3f-8161329d8e3a", + "metadata": {}, + "outputs": [], + "source": [ + "kill_llama_stack_server()" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3 (ipykernel)", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.13.7" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} From 69a52213a190bddcf118bb13206353ff4b30d33d Mon Sep 17 00:00:00 2001 From: Charlie Doern Date: Thu, 11 Sep 2025 16:30:09 -0400 Subject: [PATCH 086/150] fix: oasdiff enhancements and stability (#3419) # What does this PR do? only run conformance tests when the spec is changed. Also, cache oasdiff such that it is not installed every time the test is run Signed-off-by: Charlie Doern --- .github/workflows/conformance.yml | 24 +++++++++++++++++++----- 1 file changed, 19 insertions(+), 5 deletions(-) diff --git a/.github/workflows/conformance.yml b/.github/workflows/conformance.yml index c0a7795a3..c7962c93d 100644 --- a/.github/workflows/conformance.yml +++ b/.github/workflows/conformance.yml @@ -13,11 +13,8 @@ on: branches: [ main ] types: [opened, synchronize, reopened] paths: - - 'llama_stack/**' - - '!llama_stack/ui/**' - - 'tests/**' - - 'uv.lock' - - 'pyproject.toml' + - 'docs/_static/llama-stack-spec.yaml' + - 'docs/_static/llama-stack-spec.html' - '.github/workflows/conformance.yml' # This workflow itself concurrency: @@ -43,10 +40,27 @@ jobs: ref: ${{ github.event.pull_request.base.ref }} path: 'base' + # Cache oasdiff to avoid checksum failures and speed up builds + - name: Cache oasdiff + id: cache-oasdiff + uses: actions/cache@0400d5f644dc74513175e3cd8d07132dd4860809 + with: + path: ~/oasdiff + key: oasdiff-${{ runner.os }} + # Install oasdiff: https://github.com/oasdiff/oasdiff, a tool for detecting breaking changes in OpenAPI specs. - name: Install oasdiff + if: steps.cache-oasdiff.outputs.cache-hit != 'true' run: | curl -fsSL https://raw.githubusercontent.com/oasdiff/oasdiff/main/install.sh | sh + cp /usr/local/bin/oasdiff ~/oasdiff + + # Setup cached oasdiff + - name: Setup cached oasdiff + if: steps.cache-oasdiff.outputs.cache-hit == 'true' + run: | + sudo cp ~/oasdiff /usr/local/bin/oasdiff + sudo chmod +x /usr/local/bin/oasdiff # Run oasdiff to detect breaking changes in the API specification # This step will fail if incompatible changes are detected, preventing breaking changes from being merged From d31e641d6902dd1f43a3cc034af31a58ac135425 Mon Sep 17 00:00:00 2001 From: Akram Ben Aissi Date: Fri, 12 Sep 2025 10:10:59 +0100 Subject: [PATCH 087/150] fix: Improve pre-commit workflow error handling and feedback (#3400) # What does this PR do? fix: Improve pre-commit workflow error handling and feedback - Add explicit step to check pre-commit results and provide clear error messages - Improve verification steps with better error messages and file listings - Use GitHub Actions annotations (::error:: and ::warning::) for better visibility - Maintain continue-on-error for pre-commit step but add proper failure handling This addresses the issue where pre-commit failures were silent but still caused workflow failures later, making it difficult to understand what needed to be fixed. ## Test Plan Signed-off-by: Akram Ben Aissi --- .github/workflows/pre-commit.yml | 24 ++++++++++++++++++++---- 1 file changed, 20 insertions(+), 4 deletions(-) diff --git a/.github/workflows/pre-commit.yml b/.github/workflows/pre-commit.yml index 000208043..b5845be53 100644 --- a/.github/workflows/pre-commit.yml +++ b/.github/workflows/pre-commit.yml @@ -47,11 +47,21 @@ jobs: run: npm ci working-directory: llama_stack/ui - - uses: pre-commit/action@2c7b3805fd2a0fd8c1884dcaebf91fc102a13ecd # v3.0.1 + - name: Run pre-commit + id: precommit + uses: pre-commit/action@2c7b3805fd2a0fd8c1884dcaebf91fc102a13ecd # v3.0.1 + continue-on-error: true env: SKIP: no-commit-to-branch RUFF_OUTPUT_FORMAT: github + - name: Check pre-commit results + if: steps.precommit.outcome == 'failure' + run: | + echo "::error::Pre-commit hooks failed. Please run 'pre-commit run --all-files' locally and commit the fixes." + echo "::warning::Some pre-commit hooks failed. Check the output above for details." + exit 1 + - name: Debug run: | echo "github.ref: ${{ github.ref }}" @@ -79,17 +89,23 @@ jobs: echo "No changes to commit" fi - - name: Verify if there are any diff files after pre-commit + - name: Verify no uncommitted changes if: github.actor != 'dependabot[bot]' run: | - git diff --exit-code || (echo "There are uncommitted changes, run pre-commit locally and commit again" && exit 1) + if ! git diff --exit-code; then + echo "::error::There are uncommitted changes after pre-commit. Please run 'pre-commit run --all-files' locally and commit the fixes." + echo "::warning::Files with changes:" + git diff --name-status + exit 1 + fi - name: Verify if there are any new files after pre-commit if: github.actor != 'dependabot[bot]' run: | unstaged_files=$(git ls-files --others --exclude-standard) if [ -n "$unstaged_files" ]; then - echo "There are uncommitted new files, run pre-commit locally and commit again" + echo "::error::There are new untracked files after pre-commit. Please run 'pre-commit run --all-files' locally and commit the fixes." + echo "::warning::New files:" echo "$unstaged_files" exit 1 fi From f67081d2d6088a0d3175baffad94977ddf8f6483 Mon Sep 17 00:00:00 2001 From: Doug Edgar Date: Fri, 12 Sep 2025 02:18:19 -0700 Subject: [PATCH 088/150] feat: migrate to FIPS-validated cryptographic algorithms (#3423) # What does this PR do? Migrates MD5 and SHA-1 hash algorithms to SHA-256. In particular, replaces: - MD5 in chunk ID generation. - MD5 in file verification. - SHA-1 in model identifier digests. And updates all related test expectations. Original discussion: https://github.com/llamastack/llama-stack/discussions/3413 Closes #3424. ## Test Plan Unit tests from scripts/unit-tests.sh were updated to match the new hash output, and ran to verify the tests pass. Signed-off-by: Doug Edgar --- llama_stack/cli/verify_download.py | 17 +++++++---------- .../providers/utils/vector_io/vector_utils.py | 6 ++---- llama_stack/testing/inference_recorder.py | 2 +- .../providers/vector_io/test_vector_utils.py | 12 ++++++------ 4 files changed, 16 insertions(+), 21 deletions(-) diff --git a/llama_stack/cli/verify_download.py b/llama_stack/cli/verify_download.py index b7f4cfdb5..e738abb4f 100644 --- a/llama_stack/cli/verify_download.py +++ b/llama_stack/cli/verify_download.py @@ -48,15 +48,12 @@ def setup_verify_download_parser(parser: argparse.ArgumentParser) -> None: parser.set_defaults(func=partial(run_verify_cmd, parser=parser)) -def calculate_md5(filepath: Path, chunk_size: int = 8192) -> str: - # NOTE: MD5 is used here only for download integrity verification, - # not for security purposes - # TODO: switch to SHA256 - md5_hash = hashlib.md5(usedforsecurity=False) +def calculate_sha256(filepath: Path, chunk_size: int = 8192) -> str: + sha256_hash = hashlib.sha256() with open(filepath, "rb") as f: for chunk in iter(lambda: f.read(chunk_size), b""): - md5_hash.update(chunk) - return md5_hash.hexdigest() + sha256_hash.update(chunk) + return sha256_hash.hexdigest() def load_checksums(checklist_path: Path) -> dict[str, str]: @@ -64,10 +61,10 @@ def load_checksums(checklist_path: Path) -> dict[str, str]: with open(checklist_path) as f: for line in f: if line.strip(): - md5sum, filepath = line.strip().split(" ", 1) + sha256sum, filepath = line.strip().split(" ", 1) # Remove leading './' if present filepath = filepath.lstrip("./") - checksums[filepath] = md5sum + checksums[filepath] = sha256sum return checksums @@ -88,7 +85,7 @@ def verify_files(model_dir: Path, checksums: dict[str, str], console: Console) - matches = False if exists: - actual_hash = calculate_md5(full_path) + actual_hash = calculate_sha256(full_path) matches = actual_hash == expected_hash results.append( diff --git a/llama_stack/providers/utils/vector_io/vector_utils.py b/llama_stack/providers/utils/vector_io/vector_utils.py index e55ac75ae..324f35405 100644 --- a/llama_stack/providers/utils/vector_io/vector_utils.py +++ b/llama_stack/providers/utils/vector_io/vector_utils.py @@ -12,14 +12,12 @@ import uuid def generate_chunk_id(document_id: str, chunk_text: str, chunk_window: str | None = None) -> str: """ Generate a unique chunk ID using a hash of the document ID and chunk text. - - Note: MD5 is used only to calculate an identifier, not for security purposes. - Adding usedforsecurity=False for compatibility with FIPS environments. + Then use the first 32 characters of the hash to create a UUID. """ hash_input = f"{document_id}:{chunk_text}".encode() if chunk_window: hash_input += f":{chunk_window}".encode() - return str(uuid.UUID(hashlib.md5(hash_input, usedforsecurity=False).hexdigest())) + return str(uuid.UUID(hashlib.sha256(hash_input).hexdigest()[:32])) def proper_case(s: str) -> str: diff --git a/llama_stack/testing/inference_recorder.py b/llama_stack/testing/inference_recorder.py index e78f493a6..6f017c51d 100644 --- a/llama_stack/testing/inference_recorder.py +++ b/llama_stack/testing/inference_recorder.py @@ -211,7 +211,7 @@ def _model_identifiers_digest(endpoint: str, response: dict[str, Any]) -> str: return sorted(set(idents)) identifiers = _extract_model_identifiers() - return hashlib.sha1(("|".join(identifiers)).encode("utf-8")).hexdigest()[:8] + return hashlib.sha256(("|".join(identifiers)).encode("utf-8")).hexdigest()[:8] def _combine_model_list_responses(endpoint: str, records: list[dict[str, Any]]) -> dict[str, Any] | None: diff --git a/tests/unit/providers/vector_io/test_vector_utils.py b/tests/unit/providers/vector_io/test_vector_utils.py index a5d803a82..10ebe5bfb 100644 --- a/tests/unit/providers/vector_io/test_vector_utils.py +++ b/tests/unit/providers/vector_io/test_vector_utils.py @@ -26,9 +26,9 @@ def test_generate_chunk_id(): chunk_ids = sorted([chunk.chunk_id for chunk in chunks]) assert chunk_ids == [ - "177a1368-f6a8-0c50-6e92-18677f2c3de3", - "bc744db3-1b25-0a9c-cdff-b6ba3df73c36", - "f68df25d-d9aa-ab4d-5684-64a233add20d", + "31d1f9a3-c8d2-66e7-3c37-af2acd329778", + "d07dade7-29c0-cda7-df29-0249a1dcbc3e", + "d14f75a1-5855-7f72-2c78-d9fc4275a346", ] @@ -36,14 +36,14 @@ def test_generate_chunk_id_with_window(): chunk = Chunk(content="test", metadata={"document_id": "doc-1"}) chunk_id1 = generate_chunk_id("doc-1", chunk, chunk_window="0-1") chunk_id2 = generate_chunk_id("doc-1", chunk, chunk_window="1-2") - assert chunk_id1 == "149018fe-d0eb-0f8d-5f7f-726bdd2aeedb" - assert chunk_id2 == "4562c1ee-9971-1f3b-51a6-7d05e5211154" + assert chunk_id1 == "8630321a-d9cb-2bb6-cd28-ebf68dafd866" + assert chunk_id2 == "13a1c09a-cbda-b61a-2d1a-7baa90888685" def test_chunk_id(): # Test with existing chunk ID chunk_with_id = Chunk(content="test", metadata={"document_id": "existing-id"}) - assert chunk_with_id.chunk_id == "84ededcc-b80b-a83e-1a20-ca6515a11350" + assert chunk_with_id.chunk_id == "11704f92-42b6-61df-bf85-6473e7708fbd" # Test with document ID in metadata chunk_with_doc_id = Chunk(content="test", metadata={"document_id": "doc-1"}) From 3de9ad0a87d7bfad50ab23c859cebcaf06b6911b Mon Sep 17 00:00:00 2001 From: Matthew Farrellee Date: Fri, 12 Sep 2025 17:59:56 -0400 Subject: [PATCH 089/150] chore(recorder, tests): add test for openai /v1/models (#3426) # What does this PR do? - [x] adds a test for the recorder's handling of /v1/models - [x] adds a fix for /v1/models handling ## Test Plan ci --- llama_stack/testing/inference_recorder.py | 60 ++++++++++--------- .../distribution/test_inference_recordings.py | 51 ++++++++++++++-- 2 files changed, 79 insertions(+), 32 deletions(-) diff --git a/llama_stack/testing/inference_recorder.py b/llama_stack/testing/inference_recorder.py index 6f017c51d..745160976 100644 --- a/llama_stack/testing/inference_recorder.py +++ b/llama_stack/testing/inference_recorder.py @@ -7,6 +7,7 @@ from __future__ import annotations # for forward references import hashlib +import inspect import json import os from collections.abc import Generator @@ -198,16 +199,11 @@ def _model_identifiers_digest(endpoint: str, response: dict[str, Any]) -> str: Supported endpoints: - '/api/tags' (Ollama): response body has 'models': [ { name/model/digest/id/... }, ... ] - - '/v1/models' (OpenAI): response body has 'data': [ { id: ... }, ... ] + - '/v1/models' (OpenAI): response body is: [ { id: ... }, ... ] Returns a list of unique identifiers or None if structure doesn't match. """ - body = response["body"] - if endpoint == "/api/tags": - items = body.get("models") - idents = [m.model for m in items] - else: - items = body.get("data") - idents = [m.id for m in items] + items = response["body"] + idents = [m.model if endpoint == "/api/tags" else m.id for m in items] return sorted(set(idents)) identifiers = _extract_model_identifiers() @@ -219,28 +215,22 @@ def _combine_model_list_responses(endpoint: str, records: list[dict[str, Any]]) seen: dict[str, dict[str, Any]] = {} for rec in records: body = rec["response"]["body"] - if endpoint == "/api/tags": - items = body.models - elif endpoint == "/v1/models": - items = body.data - else: - items = [] - - for m in items: - if endpoint == "/v1/models": + if endpoint == "/v1/models": + for m in body: key = m.id - else: + seen[key] = m + elif endpoint == "/api/tags": + for m in body.models: key = m.model - seen[key] = m + seen[key] = m ordered = [seen[k] for k in sorted(seen.keys())] canonical = records[0] canonical_req = canonical.get("request", {}) if isinstance(canonical_req, dict): canonical_req["endpoint"] = endpoint - if endpoint == "/v1/models": - body = {"data": ordered, "object": "list"} - else: + body = ordered + if endpoint == "/api/tags": from ollama import ListResponse body = ListResponse(models=ordered) @@ -252,7 +242,10 @@ async def _patched_inference_method(original_method, self, client_type, endpoint if _current_mode == InferenceMode.LIVE or _current_storage is None: # Normal operation - return await original_method(self, *args, **kwargs) + if inspect.iscoroutinefunction(original_method): + return await original_method(self, *args, **kwargs) + else: + return original_method(self, *args, **kwargs) # Get base URL based on client type if client_type == "openai": @@ -300,7 +293,14 @@ async def _patched_inference_method(original_method, self, client_type, endpoint ) elif _current_mode == InferenceMode.RECORD: - response = await original_method(self, *args, **kwargs) + if inspect.iscoroutinefunction(original_method): + response = await original_method(self, *args, **kwargs) + else: + response = original_method(self, *args, **kwargs) + + # we want to store the result of the iterator, not the iterator itself + if endpoint == "/v1/models": + response = [m async for m in response] request_data = { "method": method, @@ -380,10 +380,14 @@ def patch_inference_clients(): _original_methods["embeddings_create"], self, "openai", "/v1/embeddings", *args, **kwargs ) - async def patched_models_list(self, *args, **kwargs): - return await _patched_inference_method( - _original_methods["models_list"], self, "openai", "/v1/models", *args, **kwargs - ) + def patched_models_list(self, *args, **kwargs): + async def _iter(): + for item in await _patched_inference_method( + _original_methods["models_list"], self, "openai", "/v1/models", *args, **kwargs + ): + yield item + + return _iter() # Apply OpenAI patches AsyncChatCompletions.create = patched_chat_completions_create diff --git a/tests/unit/distribution/test_inference_recordings.py b/tests/unit/distribution/test_inference_recordings.py index c69cf319b..94fd2536e 100644 --- a/tests/unit/distribution/test_inference_recordings.py +++ b/tests/unit/distribution/test_inference_recordings.py @@ -6,10 +6,11 @@ import tempfile from pathlib import Path -from unittest.mock import patch +from unittest.mock import AsyncMock, Mock, patch import pytest from openai import AsyncOpenAI +from openai.types.model import Model as OpenAIModel # Import the real Pydantic response types instead of using Mocks from llama_stack.apis.inference import ( @@ -158,7 +159,9 @@ class TestInferenceRecording: return real_openai_chat_response temp_storage_dir = temp_storage_dir / "test_recording_mode" - with patch("openai.resources.chat.completions.AsyncCompletions.create", side_effect=mock_create): + with patch( + "openai.resources.chat.completions.AsyncCompletions.create", new_callable=AsyncMock, side_effect=mock_create + ): with inference_recording(mode=InferenceMode.RECORD, storage_dir=str(temp_storage_dir)): client = AsyncOpenAI(base_url="http://localhost:11434/v1", api_key="test") @@ -184,7 +187,9 @@ class TestInferenceRecording: temp_storage_dir = temp_storage_dir / "test_replay_mode" # First, record a response - with patch("openai.resources.chat.completions.AsyncCompletions.create", side_effect=mock_create): + with patch( + "openai.resources.chat.completions.AsyncCompletions.create", new_callable=AsyncMock, side_effect=mock_create + ): with inference_recording(mode=InferenceMode.RECORD, storage_dir=str(temp_storage_dir)): client = AsyncOpenAI(base_url="http://localhost:11434/v1", api_key="test") @@ -213,6 +218,42 @@ class TestInferenceRecording: # Verify the original method was NOT called mock_create_patch.assert_not_called() + async def test_replay_mode_models(self, temp_storage_dir): + """Test that replay mode returns stored responses without making real model listing calls.""" + + async def _async_iterator(models): + for model in models: + yield model + + models = [ + OpenAIModel(id="foo", created=1, object="model", owned_by="test"), + OpenAIModel(id="bar", created=2, object="model", owned_by="test"), + ] + + expected_ids = {m.id for m in models} + + temp_storage_dir = temp_storage_dir / "test_replay_mode_models" + + # baseline - mock works without recording + client = AsyncOpenAI(base_url="http://localhost:11434/v1", api_key="test") + client.models._get_api_list = Mock(return_value=_async_iterator(models)) + assert {m.id async for m in client.models.list()} == expected_ids + client.models._get_api_list.assert_called_once() + + # record the call + with inference_recording(mode=InferenceMode.RECORD, storage_dir=temp_storage_dir): + client = AsyncOpenAI(base_url="http://localhost:11434/v1", api_key="test") + client.models._get_api_list = Mock(return_value=_async_iterator(models)) + assert {m.id async for m in client.models.list()} == expected_ids + client.models._get_api_list.assert_called_once() + + # replay the call + with inference_recording(mode=InferenceMode.REPLAY, storage_dir=temp_storage_dir): + client = AsyncOpenAI(base_url="http://localhost:11434/v1", api_key="test") + client.models._get_api_list = Mock(return_value=_async_iterator(models)) + assert {m.id async for m in client.models.list()} == expected_ids + client.models._get_api_list.assert_not_called() + async def test_replay_missing_recording(self, temp_storage_dir): """Test that replay mode fails when no recording is found.""" temp_storage_dir = temp_storage_dir / "test_replay_missing_recording" @@ -233,7 +274,9 @@ class TestInferenceRecording: temp_storage_dir = temp_storage_dir / "test_embeddings_recording" # Record - with patch("openai.resources.embeddings.AsyncEmbeddings.create", side_effect=mock_create): + with patch( + "openai.resources.embeddings.AsyncEmbeddings.create", new_callable=AsyncMock, side_effect=mock_create + ): with inference_recording(mode=InferenceMode.RECORD, storage_dir=str(temp_storage_dir)): client = AsyncOpenAI(base_url="http://localhost:11434/v1", api_key="test") From 8cf2128b40195634c4024e3c797eceaaa4da19bc Mon Sep 17 00:00:00 2001 From: Matthew Farrellee Date: Sat, 13 Sep 2025 12:28:04 -0400 Subject: [PATCH 090/150] chore(tests): always show slowest tests (#3431) # What does this PR do? help developers identify slow tests by always passing --duration to pytest ## Test Plan n/a --- pyproject.toml | 1 + 1 file changed, 1 insertion(+) diff --git a/pyproject.toml b/pyproject.toml index 72c4f6f9e..ce95b758f 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -354,6 +354,7 @@ warn_required_dynamic_aliases = true classmethod-decorators = ["classmethod", "pydantic.field_validator"] [tool.pytest.ini_options] +addopts = ["--durations=10"] asyncio_mode = "auto" markers = [ "allow_network: Allow network access for specific unit tests", From 6787755c0c8af6b59322352f985cffb224aadd3b Mon Sep 17 00:00:00 2001 From: Matthew Farrellee Date: Sat, 13 Sep 2025 14:11:38 -0400 Subject: [PATCH 091/150] chore(recorder): add support for NOT_GIVEN (#3430) # What does this PR do? the recorder mocks the openai-python interface. the openai-python interface allows NOT_GIVEN as an input option. this change properly handles NOT_GIVEN. ## Test Plan ci (coverage for chat, completions, embeddings) --- llama_stack/testing/inference_recorder.py | 5 ++ .../distribution/test_inference_recordings.py | 65 ++++++++++++++++++- 2 files changed, 67 insertions(+), 3 deletions(-) diff --git a/llama_stack/testing/inference_recorder.py b/llama_stack/testing/inference_recorder.py index 745160976..f899d73d3 100644 --- a/llama_stack/testing/inference_recorder.py +++ b/llama_stack/testing/inference_recorder.py @@ -16,6 +16,8 @@ from enum import StrEnum from pathlib import Path from typing import Any, Literal, cast +from openai import NOT_GIVEN + from llama_stack.log import get_logger logger = get_logger(__name__, category="testing") @@ -250,6 +252,9 @@ async def _patched_inference_method(original_method, self, client_type, endpoint # Get base URL based on client type if client_type == "openai": base_url = str(self._client.base_url) + + # the OpenAI client methods may pass NOT_GIVEN for unset parameters; filter these out + kwargs = {k: v for k, v in kwargs.items() if v is not NOT_GIVEN} elif client_type == "ollama": # Get base URL from the client (Ollama client uses host attribute) base_url = getattr(self, "host", "http://localhost:11434") diff --git a/tests/unit/distribution/test_inference_recordings.py b/tests/unit/distribution/test_inference_recordings.py index 94fd2536e..4909bbe1e 100644 --- a/tests/unit/distribution/test_inference_recordings.py +++ b/tests/unit/distribution/test_inference_recordings.py @@ -9,7 +9,7 @@ from pathlib import Path from unittest.mock import AsyncMock, Mock, patch import pytest -from openai import AsyncOpenAI +from openai import NOT_GIVEN, AsyncOpenAI from openai.types.model import Model as OpenAIModel # Import the real Pydantic response types instead of using Mocks @@ -17,6 +17,7 @@ from llama_stack.apis.inference import ( OpenAIAssistantMessageParam, OpenAIChatCompletion, OpenAIChoice, + OpenAICompletion, OpenAIEmbeddingData, OpenAIEmbeddingsResponse, OpenAIEmbeddingUsage, @@ -170,6 +171,7 @@ class TestInferenceRecording: messages=[{"role": "user", "content": "Hello, how are you?"}], temperature=0.7, max_tokens=50, + user=NOT_GIVEN, ) # Verify the response was returned correctly @@ -198,6 +200,7 @@ class TestInferenceRecording: messages=[{"role": "user", "content": "Hello, how are you?"}], temperature=0.7, max_tokens=50, + user=NOT_GIVEN, ) # Now test replay mode - should not call the original method @@ -281,7 +284,11 @@ class TestInferenceRecording: client = AsyncOpenAI(base_url="http://localhost:11434/v1", api_key="test") response = await client.embeddings.create( - model="nomic-embed-text", input=["Hello world", "Test embedding"] + model=real_embeddings_response.model, + input=["Hello world", "Test embedding"], + encoding_format=NOT_GIVEN, + dimensions=NOT_GIVEN, + user=NOT_GIVEN, ) assert len(response.data) == 2 @@ -292,7 +299,8 @@ class TestInferenceRecording: client = AsyncOpenAI(base_url="http://localhost:11434/v1", api_key="test") response = await client.embeddings.create( - model="nomic-embed-text", input=["Hello world", "Test embedding"] + model=real_embeddings_response.model, + input=["Hello world", "Test embedding"], ) # Verify we got the recorded response @@ -302,6 +310,57 @@ class TestInferenceRecording: # Verify original method was not called mock_create_patch.assert_not_called() + async def test_completions_recording(self, temp_storage_dir): + real_completions_response = OpenAICompletion( + id="test_completion", + object="text_completion", + created=1234567890, + model="llama3.2:3b", + choices=[ + { + "text": "Hello! I'm doing well, thank you for asking.", + "index": 0, + "logprobs": None, + "finish_reason": "stop", + } + ], + ) + + async def mock_create(*args, **kwargs): + return real_completions_response + + temp_storage_dir = temp_storage_dir / "test_completions_recording" + + # Record + with patch( + "openai.resources.completions.AsyncCompletions.create", new_callable=AsyncMock, side_effect=mock_create + ): + with inference_recording(mode=InferenceMode.RECORD, storage_dir=str(temp_storage_dir)): + client = AsyncOpenAI(base_url="http://localhost:11434/v1", api_key="test") + + response = await client.completions.create( + model=real_completions_response.model, + prompt="Hello, how are you?", + temperature=0.7, + max_tokens=50, + user=NOT_GIVEN, + ) + + assert response.choices[0].text == real_completions_response.choices[0].text + + # Replay + with patch("openai.resources.completions.AsyncCompletions.create") as mock_create_patch: + with inference_recording(mode=InferenceMode.REPLAY, storage_dir=str(temp_storage_dir)): + client = AsyncOpenAI(base_url="http://localhost:11434/v1", api_key="test") + response = await client.completions.create( + model=real_completions_response.model, + prompt="Hello, how are you?", + temperature=0.7, + max_tokens=50, + ) + assert response.choices[0].text == real_completions_response.choices[0].text + mock_create_patch.assert_not_called() + async def test_live_mode(self, real_openai_chat_response): """Test that live mode passes through to original methods.""" From 36fd97e306d14cbb5eba7c18ce93dcb05bdf9206 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 15 Sep 2025 09:46:05 +0200 Subject: [PATCH 092/150] chore(ui-deps): bump next from 15.3.3 to 15.5.3 in /llama_stack/ui (#3438) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Bumps [next](https://github.com/vercel/next.js) from 15.3.3 to 15.5.3.
Release notes

Sourced from next's releases.

v15.5.3

[!NOTE]
This release is backporting bug fixes. It does not include all pending features/changes on canary.

Core Changes

  • fix: validation return types of pages API routes (#83069)
  • fix: relative paths in dev in validator.ts (#83073)
  • fix: remove satisfies keyword from type validation to preserve old TS compatibility (#83071)

Credits

Huge thanks to @​bgub for helping!

v15.5.2

[!NOTE]
This release is backporting bug fixes. It does not include all pending features/changes on canary.

Core Changes

  • fix: disable unknownatrules lint rule entirely (#83059)
  • revert: add ?dpl to fonts in /_next/static/media (#83062)

Credits

Huge thanks to @​bgub and @​ztanner for helping!

v15.5.1

[!NOTE]
This release is backporting bug fixes. It does not include all pending features/changes on canary.

Core Changes

  • fix: aliased navigations should apply scroll handling (#82900)
  • Turbopack: fix invalid NFT entry with file behind symlink (#82887)
  • fix: typesafe linking to route handlers and pages API routes (#82858)
  • fix: change "noUnknownAtRules" to "warn" for Biome (#82974)
  • fix: add path normalization to getRelativePath for Windows (#82918)
  • feat: add typesafety with config.typedRoutes to redirect() and permanentRedirect() (#82860)
  • fix: avoid importing types that will be unused (#82856)
  • fix: update the config.api.responseLimit type (#82852)
  • fix: update validation return types (#82854)

Credits

Huge thanks to @​bgub, @​mischnic, and @​ztanner for helping!

v15.5.1-canary.39

Core Changes

  • [metadata] change the metadata routes params to promises: #83560

... (truncated)

Commits

[![Dependabot compatibility score](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name=next&package-manager=npm_and_yarn&previous-version=15.3.3&new-version=15.5.3)](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores) Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting `@dependabot rebase`. [//]: # (dependabot-automerge-start) [//]: # (dependabot-automerge-end) ---
Dependabot commands and options
You can trigger Dependabot actions by commenting on this PR: - `@dependabot rebase` will rebase this PR - `@dependabot recreate` will recreate this PR, overwriting any edits that have been made to it - `@dependabot merge` will merge this PR after your CI passes on it - `@dependabot squash and merge` will squash and merge this PR after your CI passes on it - `@dependabot cancel merge` will cancel a previously requested merge and block automerging - `@dependabot reopen` will reopen this PR if it is closed - `@dependabot close` will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually - `@dependabot show ignore conditions` will show all of the ignore conditions of the specified dependency - `@dependabot ignore this major version` will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this minor version` will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this dependency` will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)
Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- llama_stack/ui/package-lock.json | 370 +++++++++++++++++-------------- llama_stack/ui/package.json | 2 +- 2 files changed, 199 insertions(+), 173 deletions(-) diff --git a/llama_stack/ui/package-lock.json b/llama_stack/ui/package-lock.json index e2c0815fd..ff73fa2e8 100644 --- a/llama_stack/ui/package-lock.json +++ b/llama_stack/ui/package-lock.json @@ -20,7 +20,7 @@ "framer-motion": "^12.23.12", "llama-stack-client": "^0.2.21", "lucide-react": "^0.542.0", - "next": "15.3.3", + "next": "15.5.3", "next-auth": "^4.24.11", "next-themes": "^0.4.6", "react": "^19.0.0", @@ -664,9 +664,9 @@ } }, "node_modules/@emnapi/runtime": { - "version": "1.4.3", - "resolved": "https://registry.npmjs.org/@emnapi/runtime/-/runtime-1.4.3.tgz", - "integrity": "sha512-pBPWdu6MLKROBX05wSNKcNb++m5Er+KQ9QkB+WVM+pW2Kx9hoSrVTnu3BdkI5eBLZoKu/J6mW/B6i6bJB2ytXQ==", + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/@emnapi/runtime/-/runtime-1.5.0.tgz", + "integrity": "sha512-97/BJ3iXHww3djw6hYIfErCZFee7qCtrneuLa20UXFCOTCfBM2cvQHjWJ2EG0s0MtdNwInarqCTz35i4wWXHsQ==", "license": "MIT", "optional": true, "dependencies": { @@ -927,9 +927,9 @@ } }, "node_modules/@img/sharp-darwin-arm64": { - "version": "0.34.1", - "resolved": "https://registry.npmjs.org/@img/sharp-darwin-arm64/-/sharp-darwin-arm64-0.34.1.tgz", - "integrity": "sha512-pn44xgBtgpEbZsu+lWf2KNb6OAf70X68k+yk69Ic2Xz11zHR/w24/U49XT7AeRwJ0Px+mhALhU5LPci1Aymk7A==", + "version": "0.34.3", + "resolved": "https://registry.npmjs.org/@img/sharp-darwin-arm64/-/sharp-darwin-arm64-0.34.3.tgz", + "integrity": "sha512-ryFMfvxxpQRsgZJqBd4wsttYQbCxsJksrv9Lw/v798JcQ8+w84mBWuXwl+TT0WJ/WrYOLaYpwQXi3sA9nTIaIg==", "cpu": [ "arm64" ], @@ -945,13 +945,13 @@ "url": "https://opencollective.com/libvips" }, "optionalDependencies": { - "@img/sharp-libvips-darwin-arm64": "1.1.0" + "@img/sharp-libvips-darwin-arm64": "1.2.0" } }, "node_modules/@img/sharp-darwin-x64": { - "version": "0.34.1", - "resolved": "https://registry.npmjs.org/@img/sharp-darwin-x64/-/sharp-darwin-x64-0.34.1.tgz", - "integrity": "sha512-VfuYgG2r8BpYiOUN+BfYeFo69nP/MIwAtSJ7/Zpxc5QF3KS22z8Pvg3FkrSFJBPNQ7mmcUcYQFBmEQp7eu1F8Q==", + "version": "0.34.3", + "resolved": "https://registry.npmjs.org/@img/sharp-darwin-x64/-/sharp-darwin-x64-0.34.3.tgz", + "integrity": "sha512-yHpJYynROAj12TA6qil58hmPmAwxKKC7reUqtGLzsOHfP7/rniNGTL8tjWX6L3CTV4+5P4ypcS7Pp+7OB+8ihA==", "cpu": [ "x64" ], @@ -967,13 +967,13 @@ "url": "https://opencollective.com/libvips" }, "optionalDependencies": { - "@img/sharp-libvips-darwin-x64": "1.1.0" + "@img/sharp-libvips-darwin-x64": "1.2.0" } }, "node_modules/@img/sharp-libvips-darwin-arm64": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@img/sharp-libvips-darwin-arm64/-/sharp-libvips-darwin-arm64-1.1.0.tgz", - "integrity": "sha512-HZ/JUmPwrJSoM4DIQPv/BfNh9yrOA8tlBbqbLz4JZ5uew2+o22Ik+tHQJcih7QJuSa0zo5coHTfD5J8inqj9DA==", + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-darwin-arm64/-/sharp-libvips-darwin-arm64-1.2.0.tgz", + "integrity": "sha512-sBZmpwmxqwlqG9ueWFXtockhsxefaV6O84BMOrhtg/YqbTaRdqDE7hxraVE3y6gVM4eExmfzW4a8el9ArLeEiQ==", "cpu": [ "arm64" ], @@ -987,9 +987,9 @@ } }, "node_modules/@img/sharp-libvips-darwin-x64": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@img/sharp-libvips-darwin-x64/-/sharp-libvips-darwin-x64-1.1.0.tgz", - "integrity": "sha512-Xzc2ToEmHN+hfvsl9wja0RlnXEgpKNmftriQp6XzY/RaSfwD9th+MSh0WQKzUreLKKINb3afirxW7A0fz2YWuQ==", + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-darwin-x64/-/sharp-libvips-darwin-x64-1.2.0.tgz", + "integrity": "sha512-M64XVuL94OgiNHa5/m2YvEQI5q2cl9d/wk0qFTDVXcYzi43lxuiFTftMR1tOnFQovVXNZJ5TURSDK2pNe9Yzqg==", "cpu": [ "x64" ], @@ -1003,9 +1003,9 @@ } }, "node_modules/@img/sharp-libvips-linux-arm": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-arm/-/sharp-libvips-linux-arm-1.1.0.tgz", - "integrity": "sha512-s8BAd0lwUIvYCJyRdFqvsj+BJIpDBSxs6ivrOPm/R7piTs5UIwY5OjXrP2bqXC9/moGsyRa37eYWYCOGVXxVrA==", + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-arm/-/sharp-libvips-linux-arm-1.2.0.tgz", + "integrity": "sha512-mWd2uWvDtL/nvIzThLq3fr2nnGfyr/XMXlq8ZJ9WMR6PXijHlC3ksp0IpuhK6bougvQrchUAfzRLnbsen0Cqvw==", "cpu": [ "arm" ], @@ -1019,9 +1019,9 @@ } }, "node_modules/@img/sharp-libvips-linux-arm64": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-arm64/-/sharp-libvips-linux-arm64-1.1.0.tgz", - "integrity": "sha512-IVfGJa7gjChDET1dK9SekxFFdflarnUB8PwW8aGwEoF3oAsSDuNUTYS+SKDOyOJxQyDC1aPFMuRYLoDInyV9Ew==", + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-arm64/-/sharp-libvips-linux-arm64-1.2.0.tgz", + "integrity": "sha512-RXwd0CgG+uPRX5YYrkzKyalt2OJYRiJQ8ED/fi1tq9WQW2jsQIn0tqrlR5l5dr/rjqq6AHAxURhj2DVjyQWSOA==", "cpu": [ "arm64" ], @@ -1035,9 +1035,9 @@ } }, "node_modules/@img/sharp-libvips-linux-ppc64": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-ppc64/-/sharp-libvips-linux-ppc64-1.1.0.tgz", - "integrity": "sha512-tiXxFZFbhnkWE2LA8oQj7KYR+bWBkiV2nilRldT7bqoEZ4HiDOcePr9wVDAZPi/Id5fT1oY9iGnDq20cwUz8lQ==", + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-ppc64/-/sharp-libvips-linux-ppc64-1.2.0.tgz", + "integrity": "sha512-Xod/7KaDDHkYu2phxxfeEPXfVXFKx70EAFZ0qyUdOjCcxbjqyJOEUpDe6RIyaunGxT34Anf9ue/wuWOqBW2WcQ==", "cpu": [ "ppc64" ], @@ -1051,9 +1051,9 @@ } }, "node_modules/@img/sharp-libvips-linux-s390x": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-s390x/-/sharp-libvips-linux-s390x-1.1.0.tgz", - "integrity": "sha512-xukSwvhguw7COyzvmjydRb3x/09+21HykyapcZchiCUkTThEQEOMtBj9UhkaBRLuBrgLFzQ2wbxdeCCJW/jgJA==", + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-s390x/-/sharp-libvips-linux-s390x-1.2.0.tgz", + "integrity": "sha512-eMKfzDxLGT8mnmPJTNMcjfO33fLiTDsrMlUVcp6b96ETbnJmd4uvZxVJSKPQfS+odwfVaGifhsB07J1LynFehw==", "cpu": [ "s390x" ], @@ -1067,9 +1067,9 @@ } }, "node_modules/@img/sharp-libvips-linux-x64": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-x64/-/sharp-libvips-linux-x64-1.1.0.tgz", - "integrity": "sha512-yRj2+reB8iMg9W5sULM3S74jVS7zqSzHG3Ol/twnAAkAhnGQnpjj6e4ayUz7V+FpKypwgs82xbRdYtchTTUB+Q==", + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-x64/-/sharp-libvips-linux-x64-1.2.0.tgz", + "integrity": "sha512-ZW3FPWIc7K1sH9E3nxIGB3y3dZkpJlMnkk7z5tu1nSkBoCgw2nSRTFHI5pB/3CQaJM0pdzMF3paf9ckKMSE9Tg==", "cpu": [ "x64" ], @@ -1083,9 +1083,9 @@ } }, "node_modules/@img/sharp-libvips-linuxmusl-arm64": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linuxmusl-arm64/-/sharp-libvips-linuxmusl-arm64-1.1.0.tgz", - "integrity": "sha512-jYZdG+whg0MDK+q2COKbYidaqW/WTz0cc1E+tMAusiDygrM4ypmSCjOJPmFTvHHJ8j/6cAGyeDWZOsK06tP33w==", + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linuxmusl-arm64/-/sharp-libvips-linuxmusl-arm64-1.2.0.tgz", + "integrity": "sha512-UG+LqQJbf5VJ8NWJ5Z3tdIe/HXjuIdo4JeVNADXBFuG7z9zjoegpzzGIyV5zQKi4zaJjnAd2+g2nna8TZvuW9Q==", "cpu": [ "arm64" ], @@ -1099,9 +1099,9 @@ } }, "node_modules/@img/sharp-libvips-linuxmusl-x64": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linuxmusl-x64/-/sharp-libvips-linuxmusl-x64-1.1.0.tgz", - "integrity": "sha512-wK7SBdwrAiycjXdkPnGCPLjYb9lD4l6Ze2gSdAGVZrEL05AOUJESWU2lhlC+Ffn5/G+VKuSm6zzbQSzFX/P65A==", + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linuxmusl-x64/-/sharp-libvips-linuxmusl-x64-1.2.0.tgz", + "integrity": "sha512-SRYOLR7CXPgNze8akZwjoGBoN1ThNZoqpOgfnOxmWsklTGVfJiGJoC/Lod7aNMGA1jSsKWM1+HRX43OP6p9+6Q==", "cpu": [ "x64" ], @@ -1115,9 +1115,9 @@ } }, "node_modules/@img/sharp-linux-arm": { - "version": "0.34.1", - "resolved": "https://registry.npmjs.org/@img/sharp-linux-arm/-/sharp-linux-arm-0.34.1.tgz", - "integrity": "sha512-anKiszvACti2sGy9CirTlNyk7BjjZPiML1jt2ZkTdcvpLU1YH6CXwRAZCA2UmRXnhiIftXQ7+Oh62Ji25W72jA==", + "version": "0.34.3", + "resolved": "https://registry.npmjs.org/@img/sharp-linux-arm/-/sharp-linux-arm-0.34.3.tgz", + "integrity": "sha512-oBK9l+h6KBN0i3dC8rYntLiVfW8D8wH+NPNT3O/WBHeW0OQWCjfWksLUaPidsrDKpJgXp3G3/hkmhptAW0I3+A==", "cpu": [ "arm" ], @@ -1133,13 +1133,13 @@ "url": "https://opencollective.com/libvips" }, "optionalDependencies": { - "@img/sharp-libvips-linux-arm": "1.1.0" + "@img/sharp-libvips-linux-arm": "1.2.0" } }, "node_modules/@img/sharp-linux-arm64": { - "version": "0.34.1", - "resolved": "https://registry.npmjs.org/@img/sharp-linux-arm64/-/sharp-linux-arm64-0.34.1.tgz", - "integrity": "sha512-kX2c+vbvaXC6vly1RDf/IWNXxrlxLNpBVWkdpRq5Ka7OOKj6nr66etKy2IENf6FtOgklkg9ZdGpEu9kwdlcwOQ==", + "version": "0.34.3", + "resolved": "https://registry.npmjs.org/@img/sharp-linux-arm64/-/sharp-linux-arm64-0.34.3.tgz", + "integrity": "sha512-QdrKe3EvQrqwkDrtuTIjI0bu6YEJHTgEeqdzI3uWJOH6G1O8Nl1iEeVYRGdj1h5I21CqxSvQp1Yv7xeU3ZewbA==", "cpu": [ "arm64" ], @@ -1155,13 +1155,35 @@ "url": "https://opencollective.com/libvips" }, "optionalDependencies": { - "@img/sharp-libvips-linux-arm64": "1.1.0" + "@img/sharp-libvips-linux-arm64": "1.2.0" + } + }, + "node_modules/@img/sharp-linux-ppc64": { + "version": "0.34.3", + "resolved": "https://registry.npmjs.org/@img/sharp-linux-ppc64/-/sharp-linux-ppc64-0.34.3.tgz", + "integrity": "sha512-GLtbLQMCNC5nxuImPR2+RgrviwKwVql28FWZIW1zWruy6zLgA5/x2ZXk3mxj58X/tszVF69KK0Is83V8YgWhLA==", + "cpu": [ + "ppc64" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-linux-ppc64": "1.2.0" } }, "node_modules/@img/sharp-linux-s390x": { - "version": "0.34.1", - "resolved": "https://registry.npmjs.org/@img/sharp-linux-s390x/-/sharp-linux-s390x-0.34.1.tgz", - "integrity": "sha512-7s0KX2tI9mZI2buRipKIw2X1ufdTeaRgwmRabt5bi9chYfhur+/C1OXg3TKg/eag1W+6CCWLVmSauV1owmRPxA==", + "version": "0.34.3", + "resolved": "https://registry.npmjs.org/@img/sharp-linux-s390x/-/sharp-linux-s390x-0.34.3.tgz", + "integrity": "sha512-3gahT+A6c4cdc2edhsLHmIOXMb17ltffJlxR0aC2VPZfwKoTGZec6u5GrFgdR7ciJSsHT27BD3TIuGcuRT0KmQ==", "cpu": [ "s390x" ], @@ -1177,13 +1199,13 @@ "url": "https://opencollective.com/libvips" }, "optionalDependencies": { - "@img/sharp-libvips-linux-s390x": "1.1.0" + "@img/sharp-libvips-linux-s390x": "1.2.0" } }, "node_modules/@img/sharp-linux-x64": { - "version": "0.34.1", - "resolved": "https://registry.npmjs.org/@img/sharp-linux-x64/-/sharp-linux-x64-0.34.1.tgz", - "integrity": "sha512-wExv7SH9nmoBW3Wr2gvQopX1k8q2g5V5Iag8Zk6AVENsjwd+3adjwxtp3Dcu2QhOXr8W9NusBU6XcQUohBZ5MA==", + "version": "0.34.3", + "resolved": "https://registry.npmjs.org/@img/sharp-linux-x64/-/sharp-linux-x64-0.34.3.tgz", + "integrity": "sha512-8kYso8d806ypnSq3/Ly0QEw90V5ZoHh10yH0HnrzOCr6DKAPI6QVHvwleqMkVQ0m+fc7EH8ah0BB0QPuWY6zJQ==", "cpu": [ "x64" ], @@ -1199,13 +1221,13 @@ "url": "https://opencollective.com/libvips" }, "optionalDependencies": { - "@img/sharp-libvips-linux-x64": "1.1.0" + "@img/sharp-libvips-linux-x64": "1.2.0" } }, "node_modules/@img/sharp-linuxmusl-arm64": { - "version": "0.34.1", - "resolved": "https://registry.npmjs.org/@img/sharp-linuxmusl-arm64/-/sharp-linuxmusl-arm64-0.34.1.tgz", - "integrity": "sha512-DfvyxzHxw4WGdPiTF0SOHnm11Xv4aQexvqhRDAoD00MzHekAj9a/jADXeXYCDFH/DzYruwHbXU7uz+H+nWmSOQ==", + "version": "0.34.3", + "resolved": "https://registry.npmjs.org/@img/sharp-linuxmusl-arm64/-/sharp-linuxmusl-arm64-0.34.3.tgz", + "integrity": "sha512-vAjbHDlr4izEiXM1OTggpCcPg9tn4YriK5vAjowJsHwdBIdx0fYRsURkxLG2RLm9gyBq66gwtWI8Gx0/ov+JKQ==", "cpu": [ "arm64" ], @@ -1221,13 +1243,13 @@ "url": "https://opencollective.com/libvips" }, "optionalDependencies": { - "@img/sharp-libvips-linuxmusl-arm64": "1.1.0" + "@img/sharp-libvips-linuxmusl-arm64": "1.2.0" } }, "node_modules/@img/sharp-linuxmusl-x64": { - "version": "0.34.1", - "resolved": "https://registry.npmjs.org/@img/sharp-linuxmusl-x64/-/sharp-linuxmusl-x64-0.34.1.tgz", - "integrity": "sha512-pax/kTR407vNb9qaSIiWVnQplPcGU8LRIJpDT5o8PdAx5aAA7AS3X9PS8Isw1/WfqgQorPotjrZL3Pqh6C5EBg==", + "version": "0.34.3", + "resolved": "https://registry.npmjs.org/@img/sharp-linuxmusl-x64/-/sharp-linuxmusl-x64-0.34.3.tgz", + "integrity": "sha512-gCWUn9547K5bwvOn9l5XGAEjVTTRji4aPTqLzGXHvIr6bIDZKNTA34seMPgM0WmSf+RYBH411VavCejp3PkOeQ==", "cpu": [ "x64" ], @@ -1243,20 +1265,20 @@ "url": "https://opencollective.com/libvips" }, "optionalDependencies": { - "@img/sharp-libvips-linuxmusl-x64": "1.1.0" + "@img/sharp-libvips-linuxmusl-x64": "1.2.0" } }, "node_modules/@img/sharp-wasm32": { - "version": "0.34.1", - "resolved": "https://registry.npmjs.org/@img/sharp-wasm32/-/sharp-wasm32-0.34.1.tgz", - "integrity": "sha512-YDybQnYrLQfEpzGOQe7OKcyLUCML4YOXl428gOOzBgN6Gw0rv8dpsJ7PqTHxBnXnwXr8S1mYFSLSa727tpz0xg==", + "version": "0.34.3", + "resolved": "https://registry.npmjs.org/@img/sharp-wasm32/-/sharp-wasm32-0.34.3.tgz", + "integrity": "sha512-+CyRcpagHMGteySaWos8IbnXcHgfDn7pO2fiC2slJxvNq9gDipYBN42/RagzctVRKgxATmfqOSulgZv5e1RdMg==", "cpu": [ "wasm32" ], "license": "Apache-2.0 AND LGPL-3.0-or-later AND MIT", "optional": true, "dependencies": { - "@emnapi/runtime": "^1.4.0" + "@emnapi/runtime": "^1.4.4" }, "engines": { "node": "^18.17.0 || ^20.3.0 || >=21.0.0" @@ -1265,10 +1287,29 @@ "url": "https://opencollective.com/libvips" } }, + "node_modules/@img/sharp-win32-arm64": { + "version": "0.34.3", + "resolved": "https://registry.npmjs.org/@img/sharp-win32-arm64/-/sharp-win32-arm64-0.34.3.tgz", + "integrity": "sha512-MjnHPnbqMXNC2UgeLJtX4XqoVHHlZNd+nPt1kRPmj63wURegwBhZlApELdtxM2OIZDRv/DFtLcNhVbd1z8GYXQ==", + "cpu": [ + "arm64" + ], + "license": "Apache-2.0 AND LGPL-3.0-or-later", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + } + }, "node_modules/@img/sharp-win32-ia32": { - "version": "0.34.1", - "resolved": "https://registry.npmjs.org/@img/sharp-win32-ia32/-/sharp-win32-ia32-0.34.1.tgz", - "integrity": "sha512-WKf/NAZITnonBf3U1LfdjoMgNO5JYRSlhovhRhMxXVdvWYveM4kM3L8m35onYIdh75cOMCo1BexgVQcCDzyoWw==", + "version": "0.34.3", + "resolved": "https://registry.npmjs.org/@img/sharp-win32-ia32/-/sharp-win32-ia32-0.34.3.tgz", + "integrity": "sha512-xuCdhH44WxuXgOM714hn4amodJMZl3OEvf0GVTm0BEyMeA2to+8HEdRPShH0SLYptJY1uBw+SCFP9WVQi1Q/cw==", "cpu": [ "ia32" ], @@ -1285,9 +1326,9 @@ } }, "node_modules/@img/sharp-win32-x64": { - "version": "0.34.1", - "resolved": "https://registry.npmjs.org/@img/sharp-win32-x64/-/sharp-win32-x64-0.34.1.tgz", - "integrity": "sha512-hw1iIAHpNE8q3uMIRCgGOeDoz9KtFNarFLQclLxr/LK1VBkj8nby18RjFvr6aP7USRYAjTZW6yisnBWMX571Tw==", + "version": "0.34.3", + "resolved": "https://registry.npmjs.org/@img/sharp-win32-x64/-/sharp-win32-x64-0.34.3.tgz", + "integrity": "sha512-OWwz05d++TxzLEv4VnsTz5CmZ6mI6S05sfQGEMrNrQcOEERbX46332IvE7pO/EUiw7jUrrS40z/M7kPyjfl04g==", "cpu": [ "x64" ], @@ -1849,9 +1890,10 @@ } }, "node_modules/@next/env": { - "version": "15.3.3", - "resolved": "https://registry.npmjs.org/@next/env/-/env-15.3.3.tgz", - "integrity": "sha512-OdiMrzCl2Xi0VTjiQQUK0Xh7bJHnOuET2s+3V+Y40WJBAXrJeGA3f+I8MZJ/YQ3mVGi5XGR1L66oFlgqXhQ4Vw==" + "version": "15.5.3", + "resolved": "https://registry.npmjs.org/@next/env/-/env-15.5.3.tgz", + "integrity": "sha512-RSEDTRqyihYXygx/OJXwvVupfr9m04+0vH8vyy0HfZ7keRto6VX9BbEk0J2PUk0VGy6YhklJUSrgForov5F9pw==", + "license": "MIT" }, "node_modules/@next/eslint-plugin-next": { "version": "15.5.2", @@ -1864,12 +1906,13 @@ } }, "node_modules/@next/swc-darwin-arm64": { - "version": "15.3.3", - "resolved": "https://registry.npmjs.org/@next/swc-darwin-arm64/-/swc-darwin-arm64-15.3.3.tgz", - "integrity": "sha512-WRJERLuH+O3oYB4yZNVahSVFmtxRNjNF1I1c34tYMoJb0Pve+7/RaLAJJizyYiFhjYNGHRAE1Ri2Fd23zgDqhg==", + "version": "15.5.3", + "resolved": "https://registry.npmjs.org/@next/swc-darwin-arm64/-/swc-darwin-arm64-15.5.3.tgz", + "integrity": "sha512-nzbHQo69+au9wJkGKTU9lP7PXv0d1J5ljFpvb+LnEomLtSbJkbZyEs6sbF3plQmiOB2l9OBtN2tNSvCH1nQ9Jg==", "cpu": [ "arm64" ], + "license": "MIT", "optional": true, "os": [ "darwin" @@ -1879,12 +1922,13 @@ } }, "node_modules/@next/swc-darwin-x64": { - "version": "15.3.3", - "resolved": "https://registry.npmjs.org/@next/swc-darwin-x64/-/swc-darwin-x64-15.3.3.tgz", - "integrity": "sha512-XHdzH/yBc55lu78k/XwtuFR/ZXUTcflpRXcsu0nKmF45U96jt1tsOZhVrn5YH+paw66zOANpOnFQ9i6/j+UYvw==", + "version": "15.5.3", + "resolved": "https://registry.npmjs.org/@next/swc-darwin-x64/-/swc-darwin-x64-15.5.3.tgz", + "integrity": "sha512-w83w4SkOOhekJOcA5HBvHyGzgV1W/XvOfpkrxIse4uPWhYTTRwtGEM4v/jiXwNSJvfRvah0H8/uTLBKRXlef8g==", "cpu": [ "x64" ], + "license": "MIT", "optional": true, "os": [ "darwin" @@ -1894,12 +1938,13 @@ } }, "node_modules/@next/swc-linux-arm64-gnu": { - "version": "15.3.3", - "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-gnu/-/swc-linux-arm64-gnu-15.3.3.tgz", - "integrity": "sha512-VZ3sYL2LXB8znNGcjhocikEkag/8xiLgnvQts41tq6i+wql63SMS1Q6N8RVXHw5pEUjiof+II3HkDd7GFcgkzw==", + "version": "15.5.3", + "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-gnu/-/swc-linux-arm64-gnu-15.5.3.tgz", + "integrity": "sha512-+m7pfIs0/yvgVu26ieaKrifV8C8yiLe7jVp9SpcIzg7XmyyNE7toC1fy5IOQozmr6kWl/JONC51osih2RyoXRw==", "cpu": [ "arm64" ], + "license": "MIT", "optional": true, "os": [ "linux" @@ -1909,12 +1954,13 @@ } }, "node_modules/@next/swc-linux-arm64-musl": { - "version": "15.3.3", - "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-musl/-/swc-linux-arm64-musl-15.3.3.tgz", - "integrity": "sha512-h6Y1fLU4RWAp1HPNJWDYBQ+e3G7sLckyBXhmH9ajn8l/RSMnhbuPBV/fXmy3muMcVwoJdHL+UtzRzs0nXOf9SA==", + "version": "15.5.3", + "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-musl/-/swc-linux-arm64-musl-15.5.3.tgz", + "integrity": "sha512-u3PEIzuguSenoZviZJahNLgCexGFhso5mxWCrrIMdvpZn6lkME5vc/ADZG8UUk5K1uWRy4hqSFECrON6UKQBbQ==", "cpu": [ "arm64" ], + "license": "MIT", "optional": true, "os": [ "linux" @@ -1924,12 +1970,13 @@ } }, "node_modules/@next/swc-linux-x64-gnu": { - "version": "15.3.3", - "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-gnu/-/swc-linux-x64-gnu-15.3.3.tgz", - "integrity": "sha512-jJ8HRiF3N8Zw6hGlytCj5BiHyG/K+fnTKVDEKvUCyiQ/0r5tgwO7OgaRiOjjRoIx2vwLR+Rz8hQoPrnmFbJdfw==", + "version": "15.5.3", + "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-gnu/-/swc-linux-x64-gnu-15.5.3.tgz", + "integrity": "sha512-lDtOOScYDZxI2BENN9m0pfVPJDSuUkAD1YXSvlJF0DKwZt0WlA7T7o3wrcEr4Q+iHYGzEaVuZcsIbCps4K27sA==", "cpu": [ "x64" ], + "license": "MIT", "optional": true, "os": [ "linux" @@ -1939,12 +1986,13 @@ } }, "node_modules/@next/swc-linux-x64-musl": { - "version": "15.3.3", - "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-musl/-/swc-linux-x64-musl-15.3.3.tgz", - "integrity": "sha512-HrUcTr4N+RgiiGn3jjeT6Oo208UT/7BuTr7K0mdKRBtTbT4v9zJqCDKO97DUqqoBK1qyzP1RwvrWTvU6EPh/Cw==", + "version": "15.5.3", + "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-musl/-/swc-linux-x64-musl-15.5.3.tgz", + "integrity": "sha512-9vWVUnsx9PrY2NwdVRJ4dUURAQ8Su0sLRPqcCCxtX5zIQUBES12eRVHq6b70bbfaVaxIDGJN2afHui0eDm+cLg==", "cpu": [ "x64" ], + "license": "MIT", "optional": true, "os": [ "linux" @@ -1954,12 +2002,13 @@ } }, "node_modules/@next/swc-win32-arm64-msvc": { - "version": "15.3.3", - "resolved": "https://registry.npmjs.org/@next/swc-win32-arm64-msvc/-/swc-win32-arm64-msvc-15.3.3.tgz", - "integrity": "sha512-SxorONgi6K7ZUysMtRF3mIeHC5aA3IQLmKFQzU0OuhuUYwpOBc1ypaLJLP5Bf3M9k53KUUUj4vTPwzGvl/NwlQ==", + "version": "15.5.3", + "resolved": "https://registry.npmjs.org/@next/swc-win32-arm64-msvc/-/swc-win32-arm64-msvc-15.5.3.tgz", + "integrity": "sha512-1CU20FZzY9LFQigRi6jM45oJMU3KziA5/sSG+dXeVaTm661snQP6xu3ykGxxwU5sLG3sh14teO/IOEPVsQMRfA==", "cpu": [ "arm64" ], + "license": "MIT", "optional": true, "os": [ "win32" @@ -1969,12 +2018,13 @@ } }, "node_modules/@next/swc-win32-x64-msvc": { - "version": "15.3.3", - "resolved": "https://registry.npmjs.org/@next/swc-win32-x64-msvc/-/swc-win32-x64-msvc-15.3.3.tgz", - "integrity": "sha512-4QZG6F8enl9/S2+yIiOiju0iCTFd93d8VC1q9LZS4p/Xuk81W2QDjCFeoogmrWWkAD59z8ZxepBQap2dKS5ruw==", + "version": "15.5.3", + "resolved": "https://registry.npmjs.org/@next/swc-win32-x64-msvc/-/swc-win32-x64-msvc-15.5.3.tgz", + "integrity": "sha512-JMoLAq3n3y5tKXPQwCK5c+6tmwkuFDa2XAxz8Wm4+IVthdBZdZGh+lmiLUHg9f9IDwIQpUjp+ysd6OkYTyZRZw==", "cpu": [ "x64" ], + "license": "MIT", "optional": true, "os": [ "win32" @@ -3547,12 +3597,6 @@ "@sinonjs/commons": "^3.0.0" } }, - "node_modules/@swc/counter": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/@swc/counter/-/counter-0.1.3.tgz", - "integrity": "sha512-e2BR4lsJkkRlKZ/qCHPw9ZaSxc0MVUd7gtbtaB7aMvHeJVYe8sOB8DBZkP2DtISHGSku9sCK6T6cnY0CtXrOCQ==", - "license": "Apache-2.0" - }, "node_modules/@swc/helpers": { "version": "0.5.15", "resolved": "https://registry.npmjs.org/@swc/helpers/-/helpers-0.5.15.tgz", @@ -5475,17 +5519,6 @@ "dev": true, "license": "MIT" }, - "node_modules/busboy": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/busboy/-/busboy-1.6.0.tgz", - "integrity": "sha512-8SFQbg/0hQ9xy3UNTB0YEnsNBbWfhf7RtnzpL7TkBiTBRfrQ9Fxcnz7VJsleJpyp6rVLvXiuORqjlHi5q+PYuA==", - "dependencies": { - "streamsearch": "^1.1.0" - }, - "engines": { - "node": ">=10.16.0" - } - }, "node_modules/bytes": { "version": "3.1.2", "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", @@ -8295,9 +8328,9 @@ } }, "node_modules/is-arrayish": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.3.2.tgz", - "integrity": "sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ==", + "version": "0.3.4", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.3.4.tgz", + "integrity": "sha512-m6UrgzFVUYawGBh1dUsWR5M2Clqic9RVXC/9f8ceNlv2IcO9j9J/z8UoCLPqtsPBFNzEpfR3xftohbfqDx8EQA==", "license": "MIT", "optional": true }, @@ -11542,14 +11575,13 @@ } }, "node_modules/next": { - "version": "15.3.3", - "resolved": "https://registry.npmjs.org/next/-/next-15.3.3.tgz", - "integrity": "sha512-JqNj29hHNmCLtNvd090SyRbXJiivQ+58XjCcrC50Crb5g5u2zi7Y2YivbsEfzk6AtVI80akdOQbaMZwWB1Hthw==", + "version": "15.5.3", + "resolved": "https://registry.npmjs.org/next/-/next-15.5.3.tgz", + "integrity": "sha512-r/liNAx16SQj4D+XH/oI1dlpv9tdKJ6cONYPwwcCC46f2NjpaRWY+EKCzULfgQYV6YKXjHBchff2IZBSlZmJNw==", + "license": "MIT", "dependencies": { - "@next/env": "15.3.3", - "@swc/counter": "0.1.3", + "@next/env": "15.5.3", "@swc/helpers": "0.5.15", - "busboy": "1.6.0", "caniuse-lite": "^1.0.30001579", "postcss": "8.4.31", "styled-jsx": "5.1.6" @@ -11561,19 +11593,19 @@ "node": "^18.18.0 || ^19.8.0 || >= 20.0.0" }, "optionalDependencies": { - "@next/swc-darwin-arm64": "15.3.3", - "@next/swc-darwin-x64": "15.3.3", - "@next/swc-linux-arm64-gnu": "15.3.3", - "@next/swc-linux-arm64-musl": "15.3.3", - "@next/swc-linux-x64-gnu": "15.3.3", - "@next/swc-linux-x64-musl": "15.3.3", - "@next/swc-win32-arm64-msvc": "15.3.3", - "@next/swc-win32-x64-msvc": "15.3.3", - "sharp": "^0.34.1" + "@next/swc-darwin-arm64": "15.5.3", + "@next/swc-darwin-x64": "15.5.3", + "@next/swc-linux-arm64-gnu": "15.5.3", + "@next/swc-linux-arm64-musl": "15.5.3", + "@next/swc-linux-x64-gnu": "15.5.3", + "@next/swc-linux-x64-musl": "15.5.3", + "@next/swc-win32-arm64-msvc": "15.5.3", + "@next/swc-win32-x64-msvc": "15.5.3", + "sharp": "^0.34.3" }, "peerDependencies": { "@opentelemetry/api": "^1.1.0", - "@playwright/test": "^1.41.2", + "@playwright/test": "^1.51.1", "babel-plugin-react-compiler": "*", "react": "^18.2.0 || 19.0.0-rc-de68d2f4-20241204 || ^19.0.0", "react-dom": "^18.2.0 || 19.0.0-rc-de68d2f4-20241204 || ^19.0.0", @@ -13240,16 +13272,16 @@ "license": "ISC" }, "node_modules/sharp": { - "version": "0.34.1", - "resolved": "https://registry.npmjs.org/sharp/-/sharp-0.34.1.tgz", - "integrity": "sha512-1j0w61+eVxu7DawFJtnfYcvSv6qPFvfTaqzTQ2BLknVhHTwGS8sc63ZBF4rzkWMBVKybo4S5OBtDdZahh2A1xg==", + "version": "0.34.3", + "resolved": "https://registry.npmjs.org/sharp/-/sharp-0.34.3.tgz", + "integrity": "sha512-eX2IQ6nFohW4DbvHIOLRB3MHFpYqaqvXd3Tp5e/T/dSH83fxaNJQRvDMhASmkNTsNTVF2/OOopzRCt7xokgPfg==", "hasInstallScript": true, "license": "Apache-2.0", "optional": true, "dependencies": { "color": "^4.2.3", - "detect-libc": "^2.0.3", - "semver": "^7.7.1" + "detect-libc": "^2.0.4", + "semver": "^7.7.2" }, "engines": { "node": "^18.17.0 || ^20.3.0 || >=21.0.0" @@ -13258,26 +13290,28 @@ "url": "https://opencollective.com/libvips" }, "optionalDependencies": { - "@img/sharp-darwin-arm64": "0.34.1", - "@img/sharp-darwin-x64": "0.34.1", - "@img/sharp-libvips-darwin-arm64": "1.1.0", - "@img/sharp-libvips-darwin-x64": "1.1.0", - "@img/sharp-libvips-linux-arm": "1.1.0", - "@img/sharp-libvips-linux-arm64": "1.1.0", - "@img/sharp-libvips-linux-ppc64": "1.1.0", - "@img/sharp-libvips-linux-s390x": "1.1.0", - "@img/sharp-libvips-linux-x64": "1.1.0", - "@img/sharp-libvips-linuxmusl-arm64": "1.1.0", - "@img/sharp-libvips-linuxmusl-x64": "1.1.0", - "@img/sharp-linux-arm": "0.34.1", - "@img/sharp-linux-arm64": "0.34.1", - "@img/sharp-linux-s390x": "0.34.1", - "@img/sharp-linux-x64": "0.34.1", - "@img/sharp-linuxmusl-arm64": "0.34.1", - "@img/sharp-linuxmusl-x64": "0.34.1", - "@img/sharp-wasm32": "0.34.1", - "@img/sharp-win32-ia32": "0.34.1", - "@img/sharp-win32-x64": "0.34.1" + "@img/sharp-darwin-arm64": "0.34.3", + "@img/sharp-darwin-x64": "0.34.3", + "@img/sharp-libvips-darwin-arm64": "1.2.0", + "@img/sharp-libvips-darwin-x64": "1.2.0", + "@img/sharp-libvips-linux-arm": "1.2.0", + "@img/sharp-libvips-linux-arm64": "1.2.0", + "@img/sharp-libvips-linux-ppc64": "1.2.0", + "@img/sharp-libvips-linux-s390x": "1.2.0", + "@img/sharp-libvips-linux-x64": "1.2.0", + "@img/sharp-libvips-linuxmusl-arm64": "1.2.0", + "@img/sharp-libvips-linuxmusl-x64": "1.2.0", + "@img/sharp-linux-arm": "0.34.3", + "@img/sharp-linux-arm64": "0.34.3", + "@img/sharp-linux-ppc64": "0.34.3", + "@img/sharp-linux-s390x": "0.34.3", + "@img/sharp-linux-x64": "0.34.3", + "@img/sharp-linuxmusl-arm64": "0.34.3", + "@img/sharp-linuxmusl-x64": "0.34.3", + "@img/sharp-wasm32": "0.34.3", + "@img/sharp-win32-arm64": "0.34.3", + "@img/sharp-win32-ia32": "0.34.3", + "@img/sharp-win32-x64": "0.34.3" } }, "node_modules/shebang-command": { @@ -13403,9 +13437,9 @@ "license": "ISC" }, "node_modules/simple-swizzle": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/simple-swizzle/-/simple-swizzle-0.2.2.tgz", - "integrity": "sha512-JA//kQgZtbuY83m+xT+tXJkmJncGMTFT+C+g2h2R9uxkYIrE2yy9sgmcLhCnw57/WSD+Eh3J97FPEDFnbXnDUg==", + "version": "0.2.4", + "resolved": "https://registry.npmjs.org/simple-swizzle/-/simple-swizzle-0.2.4.tgz", + "integrity": "sha512-nAu1WFPQSMNr2Zn9PGSZK9AGn4t/y97lEm+MXTtUDwfP0ksAIX4nO+6ruD9Jwut4C49SB1Ws+fbXsm/yScWOHw==", "license": "MIT", "optional": true, "dependencies": { @@ -13526,14 +13560,6 @@ "node": ">= 0.8" } }, - "node_modules/streamsearch": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/streamsearch/-/streamsearch-1.1.0.tgz", - "integrity": "sha512-Mcc5wHehp9aXz1ax6bZUyY5afg9u2rv5cqQI3mRrYkGC8rW2hM02jWuwjtL++LS5qinSyhj2QfLyNsuc+VsExg==", - "engines": { - "node": ">=10.0.0" - } - }, "node_modules/string-length": { "version": "4.0.2", "resolved": "https://registry.npmjs.org/string-length/-/string-length-4.0.2.tgz", diff --git a/llama_stack/ui/package.json b/llama_stack/ui/package.json index e50401fa6..a0a8b2c7c 100644 --- a/llama_stack/ui/package.json +++ b/llama_stack/ui/package.json @@ -25,7 +25,7 @@ "framer-motion": "^12.23.12", "llama-stack-client": "^0.2.21", "lucide-react": "^0.542.0", - "next": "15.3.3", + "next": "15.5.3", "next-auth": "^4.24.11", "next-themes": "^0.4.6", "react": "^19.0.0", From b6cb8178976b941a1fdb3894b00bd13eaca91561 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 15 Sep 2025 09:46:14 +0200 Subject: [PATCH 093/150] chore(ui-deps): bump @radix-ui/react-select from 2.2.5 to 2.2.6 in /llama_stack/ui (#3437) Bumps [@radix-ui/react-select](https://github.com/radix-ui/primitives) from 2.2.5 to 2.2.6.
Commits

[![Dependabot compatibility score](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name=@radix-ui/react-select&package-manager=npm_and_yarn&previous-version=2.2.5&new-version=2.2.6)](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores) Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting `@dependabot rebase`. [//]: # (dependabot-automerge-start) [//]: # (dependabot-automerge-end) ---
Dependabot commands and options
You can trigger Dependabot actions by commenting on this PR: - `@dependabot rebase` will rebase this PR - `@dependabot recreate` will recreate this PR, overwriting any edits that have been made to it - `@dependabot merge` will merge this PR after your CI passes on it - `@dependabot squash and merge` will squash and merge this PR after your CI passes on it - `@dependabot cancel merge` will cancel a previously requested merge and block automerging - `@dependabot reopen` will reopen this PR if it is closed - `@dependabot close` will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually - `@dependabot show ignore conditions` will show all of the ignore conditions of the specified dependency - `@dependabot ignore this major version` will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this minor version` will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this dependency` will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)
Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- llama_stack/ui/package-lock.json | 77 ++++++++++++++------------------ llama_stack/ui/package.json | 2 +- 2 files changed, 34 insertions(+), 45 deletions(-) diff --git a/llama_stack/ui/package-lock.json b/llama_stack/ui/package-lock.json index ff73fa2e8..f333aa809 100644 --- a/llama_stack/ui/package-lock.json +++ b/llama_stack/ui/package-lock.json @@ -11,7 +11,7 @@ "@radix-ui/react-collapsible": "^1.1.12", "@radix-ui/react-dialog": "^1.1.13", "@radix-ui/react-dropdown-menu": "^2.1.16", - "@radix-ui/react-select": "^2.2.5", + "@radix-ui/react-select": "^2.2.6", "@radix-ui/react-separator": "^1.1.7", "@radix-ui/react-slot": "^1.2.3", "@radix-ui/react-tooltip": "^1.2.8", @@ -2924,22 +2924,22 @@ } }, "node_modules/@radix-ui/react-select": { - "version": "2.2.5", - "resolved": "https://registry.npmjs.org/@radix-ui/react-select/-/react-select-2.2.5.tgz", - "integrity": "sha512-HnMTdXEVuuyzx63ME0ut4+sEMYW6oouHWNGUZc7ddvUWIcfCva/AMoqEW/3wnEllriMWBa0RHspCYnfCWJQYmA==", + "version": "2.2.6", + "resolved": "https://registry.npmjs.org/@radix-ui/react-select/-/react-select-2.2.6.tgz", + "integrity": "sha512-I30RydO+bnn2PQztvo25tswPH+wFBjehVGtmagkU78yMdwTwVf12wnAOF+AeP8S2N8xD+5UPbGhkUfPyvT+mwQ==", "license": "MIT", "dependencies": { "@radix-ui/number": "1.1.1", - "@radix-ui/primitive": "1.1.2", + "@radix-ui/primitive": "1.1.3", "@radix-ui/react-collection": "1.1.7", "@radix-ui/react-compose-refs": "1.1.2", "@radix-ui/react-context": "1.1.2", "@radix-ui/react-direction": "1.1.1", - "@radix-ui/react-dismissable-layer": "1.1.10", - "@radix-ui/react-focus-guards": "1.1.2", + "@radix-ui/react-dismissable-layer": "1.1.11", + "@radix-ui/react-focus-guards": "1.1.3", "@radix-ui/react-focus-scope": "1.1.7", "@radix-ui/react-id": "1.1.1", - "@radix-ui/react-popper": "1.2.7", + "@radix-ui/react-popper": "1.2.8", "@radix-ui/react-portal": "1.1.9", "@radix-ui/react-primitive": "2.1.3", "@radix-ui/react-slot": "1.2.3", @@ -2966,13 +2966,19 @@ } } }, + "node_modules/@radix-ui/react-select/node_modules/@radix-ui/primitive": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/@radix-ui/primitive/-/primitive-1.1.3.tgz", + "integrity": "sha512-JTF99U/6XIjCBo0wqkU5sK10glYe27MRRsfwoiq5zzOEZLHU3A3KCMa5X/azekYRCJ0HlwI0crAXS/5dEHTzDg==", + "license": "MIT" + }, "node_modules/@radix-ui/react-select/node_modules/@radix-ui/react-dismissable-layer": { - "version": "1.1.10", - "resolved": "https://registry.npmjs.org/@radix-ui/react-dismissable-layer/-/react-dismissable-layer-1.1.10.tgz", - "integrity": "sha512-IM1zzRV4W3HtVgftdQiiOmA0AdJlCtMLe00FXaHwgt3rAnNsIyDqshvkIW3hj/iu5hu8ERP7KIYki6NkqDxAwQ==", + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/@radix-ui/react-dismissable-layer/-/react-dismissable-layer-1.1.11.tgz", + "integrity": "sha512-Nqcp+t5cTB8BinFkZgXiMJniQH0PsUt2k51FUhbdfeKvc4ACcG2uQniY/8+h1Yv6Kza4Q7lD7PQV0z0oicE0Mg==", "license": "MIT", "dependencies": { - "@radix-ui/primitive": "1.1.2", + "@radix-ui/primitive": "1.1.3", "@radix-ui/react-compose-refs": "1.1.2", "@radix-ui/react-primitive": "2.1.3", "@radix-ui/react-use-callback-ref": "1.1.1", @@ -2993,6 +2999,21 @@ } } }, + "node_modules/@radix-ui/react-select/node_modules/@radix-ui/react-focus-guards": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/@radix-ui/react-focus-guards/-/react-focus-guards-1.1.3.tgz", + "integrity": "sha512-0rFg/Rj2Q62NCm62jZw0QX7a3sz6QCQU0LpZdNrJX8byRGaGVTqbrW9jAoIAHyMQqsNpeZ81YgSizOt5WXq0Pw==", + "license": "MIT", + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, "node_modules/@radix-ui/react-select/node_modules/@radix-ui/react-focus-scope": { "version": "1.1.7", "resolved": "https://registry.npmjs.org/@radix-ui/react-focus-scope/-/react-focus-scope-1.1.7.tgz", @@ -3018,38 +3039,6 @@ } } }, - "node_modules/@radix-ui/react-select/node_modules/@radix-ui/react-popper": { - "version": "1.2.7", - "resolved": "https://registry.npmjs.org/@radix-ui/react-popper/-/react-popper-1.2.7.tgz", - "integrity": "sha512-IUFAccz1JyKcf/RjB552PlWwxjeCJB8/4KxT7EhBHOJM+mN7LdW+B3kacJXILm32xawcMMjb2i0cIZpo+f9kiQ==", - "license": "MIT", - "dependencies": { - "@floating-ui/react-dom": "^2.0.0", - "@radix-ui/react-arrow": "1.1.7", - "@radix-ui/react-compose-refs": "1.1.2", - "@radix-ui/react-context": "1.1.2", - "@radix-ui/react-primitive": "2.1.3", - "@radix-ui/react-use-callback-ref": "1.1.1", - "@radix-ui/react-use-layout-effect": "1.1.1", - "@radix-ui/react-use-rect": "1.1.1", - "@radix-ui/react-use-size": "1.1.1", - "@radix-ui/rect": "1.1.1" - }, - "peerDependencies": { - "@types/react": "*", - "@types/react-dom": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", - "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - }, - "@types/react-dom": { - "optional": true - } - } - }, "node_modules/@radix-ui/react-select/node_modules/@radix-ui/react-portal": { "version": "1.1.9", "resolved": "https://registry.npmjs.org/@radix-ui/react-portal/-/react-portal-1.1.9.tgz", diff --git a/llama_stack/ui/package.json b/llama_stack/ui/package.json index a0a8b2c7c..ccbc2a4c2 100644 --- a/llama_stack/ui/package.json +++ b/llama_stack/ui/package.json @@ -16,7 +16,7 @@ "@radix-ui/react-collapsible": "^1.1.12", "@radix-ui/react-dialog": "^1.1.13", "@radix-ui/react-dropdown-menu": "^2.1.16", - "@radix-ui/react-select": "^2.2.5", + "@radix-ui/react-select": "^2.2.6", "@radix-ui/react-separator": "^1.1.7", "@radix-ui/react-slot": "^1.2.3", "@radix-ui/react-tooltip": "^1.2.8", From 01bdcce4d2218754acfe960de58598bc50e32d21 Mon Sep 17 00:00:00 2001 From: Matthew Farrellee Date: Mon, 15 Sep 2025 15:25:53 -0400 Subject: [PATCH 094/150] chore(recorder): update mocks to be closer to non-mock environment (#3442) # What does this PR do? the @required_args decorator in openai-python is masking the async nature of the {AsyncCompletions,chat.AsyncCompletions}.create method. see https://github.com/openai/openai-python/issues/996 this means two things - 0. we cannot use iscoroutine in the recorder to detect async vs non 1. our mocks are inappropriately introducing identifiable async for (0), we update the iscoroutine check w/ detection of /v1/models, which is the only non-async function we mock & record. for (1), we could leave everything as is and assume (0) will catch errors. to be defensive, we update the unit tests to mock below create methods, allowing the true openai-python create() methods to be tested. --- llama_stack/testing/inference_recorder.py | 14 +- .../distribution/test_inference_recordings.py | 208 +++++++++--------- 2 files changed, 113 insertions(+), 109 deletions(-) diff --git a/llama_stack/testing/inference_recorder.py b/llama_stack/testing/inference_recorder.py index f899d73d3..674016fb1 100644 --- a/llama_stack/testing/inference_recorder.py +++ b/llama_stack/testing/inference_recorder.py @@ -7,7 +7,6 @@ from __future__ import annotations # for forward references import hashlib -import inspect import json import os from collections.abc import Generator @@ -243,11 +242,10 @@ async def _patched_inference_method(original_method, self, client_type, endpoint global _current_mode, _current_storage if _current_mode == InferenceMode.LIVE or _current_storage is None: - # Normal operation - if inspect.iscoroutinefunction(original_method): - return await original_method(self, *args, **kwargs) - else: + if endpoint == "/v1/models": return original_method(self, *args, **kwargs) + else: + return await original_method(self, *args, **kwargs) # Get base URL based on client type if client_type == "openai": @@ -298,10 +296,10 @@ async def _patched_inference_method(original_method, self, client_type, endpoint ) elif _current_mode == InferenceMode.RECORD: - if inspect.iscoroutinefunction(original_method): - response = await original_method(self, *args, **kwargs) - else: + if endpoint == "/v1/models": response = original_method(self, *args, **kwargs) + else: + response = await original_method(self, *args, **kwargs) # we want to store the result of the iterator, not the iterator itself if endpoint == "/v1/models": diff --git a/tests/unit/distribution/test_inference_recordings.py b/tests/unit/distribution/test_inference_recordings.py index 4909bbe1e..5740357c1 100644 --- a/tests/unit/distribution/test_inference_recordings.py +++ b/tests/unit/distribution/test_inference_recordings.py @@ -155,27 +155,22 @@ class TestInferenceRecording: async def test_recording_mode(self, temp_storage_dir, real_openai_chat_response): """Test that recording mode captures and stores responses.""" - - async def mock_create(*args, **kwargs): - return real_openai_chat_response - temp_storage_dir = temp_storage_dir / "test_recording_mode" - with patch( - "openai.resources.chat.completions.AsyncCompletions.create", new_callable=AsyncMock, side_effect=mock_create - ): - with inference_recording(mode=InferenceMode.RECORD, storage_dir=str(temp_storage_dir)): - client = AsyncOpenAI(base_url="http://localhost:11434/v1", api_key="test") + with inference_recording(mode=InferenceMode.RECORD, storage_dir=str(temp_storage_dir)): + client = AsyncOpenAI(base_url="http://localhost:11434/v1", api_key="test") + client.chat.completions._post = AsyncMock(return_value=real_openai_chat_response) - response = await client.chat.completions.create( - model="llama3.2:3b", - messages=[{"role": "user", "content": "Hello, how are you?"}], - temperature=0.7, - max_tokens=50, - user=NOT_GIVEN, - ) + response = await client.chat.completions.create( + model="llama3.2:3b", + messages=[{"role": "user", "content": "Hello, how are you?"}], + temperature=0.7, + max_tokens=50, + user=NOT_GIVEN, + ) - # Verify the response was returned correctly - assert response.choices[0].message.content == "Hello! I'm doing well, thank you for asking." + # Verify the response was returned correctly + assert response.choices[0].message.content == "Hello! I'm doing well, thank you for asking." + client.chat.completions._post.assert_called_once() # Verify recording was stored storage = ResponseStorage(temp_storage_dir) @@ -183,43 +178,38 @@ class TestInferenceRecording: async def test_replay_mode(self, temp_storage_dir, real_openai_chat_response): """Test that replay mode returns stored responses without making real calls.""" - - async def mock_create(*args, **kwargs): - return real_openai_chat_response - temp_storage_dir = temp_storage_dir / "test_replay_mode" # First, record a response - with patch( - "openai.resources.chat.completions.AsyncCompletions.create", new_callable=AsyncMock, side_effect=mock_create - ): - with inference_recording(mode=InferenceMode.RECORD, storage_dir=str(temp_storage_dir)): - client = AsyncOpenAI(base_url="http://localhost:11434/v1", api_key="test") + with inference_recording(mode=InferenceMode.RECORD, storage_dir=str(temp_storage_dir)): + client = AsyncOpenAI(base_url="http://localhost:11434/v1", api_key="test") + client.chat.completions._post = AsyncMock(return_value=real_openai_chat_response) - response = await client.chat.completions.create( - model="llama3.2:3b", - messages=[{"role": "user", "content": "Hello, how are you?"}], - temperature=0.7, - max_tokens=50, - user=NOT_GIVEN, - ) + response = await client.chat.completions.create( + model="llama3.2:3b", + messages=[{"role": "user", "content": "Hello, how are you?"}], + temperature=0.7, + max_tokens=50, + user=NOT_GIVEN, + ) + client.chat.completions._post.assert_called_once() # Now test replay mode - should not call the original method - with patch("openai.resources.chat.completions.AsyncCompletions.create") as mock_create_patch: - with inference_recording(mode=InferenceMode.REPLAY, storage_dir=str(temp_storage_dir)): - client = AsyncOpenAI(base_url="http://localhost:11434/v1", api_key="test") + with inference_recording(mode=InferenceMode.REPLAY, storage_dir=str(temp_storage_dir)): + client = AsyncOpenAI(base_url="http://localhost:11434/v1", api_key="test") + client.chat.completions._post = AsyncMock(return_value=real_openai_chat_response) - response = await client.chat.completions.create( - model="llama3.2:3b", - messages=[{"role": "user", "content": "Hello, how are you?"}], - temperature=0.7, - max_tokens=50, - ) + response = await client.chat.completions.create( + model="llama3.2:3b", + messages=[{"role": "user", "content": "Hello, how are you?"}], + temperature=0.7, + max_tokens=50, + ) - # Verify we got the recorded response - assert response.choices[0].message.content == "Hello! I'm doing well, thank you for asking." + # Verify we got the recorded response + assert response.choices[0].message.content == "Hello! I'm doing well, thank you for asking." - # Verify the original method was NOT called - mock_create_patch.assert_not_called() + # Verify the original method was NOT called + client.chat.completions._post.assert_not_called() async def test_replay_mode_models(self, temp_storage_dir): """Test that replay mode returns stored responses without making real model listing calls.""" @@ -272,43 +262,50 @@ class TestInferenceRecording: async def test_embeddings_recording(self, temp_storage_dir, real_embeddings_response): """Test recording and replay of embeddings calls.""" - async def mock_create(*args, **kwargs): - return real_embeddings_response + # baseline - mock works without recording + client = AsyncOpenAI(base_url="http://localhost:11434/v1", api_key="test") + client.embeddings._post = AsyncMock(return_value=real_embeddings_response) + response = await client.embeddings.create( + model=real_embeddings_response.model, + input=["Hello world", "Test embedding"], + encoding_format=NOT_GIVEN, + ) + assert len(response.data) == 2 + assert response.data[0].embedding == [0.1, 0.2, 0.3] + client.embeddings._post.assert_called_once() temp_storage_dir = temp_storage_dir / "test_embeddings_recording" # Record - with patch( - "openai.resources.embeddings.AsyncEmbeddings.create", new_callable=AsyncMock, side_effect=mock_create - ): - with inference_recording(mode=InferenceMode.RECORD, storage_dir=str(temp_storage_dir)): - client = AsyncOpenAI(base_url="http://localhost:11434/v1", api_key="test") + with inference_recording(mode=InferenceMode.RECORD, storage_dir=str(temp_storage_dir)): + client = AsyncOpenAI(base_url="http://localhost:11434/v1", api_key="test") + client.embeddings._post = AsyncMock(return_value=real_embeddings_response) - response = await client.embeddings.create( - model=real_embeddings_response.model, - input=["Hello world", "Test embedding"], - encoding_format=NOT_GIVEN, - dimensions=NOT_GIVEN, - user=NOT_GIVEN, - ) + response = await client.embeddings.create( + model=real_embeddings_response.model, + input=["Hello world", "Test embedding"], + encoding_format=NOT_GIVEN, + dimensions=NOT_GIVEN, + user=NOT_GIVEN, + ) - assert len(response.data) == 2 + assert len(response.data) == 2 # Replay - with patch("openai.resources.embeddings.AsyncEmbeddings.create") as mock_create_patch: - with inference_recording(mode=InferenceMode.REPLAY, storage_dir=str(temp_storage_dir)): - client = AsyncOpenAI(base_url="http://localhost:11434/v1", api_key="test") + with inference_recording(mode=InferenceMode.REPLAY, storage_dir=str(temp_storage_dir)): + client = AsyncOpenAI(base_url="http://localhost:11434/v1", api_key="test") + client.embeddings._post = AsyncMock(return_value=real_embeddings_response) - response = await client.embeddings.create( - model=real_embeddings_response.model, - input=["Hello world", "Test embedding"], - ) + response = await client.embeddings.create( + model=real_embeddings_response.model, + input=["Hello world", "Test embedding"], + ) - # Verify we got the recorded response - assert len(response.data) == 2 - assert response.data[0].embedding == [0.1, 0.2, 0.3] + # Verify we got the recorded response + assert len(response.data) == 2 + assert response.data[0].embedding == [0.1, 0.2, 0.3] - # Verify original method was not called - mock_create_patch.assert_not_called() + # Verify original method was not called + client.embeddings._post.assert_not_called() async def test_completions_recording(self, temp_storage_dir): real_completions_response = OpenAICompletion( @@ -326,40 +323,49 @@ class TestInferenceRecording: ], ) - async def mock_create(*args, **kwargs): - return real_completions_response - temp_storage_dir = temp_storage_dir / "test_completions_recording" + # baseline - mock works without recording + client = AsyncOpenAI(base_url="http://localhost:11434/v1", api_key="test") + client.completions._post = AsyncMock(return_value=real_completions_response) + response = await client.completions.create( + model=real_completions_response.model, + prompt="Hello, how are you?", + temperature=0.7, + max_tokens=50, + user=NOT_GIVEN, + ) + assert response.choices[0].text == real_completions_response.choices[0].text + client.completions._post.assert_called_once() + # Record - with patch( - "openai.resources.completions.AsyncCompletions.create", new_callable=AsyncMock, side_effect=mock_create - ): - with inference_recording(mode=InferenceMode.RECORD, storage_dir=str(temp_storage_dir)): - client = AsyncOpenAI(base_url="http://localhost:11434/v1", api_key="test") + with inference_recording(mode=InferenceMode.RECORD, storage_dir=str(temp_storage_dir)): + client = AsyncOpenAI(base_url="http://localhost:11434/v1", api_key="test") + client.completions._post = AsyncMock(return_value=real_completions_response) - response = await client.completions.create( - model=real_completions_response.model, - prompt="Hello, how are you?", - temperature=0.7, - max_tokens=50, - user=NOT_GIVEN, - ) + response = await client.completions.create( + model=real_completions_response.model, + prompt="Hello, how are you?", + temperature=0.7, + max_tokens=50, + user=NOT_GIVEN, + ) - assert response.choices[0].text == real_completions_response.choices[0].text + assert response.choices[0].text == real_completions_response.choices[0].text + client.completions._post.assert_called_once() # Replay - with patch("openai.resources.completions.AsyncCompletions.create") as mock_create_patch: - with inference_recording(mode=InferenceMode.REPLAY, storage_dir=str(temp_storage_dir)): - client = AsyncOpenAI(base_url="http://localhost:11434/v1", api_key="test") - response = await client.completions.create( - model=real_completions_response.model, - prompt="Hello, how are you?", - temperature=0.7, - max_tokens=50, - ) - assert response.choices[0].text == real_completions_response.choices[0].text - mock_create_patch.assert_not_called() + with inference_recording(mode=InferenceMode.REPLAY, storage_dir=str(temp_storage_dir)): + client = AsyncOpenAI(base_url="http://localhost:11434/v1", api_key="test") + client.completions._post = AsyncMock(return_value=real_completions_response) + response = await client.completions.create( + model=real_completions_response.model, + prompt="Hello, how are you?", + temperature=0.7, + max_tokens=50, + ) + assert response.choices[0].text == real_completions_response.choices[0].text + client.completions._post.assert_not_called() async def test_live_mode(self, real_openai_chat_response): """Test that live mode passes through to original methods.""" From ab321739f2e2a328765b13c874d3cd408b530887 Mon Sep 17 00:00:00 2001 From: IAN MILLER <75687988+r3v5@users.noreply.github.com> Date: Mon, 15 Sep 2025 20:43:38 +0100 Subject: [PATCH 095/150] feat: create HTTP DELETE API endpoints to unregister ScoringFn and Benchmark resources in Llama Stack (#3371) # What does this PR do? This PR provides functionality for users to unregister ScoringFn and Benchmark resources for `scoring` and `eval` APIs. Closes #3051 ## Test Plan Updated integration and unit tests via CI workflow --- docs/_static/llama-stack-spec.html | 68 +++++++++++++++++++ docs/_static/llama-stack-spec.yaml | 49 +++++++++++++ llama_stack/apis/benchmarks/benchmarks.py | 8 +++ .../scoring_functions/scoring_functions.py | 8 +++ llama_stack/core/routing_tables/benchmarks.py | 4 ++ llama_stack/core/routing_tables/common.py | 4 ++ .../core/routing_tables/scoring_functions.py | 4 ++ .../inline/eval/meta_reference/eval.py | 7 ++ .../inline/scoring/llm_as_judge/scoring.py | 3 + .../providers/remote/eval/nvidia/eval.py | 13 +++- tests/integration/scoring/test_scoring.py | 42 +++++++++++- .../routers/test_routing_tables.py | 22 ++++++ tests/unit/providers/nvidia/test_eval.py | 12 ++++ 13 files changed, 241 insertions(+), 3 deletions(-) diff --git a/docs/_static/llama-stack-spec.html b/docs/_static/llama-stack-spec.html index a036e5dc0..9ddb070d7 100644 --- a/docs/_static/llama-stack-spec.html +++ b/docs/_static/llama-stack-spec.html @@ -1380,6 +1380,40 @@ } } ] + }, + "delete": { + "responses": { + "200": { + "description": "OK" + }, + "400": { + "$ref": "#/components/responses/BadRequest400" + }, + "429": { + "$ref": "#/components/responses/TooManyRequests429" + }, + "500": { + "$ref": "#/components/responses/InternalServerError500" + }, + "default": { + "$ref": "#/components/responses/DefaultError" + } + }, + "tags": [ + "Benchmarks" + ], + "description": "Unregister a benchmark.", + "parameters": [ + { + "name": "benchmark_id", + "in": "path", + "description": "The ID of the benchmark to unregister.", + "required": true, + "schema": { + "type": "string" + } + } + ] } }, "/v1/openai/v1/chat/completions/{completion_id}": { @@ -1620,6 +1654,40 @@ } } ] + }, + "delete": { + "responses": { + "200": { + "description": "OK" + }, + "400": { + "$ref": "#/components/responses/BadRequest400" + }, + "429": { + "$ref": "#/components/responses/TooManyRequests429" + }, + "500": { + "$ref": "#/components/responses/InternalServerError500" + }, + "default": { + "$ref": "#/components/responses/DefaultError" + } + }, + "tags": [ + "ScoringFunctions" + ], + "description": "Unregister a scoring function.", + "parameters": [ + { + "name": "scoring_fn_id", + "in": "path", + "description": "The ID of the scoring function to unregister.", + "required": true, + "schema": { + "type": "string" + } + } + ] } }, "/v1/shields/{identifier}": { diff --git a/docs/_static/llama-stack-spec.yaml b/docs/_static/llama-stack-spec.yaml index 8ed04c1f8..94dc5c0f9 100644 --- a/docs/_static/llama-stack-spec.yaml +++ b/docs/_static/llama-stack-spec.yaml @@ -954,6 +954,30 @@ paths: required: true schema: type: string + delete: + responses: + '200': + description: OK + '400': + $ref: '#/components/responses/BadRequest400' + '429': + $ref: >- + #/components/responses/TooManyRequests429 + '500': + $ref: >- + #/components/responses/InternalServerError500 + default: + $ref: '#/components/responses/DefaultError' + tags: + - Benchmarks + description: Unregister a benchmark. + parameters: + - name: benchmark_id + in: path + description: The ID of the benchmark to unregister. + required: true + schema: + type: string /v1/openai/v1/chat/completions/{completion_id}: get: responses: @@ -1119,6 +1143,31 @@ paths: required: true schema: type: string + delete: + responses: + '200': + description: OK + '400': + $ref: '#/components/responses/BadRequest400' + '429': + $ref: >- + #/components/responses/TooManyRequests429 + '500': + $ref: >- + #/components/responses/InternalServerError500 + default: + $ref: '#/components/responses/DefaultError' + tags: + - ScoringFunctions + description: Unregister a scoring function. + parameters: + - name: scoring_fn_id + in: path + description: >- + The ID of the scoring function to unregister. + required: true + schema: + type: string /v1/shields/{identifier}: get: responses: diff --git a/llama_stack/apis/benchmarks/benchmarks.py b/llama_stack/apis/benchmarks/benchmarks.py index 706eaed6c..8d0a25e7b 100644 --- a/llama_stack/apis/benchmarks/benchmarks.py +++ b/llama_stack/apis/benchmarks/benchmarks.py @@ -93,3 +93,11 @@ class Benchmarks(Protocol): :param metadata: The metadata to use for the benchmark. """ ... + + @webmethod(route="/eval/benchmarks/{benchmark_id}", method="DELETE") + async def unregister_benchmark(self, benchmark_id: str) -> None: + """Unregister a benchmark. + + :param benchmark_id: The ID of the benchmark to unregister. + """ + ... diff --git a/llama_stack/apis/scoring_functions/scoring_functions.py b/llama_stack/apis/scoring_functions/scoring_functions.py index 05b6325b7..541067766 100644 --- a/llama_stack/apis/scoring_functions/scoring_functions.py +++ b/llama_stack/apis/scoring_functions/scoring_functions.py @@ -197,3 +197,11 @@ class ScoringFunctions(Protocol): :param params: The parameters for the scoring function for benchmark eval, these can be overridden for app eval. """ ... + + @webmethod(route="/scoring-functions/{scoring_fn_id:path}", method="DELETE") + async def unregister_scoring_function(self, scoring_fn_id: str) -> None: + """Unregister a scoring function. + + :param scoring_fn_id: The ID of the scoring function to unregister. + """ + ... diff --git a/llama_stack/core/routing_tables/benchmarks.py b/llama_stack/core/routing_tables/benchmarks.py index c875dee5b..8c87d395d 100644 --- a/llama_stack/core/routing_tables/benchmarks.py +++ b/llama_stack/core/routing_tables/benchmarks.py @@ -56,3 +56,7 @@ class BenchmarksRoutingTable(CommonRoutingTableImpl, Benchmarks): provider_resource_id=provider_benchmark_id, ) await self.register_object(benchmark) + + async def unregister_benchmark(self, benchmark_id: str) -> None: + existing_benchmark = await self.get_benchmark(benchmark_id) + await self.unregister_object(existing_benchmark) diff --git a/llama_stack/core/routing_tables/common.py b/llama_stack/core/routing_tables/common.py index e523746d8..ca2f3af42 100644 --- a/llama_stack/core/routing_tables/common.py +++ b/llama_stack/core/routing_tables/common.py @@ -64,6 +64,10 @@ async def unregister_object_from_provider(obj: RoutableObject, p: Any) -> None: return await p.unregister_shield(obj.identifier) elif api == Api.datasetio: return await p.unregister_dataset(obj.identifier) + elif api == Api.eval: + return await p.unregister_benchmark(obj.identifier) + elif api == Api.scoring: + return await p.unregister_scoring_function(obj.identifier) elif api == Api.tool_runtime: return await p.unregister_toolgroup(obj.identifier) else: diff --git a/llama_stack/core/routing_tables/scoring_functions.py b/llama_stack/core/routing_tables/scoring_functions.py index 71e5bed63..520f07014 100644 --- a/llama_stack/core/routing_tables/scoring_functions.py +++ b/llama_stack/core/routing_tables/scoring_functions.py @@ -60,3 +60,7 @@ class ScoringFunctionsRoutingTable(CommonRoutingTableImpl, ScoringFunctions): ) scoring_fn.provider_id = provider_id await self.register_object(scoring_fn) + + async def unregister_scoring_function(self, scoring_fn_id: str) -> None: + existing_scoring_fn = await self.get_scoring_function(scoring_fn_id) + await self.unregister_object(existing_scoring_fn) diff --git a/llama_stack/providers/inline/eval/meta_reference/eval.py b/llama_stack/providers/inline/eval/meta_reference/eval.py index 9ae2018c4..a03e8951c 100644 --- a/llama_stack/providers/inline/eval/meta_reference/eval.py +++ b/llama_stack/providers/inline/eval/meta_reference/eval.py @@ -75,6 +75,13 @@ class MetaReferenceEvalImpl( ) self.benchmarks[task_def.identifier] = task_def + async def unregister_benchmark(self, benchmark_id: str) -> None: + if benchmark_id in self.benchmarks: + del self.benchmarks[benchmark_id] + + key = f"{EVAL_TASKS_PREFIX}{benchmark_id}" + await self.kvstore.delete(key) + async def run_eval( self, benchmark_id: str, diff --git a/llama_stack/providers/inline/scoring/llm_as_judge/scoring.py b/llama_stack/providers/inline/scoring/llm_as_judge/scoring.py index fd651877c..9b7628524 100644 --- a/llama_stack/providers/inline/scoring/llm_as_judge/scoring.py +++ b/llama_stack/providers/inline/scoring/llm_as_judge/scoring.py @@ -63,6 +63,9 @@ class LlmAsJudgeScoringImpl( async def register_scoring_function(self, function_def: ScoringFn) -> None: self.llm_as_judge_fn.register_scoring_fn_def(function_def) + async def unregister_scoring_function(self, scoring_fn_id: str) -> None: + self.llm_as_judge_fn.unregister_scoring_fn_def(scoring_fn_id) + async def score_batch( self, dataset_id: str, diff --git a/llama_stack/providers/remote/eval/nvidia/eval.py b/llama_stack/providers/remote/eval/nvidia/eval.py index 3572de0ef..a474e78e3 100644 --- a/llama_stack/providers/remote/eval/nvidia/eval.py +++ b/llama_stack/providers/remote/eval/nvidia/eval.py @@ -51,18 +51,23 @@ class NVIDIAEvalImpl( async def shutdown(self) -> None: ... - async def _evaluator_get(self, path): + async def _evaluator_get(self, path: str): """Helper for making GET requests to the evaluator service.""" response = requests.get(url=f"{self.config.evaluator_url}{path}") response.raise_for_status() return response.json() - async def _evaluator_post(self, path, data): + async def _evaluator_post(self, path: str, data: dict[str, Any]): """Helper for making POST requests to the evaluator service.""" response = requests.post(url=f"{self.config.evaluator_url}{path}", json=data) response.raise_for_status() return response.json() + async def _evaluator_delete(self, path: str) -> None: + """Helper for making DELETE requests to the evaluator service.""" + response = requests.delete(url=f"{self.config.evaluator_url}{path}") + response.raise_for_status() + async def register_benchmark(self, task_def: Benchmark) -> None: """Register a benchmark as an evaluation configuration.""" await self._evaluator_post( @@ -75,6 +80,10 @@ class NVIDIAEvalImpl( }, ) + async def unregister_benchmark(self, benchmark_id: str) -> None: + """Unregister a benchmark evaluation configuration from NeMo Evaluator.""" + await self._evaluator_delete(f"/v1/evaluation/configs/{DEFAULT_NAMESPACE}/{benchmark_id}") + async def run_eval( self, benchmark_id: str, diff --git a/tests/integration/scoring/test_scoring.py b/tests/integration/scoring/test_scoring.py index 315ff050c..1112f9164 100644 --- a/tests/integration/scoring/test_scoring.py +++ b/tests/integration/scoring/test_scoring.py @@ -9,6 +9,7 @@ from pathlib import Path import pandas as pd import pytest +import requests @pytest.fixture @@ -77,7 +78,46 @@ def test_scoring_functions_register( assert len(list_response) > 0 assert any(x.identifier == sample_scoring_fn_id for x in list_response) - # TODO: add unregister api for scoring functions + +def test_scoring_functions_unregister( + llama_stack_client, + sample_scoring_fn_id, + judge_model_id, + sample_judge_prompt_template, +): + llm_as_judge_provider = [ + x + for x in llama_stack_client.providers.list() + if x.api == "scoring" and x.provider_type == "inline::llm-as-judge" + ] + if len(llm_as_judge_provider) == 0: + pytest.skip("No llm-as-judge provider found, cannot test unregister") + + llm_as_judge_provider_id = llm_as_judge_provider[0].provider_id + + # Register first + register_scoring_function( + llama_stack_client, + llm_as_judge_provider_id, + sample_scoring_fn_id, + judge_model_id, + sample_judge_prompt_template, + ) + + # Ensure it is present + list_response = llama_stack_client.scoring_functions.list() + assert any(x.identifier == sample_scoring_fn_id for x in list_response) + + # Unregister scoring fn + try: + base_url = llama_stack_client.base_url + except AttributeError: + pytest.skip("No server base_url available; cannot test HTTP unregister in library mode") + + resp = requests.delete(f"{base_url}/v1/scoring-functions/{sample_scoring_fn_id}", timeout=30) + assert resp.status_code in (200, 204) + list_after = llama_stack_client.scoring_functions.list() + assert all(x.identifier != sample_scoring_fn_id for x in list_after) @pytest.mark.parametrize("scoring_fn_id", ["basic::equality"]) diff --git a/tests/unit/distribution/routers/test_routing_tables.py b/tests/unit/distribution/routers/test_routing_tables.py index 1ceee81c6..bbfea3f46 100644 --- a/tests/unit/distribution/routers/test_routing_tables.py +++ b/tests/unit/distribution/routers/test_routing_tables.py @@ -105,6 +105,9 @@ class ScoringFunctionsImpl(Impl): async def register_scoring_function(self, scoring_fn): return scoring_fn + async def unregister_scoring_function(self, scoring_fn_id: str): + return scoring_fn_id + class BenchmarksImpl(Impl): def __init__(self): @@ -113,6 +116,9 @@ class BenchmarksImpl(Impl): async def register_benchmark(self, benchmark): return benchmark + async def unregister_benchmark(self, benchmark_id: str): + return benchmark_id + class ToolGroupsImpl(Impl): def __init__(self): @@ -330,6 +336,13 @@ async def test_scoring_functions_routing_table(cached_disk_dist_registry): assert "test-scoring-fn" in scoring_fn_ids assert "test-scoring-fn-2" in scoring_fn_ids + # Unregister scoring functions and verify listing + for i in range(len(scoring_functions.data)): + await table.unregister_scoring_function(scoring_functions.data[i].scoring_fn_id) + + scoring_functions_list_after_deletion = await table.list_scoring_functions() + assert len(scoring_functions_list_after_deletion.data) == 0 + async def test_benchmarks_routing_table(cached_disk_dist_registry): table = BenchmarksRoutingTable({"test_provider": BenchmarksImpl()}, cached_disk_dist_registry, {}) @@ -347,6 +360,15 @@ async def test_benchmarks_routing_table(cached_disk_dist_registry): benchmark_ids = {b.identifier for b in benchmarks.data} assert "test-benchmark" in benchmark_ids + # Unregister the benchmark and verify removal + await table.unregister_benchmark(benchmark_id="test-benchmark") + benchmarks_after = await table.list_benchmarks() + assert len(benchmarks_after.data) == 0 + + # Unregistering a non-existent benchmark should raise a clear error + with pytest.raises(ValueError, match="Benchmark 'dummy_benchmark' not found"): + await table.unregister_benchmark(benchmark_id="dummy_benchmark") + async def test_tool_groups_routing_table(cached_disk_dist_registry): table = ToolGroupsRoutingTable({"test_provider": ToolGroupsImpl()}, cached_disk_dist_registry, {}) diff --git a/tests/unit/providers/nvidia/test_eval.py b/tests/unit/providers/nvidia/test_eval.py index 584ca2101..2bdcbbeba 100644 --- a/tests/unit/providers/nvidia/test_eval.py +++ b/tests/unit/providers/nvidia/test_eval.py @@ -52,14 +52,19 @@ class TestNVIDIAEvalImpl(unittest.TestCase): self.evaluator_post_patcher = patch( "llama_stack.providers.remote.eval.nvidia.eval.NVIDIAEvalImpl._evaluator_post" ) + self.evaluator_delete_patcher = patch( + "llama_stack.providers.remote.eval.nvidia.eval.NVIDIAEvalImpl._evaluator_delete" + ) self.mock_evaluator_get = self.evaluator_get_patcher.start() self.mock_evaluator_post = self.evaluator_post_patcher.start() + self.mock_evaluator_delete = self.evaluator_delete_patcher.start() def tearDown(self): """Clean up after each test.""" self.evaluator_get_patcher.stop() self.evaluator_post_patcher.stop() + self.evaluator_delete_patcher.stop() def _assert_request_body(self, expected_json): """Helper method to verify request body in Evaluator POST request is correct""" @@ -115,6 +120,13 @@ class TestNVIDIAEvalImpl(unittest.TestCase): self.mock_evaluator_post.assert_called_once() self._assert_request_body({"namespace": benchmark.provider_id, "name": benchmark.identifier, **eval_config}) + def test_unregister_benchmark(self): + # Unregister the benchmark + self.run_async(self.eval_impl.unregister_benchmark(benchmark_id=MOCK_BENCHMARK_ID)) + + # Verify the Evaluator API was called correctly + self.mock_evaluator_delete.assert_called_once_with(f"/v1/evaluation/configs/nvidia/{MOCK_BENCHMARK_ID}") + def test_run_eval(self): benchmark_config = BenchmarkConfig( eval_candidate=ModelCandidate( From f4ab154ade646cc153f1f2840d6596fc6d5b24af Mon Sep 17 00:00:00 2001 From: Matthew Farrellee Date: Mon, 15 Sep 2025 15:52:40 -0400 Subject: [PATCH 096/150] feat: add dynamic model registration support to TGI inference (#3417) # What does this PR do? adds dynamic model support to TGI add new overwrite_completion_id feature to OpenAIMixin to deal with TGI always returning id="" ## Test Plan tgi: `docker run --gpus all --shm-size 1g -p 8080:80 -v /data:/data ghcr.io/huggingface/text-generation-inference --model-id Qwen/Qwen3-0.6B` stack: `TGI_URL=http://localhost:8080 uv run llama stack build --image-type venv --distro ci-tests --run` test: `./scripts/integration-tests.sh --stack-config http://localhost:8321 --setup tgi --subdirs inference --pattern openai` --- .../providers/remote/inference/tgi/tgi.py | 58 +- .../providers/utils/inference/openai_mixin.py | 33 +- .../inference/test_openai_completion.py | 3 +- .../recordings/responses/27463384d1a3.json | 56 + .../recordings/responses/4d4440c8641b.json | 42 + .../recordings/responses/7ef63231b9f8.json | 56 + .../recordings/responses/89b141855b81.json | 3820 ++++++++++++++++ .../recordings/responses/a98eecadddc8.json | 366 ++ .../recordings/responses/aacf9abc51d4.json | 2624 +++++++++++ .../recordings/responses/b9f6e724ae06.json | 976 ++++ .../recordings/responses/cf55f983d1ff.json | 84 + .../recordings/responses/e08e01e5652a.json | 56 + .../recordings/responses/f518ea4fde7d.json | 4054 +++++++++++++++++ tests/integration/suites.py | 10 + 14 files changed, 12218 insertions(+), 20 deletions(-) create mode 100644 tests/integration/recordings/responses/27463384d1a3.json create mode 100644 tests/integration/recordings/responses/4d4440c8641b.json create mode 100644 tests/integration/recordings/responses/7ef63231b9f8.json create mode 100644 tests/integration/recordings/responses/89b141855b81.json create mode 100644 tests/integration/recordings/responses/a98eecadddc8.json create mode 100644 tests/integration/recordings/responses/aacf9abc51d4.json create mode 100644 tests/integration/recordings/responses/b9f6e724ae06.json create mode 100644 tests/integration/recordings/responses/cf55f983d1ff.json create mode 100644 tests/integration/recordings/responses/e08e01e5652a.json create mode 100644 tests/integration/recordings/responses/f518ea4fde7d.json diff --git a/llama_stack/providers/remote/inference/tgi/tgi.py b/llama_stack/providers/remote/inference/tgi/tgi.py index 97c72d14c..27597900f 100644 --- a/llama_stack/providers/remote/inference/tgi/tgi.py +++ b/llama_stack/providers/remote/inference/tgi/tgi.py @@ -8,6 +8,7 @@ from collections.abc import AsyncGenerator from huggingface_hub import AsyncInferenceClient, HfApi +from pydantic import SecretStr from llama_stack.apis.common.content_types import ( InterleavedContent, @@ -33,6 +34,7 @@ from llama_stack.apis.inference import ( ToolPromptFormat, ) from llama_stack.apis.models import Model +from llama_stack.apis.models.models import ModelType from llama_stack.log import get_logger from llama_stack.models.llama.sku_list import all_registered_models from llama_stack.providers.datatypes import ModelsProtocolPrivate @@ -41,16 +43,15 @@ from llama_stack.providers.utils.inference.model_registry import ( build_hf_repo_model_entry, ) from llama_stack.providers.utils.inference.openai_compat import ( - OpenAIChatCompletionToLlamaStackMixin, OpenAICompatCompletionChoice, OpenAICompatCompletionResponse, - OpenAICompletionToLlamaStackMixin, get_sampling_options, process_chat_completion_response, process_chat_completion_stream_response, process_completion_response, process_completion_stream_response, ) +from llama_stack.providers.utils.inference.openai_mixin import OpenAIMixin from llama_stack.providers.utils.inference.prompt_adapter import ( chat_completion_request_to_model_input_info, completion_request_to_prompt_model_input_info, @@ -73,26 +74,49 @@ def build_hf_repo_model_entries(): class _HfAdapter( + OpenAIMixin, Inference, - OpenAIChatCompletionToLlamaStackMixin, - OpenAICompletionToLlamaStackMixin, ModelsProtocolPrivate, ): - client: AsyncInferenceClient + url: str + api_key: SecretStr + + hf_client: AsyncInferenceClient max_tokens: int model_id: str + overwrite_completion_id = True # TGI always returns id="" + def __init__(self) -> None: self.register_helper = ModelRegistryHelper(build_hf_repo_model_entries()) self.huggingface_repo_to_llama_model_id = { model.huggingface_repo: model.descriptor() for model in all_registered_models() if model.huggingface_repo } + def get_api_key(self): + return self.api_key.get_secret_value() + + def get_base_url(self): + return self.url + async def shutdown(self) -> None: pass + async def list_models(self) -> list[Model] | None: + models = [] + async for model in self.client.models.list(): + models.append( + Model( + identifier=model.id, + provider_resource_id=model.id, + provider_id=self.__provider_id__, + metadata={}, + model_type=ModelType.llm, + ) + ) + return models + async def register_model(self, model: Model) -> Model: - model = await self.register_helper.register_model(model) if model.provider_resource_id != self.model_id: raise ValueError( f"Model {model.provider_resource_id} does not match the model {self.model_id} served by TGI." @@ -176,7 +200,7 @@ class _HfAdapter( params = await self._get_params_for_completion(request) async def _generate_and_convert_to_openai_compat(): - s = await self.client.text_generation(**params) + s = await self.hf_client.text_generation(**params) async for chunk in s: token_result = chunk.token finish_reason = None @@ -194,7 +218,7 @@ class _HfAdapter( async def _nonstream_completion(self, request: CompletionRequest) -> AsyncGenerator: params = await self._get_params_for_completion(request) - r = await self.client.text_generation(**params) + r = await self.hf_client.text_generation(**params) choice = OpenAICompatCompletionChoice( finish_reason=r.details.finish_reason, @@ -241,7 +265,7 @@ class _HfAdapter( async def _nonstream_chat_completion(self, request: ChatCompletionRequest) -> ChatCompletionResponse: params = await self._get_params(request) - r = await self.client.text_generation(**params) + r = await self.hf_client.text_generation(**params) choice = OpenAICompatCompletionChoice( finish_reason=r.details.finish_reason, @@ -256,7 +280,7 @@ class _HfAdapter( params = await self._get_params(request) async def _generate_and_convert_to_openai_compat(): - s = await self.client.text_generation(**params) + s = await self.hf_client.text_generation(**params) async for chunk in s: token_result = chunk.token @@ -308,18 +332,21 @@ class TGIAdapter(_HfAdapter): if not config.url: raise ValueError("You must provide a URL in run.yaml (or via the TGI_URL environment variable) to use TGI.") log.info(f"Initializing TGI client with url={config.url}") - self.client = AsyncInferenceClient(model=config.url, provider="hf-inference") - endpoint_info = await self.client.get_endpoint_info() + self.hf_client = AsyncInferenceClient(model=config.url, provider="hf-inference") + endpoint_info = await self.hf_client.get_endpoint_info() self.max_tokens = endpoint_info["max_total_tokens"] self.model_id = endpoint_info["model_id"] + self.url = f"{config.url.rstrip('/')}/v1" + self.api_key = SecretStr("NO_KEY") class InferenceAPIAdapter(_HfAdapter): async def initialize(self, config: InferenceAPIImplConfig) -> None: - self.client = AsyncInferenceClient(model=config.huggingface_repo, token=config.api_token.get_secret_value()) - endpoint_info = await self.client.get_endpoint_info() + self.hf_client = AsyncInferenceClient(model=config.huggingface_repo, token=config.api_token.get_secret_value()) + endpoint_info = await self.hf_client.get_endpoint_info() self.max_tokens = endpoint_info["max_total_tokens"] self.model_id = endpoint_info["model_id"] + # TODO: how do we set url for this? class InferenceEndpointAdapter(_HfAdapter): @@ -331,6 +358,7 @@ class InferenceEndpointAdapter(_HfAdapter): endpoint.wait(timeout=60) # Initialize the adapter - self.client = endpoint.async_client + self.hf_client = endpoint.async_client self.model_id = endpoint.repository self.max_tokens = int(endpoint.raw["model"]["image"]["custom"]["env"]["MAX_TOTAL_TOKENS"]) + # TODO: how do we set url for this? diff --git a/llama_stack/providers/utils/inference/openai_mixin.py b/llama_stack/providers/utils/inference/openai_mixin.py index a3c0ffadc..938927d21 100644 --- a/llama_stack/providers/utils/inference/openai_mixin.py +++ b/llama_stack/providers/utils/inference/openai_mixin.py @@ -4,6 +4,7 @@ # This source code is licensed under the terms described in the LICENSE file in # the root directory of this source tree. +import uuid from abc import ABC, abstractmethod from collections.abc import AsyncIterator from typing import Any @@ -43,6 +44,12 @@ class OpenAIMixin(ABC): The model_store is set in routing_tables/common.py during provider initialization. """ + # Allow subclasses to control whether to overwrite the 'id' field in OpenAI responses + # is overwritten with a client-side generated id. + # + # This is useful for providers that do not return a unique id in the response. + overwrite_completion_id: bool = False + @abstractmethod def get_api_key(self) -> str: """ @@ -110,6 +117,23 @@ class OpenAIMixin(ABC): raise ValueError(f"Model {model} has no provider_resource_id") return model_obj.provider_resource_id + async def _maybe_overwrite_id(self, resp: Any, stream: bool | None) -> Any: + if not self.overwrite_completion_id: + return resp + + new_id = f"cltsd-{uuid.uuid4()}" + if stream: + + async def _gen(): + async for chunk in resp: + chunk.id = new_id + yield chunk + + return _gen() + else: + resp.id = new_id + return resp + async def openai_completion( self, model: str, @@ -147,7 +171,7 @@ class OpenAIMixin(ABC): extra_body["guided_choice"] = guided_choice # TODO: fix openai_completion to return type compatible with OpenAI's API response - return await self.client.completions.create( # type: ignore[no-any-return] + resp = await self.client.completions.create( **await prepare_openai_completion_params( model=await self._get_provider_model_id(model), prompt=prompt, @@ -171,6 +195,8 @@ class OpenAIMixin(ABC): extra_body=extra_body, ) + return await self._maybe_overwrite_id(resp, stream) # type: ignore[no-any-return] + async def openai_chat_completion( self, model: str, @@ -200,8 +226,7 @@ class OpenAIMixin(ABC): """ Direct OpenAI chat completion API call. """ - # Type ignore because return types are compatible - return await self.client.chat.completions.create( # type: ignore[no-any-return] + resp = await self.client.chat.completions.create( **await prepare_openai_completion_params( model=await self._get_provider_model_id(model), messages=messages, @@ -229,6 +254,8 @@ class OpenAIMixin(ABC): ) ) + return await self._maybe_overwrite_id(resp, stream) # type: ignore[no-any-return] + async def openai_embeddings( self, model: str, diff --git a/tests/integration/inference/test_openai_completion.py b/tests/integration/inference/test_openai_completion.py index 22dec8876..35869276b 100644 --- a/tests/integration/inference/test_openai_completion.py +++ b/tests/integration/inference/test_openai_completion.py @@ -48,7 +48,6 @@ def skip_if_model_doesnt_support_openai_completion(client_with_models, model_id) "remote::nvidia", "remote::runpod", "remote::sambanova", - "remote::tgi", "remote::vertexai", # {"error":{"message":"Unknown request URL: GET /openai/v1/completions. Please check the URL for typos, # or see the docs at https://console.groq.com/docs/","type":"invalid_request_error","code":"unknown_url"}} @@ -96,6 +95,7 @@ def skip_if_doesnt_support_n(client_with_models, model_id): "remote::vertexai", # Error code: 400 - [{'error': {'code': 400, 'message': 'Unable to submit request because candidateCount must be 1 but # the entered value was 2. Update the candidateCount value and try again.', 'status': 'INVALID_ARGUMENT'} + "remote::tgi", # TGI ignores n param silently ): pytest.skip(f"Model {model_id} hosted by {provider.provider_type} doesn't support n param.") @@ -110,7 +110,6 @@ def skip_if_model_doesnt_support_openai_chat_completion(client_with_models, mode "remote::cerebras", "remote::databricks", "remote::runpod", - "remote::tgi", ): pytest.skip(f"Model {model_id} hosted by {provider.provider_type} doesn't support OpenAI chat completions.") diff --git a/tests/integration/recordings/responses/27463384d1a3.json b/tests/integration/recordings/responses/27463384d1a3.json new file mode 100644 index 000000000..fcdf3a0e3 --- /dev/null +++ b/tests/integration/recordings/responses/27463384d1a3.json @@ -0,0 +1,56 @@ +{ + "request": { + "method": "POST", + "url": "http://localhost:8080/v1/v1/chat/completions", + "headers": {}, + "body": { + "model": "Qwen/Qwen3-0.6B", + "messages": [ + { + "role": "user", + "content": "Hello, world!" + } + ], + "stream": false + }, + "endpoint": "/v1/chat/completions", + "model": "Qwen/Qwen3-0.6B" + }, + "response": { + "body": { + "__type__": "openai.types.chat.chat_completion.ChatCompletion", + "__data__": { + "id": "", + "choices": [ + { + "finish_reason": "stop", + "index": 0, + "logprobs": null, + "message": { + "content": "\nOkay, the user just said \"Hello, world!\" so I need to respond in a friendly way. My prompt says to respond in the same style, so I should start with \"Hello, world!\" but maybe add some helpful information. Let me think. Since the user is probably testing or just sharing, a simple \"Hello, world!\" with a question would be best for user interaction. I'll make sure to keep it positive and open-ended.\n\n\nHello, world! \ud83d\ude0a What do you need today?", + "refusal": null, + "role": "assistant", + "annotations": null, + "audio": null, + "function_call": null, + "tool_calls": null + } + } + ], + "created": 1757550395, + "model": "Qwen/Qwen3-0.6B", + "object": "chat.completion", + "service_tier": null, + "system_fingerprint": "3.3.5-dev0-sha-1b90c50", + "usage": { + "completion_tokens": 108, + "prompt_tokens": 12, + "total_tokens": 120, + "completion_tokens_details": null, + "prompt_tokens_details": null + } + } + }, + "is_streaming": false + } +} diff --git a/tests/integration/recordings/responses/4d4440c8641b.json b/tests/integration/recordings/responses/4d4440c8641b.json new file mode 100644 index 000000000..2fd9bf13b --- /dev/null +++ b/tests/integration/recordings/responses/4d4440c8641b.json @@ -0,0 +1,42 @@ +{ + "request": { + "method": "POST", + "url": "http://localhost:8080/v1/v1/completions", + "headers": {}, + "body": { + "model": "Qwen/Qwen3-0.6B", + "prompt": "Respond to this question and explain your answer. Complete the sentence using one word: Roses are red, violets are ", + "stream": false + }, + "endpoint": "/v1/completions", + "model": "Qwen/Qwen3-0.6B" + }, + "response": { + "body": { + "__type__": "openai.types.completion.Completion", + "__data__": { + "id": "", + "choices": [ + { + "finish_reason": "length", + "index": 0, + "logprobs": null, + "text": " ______.\nA. yellow \nB. red \nC. blue \nD. green \nAnswer:\nThe word is **green**.\n\nAnswer:\nD\n\nThe answer is green because when comparing a rose and a violet, the red hue of roses and the color green of violets are different.\n\nAnswer:\nD\nAnswer:\nD\n\nRoses are red, violets are **green**.\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\n\nRoses are red, violets are **green**.\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\n\nRoses are red, violets are **green**.\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\n\nRoses are red, violets are **green**.\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\n\nRoses are red, violets are **green**.\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\nD\nAnswer:\n" + } + ], + "created": 1757550347, + "model": "Qwen/Qwen3-0.6B", + "object": "text_completion", + "system_fingerprint": "3.3.5-dev0-sha-1b90c50", + "usage": { + "completion_tokens": 4071, + "prompt_tokens": 25, + "total_tokens": 4096, + "completion_tokens_details": null, + "prompt_tokens_details": null + } + } + }, + "is_streaming": false + } +} diff --git a/tests/integration/recordings/responses/7ef63231b9f8.json b/tests/integration/recordings/responses/7ef63231b9f8.json new file mode 100644 index 000000000..60f3e3c36 --- /dev/null +++ b/tests/integration/recordings/responses/7ef63231b9f8.json @@ -0,0 +1,56 @@ +{ + "request": { + "method": "POST", + "url": "http://localhost:8080/v1/v1/chat/completions", + "headers": {}, + "body": { + "model": "Qwen/Qwen3-0.6B", + "messages": [ + { + "role": "user", + "content": "Which planet has rings around it with a name starting with letter S?" + } + ], + "stream": false + }, + "endpoint": "/v1/chat/completions", + "model": "Qwen/Qwen3-0.6B" + }, + "response": { + "body": { + "__type__": "openai.types.chat.chat_completion.ChatCompletion", + "__data__": { + "id": "", + "choices": [ + { + "finish_reason": "stop", + "index": 0, + "logprobs": null, + "message": { + "content": "\nOkay, so the user is asking which planet has rings around it and its name starts with the letter S. Let me think... I know that the Sun is a star, not a planet. So the Moon is a natural satellite, which has the Moon's name and rings. But the Moon's name starts with M, not S. The Earth has the name Earth, but the rings aren't really around the Earth in any real sense. Mars has a thin ring of dust. Venus and Mercury don't have rings in the sense of planetary rings as we know. Wait, maybe the answer is the Moon, even though it's not the same as the name starting with S. But the question says a planet, so if there's a planet named S, that would be it. But actually, the only planet with rings is Jupiter. Wait, Jupiter has a famous system of rings. But why does the question mention a planet with a name starting with S? Maybe there's a trick. Let me double-check. Jupiter's name starts with J, so maybe the answer is Venus? But Venus doesn't have rings. Mercury, too, doesn't. The Moon, as a planet, a dwarf planet, and has rings. Despite the name, the rings are around it. So the answer would be the Moon. Therefore, the planet with rings and name starting with S is the Moon.\n\n\nThe planet with rings around it and a name starting with the letter **S** is the **Moon**. Though its name doesn't start with an **S**, it is technically a dwarf planet and has the rings in its orbit. Oops Saturn!", + "refusal": null, + "role": "assistant", + "annotations": null, + "audio": null, + "function_call": null, + "tool_calls": null + } + } + ], + "created": 1757550394, + "model": "Qwen/Qwen3-0.6B", + "object": "chat.completion", + "service_tier": null, + "system_fingerprint": "3.3.5-dev0-sha-1b90c50", + "usage": { + "completion_tokens": 336, + "prompt_tokens": 22, + "total_tokens": 358, + "completion_tokens_details": null, + "prompt_tokens_details": null + } + } + }, + "is_streaming": false + } +} diff --git a/tests/integration/recordings/responses/89b141855b81.json b/tests/integration/recordings/responses/89b141855b81.json new file mode 100644 index 000000000..0c2e9269f --- /dev/null +++ b/tests/integration/recordings/responses/89b141855b81.json @@ -0,0 +1,3820 @@ +{ + "request": { + "method": "POST", + "url": "http://localhost:8080/v1/v1/chat/completions", + "headers": {}, + "body": { + "model": "Qwen/Qwen3-0.6B", + "messages": [ + { + "role": "user", + "content": "What's the name of the Sun in latin?" + } + ], + "stream": true + }, + "endpoint": "/v1/chat/completions", + "model": "Qwen/Qwen3-0.6B" + }, + "response": { + "body": [ + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "", + "choices": [ + { + "delta": { + "content": "", + "function_call": null, + "refusal": null, + "role": "assistant", + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null + } + ], + "created": 1757550390, + "model": "Qwen/Qwen3-0.6B", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": "3.3.5-dev0-sha-1b90c50", + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "", + "choices": [ + { + "delta": { + "content": "\n", + "function_call": null, + "refusal": null, + "role": "assistant", + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null + } + ], + "created": 1757550390, + "model": "Qwen/Qwen3-0.6B", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": "3.3.5-dev0-sha-1b90c50", + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "", + "choices": [ + { + "delta": { + "content": "Okay", + "function_call": null, + "refusal": null, + "role": "assistant", + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null + } + ], + "created": 1757550390, + "model": "Qwen/Qwen3-0.6B", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": "3.3.5-dev0-sha-1b90c50", + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "", + "choices": [ + { + "delta": { + "content": ",", + "function_call": null, + "refusal": null, + "role": "assistant", + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null + } + ], + "created": 1757550390, + "model": "Qwen/Qwen3-0.6B", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": "3.3.5-dev0-sha-1b90c50", + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "", + "choices": [ + { + "delta": { + "content": " the", + "function_call": null, + "refusal": null, + "role": "assistant", + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null + } + ], + "created": 1757550390, + "model": "Qwen/Qwen3-0.6B", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": "3.3.5-dev0-sha-1b90c50", + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "", + "choices": [ + { + "delta": { + "content": " user", + "function_call": null, + "refusal": null, + "role": "assistant", + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null + } + ], + "created": 1757550390, + "model": "Qwen/Qwen3-0.6B", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": "3.3.5-dev0-sha-1b90c50", + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "", + "choices": [ + { + "delta": { + "content": " is", + "function_call": null, + "refusal": null, + "role": "assistant", + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null + } + ], + "created": 1757550390, + "model": "Qwen/Qwen3-0.6B", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": "3.3.5-dev0-sha-1b90c50", + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "", + "choices": [ + { + "delta": { + "content": " asking", + "function_call": null, + "refusal": null, + "role": "assistant", + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null + } + ], + "created": 1757550390, + "model": "Qwen/Qwen3-0.6B", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": "3.3.5-dev0-sha-1b90c50", + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "", + "choices": [ + { + "delta": { + "content": " for", + "function_call": null, + "refusal": null, + "role": "assistant", + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null + } + ], + "created": 1757550390, + "model": "Qwen/Qwen3-0.6B", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": "3.3.5-dev0-sha-1b90c50", + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "", + "choices": [ + { + "delta": { + "content": " the", + "function_call": null, + "refusal": null, + "role": "assistant", + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null + } + ], + "created": 1757550390, + "model": "Qwen/Qwen3-0.6B", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": "3.3.5-dev0-sha-1b90c50", + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "", + "choices": [ + { + "delta": { + "content": " name", + "function_call": null, + "refusal": null, + "role": "assistant", + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null + } + ], + "created": 1757550390, + "model": "Qwen/Qwen3-0.6B", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": "3.3.5-dev0-sha-1b90c50", + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "", + "choices": [ + { + "delta": { + "content": " of", + "function_call": null, + "refusal": null, + "role": "assistant", + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null + } + ], + "created": 1757550390, + "model": "Qwen/Qwen3-0.6B", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": "3.3.5-dev0-sha-1b90c50", + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "", + "choices": [ + { + "delta": { + "content": " the", + "function_call": null, + "refusal": null, + "role": "assistant", + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null + } + ], + "created": 1757550390, + "model": "Qwen/Qwen3-0.6B", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": "3.3.5-dev0-sha-1b90c50", + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "", + "choices": [ + { + "delta": { + "content": " Sun", + "function_call": null, + "refusal": null, + "role": "assistant", + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null + } + ], + "created": 1757550390, + "model": "Qwen/Qwen3-0.6B", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": "3.3.5-dev0-sha-1b90c50", + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "", + "choices": [ + { + "delta": { + "content": " in", + "function_call": null, + "refusal": null, + "role": "assistant", + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null + } + ], + "created": 1757550390, + "model": "Qwen/Qwen3-0.6B", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": "3.3.5-dev0-sha-1b90c50", + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "", + "choices": [ + { + "delta": { + "content": " Latin", + "function_call": null, + "refusal": null, + "role": "assistant", + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null + } + ], + "created": 1757550390, + "model": "Qwen/Qwen3-0.6B", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": "3.3.5-dev0-sha-1b90c50", + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "", + "choices": [ + { + "delta": { + "content": ".", + "function_call": null, + "refusal": null, + "role": "assistant", + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null + } + ], + "created": 1757550390, + "model": "Qwen/Qwen3-0.6B", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": "3.3.5-dev0-sha-1b90c50", + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "", + "choices": [ + { + "delta": { + "content": " Let", + "function_call": null, + "refusal": null, + "role": "assistant", + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null + } + ], + "created": 1757550390, + "model": "Qwen/Qwen3-0.6B", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": "3.3.5-dev0-sha-1b90c50", + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "", + "choices": [ + { + "delta": { + "content": " me", + "function_call": null, + "refusal": null, + "role": "assistant", + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null + } + ], + "created": 1757550390, + "model": "Qwen/Qwen3-0.6B", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": "3.3.5-dev0-sha-1b90c50", + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "", + "choices": [ + { + "delta": { + "content": " think", + "function_call": null, + "refusal": null, + "role": "assistant", + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null + } + ], + "created": 1757550390, + "model": "Qwen/Qwen3-0.6B", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": "3.3.5-dev0-sha-1b90c50", + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "", + "choices": [ + { + "delta": { + "content": ".", + "function_call": null, + "refusal": null, + "role": "assistant", + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null + } + ], + "created": 1757550390, + "model": "Qwen/Qwen3-0.6B", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": "3.3.5-dev0-sha-1b90c50", + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "", + "choices": [ + { + "delta": { + "content": " I", + "function_call": null, + "refusal": null, + "role": "assistant", + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null + } + ], + "created": 1757550390, + "model": "Qwen/Qwen3-0.6B", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": "3.3.5-dev0-sha-1b90c50", + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "", + "choices": [ + { + "delta": { + "content": " know", + "function_call": null, + "refusal": null, + "role": "assistant", + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null + } + ], + "created": 1757550390, + "model": "Qwen/Qwen3-0.6B", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": "3.3.5-dev0-sha-1b90c50", + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "", + "choices": [ + { + "delta": { + "content": " the", + "function_call": null, + "refusal": null, + "role": "assistant", + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null + } + ], + "created": 1757550390, + "model": "Qwen/Qwen3-0.6B", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": "3.3.5-dev0-sha-1b90c50", + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "", + "choices": [ + { + "delta": { + "content": " Sun", + "function_call": null, + "refusal": null, + "role": "assistant", + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null + } + ], + "created": 1757550390, + "model": "Qwen/Qwen3-0.6B", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": "3.3.5-dev0-sha-1b90c50", + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "", + "choices": [ + { + "delta": { + "content": " is", + "function_call": null, + "refusal": null, + "role": "assistant", + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null + } + ], + "created": 1757550390, + "model": "Qwen/Qwen3-0.6B", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": "3.3.5-dev0-sha-1b90c50", + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "", + "choices": [ + { + "delta": { + "content": " called", + "function_call": null, + "refusal": null, + "role": "assistant", + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null + } + ], + "created": 1757550390, + "model": "Qwen/Qwen3-0.6B", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": "3.3.5-dev0-sha-1b90c50", + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "", + "choices": [ + { + "delta": { + "content": " \"", + "function_call": null, + "refusal": null, + "role": "assistant", + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null + } + ], + "created": 1757550390, + "model": "Qwen/Qwen3-0.6B", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": "3.3.5-dev0-sha-1b90c50", + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "", + "choices": [ + { + "delta": { + "content": "Sol", + "function_call": null, + "refusal": null, + "role": "assistant", + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null + } + ], + "created": 1757550390, + "model": "Qwen/Qwen3-0.6B", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": "3.3.5-dev0-sha-1b90c50", + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "", + "choices": [ + { + "delta": { + "content": "\"", + "function_call": null, + "refusal": null, + "role": "assistant", + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null + } + ], + "created": 1757550390, + "model": "Qwen/Qwen3-0.6B", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": "3.3.5-dev0-sha-1b90c50", + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "", + "choices": [ + { + "delta": { + "content": " in", + "function_call": null, + "refusal": null, + "role": "assistant", + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null + } + ], + "created": 1757550390, + "model": "Qwen/Qwen3-0.6B", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": "3.3.5-dev0-sha-1b90c50", + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "", + "choices": [ + { + "delta": { + "content": " English", + "function_call": null, + "refusal": null, + "role": "assistant", + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null + } + ], + "created": 1757550390, + "model": "Qwen/Qwen3-0.6B", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": "3.3.5-dev0-sha-1b90c50", + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "", + "choices": [ + { + "delta": { + "content": ",", + "function_call": null, + "refusal": null, + "role": "assistant", + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null + } + ], + "created": 1757550390, + "model": "Qwen/Qwen3-0.6B", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": "3.3.5-dev0-sha-1b90c50", + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "", + "choices": [ + { + "delta": { + "content": " but", + "function_call": null, + "refusal": null, + "role": "assistant", + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null + } + ], + "created": 1757550390, + "model": "Qwen/Qwen3-0.6B", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": "3.3.5-dev0-sha-1b90c50", + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "", + "choices": [ + { + "delta": { + "content": " I", + "function_call": null, + "refusal": null, + "role": "assistant", + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null + } + ], + "created": 1757550390, + "model": "Qwen/Qwen3-0.6B", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": "3.3.5-dev0-sha-1b90c50", + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "", + "choices": [ + { + "delta": { + "content": " need", + "function_call": null, + "refusal": null, + "role": "assistant", + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null + } + ], + "created": 1757550390, + "model": "Qwen/Qwen3-0.6B", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": "3.3.5-dev0-sha-1b90c50", + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "", + "choices": [ + { + "delta": { + "content": " to", + "function_call": null, + "refusal": null, + "role": "assistant", + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null + } + ], + "created": 1757550390, + "model": "Qwen/Qwen3-0.6B", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": "3.3.5-dev0-sha-1b90c50", + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "", + "choices": [ + { + "delta": { + "content": " confirm", + "function_call": null, + "refusal": null, + "role": "assistant", + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null + } + ], + "created": 1757550390, + "model": "Qwen/Qwen3-0.6B", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": "3.3.5-dev0-sha-1b90c50", + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "", + "choices": [ + { + "delta": { + "content": " if", + "function_call": null, + "refusal": null, + "role": "assistant", + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null + } + ], + "created": 1757550390, + "model": "Qwen/Qwen3-0.6B", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": "3.3.5-dev0-sha-1b90c50", + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "", + "choices": [ + { + "delta": { + "content": " that", + "function_call": null, + "refusal": null, + "role": "assistant", + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null + } + ], + "created": 1757550390, + "model": "Qwen/Qwen3-0.6B", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": "3.3.5-dev0-sha-1b90c50", + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "", + "choices": [ + { + "delta": { + "content": "'s", + "function_call": null, + "refusal": null, + "role": "assistant", + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null + } + ], + "created": 1757550390, + "model": "Qwen/Qwen3-0.6B", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": "3.3.5-dev0-sha-1b90c50", + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "", + "choices": [ + { + "delta": { + "content": " the", + "function_call": null, + "refusal": null, + "role": "assistant", + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null + } + ], + "created": 1757550390, + "model": "Qwen/Qwen3-0.6B", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": "3.3.5-dev0-sha-1b90c50", + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "", + "choices": [ + { + "delta": { + "content": " Latin", + "function_call": null, + "refusal": null, + "role": "assistant", + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null + } + ], + "created": 1757550390, + "model": "Qwen/Qwen3-0.6B", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": "3.3.5-dev0-sha-1b90c50", + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "", + "choices": [ + { + "delta": { + "content": " name", + "function_call": null, + "refusal": null, + "role": "assistant", + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null + } + ], + "created": 1757550390, + "model": "Qwen/Qwen3-0.6B", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": "3.3.5-dev0-sha-1b90c50", + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "", + "choices": [ + { + "delta": { + "content": ".", + "function_call": null, + "refusal": null, + "role": "assistant", + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null + } + ], + "created": 1757550390, + "model": "Qwen/Qwen3-0.6B", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": "3.3.5-dev0-sha-1b90c50", + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "", + "choices": [ + { + "delta": { + "content": " I", + "function_call": null, + "refusal": null, + "role": "assistant", + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null + } + ], + "created": 1757550390, + "model": "Qwen/Qwen3-0.6B", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": "3.3.5-dev0-sha-1b90c50", + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "", + "choices": [ + { + "delta": { + "content": " recall", + "function_call": null, + "refusal": null, + "role": "assistant", + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null + } + ], + "created": 1757550390, + "model": "Qwen/Qwen3-0.6B", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": "3.3.5-dev0-sha-1b90c50", + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "", + "choices": [ + { + "delta": { + "content": ",", + "function_call": null, + "refusal": null, + "role": "assistant", + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null + } + ], + "created": 1757550390, + "model": "Qwen/Qwen3-0.6B", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": "3.3.5-dev0-sha-1b90c50", + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "", + "choices": [ + { + "delta": { + "content": " in", + "function_call": null, + "refusal": null, + "role": "assistant", + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null + } + ], + "created": 1757550390, + "model": "Qwen/Qwen3-0.6B", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": "3.3.5-dev0-sha-1b90c50", + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "", + "choices": [ + { + "delta": { + "content": " Latin", + "function_call": null, + "refusal": null, + "role": "assistant", + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null + } + ], + "created": 1757550390, + "model": "Qwen/Qwen3-0.6B", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": "3.3.5-dev0-sha-1b90c50", + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "", + "choices": [ + { + "delta": { + "content": ",", + "function_call": null, + "refusal": null, + "role": "assistant", + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null + } + ], + "created": 1757550390, + "model": "Qwen/Qwen3-0.6B", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": "3.3.5-dev0-sha-1b90c50", + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "", + "choices": [ + { + "delta": { + "content": " the", + "function_call": null, + "refusal": null, + "role": "assistant", + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null + } + ], + "created": 1757550390, + "model": "Qwen/Qwen3-0.6B", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": "3.3.5-dev0-sha-1b90c50", + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "", + "choices": [ + { + "delta": { + "content": " Sun", + "function_call": null, + "refusal": null, + "role": "assistant", + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null + } + ], + "created": 1757550390, + "model": "Qwen/Qwen3-0.6B", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": "3.3.5-dev0-sha-1b90c50", + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "", + "choices": [ + { + "delta": { + "content": " is", + "function_call": null, + "refusal": null, + "role": "assistant", + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null + } + ], + "created": 1757550390, + "model": "Qwen/Qwen3-0.6B", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": "3.3.5-dev0-sha-1b90c50", + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "", + "choices": [ + { + "delta": { + "content": " called", + "function_call": null, + "refusal": null, + "role": "assistant", + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null + } + ], + "created": 1757550390, + "model": "Qwen/Qwen3-0.6B", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": "3.3.5-dev0-sha-1b90c50", + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "", + "choices": [ + { + "delta": { + "content": " \"", + "function_call": null, + "refusal": null, + "role": "assistant", + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null + } + ], + "created": 1757550390, + "model": "Qwen/Qwen3-0.6B", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": "3.3.5-dev0-sha-1b90c50", + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "", + "choices": [ + { + "delta": { + "content": "Sol", + "function_call": null, + "refusal": null, + "role": "assistant", + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null + } + ], + "created": 1757550390, + "model": "Qwen/Qwen3-0.6B", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": "3.3.5-dev0-sha-1b90c50", + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "", + "choices": [ + { + "delta": { + "content": ".\"", + "function_call": null, + "refusal": null, + "role": "assistant", + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null + } + ], + "created": 1757550390, + "model": "Qwen/Qwen3-0.6B", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": "3.3.5-dev0-sha-1b90c50", + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "", + "choices": [ + { + "delta": { + "content": " But", + "function_call": null, + "refusal": null, + "role": "assistant", + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null + } + ], + "created": 1757550390, + "model": "Qwen/Qwen3-0.6B", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": "3.3.5-dev0-sha-1b90c50", + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "", + "choices": [ + { + "delta": { + "content": " wait", + "function_call": null, + "refusal": null, + "role": "assistant", + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null + } + ], + "created": 1757550390, + "model": "Qwen/Qwen3-0.6B", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": "3.3.5-dev0-sha-1b90c50", + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "", + "choices": [ + { + "delta": { + "content": ",", + "function_call": null, + "refusal": null, + "role": "assistant", + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null + } + ], + "created": 1757550390, + "model": "Qwen/Qwen3-0.6B", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": "3.3.5-dev0-sha-1b90c50", + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "", + "choices": [ + { + "delta": { + "content": " is", + "function_call": null, + "refusal": null, + "role": "assistant", + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null + } + ], + "created": 1757550390, + "model": "Qwen/Qwen3-0.6B", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": "3.3.5-dev0-sha-1b90c50", + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "", + "choices": [ + { + "delta": { + "content": " there", + "function_call": null, + "refusal": null, + "role": "assistant", + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null + } + ], + "created": 1757550390, + "model": "Qwen/Qwen3-0.6B", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": "3.3.5-dev0-sha-1b90c50", + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "", + "choices": [ + { + "delta": { + "content": " a", + "function_call": null, + "refusal": null, + "role": "assistant", + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null + } + ], + "created": 1757550390, + "model": "Qwen/Qwen3-0.6B", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": "3.3.5-dev0-sha-1b90c50", + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "", + "choices": [ + { + "delta": { + "content": " difference", + "function_call": null, + "refusal": null, + "role": "assistant", + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null + } + ], + "created": 1757550390, + "model": "Qwen/Qwen3-0.6B", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": "3.3.5-dev0-sha-1b90c50", + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "", + "choices": [ + { + "delta": { + "content": " between", + "function_call": null, + "refusal": null, + "role": "assistant", + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null + } + ], + "created": 1757550390, + "model": "Qwen/Qwen3-0.6B", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": "3.3.5-dev0-sha-1b90c50", + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "", + "choices": [ + { + "delta": { + "content": " \"", + "function_call": null, + "refusal": null, + "role": "assistant", + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null + } + ], + "created": 1757550390, + "model": "Qwen/Qwen3-0.6B", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": "3.3.5-dev0-sha-1b90c50", + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "", + "choices": [ + { + "delta": { + "content": "Sun", + "function_call": null, + "refusal": null, + "role": "assistant", + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null + } + ], + "created": 1757550390, + "model": "Qwen/Qwen3-0.6B", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": "3.3.5-dev0-sha-1b90c50", + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "", + "choices": [ + { + "delta": { + "content": "\"", + "function_call": null, + "refusal": null, + "role": "assistant", + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null + } + ], + "created": 1757550390, + "model": "Qwen/Qwen3-0.6B", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": "3.3.5-dev0-sha-1b90c50", + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "", + "choices": [ + { + "delta": { + "content": " and", + "function_call": null, + "refusal": null, + "role": "assistant", + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null + } + ], + "created": 1757550390, + "model": "Qwen/Qwen3-0.6B", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": "3.3.5-dev0-sha-1b90c50", + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "", + "choices": [ + { + "delta": { + "content": " \"", + "function_call": null, + "refusal": null, + "role": "assistant", + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null + } + ], + "created": 1757550390, + "model": "Qwen/Qwen3-0.6B", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": "3.3.5-dev0-sha-1b90c50", + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "", + "choices": [ + { + "delta": { + "content": "Sol", + "function_call": null, + "refusal": null, + "role": "assistant", + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null + } + ], + "created": 1757550390, + "model": "Qwen/Qwen3-0.6B", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": "3.3.5-dev0-sha-1b90c50", + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "", + "choices": [ + { + "delta": { + "content": "\"?", + "function_call": null, + "refusal": null, + "role": "assistant", + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null + } + ], + "created": 1757550390, + "model": "Qwen/Qwen3-0.6B", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": "3.3.5-dev0-sha-1b90c50", + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "", + "choices": [ + { + "delta": { + "content": " Yes", + "function_call": null, + "refusal": null, + "role": "assistant", + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null + } + ], + "created": 1757550390, + "model": "Qwen/Qwen3-0.6B", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": "3.3.5-dev0-sha-1b90c50", + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "", + "choices": [ + { + "delta": { + "content": ",", + "function_call": null, + "refusal": null, + "role": "assistant", + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null + } + ], + "created": 1757550390, + "model": "Qwen/Qwen3-0.6B", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": "3.3.5-dev0-sha-1b90c50", + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "", + "choices": [ + { + "delta": { + "content": " they", + "function_call": null, + "refusal": null, + "role": "assistant", + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null + } + ], + "created": 1757550390, + "model": "Qwen/Qwen3-0.6B", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": "3.3.5-dev0-sha-1b90c50", + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "", + "choices": [ + { + "delta": { + "content": " are", + "function_call": null, + "refusal": null, + "role": "assistant", + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null + } + ], + "created": 1757550390, + "model": "Qwen/Qwen3-0.6B", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": "3.3.5-dev0-sha-1b90c50", + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "", + "choices": [ + { + "delta": { + "content": " the", + "function_call": null, + "refusal": null, + "role": "assistant", + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null + } + ], + "created": 1757550390, + "model": "Qwen/Qwen3-0.6B", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": "3.3.5-dev0-sha-1b90c50", + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "", + "choices": [ + { + "delta": { + "content": " same", + "function_call": null, + "refusal": null, + "role": "assistant", + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null + } + ], + "created": 1757550390, + "model": "Qwen/Qwen3-0.6B", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": "3.3.5-dev0-sha-1b90c50", + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "", + "choices": [ + { + "delta": { + "content": ",", + "function_call": null, + "refusal": null, + "role": "assistant", + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null + } + ], + "created": 1757550390, + "model": "Qwen/Qwen3-0.6B", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": "3.3.5-dev0-sha-1b90c50", + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "", + "choices": [ + { + "delta": { + "content": " but", + "function_call": null, + "refusal": null, + "role": "assistant", + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null + } + ], + "created": 1757550390, + "model": "Qwen/Qwen3-0.6B", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": "3.3.5-dev0-sha-1b90c50", + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "", + "choices": [ + { + "delta": { + "content": " maybe", + "function_call": null, + "refusal": null, + "role": "assistant", + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null + } + ], + "created": 1757550390, + "model": "Qwen/Qwen3-0.6B", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": "3.3.5-dev0-sha-1b90c50", + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "", + "choices": [ + { + "delta": { + "content": " in", + "function_call": null, + "refusal": null, + "role": "assistant", + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null + } + ], + "created": 1757550390, + "model": "Qwen/Qwen3-0.6B", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": "3.3.5-dev0-sha-1b90c50", + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "", + "choices": [ + { + "delta": { + "content": " some", + "function_call": null, + "refusal": null, + "role": "assistant", + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null + } + ], + "created": 1757550390, + "model": "Qwen/Qwen3-0.6B", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": "3.3.5-dev0-sha-1b90c50", + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "", + "choices": [ + { + "delta": { + "content": " contexts", + "function_call": null, + "refusal": null, + "role": "assistant", + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null + } + ], + "created": 1757550390, + "model": "Qwen/Qwen3-0.6B", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": "3.3.5-dev0-sha-1b90c50", + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "", + "choices": [ + { + "delta": { + "content": ",", + "function_call": null, + "refusal": null, + "role": "assistant", + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null + } + ], + "created": 1757550390, + "model": "Qwen/Qwen3-0.6B", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": "3.3.5-dev0-sha-1b90c50", + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "", + "choices": [ + { + "delta": { + "content": " like", + "function_call": null, + "refusal": null, + "role": "assistant", + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null + } + ], + "created": 1757550390, + "model": "Qwen/Qwen3-0.6B", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": "3.3.5-dev0-sha-1b90c50", + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "", + "choices": [ + { + "delta": { + "content": " in", + "function_call": null, + "refusal": null, + "role": "assistant", + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null + } + ], + "created": 1757550390, + "model": "Qwen/Qwen3-0.6B", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": "3.3.5-dev0-sha-1b90c50", + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "", + "choices": [ + { + "delta": { + "content": " Greek", + "function_call": null, + "refusal": null, + "role": "assistant", + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null + } + ], + "created": 1757550390, + "model": "Qwen/Qwen3-0.6B", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": "3.3.5-dev0-sha-1b90c50", + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "", + "choices": [ + { + "delta": { + "content": " mythology", + "function_call": null, + "refusal": null, + "role": "assistant", + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null + } + ], + "created": 1757550390, + "model": "Qwen/Qwen3-0.6B", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": "3.3.5-dev0-sha-1b90c50", + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "", + "choices": [ + { + "delta": { + "content": ",", + "function_call": null, + "refusal": null, + "role": "assistant", + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null + } + ], + "created": 1757550390, + "model": "Qwen/Qwen3-0.6B", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": "3.3.5-dev0-sha-1b90c50", + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "", + "choices": [ + { + "delta": { + "content": " the", + "function_call": null, + "refusal": null, + "role": "assistant", + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null + } + ], + "created": 1757550390, + "model": "Qwen/Qwen3-0.6B", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": "3.3.5-dev0-sha-1b90c50", + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "", + "choices": [ + { + "delta": { + "content": " Sun", + "function_call": null, + "refusal": null, + "role": "assistant", + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null + } + ], + "created": 1757550390, + "model": "Qwen/Qwen3-0.6B", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": "3.3.5-dev0-sha-1b90c50", + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "", + "choices": [ + { + "delta": { + "content": " was", + "function_call": null, + "refusal": null, + "role": "assistant", + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null + } + ], + "created": 1757550390, + "model": "Qwen/Qwen3-0.6B", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": "3.3.5-dev0-sha-1b90c50", + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "", + "choices": [ + { + "delta": { + "content": " called", + "function_call": null, + "refusal": null, + "role": "assistant", + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null + } + ], + "created": 1757550390, + "model": "Qwen/Qwen3-0.6B", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": "3.3.5-dev0-sha-1b90c50", + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "", + "choices": [ + { + "delta": { + "content": " Sol", + "function_call": null, + "refusal": null, + "role": "assistant", + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null + } + ], + "created": 1757550390, + "model": "Qwen/Qwen3-0.6B", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": "3.3.5-dev0-sha-1b90c50", + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "", + "choices": [ + { + "delta": { + "content": ",", + "function_call": null, + "refusal": null, + "role": "assistant", + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null + } + ], + "created": 1757550390, + "model": "Qwen/Qwen3-0.6B", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": "3.3.5-dev0-sha-1b90c50", + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "", + "choices": [ + { + "delta": { + "content": " and", + "function_call": null, + "refusal": null, + "role": "assistant", + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null + } + ], + "created": 1757550390, + "model": "Qwen/Qwen3-0.6B", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": "3.3.5-dev0-sha-1b90c50", + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "", + "choices": [ + { + "delta": { + "content": " in", + "function_call": null, + "refusal": null, + "role": "assistant", + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null + } + ], + "created": 1757550390, + "model": "Qwen/Qwen3-0.6B", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": "3.3.5-dev0-sha-1b90c50", + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "", + "choices": [ + { + "delta": { + "content": " Latin", + "function_call": null, + "refusal": null, + "role": "assistant", + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null + } + ], + "created": 1757550390, + "model": "Qwen/Qwen3-0.6B", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": "3.3.5-dev0-sha-1b90c50", + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "", + "choices": [ + { + "delta": { + "content": ",", + "function_call": null, + "refusal": null, + "role": "assistant", + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null + } + ], + "created": 1757550390, + "model": "Qwen/Qwen3-0.6B", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": "3.3.5-dev0-sha-1b90c50", + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "", + "choices": [ + { + "delta": { + "content": " it", + "function_call": null, + "refusal": null, + "role": "assistant", + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null + } + ], + "created": 1757550390, + "model": "Qwen/Qwen3-0.6B", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": "3.3.5-dev0-sha-1b90c50", + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "", + "choices": [ + { + "delta": { + "content": "'s", + "function_call": null, + "refusal": null, + "role": "assistant", + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null + } + ], + "created": 1757550390, + "model": "Qwen/Qwen3-0.6B", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": "3.3.5-dev0-sha-1b90c50", + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "", + "choices": [ + { + "delta": { + "content": " also", + "function_call": null, + "refusal": null, + "role": "assistant", + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null + } + ], + "created": 1757550390, + "model": "Qwen/Qwen3-0.6B", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": "3.3.5-dev0-sha-1b90c50", + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "", + "choices": [ + { + "delta": { + "content": " referred", + "function_call": null, + "refusal": null, + "role": "assistant", + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null + } + ], + "created": 1757550390, + "model": "Qwen/Qwen3-0.6B", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": "3.3.5-dev0-sha-1b90c50", + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "", + "choices": [ + { + "delta": { + "content": " to", + "function_call": null, + "refusal": null, + "role": "assistant", + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null + } + ], + "created": 1757550390, + "model": "Qwen/Qwen3-0.6B", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": "3.3.5-dev0-sha-1b90c50", + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "", + "choices": [ + { + "delta": { + "content": " as", + "function_call": null, + "refusal": null, + "role": "assistant", + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null + } + ], + "created": 1757550390, + "model": "Qwen/Qwen3-0.6B", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": "3.3.5-dev0-sha-1b90c50", + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "", + "choices": [ + { + "delta": { + "content": " Sol", + "function_call": null, + "refusal": null, + "role": "assistant", + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null + } + ], + "created": 1757550390, + "model": "Qwen/Qwen3-0.6B", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": "3.3.5-dev0-sha-1b90c50", + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "", + "choices": [ + { + "delta": { + "content": ".", + "function_call": null, + "refusal": null, + "role": "assistant", + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null + } + ], + "created": 1757550390, + "model": "Qwen/Qwen3-0.6B", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": "3.3.5-dev0-sha-1b90c50", + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "", + "choices": [ + { + "delta": { + "content": " Alternatively", + "function_call": null, + "refusal": null, + "role": "assistant", + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null + } + ], + "created": 1757550390, + "model": "Qwen/Qwen3-0.6B", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": "3.3.5-dev0-sha-1b90c50", + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "", + "choices": [ + { + "delta": { + "content": ",", + "function_call": null, + "refusal": null, + "role": "assistant", + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null + } + ], + "created": 1757550390, + "model": "Qwen/Qwen3-0.6B", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": "3.3.5-dev0-sha-1b90c50", + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "", + "choices": [ + { + "delta": { + "content": " maybe", + "function_call": null, + "refusal": null, + "role": "assistant", + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null + } + ], + "created": 1757550390, + "model": "Qwen/Qwen3-0.6B", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": "3.3.5-dev0-sha-1b90c50", + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "", + "choices": [ + { + "delta": { + "content": " \"", + "function_call": null, + "refusal": null, + "role": "assistant", + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null + } + ], + "created": 1757550390, + "model": "Qwen/Qwen3-0.6B", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": "3.3.5-dev0-sha-1b90c50", + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "", + "choices": [ + { + "delta": { + "content": "Sol", + "function_call": null, + "refusal": null, + "role": "assistant", + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null + } + ], + "created": 1757550390, + "model": "Qwen/Qwen3-0.6B", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": "3.3.5-dev0-sha-1b90c50", + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "", + "choices": [ + { + "delta": { + "content": "\"", + "function_call": null, + "refusal": null, + "role": "assistant", + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null + } + ], + "created": 1757550390, + "model": "Qwen/Qwen3-0.6B", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": "3.3.5-dev0-sha-1b90c50", + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "", + "choices": [ + { + "delta": { + "content": " is", + "function_call": null, + "refusal": null, + "role": "assistant", + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null + } + ], + "created": 1757550390, + "model": "Qwen/Qwen3-0.6B", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": "3.3.5-dev0-sha-1b90c50", + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "", + "choices": [ + { + "delta": { + "content": " the", + "function_call": null, + "refusal": null, + "role": "assistant", + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null + } + ], + "created": 1757550390, + "model": "Qwen/Qwen3-0.6B", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": "3.3.5-dev0-sha-1b90c50", + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "", + "choices": [ + { + "delta": { + "content": " direct", + "function_call": null, + "refusal": null, + "role": "assistant", + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null + } + ], + "created": 1757550390, + "model": "Qwen/Qwen3-0.6B", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": "3.3.5-dev0-sha-1b90c50", + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "", + "choices": [ + { + "delta": { + "content": " translation", + "function_call": null, + "refusal": null, + "role": "assistant", + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null + } + ], + "created": 1757550390, + "model": "Qwen/Qwen3-0.6B", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": "3.3.5-dev0-sha-1b90c50", + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "", + "choices": [ + { + "delta": { + "content": " as", + "function_call": null, + "refusal": null, + "role": "assistant", + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null + } + ], + "created": 1757550390, + "model": "Qwen/Qwen3-0.6B", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": "3.3.5-dev0-sha-1b90c50", + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "", + "choices": [ + { + "delta": { + "content": " well", + "function_call": null, + "refusal": null, + "role": "assistant", + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null + } + ], + "created": 1757550390, + "model": "Qwen/Qwen3-0.6B", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": "3.3.5-dev0-sha-1b90c50", + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "", + "choices": [ + { + "delta": { + "content": ".", + "function_call": null, + "refusal": null, + "role": "assistant", + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null + } + ], + "created": 1757550390, + "model": "Qwen/Qwen3-0.6B", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": "3.3.5-dev0-sha-1b90c50", + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "", + "choices": [ + { + "delta": { + "content": " So", + "function_call": null, + "refusal": null, + "role": "assistant", + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null + } + ], + "created": 1757550390, + "model": "Qwen/Qwen3-0.6B", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": "3.3.5-dev0-sha-1b90c50", + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "", + "choices": [ + { + "delta": { + "content": " the", + "function_call": null, + "refusal": null, + "role": "assistant", + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null + } + ], + "created": 1757550390, + "model": "Qwen/Qwen3-0.6B", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": "3.3.5-dev0-sha-1b90c50", + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "", + "choices": [ + { + "delta": { + "content": " answer", + "function_call": null, + "refusal": null, + "role": "assistant", + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null + } + ], + "created": 1757550390, + "model": "Qwen/Qwen3-0.6B", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": "3.3.5-dev0-sha-1b90c50", + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "", + "choices": [ + { + "delta": { + "content": " should", + "function_call": null, + "refusal": null, + "role": "assistant", + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null + } + ], + "created": 1757550390, + "model": "Qwen/Qwen3-0.6B", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": "3.3.5-dev0-sha-1b90c50", + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "", + "choices": [ + { + "delta": { + "content": " be", + "function_call": null, + "refusal": null, + "role": "assistant", + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null + } + ], + "created": 1757550390, + "model": "Qwen/Qwen3-0.6B", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": "3.3.5-dev0-sha-1b90c50", + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "", + "choices": [ + { + "delta": { + "content": " \"", + "function_call": null, + "refusal": null, + "role": "assistant", + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null + } + ], + "created": 1757550390, + "model": "Qwen/Qwen3-0.6B", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": "3.3.5-dev0-sha-1b90c50", + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "", + "choices": [ + { + "delta": { + "content": "Sol", + "function_call": null, + "refusal": null, + "role": "assistant", + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null + } + ], + "created": 1757550390, + "model": "Qwen/Qwen3-0.6B", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": "3.3.5-dev0-sha-1b90c50", + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "", + "choices": [ + { + "delta": { + "content": ".\"\n", + "function_call": null, + "refusal": null, + "role": "assistant", + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null + } + ], + "created": 1757550390, + "model": "Qwen/Qwen3-0.6B", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": "3.3.5-dev0-sha-1b90c50", + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "", + "choices": [ + { + "delta": { + "content": "", + "function_call": null, + "refusal": null, + "role": "assistant", + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null + } + ], + "created": 1757550390, + "model": "Qwen/Qwen3-0.6B", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": "3.3.5-dev0-sha-1b90c50", + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "", + "choices": [ + { + "delta": { + "content": "\n\n", + "function_call": null, + "refusal": null, + "role": "assistant", + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null + } + ], + "created": 1757550390, + "model": "Qwen/Qwen3-0.6B", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": "3.3.5-dev0-sha-1b90c50", + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "", + "choices": [ + { + "delta": { + "content": "The", + "function_call": null, + "refusal": null, + "role": "assistant", + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null + } + ], + "created": 1757550390, + "model": "Qwen/Qwen3-0.6B", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": "3.3.5-dev0-sha-1b90c50", + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "", + "choices": [ + { + "delta": { + "content": " name", + "function_call": null, + "refusal": null, + "role": "assistant", + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null + } + ], + "created": 1757550390, + "model": "Qwen/Qwen3-0.6B", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": "3.3.5-dev0-sha-1b90c50", + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "", + "choices": [ + { + "delta": { + "content": " of", + "function_call": null, + "refusal": null, + "role": "assistant", + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null + } + ], + "created": 1757550390, + "model": "Qwen/Qwen3-0.6B", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": "3.3.5-dev0-sha-1b90c50", + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "", + "choices": [ + { + "delta": { + "content": " the", + "function_call": null, + "refusal": null, + "role": "assistant", + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null + } + ], + "created": 1757550390, + "model": "Qwen/Qwen3-0.6B", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": "3.3.5-dev0-sha-1b90c50", + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "", + "choices": [ + { + "delta": { + "content": " Sun", + "function_call": null, + "refusal": null, + "role": "assistant", + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null + } + ], + "created": 1757550390, + "model": "Qwen/Qwen3-0.6B", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": "3.3.5-dev0-sha-1b90c50", + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "", + "choices": [ + { + "delta": { + "content": " in", + "function_call": null, + "refusal": null, + "role": "assistant", + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null + } + ], + "created": 1757550390, + "model": "Qwen/Qwen3-0.6B", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": "3.3.5-dev0-sha-1b90c50", + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "", + "choices": [ + { + "delta": { + "content": " Latin", + "function_call": null, + "refusal": null, + "role": "assistant", + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null + } + ], + "created": 1757550390, + "model": "Qwen/Qwen3-0.6B", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": "3.3.5-dev0-sha-1b90c50", + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "", + "choices": [ + { + "delta": { + "content": " is", + "function_call": null, + "refusal": null, + "role": "assistant", + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null + } + ], + "created": 1757550390, + "model": "Qwen/Qwen3-0.6B", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": "3.3.5-dev0-sha-1b90c50", + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "", + "choices": [ + { + "delta": { + "content": " **", + "function_call": null, + "refusal": null, + "role": "assistant", + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null + } + ], + "created": 1757550390, + "model": "Qwen/Qwen3-0.6B", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": "3.3.5-dev0-sha-1b90c50", + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "", + "choices": [ + { + "delta": { + "content": "\"", + "function_call": null, + "refusal": null, + "role": "assistant", + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null + } + ], + "created": 1757550390, + "model": "Qwen/Qwen3-0.6B", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": "3.3.5-dev0-sha-1b90c50", + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "", + "choices": [ + { + "delta": { + "content": "Sol", + "function_call": null, + "refusal": null, + "role": "assistant", + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null + } + ], + "created": 1757550390, + "model": "Qwen/Qwen3-0.6B", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": "3.3.5-dev0-sha-1b90c50", + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "", + "choices": [ + { + "delta": { + "content": ".\"", + "function_call": null, + "refusal": null, + "role": "assistant", + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null + } + ], + "created": 1757550390, + "model": "Qwen/Qwen3-0.6B", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": "3.3.5-dev0-sha-1b90c50", + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "", + "choices": [ + { + "delta": { + "content": "**", + "function_call": null, + "refusal": null, + "role": "assistant", + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null + } + ], + "created": 1757550390, + "model": "Qwen/Qwen3-0.6B", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": "3.3.5-dev0-sha-1b90c50", + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "", + "choices": [ + { + "delta": { + "content": "", + "function_call": null, + "refusal": null, + "role": "assistant", + "tool_calls": null + }, + "finish_reason": "stop", + "index": 0, + "logprobs": null + } + ], + "created": 1757550390, + "model": "Qwen/Qwen3-0.6B", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": "3.3.5-dev0-sha-1b90c50", + "usage": null + } + } + ], + "is_streaming": true + } +} diff --git a/tests/integration/recordings/responses/a98eecadddc8.json b/tests/integration/recordings/responses/a98eecadddc8.json new file mode 100644 index 000000000..36a9d1514 --- /dev/null +++ b/tests/integration/recordings/responses/a98eecadddc8.json @@ -0,0 +1,366 @@ +{ + "request": { + "method": "POST", + "url": "http://localhost:8080/v1/v1/chat/completions", + "headers": {}, + "body": { + "model": "Qwen/Qwen3-0.6B", + "messages": [ + { + "role": "user", + "content": "What's the weather in Tokyo? Use the get_weather function to get the weather." + } + ], + "stream": true, + "tools": [ + { + "type": "function", + "function": { + "name": "get_weather", + "description": "Get the weather in a given city", + "parameters": { + "type": "object", + "properties": { + "city": { + "type": "string", + "description": "The city to get the weather for" + } + } + } + } + } + ] + }, + "endpoint": "/v1/chat/completions", + "model": "Qwen/Qwen3-0.6B" + }, + "response": { + "body": [ + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "", + "choices": [ + { + "delta": { + "content": null, + "function_call": null, + "refusal": null, + "role": "assistant", + "tool_calls": [ + { + "index": 0, + "id": "0", + "function": { + "arguments": "{", + "name": "get_weather" + }, + "type": "function" + } + ] + }, + "finish_reason": null, + "index": 0, + "logprobs": null + } + ], + "created": 1757550392, + "model": "Qwen/Qwen3-0.6B", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": "3.3.5-dev0-sha-1b90c50", + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "", + "choices": [ + { + "delta": { + "content": null, + "function_call": null, + "refusal": null, + "role": "assistant", + "tool_calls": [ + { + "index": 0, + "id": "0", + "function": { + "arguments": " \"", + "name": null + }, + "type": "function" + } + ] + }, + "finish_reason": null, + "index": 0, + "logprobs": null + } + ], + "created": 1757550392, + "model": "Qwen/Qwen3-0.6B", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": "3.3.5-dev0-sha-1b90c50", + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "", + "choices": [ + { + "delta": { + "content": null, + "function_call": null, + "refusal": null, + "role": "assistant", + "tool_calls": [ + { + "index": 0, + "id": "0", + "function": { + "arguments": "c", + "name": null + }, + "type": "function" + } + ] + }, + "finish_reason": null, + "index": 0, + "logprobs": null + } + ], + "created": 1757550392, + "model": "Qwen/Qwen3-0.6B", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": "3.3.5-dev0-sha-1b90c50", + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "", + "choices": [ + { + "delta": { + "content": null, + "function_call": null, + "refusal": null, + "role": "assistant", + "tool_calls": [ + { + "index": 0, + "id": "0", + "function": { + "arguments": "ity", + "name": null + }, + "type": "function" + } + ] + }, + "finish_reason": null, + "index": 0, + "logprobs": null + } + ], + "created": 1757550392, + "model": "Qwen/Qwen3-0.6B", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": "3.3.5-dev0-sha-1b90c50", + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "", + "choices": [ + { + "delta": { + "content": null, + "function_call": null, + "refusal": null, + "role": "assistant", + "tool_calls": [ + { + "index": 0, + "id": "0", + "function": { + "arguments": "\":", + "name": null + }, + "type": "function" + } + ] + }, + "finish_reason": null, + "index": 0, + "logprobs": null + } + ], + "created": 1757550392, + "model": "Qwen/Qwen3-0.6B", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": "3.3.5-dev0-sha-1b90c50", + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "", + "choices": [ + { + "delta": { + "content": null, + "function_call": null, + "refusal": null, + "role": "assistant", + "tool_calls": [ + { + "index": 0, + "id": "0", + "function": { + "arguments": " \"", + "name": null + }, + "type": "function" + } + ] + }, + "finish_reason": null, + "index": 0, + "logprobs": null + } + ], + "created": 1757550392, + "model": "Qwen/Qwen3-0.6B", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": "3.3.5-dev0-sha-1b90c50", + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "", + "choices": [ + { + "delta": { + "content": null, + "function_call": null, + "refusal": null, + "role": "assistant", + "tool_calls": [ + { + "index": 0, + "id": "0", + "function": { + "arguments": "Tok", + "name": null + }, + "type": "function" + } + ] + }, + "finish_reason": null, + "index": 0, + "logprobs": null + } + ], + "created": 1757550392, + "model": "Qwen/Qwen3-0.6B", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": "3.3.5-dev0-sha-1b90c50", + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "", + "choices": [ + { + "delta": { + "content": null, + "function_call": null, + "refusal": null, + "role": "assistant", + "tool_calls": [ + { + "index": 0, + "id": "0", + "function": { + "arguments": "yo", + "name": null + }, + "type": "function" + } + ] + }, + "finish_reason": null, + "index": 0, + "logprobs": null + } + ], + "created": 1757550392, + "model": "Qwen/Qwen3-0.6B", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": "3.3.5-dev0-sha-1b90c50", + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "", + "choices": [ + { + "delta": { + "content": null, + "function_call": null, + "refusal": null, + "role": "assistant", + "tool_calls": [ + { + "index": 0, + "id": "0", + "function": { + "arguments": "\"}", + "name": null + }, + "type": "function" + } + ] + }, + "finish_reason": null, + "index": 0, + "logprobs": null + } + ], + "created": 1757550392, + "model": "Qwen/Qwen3-0.6B", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": "3.3.5-dev0-sha-1b90c50", + "usage": null + } + } + ], + "is_streaming": true + } +} diff --git a/tests/integration/recordings/responses/aacf9abc51d4.json b/tests/integration/recordings/responses/aacf9abc51d4.json new file mode 100644 index 000000000..943fb9c38 --- /dev/null +++ b/tests/integration/recordings/responses/aacf9abc51d4.json @@ -0,0 +1,2624 @@ +{ + "request": { + "method": "POST", + "url": "http://localhost:8080/v1/v1/chat/completions", + "headers": {}, + "body": { + "model": "Qwen/Qwen3-0.6B", + "messages": [ + { + "role": "user", + "content": "What is the name of the US captial?" + } + ], + "stream": true + }, + "endpoint": "/v1/chat/completions", + "model": "Qwen/Qwen3-0.6B" + }, + "response": { + "body": [ + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "", + "choices": [ + { + "delta": { + "content": "", + "function_call": null, + "refusal": null, + "role": "assistant", + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null + } + ], + "created": 1757550394, + "model": "Qwen/Qwen3-0.6B", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": "3.3.5-dev0-sha-1b90c50", + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "", + "choices": [ + { + "delta": { + "content": "\n", + "function_call": null, + "refusal": null, + "role": "assistant", + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null + } + ], + "created": 1757550394, + "model": "Qwen/Qwen3-0.6B", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": "3.3.5-dev0-sha-1b90c50", + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "", + "choices": [ + { + "delta": { + "content": "Okay", + "function_call": null, + "refusal": null, + "role": "assistant", + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null + } + ], + "created": 1757550394, + "model": "Qwen/Qwen3-0.6B", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": "3.3.5-dev0-sha-1b90c50", + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "", + "choices": [ + { + "delta": { + "content": ",", + "function_call": null, + "refusal": null, + "role": "assistant", + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null + } + ], + "created": 1757550394, + "model": "Qwen/Qwen3-0.6B", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": "3.3.5-dev0-sha-1b90c50", + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "", + "choices": [ + { + "delta": { + "content": " the", + "function_call": null, + "refusal": null, + "role": "assistant", + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null + } + ], + "created": 1757550394, + "model": "Qwen/Qwen3-0.6B", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": "3.3.5-dev0-sha-1b90c50", + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "", + "choices": [ + { + "delta": { + "content": " user", + "function_call": null, + "refusal": null, + "role": "assistant", + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null + } + ], + "created": 1757550394, + "model": "Qwen/Qwen3-0.6B", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": "3.3.5-dev0-sha-1b90c50", + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "", + "choices": [ + { + "delta": { + "content": " is", + "function_call": null, + "refusal": null, + "role": "assistant", + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null + } + ], + "created": 1757550394, + "model": "Qwen/Qwen3-0.6B", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": "3.3.5-dev0-sha-1b90c50", + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "", + "choices": [ + { + "delta": { + "content": " asking", + "function_call": null, + "refusal": null, + "role": "assistant", + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null + } + ], + "created": 1757550394, + "model": "Qwen/Qwen3-0.6B", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": "3.3.5-dev0-sha-1b90c50", + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "", + "choices": [ + { + "delta": { + "content": " for", + "function_call": null, + "refusal": null, + "role": "assistant", + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null + } + ], + "created": 1757550394, + "model": "Qwen/Qwen3-0.6B", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": "3.3.5-dev0-sha-1b90c50", + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "", + "choices": [ + { + "delta": { + "content": " the", + "function_call": null, + "refusal": null, + "role": "assistant", + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null + } + ], + "created": 1757550394, + "model": "Qwen/Qwen3-0.6B", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": "3.3.5-dev0-sha-1b90c50", + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "", + "choices": [ + { + "delta": { + "content": " name", + "function_call": null, + "refusal": null, + "role": "assistant", + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null + } + ], + "created": 1757550394, + "model": "Qwen/Qwen3-0.6B", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": "3.3.5-dev0-sha-1b90c50", + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "", + "choices": [ + { + "delta": { + "content": " of", + "function_call": null, + "refusal": null, + "role": "assistant", + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null + } + ], + "created": 1757550394, + "model": "Qwen/Qwen3-0.6B", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": "3.3.5-dev0-sha-1b90c50", + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "", + "choices": [ + { + "delta": { + "content": " the", + "function_call": null, + "refusal": null, + "role": "assistant", + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null + } + ], + "created": 1757550394, + "model": "Qwen/Qwen3-0.6B", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": "3.3.5-dev0-sha-1b90c50", + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "", + "choices": [ + { + "delta": { + "content": " US", + "function_call": null, + "refusal": null, + "role": "assistant", + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null + } + ], + "created": 1757550394, + "model": "Qwen/Qwen3-0.6B", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": "3.3.5-dev0-sha-1b90c50", + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "", + "choices": [ + { + "delta": { + "content": " capital", + "function_call": null, + "refusal": null, + "role": "assistant", + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null + } + ], + "created": 1757550394, + "model": "Qwen/Qwen3-0.6B", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": "3.3.5-dev0-sha-1b90c50", + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "", + "choices": [ + { + "delta": { + "content": ".", + "function_call": null, + "refusal": null, + "role": "assistant", + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null + } + ], + "created": 1757550394, + "model": "Qwen/Qwen3-0.6B", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": "3.3.5-dev0-sha-1b90c50", + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "", + "choices": [ + { + "delta": { + "content": " I", + "function_call": null, + "refusal": null, + "role": "assistant", + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null + } + ], + "created": 1757550394, + "model": "Qwen/Qwen3-0.6B", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": "3.3.5-dev0-sha-1b90c50", + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "", + "choices": [ + { + "delta": { + "content": " know", + "function_call": null, + "refusal": null, + "role": "assistant", + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null + } + ], + "created": 1757550394, + "model": "Qwen/Qwen3-0.6B", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": "3.3.5-dev0-sha-1b90c50", + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "", + "choices": [ + { + "delta": { + "content": " that", + "function_call": null, + "refusal": null, + "role": "assistant", + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null + } + ], + "created": 1757550394, + "model": "Qwen/Qwen3-0.6B", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": "3.3.5-dev0-sha-1b90c50", + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "", + "choices": [ + { + "delta": { + "content": " the", + "function_call": null, + "refusal": null, + "role": "assistant", + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null + } + ], + "created": 1757550394, + "model": "Qwen/Qwen3-0.6B", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": "3.3.5-dev0-sha-1b90c50", + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "", + "choices": [ + { + "delta": { + "content": " United", + "function_call": null, + "refusal": null, + "role": "assistant", + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null + } + ], + "created": 1757550394, + "model": "Qwen/Qwen3-0.6B", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": "3.3.5-dev0-sha-1b90c50", + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "", + "choices": [ + { + "delta": { + "content": " States", + "function_call": null, + "refusal": null, + "role": "assistant", + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null + } + ], + "created": 1757550394, + "model": "Qwen/Qwen3-0.6B", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": "3.3.5-dev0-sha-1b90c50", + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "", + "choices": [ + { + "delta": { + "content": " is", + "function_call": null, + "refusal": null, + "role": "assistant", + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null + } + ], + "created": 1757550394, + "model": "Qwen/Qwen3-0.6B", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": "3.3.5-dev0-sha-1b90c50", + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "", + "choices": [ + { + "delta": { + "content": " a", + "function_call": null, + "refusal": null, + "role": "assistant", + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null + } + ], + "created": 1757550394, + "model": "Qwen/Qwen3-0.6B", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": "3.3.5-dev0-sha-1b90c50", + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "", + "choices": [ + { + "delta": { + "content": " democratic", + "function_call": null, + "refusal": null, + "role": "assistant", + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null + } + ], + "created": 1757550394, + "model": "Qwen/Qwen3-0.6B", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": "3.3.5-dev0-sha-1b90c50", + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "", + "choices": [ + { + "delta": { + "content": " republic", + "function_call": null, + "refusal": null, + "role": "assistant", + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null + } + ], + "created": 1757550394, + "model": "Qwen/Qwen3-0.6B", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": "3.3.5-dev0-sha-1b90c50", + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "", + "choices": [ + { + "delta": { + "content": ",", + "function_call": null, + "refusal": null, + "role": "assistant", + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null + } + ], + "created": 1757550394, + "model": "Qwen/Qwen3-0.6B", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": "3.3.5-dev0-sha-1b90c50", + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "", + "choices": [ + { + "delta": { + "content": " and", + "function_call": null, + "refusal": null, + "role": "assistant", + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null + } + ], + "created": 1757550394, + "model": "Qwen/Qwen3-0.6B", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": "3.3.5-dev0-sha-1b90c50", + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "", + "choices": [ + { + "delta": { + "content": " the", + "function_call": null, + "refusal": null, + "role": "assistant", + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null + } + ], + "created": 1757550394, + "model": "Qwen/Qwen3-0.6B", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": "3.3.5-dev0-sha-1b90c50", + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "", + "choices": [ + { + "delta": { + "content": " capital", + "function_call": null, + "refusal": null, + "role": "assistant", + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null + } + ], + "created": 1757550394, + "model": "Qwen/Qwen3-0.6B", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": "3.3.5-dev0-sha-1b90c50", + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "", + "choices": [ + { + "delta": { + "content": " is", + "function_call": null, + "refusal": null, + "role": "assistant", + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null + } + ], + "created": 1757550394, + "model": "Qwen/Qwen3-0.6B", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": "3.3.5-dev0-sha-1b90c50", + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "", + "choices": [ + { + "delta": { + "content": " Washington", + "function_call": null, + "refusal": null, + "role": "assistant", + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null + } + ], + "created": 1757550394, + "model": "Qwen/Qwen3-0.6B", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": "3.3.5-dev0-sha-1b90c50", + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "", + "choices": [ + { + "delta": { + "content": ",", + "function_call": null, + "refusal": null, + "role": "assistant", + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null + } + ], + "created": 1757550394, + "model": "Qwen/Qwen3-0.6B", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": "3.3.5-dev0-sha-1b90c50", + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "", + "choices": [ + { + "delta": { + "content": " D", + "function_call": null, + "refusal": null, + "role": "assistant", + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null + } + ], + "created": 1757550394, + "model": "Qwen/Qwen3-0.6B", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": "3.3.5-dev0-sha-1b90c50", + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "", + "choices": [ + { + "delta": { + "content": ".C", + "function_call": null, + "refusal": null, + "role": "assistant", + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null + } + ], + "created": 1757550394, + "model": "Qwen/Qwen3-0.6B", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": "3.3.5-dev0-sha-1b90c50", + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "", + "choices": [ + { + "delta": { + "content": ".", + "function_call": null, + "refusal": null, + "role": "assistant", + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null + } + ], + "created": 1757550394, + "model": "Qwen/Qwen3-0.6B", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": "3.3.5-dev0-sha-1b90c50", + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "", + "choices": [ + { + "delta": { + "content": " I", + "function_call": null, + "refusal": null, + "role": "assistant", + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null + } + ], + "created": 1757550394, + "model": "Qwen/Qwen3-0.6B", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": "3.3.5-dev0-sha-1b90c50", + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "", + "choices": [ + { + "delta": { + "content": " need", + "function_call": null, + "refusal": null, + "role": "assistant", + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null + } + ], + "created": 1757550394, + "model": "Qwen/Qwen3-0.6B", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": "3.3.5-dev0-sha-1b90c50", + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "", + "choices": [ + { + "delta": { + "content": " to", + "function_call": null, + "refusal": null, + "role": "assistant", + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null + } + ], + "created": 1757550394, + "model": "Qwen/Qwen3-0.6B", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": "3.3.5-dev0-sha-1b90c50", + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "", + "choices": [ + { + "delta": { + "content": " make", + "function_call": null, + "refusal": null, + "role": "assistant", + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null + } + ], + "created": 1757550394, + "model": "Qwen/Qwen3-0.6B", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": "3.3.5-dev0-sha-1b90c50", + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "", + "choices": [ + { + "delta": { + "content": " sure", + "function_call": null, + "refusal": null, + "role": "assistant", + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null + } + ], + "created": 1757550394, + "model": "Qwen/Qwen3-0.6B", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": "3.3.5-dev0-sha-1b90c50", + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "", + "choices": [ + { + "delta": { + "content": " that", + "function_call": null, + "refusal": null, + "role": "assistant", + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null + } + ], + "created": 1757550394, + "model": "Qwen/Qwen3-0.6B", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": "3.3.5-dev0-sha-1b90c50", + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "", + "choices": [ + { + "delta": { + "content": "'s", + "function_call": null, + "refusal": null, + "role": "assistant", + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null + } + ], + "created": 1757550394, + "model": "Qwen/Qwen3-0.6B", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": "3.3.5-dev0-sha-1b90c50", + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "", + "choices": [ + { + "delta": { + "content": " correct", + "function_call": null, + "refusal": null, + "role": "assistant", + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null + } + ], + "created": 1757550394, + "model": "Qwen/Qwen3-0.6B", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": "3.3.5-dev0-sha-1b90c50", + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "", + "choices": [ + { + "delta": { + "content": " without", + "function_call": null, + "refusal": null, + "role": "assistant", + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null + } + ], + "created": 1757550394, + "model": "Qwen/Qwen3-0.6B", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": "3.3.5-dev0-sha-1b90c50", + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "", + "choices": [ + { + "delta": { + "content": " mentioning", + "function_call": null, + "refusal": null, + "role": "assistant", + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null + } + ], + "created": 1757550394, + "model": "Qwen/Qwen3-0.6B", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": "3.3.5-dev0-sha-1b90c50", + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "", + "choices": [ + { + "delta": { + "content": " any", + "function_call": null, + "refusal": null, + "role": "assistant", + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null + } + ], + "created": 1757550394, + "model": "Qwen/Qwen3-0.6B", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": "3.3.5-dev0-sha-1b90c50", + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "", + "choices": [ + { + "delta": { + "content": " other", + "function_call": null, + "refusal": null, + "role": "assistant", + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null + } + ], + "created": 1757550394, + "model": "Qwen/Qwen3-0.6B", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": "3.3.5-dev0-sha-1b90c50", + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "", + "choices": [ + { + "delta": { + "content": " places", + "function_call": null, + "refusal": null, + "role": "assistant", + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null + } + ], + "created": 1757550394, + "model": "Qwen/Qwen3-0.6B", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": "3.3.5-dev0-sha-1b90c50", + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "", + "choices": [ + { + "delta": { + "content": ".", + "function_call": null, + "refusal": null, + "role": "assistant", + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null + } + ], + "created": 1757550394, + "model": "Qwen/Qwen3-0.6B", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": "3.3.5-dev0-sha-1b90c50", + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "", + "choices": [ + { + "delta": { + "content": " I", + "function_call": null, + "refusal": null, + "role": "assistant", + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null + } + ], + "created": 1757550394, + "model": "Qwen/Qwen3-0.6B", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": "3.3.5-dev0-sha-1b90c50", + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "", + "choices": [ + { + "delta": { + "content": " should", + "function_call": null, + "refusal": null, + "role": "assistant", + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null + } + ], + "created": 1757550394, + "model": "Qwen/Qwen3-0.6B", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": "3.3.5-dev0-sha-1b90c50", + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "", + "choices": [ + { + "delta": { + "content": " check", + "function_call": null, + "refusal": null, + "role": "assistant", + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null + } + ], + "created": 1757550394, + "model": "Qwen/Qwen3-0.6B", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": "3.3.5-dev0-sha-1b90c50", + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "", + "choices": [ + { + "delta": { + "content": " if", + "function_call": null, + "refusal": null, + "role": "assistant", + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null + } + ], + "created": 1757550394, + "model": "Qwen/Qwen3-0.6B", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": "3.3.5-dev0-sha-1b90c50", + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "", + "choices": [ + { + "delta": { + "content": " there", + "function_call": null, + "refusal": null, + "role": "assistant", + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null + } + ], + "created": 1757550394, + "model": "Qwen/Qwen3-0.6B", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": "3.3.5-dev0-sha-1b90c50", + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "", + "choices": [ + { + "delta": { + "content": "'s", + "function_call": null, + "refusal": null, + "role": "assistant", + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null + } + ], + "created": 1757550394, + "model": "Qwen/Qwen3-0.6B", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": "3.3.5-dev0-sha-1b90c50", + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "", + "choices": [ + { + "delta": { + "content": " any", + "function_call": null, + "refusal": null, + "role": "assistant", + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null + } + ], + "created": 1757550394, + "model": "Qwen/Qwen3-0.6B", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": "3.3.5-dev0-sha-1b90c50", + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "", + "choices": [ + { + "delta": { + "content": " confusion", + "function_call": null, + "refusal": null, + "role": "assistant", + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null + } + ], + "created": 1757550394, + "model": "Qwen/Qwen3-0.6B", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": "3.3.5-dev0-sha-1b90c50", + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "", + "choices": [ + { + "delta": { + "content": " with", + "function_call": null, + "refusal": null, + "role": "assistant", + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null + } + ], + "created": 1757550394, + "model": "Qwen/Qwen3-0.6B", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": "3.3.5-dev0-sha-1b90c50", + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "", + "choices": [ + { + "delta": { + "content": " another", + "function_call": null, + "refusal": null, + "role": "assistant", + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null + } + ], + "created": 1757550394, + "model": "Qwen/Qwen3-0.6B", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": "3.3.5-dev0-sha-1b90c50", + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "", + "choices": [ + { + "delta": { + "content": " country", + "function_call": null, + "refusal": null, + "role": "assistant", + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null + } + ], + "created": 1757550394, + "model": "Qwen/Qwen3-0.6B", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": "3.3.5-dev0-sha-1b90c50", + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "", + "choices": [ + { + "delta": { + "content": "'s", + "function_call": null, + "refusal": null, + "role": "assistant", + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null + } + ], + "created": 1757550394, + "model": "Qwen/Qwen3-0.6B", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": "3.3.5-dev0-sha-1b90c50", + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "", + "choices": [ + { + "delta": { + "content": " capital", + "function_call": null, + "refusal": null, + "role": "assistant", + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null + } + ], + "created": 1757550394, + "model": "Qwen/Qwen3-0.6B", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": "3.3.5-dev0-sha-1b90c50", + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "", + "choices": [ + { + "delta": { + "content": ",", + "function_call": null, + "refusal": null, + "role": "assistant", + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null + } + ], + "created": 1757550394, + "model": "Qwen/Qwen3-0.6B", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": "3.3.5-dev0-sha-1b90c50", + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "", + "choices": [ + { + "delta": { + "content": " but", + "function_call": null, + "refusal": null, + "role": "assistant", + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null + } + ], + "created": 1757550394, + "model": "Qwen/Qwen3-0.6B", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": "3.3.5-dev0-sha-1b90c50", + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "", + "choices": [ + { + "delta": { + "content": " I", + "function_call": null, + "refusal": null, + "role": "assistant", + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null + } + ], + "created": 1757550394, + "model": "Qwen/Qwen3-0.6B", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": "3.3.5-dev0-sha-1b90c50", + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "", + "choices": [ + { + "delta": { + "content": " don", + "function_call": null, + "refusal": null, + "role": "assistant", + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null + } + ], + "created": 1757550394, + "model": "Qwen/Qwen3-0.6B", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": "3.3.5-dev0-sha-1b90c50", + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "", + "choices": [ + { + "delta": { + "content": "'t", + "function_call": null, + "refusal": null, + "role": "assistant", + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null + } + ], + "created": 1757550394, + "model": "Qwen/Qwen3-0.6B", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": "3.3.5-dev0-sha-1b90c50", + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "", + "choices": [ + { + "delta": { + "content": " think", + "function_call": null, + "refusal": null, + "role": "assistant", + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null + } + ], + "created": 1757550394, + "model": "Qwen/Qwen3-0.6B", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": "3.3.5-dev0-sha-1b90c50", + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "", + "choices": [ + { + "delta": { + "content": " so", + "function_call": null, + "refusal": null, + "role": "assistant", + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null + } + ], + "created": 1757550394, + "model": "Qwen/Qwen3-0.6B", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": "3.3.5-dev0-sha-1b90c50", + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "", + "choices": [ + { + "delta": { + "content": ".", + "function_call": null, + "refusal": null, + "role": "assistant", + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null + } + ], + "created": 1757550394, + "model": "Qwen/Qwen3-0.6B", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": "3.3.5-dev0-sha-1b90c50", + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "", + "choices": [ + { + "delta": { + "content": " The", + "function_call": null, + "refusal": null, + "role": "assistant", + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null + } + ], + "created": 1757550394, + "model": "Qwen/Qwen3-0.6B", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": "3.3.5-dev0-sha-1b90c50", + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "", + "choices": [ + { + "delta": { + "content": " answer", + "function_call": null, + "refusal": null, + "role": "assistant", + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null + } + ], + "created": 1757550394, + "model": "Qwen/Qwen3-0.6B", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": "3.3.5-dev0-sha-1b90c50", + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "", + "choices": [ + { + "delta": { + "content": " should", + "function_call": null, + "refusal": null, + "role": "assistant", + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null + } + ], + "created": 1757550394, + "model": "Qwen/Qwen3-0.6B", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": "3.3.5-dev0-sha-1b90c50", + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "", + "choices": [ + { + "delta": { + "content": " be", + "function_call": null, + "refusal": null, + "role": "assistant", + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null + } + ], + "created": 1757550394, + "model": "Qwen/Qwen3-0.6B", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": "3.3.5-dev0-sha-1b90c50", + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "", + "choices": [ + { + "delta": { + "content": " straightforward", + "function_call": null, + "refusal": null, + "role": "assistant", + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null + } + ], + "created": 1757550394, + "model": "Qwen/Qwen3-0.6B", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": "3.3.5-dev0-sha-1b90c50", + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "", + "choices": [ + { + "delta": { + "content": ".\n", + "function_call": null, + "refusal": null, + "role": "assistant", + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null + } + ], + "created": 1757550394, + "model": "Qwen/Qwen3-0.6B", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": "3.3.5-dev0-sha-1b90c50", + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "", + "choices": [ + { + "delta": { + "content": "", + "function_call": null, + "refusal": null, + "role": "assistant", + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null + } + ], + "created": 1757550394, + "model": "Qwen/Qwen3-0.6B", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": "3.3.5-dev0-sha-1b90c50", + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "", + "choices": [ + { + "delta": { + "content": "\n\n", + "function_call": null, + "refusal": null, + "role": "assistant", + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null + } + ], + "created": 1757550394, + "model": "Qwen/Qwen3-0.6B", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": "3.3.5-dev0-sha-1b90c50", + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "", + "choices": [ + { + "delta": { + "content": "The", + "function_call": null, + "refusal": null, + "role": "assistant", + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null + } + ], + "created": 1757550394, + "model": "Qwen/Qwen3-0.6B", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": "3.3.5-dev0-sha-1b90c50", + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "", + "choices": [ + { + "delta": { + "content": " capital", + "function_call": null, + "refusal": null, + "role": "assistant", + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null + } + ], + "created": 1757550394, + "model": "Qwen/Qwen3-0.6B", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": "3.3.5-dev0-sha-1b90c50", + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "", + "choices": [ + { + "delta": { + "content": " of", + "function_call": null, + "refusal": null, + "role": "assistant", + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null + } + ], + "created": 1757550394, + "model": "Qwen/Qwen3-0.6B", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": "3.3.5-dev0-sha-1b90c50", + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "", + "choices": [ + { + "delta": { + "content": " the", + "function_call": null, + "refusal": null, + "role": "assistant", + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null + } + ], + "created": 1757550394, + "model": "Qwen/Qwen3-0.6B", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": "3.3.5-dev0-sha-1b90c50", + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "", + "choices": [ + { + "delta": { + "content": " United", + "function_call": null, + "refusal": null, + "role": "assistant", + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null + } + ], + "created": 1757550394, + "model": "Qwen/Qwen3-0.6B", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": "3.3.5-dev0-sha-1b90c50", + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "", + "choices": [ + { + "delta": { + "content": " States", + "function_call": null, + "refusal": null, + "role": "assistant", + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null + } + ], + "created": 1757550394, + "model": "Qwen/Qwen3-0.6B", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": "3.3.5-dev0-sha-1b90c50", + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "", + "choices": [ + { + "delta": { + "content": " is", + "function_call": null, + "refusal": null, + "role": "assistant", + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null + } + ], + "created": 1757550394, + "model": "Qwen/Qwen3-0.6B", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": "3.3.5-dev0-sha-1b90c50", + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "", + "choices": [ + { + "delta": { + "content": " **", + "function_call": null, + "refusal": null, + "role": "assistant", + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null + } + ], + "created": 1757550394, + "model": "Qwen/Qwen3-0.6B", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": "3.3.5-dev0-sha-1b90c50", + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "", + "choices": [ + { + "delta": { + "content": "Washington", + "function_call": null, + "refusal": null, + "role": "assistant", + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null + } + ], + "created": 1757550394, + "model": "Qwen/Qwen3-0.6B", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": "3.3.5-dev0-sha-1b90c50", + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "", + "choices": [ + { + "delta": { + "content": ",", + "function_call": null, + "refusal": null, + "role": "assistant", + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null + } + ], + "created": 1757550394, + "model": "Qwen/Qwen3-0.6B", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": "3.3.5-dev0-sha-1b90c50", + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "", + "choices": [ + { + "delta": { + "content": " D", + "function_call": null, + "refusal": null, + "role": "assistant", + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null + } + ], + "created": 1757550394, + "model": "Qwen/Qwen3-0.6B", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": "3.3.5-dev0-sha-1b90c50", + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "", + "choices": [ + { + "delta": { + "content": ".C", + "function_call": null, + "refusal": null, + "role": "assistant", + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null + } + ], + "created": 1757550394, + "model": "Qwen/Qwen3-0.6B", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": "3.3.5-dev0-sha-1b90c50", + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "", + "choices": [ + { + "delta": { + "content": ".", + "function_call": null, + "refusal": null, + "role": "assistant", + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null + } + ], + "created": 1757550394, + "model": "Qwen/Qwen3-0.6B", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": "3.3.5-dev0-sha-1b90c50", + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "", + "choices": [ + { + "delta": { + "content": "**", + "function_call": null, + "refusal": null, + "role": "assistant", + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null + } + ], + "created": 1757550394, + "model": "Qwen/Qwen3-0.6B", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": "3.3.5-dev0-sha-1b90c50", + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "", + "choices": [ + { + "delta": { + "content": " (", + "function_call": null, + "refusal": null, + "role": "assistant", + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null + } + ], + "created": 1757550394, + "model": "Qwen/Qwen3-0.6B", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": "3.3.5-dev0-sha-1b90c50", + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "", + "choices": [ + { + "delta": { + "content": "Washington", + "function_call": null, + "refusal": null, + "role": "assistant", + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null + } + ], + "created": 1757550395, + "model": "Qwen/Qwen3-0.6B", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": "3.3.5-dev0-sha-1b90c50", + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "", + "choices": [ + { + "delta": { + "content": ",", + "function_call": null, + "refusal": null, + "role": "assistant", + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null + } + ], + "created": 1757550395, + "model": "Qwen/Qwen3-0.6B", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": "3.3.5-dev0-sha-1b90c50", + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "", + "choices": [ + { + "delta": { + "content": " D", + "function_call": null, + "refusal": null, + "role": "assistant", + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null + } + ], + "created": 1757550395, + "model": "Qwen/Qwen3-0.6B", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": "3.3.5-dev0-sha-1b90c50", + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "", + "choices": [ + { + "delta": { + "content": ".C", + "function_call": null, + "refusal": null, + "role": "assistant", + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null + } + ], + "created": 1757550395, + "model": "Qwen/Qwen3-0.6B", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": "3.3.5-dev0-sha-1b90c50", + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "", + "choices": [ + { + "delta": { + "content": ".).", + "function_call": null, + "refusal": null, + "role": "assistant", + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null + } + ], + "created": 1757550395, + "model": "Qwen/Qwen3-0.6B", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": "3.3.5-dev0-sha-1b90c50", + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "", + "choices": [ + { + "delta": { + "content": "", + "function_call": null, + "refusal": null, + "role": "assistant", + "tool_calls": null + }, + "finish_reason": "stop", + "index": 0, + "logprobs": null + } + ], + "created": 1757550395, + "model": "Qwen/Qwen3-0.6B", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": "3.3.5-dev0-sha-1b90c50", + "usage": null + } + } + ], + "is_streaming": true + } +} diff --git a/tests/integration/recordings/responses/b9f6e724ae06.json b/tests/integration/recordings/responses/b9f6e724ae06.json new file mode 100644 index 000000000..d8bf61625 --- /dev/null +++ b/tests/integration/recordings/responses/b9f6e724ae06.json @@ -0,0 +1,976 @@ +{ + "request": { + "method": "POST", + "url": "http://localhost:8080/v1/v1/completions", + "headers": {}, + "body": { + "model": "Qwen/Qwen3-0.6B", + "prompt": "Respond to this question and explain your answer. Complete the sentence using one word: Roses are red, violets are ", + "max_tokens": 50, + "stream": true + }, + "endpoint": "/v1/completions", + "model": "Qwen/Qwen3-0.6B" + }, + "response": { + "body": [ + { + "__type__": "openai.types.completion.Completion", + "__data__": { + "id": "", + "choices": [ + { + "finish_reason": "", + "index": 0, + "logprobs": null, + "text": " several" + } + ], + "created": 1757550367, + "model": "Qwen/Qwen3-0.6B", + "object": "text_completion", + "system_fingerprint": "3.3.5-dev0-sha-1b90c50", + "usage": null + } + }, + { + "__type__": "openai.types.completion.Completion", + "__data__": { + "id": "", + "choices": [ + { + "finish_reason": "", + "index": 0, + "logprobs": null, + "text": " several" + } + ], + "created": 1757550367, + "model": "Qwen/Qwen3-0.6B", + "object": "text_completion", + "system_fingerprint": "3.3.5-dev0-sha-1b90c50", + "usage": null + } + }, + { + "__type__": "openai.types.completion.Completion", + "__data__": { + "id": "", + "choices": [ + { + "finish_reason": "", + "index": 0, + "logprobs": null, + "text": " times" + } + ], + "created": 1757550367, + "model": "Qwen/Qwen3-0.6B", + "object": "text_completion", + "system_fingerprint": "3.3.5-dev0-sha-1b90c50", + "usage": null + } + }, + { + "__type__": "openai.types.completion.Completion", + "__data__": { + "id": "", + "choices": [ + { + "finish_reason": "", + "index": 0, + "logprobs": null, + "text": " more" + } + ], + "created": 1757550367, + "model": "Qwen/Qwen3-0.6B", + "object": "text_completion", + "system_fingerprint": "3.3.5-dev0-sha-1b90c50", + "usage": null + } + }, + { + "__type__": "openai.types.completion.Completion", + "__data__": { + "id": "", + "choices": [ + { + "finish_reason": "", + "index": 0, + "logprobs": null, + "text": " popular" + } + ], + "created": 1757550367, + "model": "Qwen/Qwen3-0.6B", + "object": "text_completion", + "system_fingerprint": "3.3.5-dev0-sha-1b90c50", + "usage": null + } + }, + { + "__type__": "openai.types.completion.Completion", + "__data__": { + "id": "", + "choices": [ + { + "finish_reason": "", + "index": 0, + "logprobs": null, + "text": " than" + } + ], + "created": 1757550367, + "model": "Qwen/Qwen3-0.6B", + "object": "text_completion", + "system_fingerprint": "3.3.5-dev0-sha-1b90c50", + "usage": null + } + }, + { + "__type__": "openai.types.completion.Completion", + "__data__": { + "id": "", + "choices": [ + { + "finish_reason": "", + "index": 0, + "logprobs": null, + "text": " ____" + } + ], + "created": 1757550367, + "model": "Qwen/Qwen3-0.6B", + "object": "text_completion", + "system_fingerprint": "3.3.5-dev0-sha-1b90c50", + "usage": null + } + }, + { + "__type__": "openai.types.completion.Completion", + "__data__": { + "id": "", + "choices": [ + { + "finish_reason": "", + "index": 0, + "logprobs": null, + "text": ".\n" + } + ], + "created": 1757550367, + "model": "Qwen/Qwen3-0.6B", + "object": "text_completion", + "system_fingerprint": "3.3.5-dev0-sha-1b90c50", + "usage": null + } + }, + { + "__type__": "openai.types.completion.Completion", + "__data__": { + "id": "", + "choices": [ + { + "finish_reason": "", + "index": 0, + "logprobs": null, + "text": "Answer" + } + ], + "created": 1757550367, + "model": "Qwen/Qwen3-0.6B", + "object": "text_completion", + "system_fingerprint": "3.3.5-dev0-sha-1b90c50", + "usage": null + } + }, + { + "__type__": "openai.types.completion.Completion", + "__data__": { + "id": "", + "choices": [ + { + "finish_reason": "", + "index": 0, + "logprobs": null, + "text": ":\n\n" + } + ], + "created": 1757550367, + "model": "Qwen/Qwen3-0.6B", + "object": "text_completion", + "system_fingerprint": "3.3.5-dev0-sha-1b90c50", + "usage": null + } + }, + { + "__type__": "openai.types.completion.Completion", + "__data__": { + "id": "", + "choices": [ + { + "finish_reason": "", + "index": 0, + "logprobs": null, + "text": "The" + } + ], + "created": 1757550367, + "model": "Qwen/Qwen3-0.6B", + "object": "text_completion", + "system_fingerprint": "3.3.5-dev0-sha-1b90c50", + "usage": null + } + }, + { + "__type__": "openai.types.completion.Completion", + "__data__": { + "id": "", + "choices": [ + { + "finish_reason": "", + "index": 0, + "logprobs": null, + "text": " roses" + } + ], + "created": 1757550367, + "model": "Qwen/Qwen3-0.6B", + "object": "text_completion", + "system_fingerprint": "3.3.5-dev0-sha-1b90c50", + "usage": null + } + }, + { + "__type__": "openai.types.completion.Completion", + "__data__": { + "id": "", + "choices": [ + { + "finish_reason": "", + "index": 0, + "logprobs": null, + "text": " are" + } + ], + "created": 1757550367, + "model": "Qwen/Qwen3-0.6B", + "object": "text_completion", + "system_fingerprint": "3.3.5-dev0-sha-1b90c50", + "usage": null + } + }, + { + "__type__": "openai.types.completion.Completion", + "__data__": { + "id": "", + "choices": [ + { + "finish_reason": "", + "index": 0, + "logprobs": null, + "text": " red" + } + ], + "created": 1757550367, + "model": "Qwen/Qwen3-0.6B", + "object": "text_completion", + "system_fingerprint": "3.3.5-dev0-sha-1b90c50", + "usage": null + } + }, + { + "__type__": "openai.types.completion.Completion", + "__data__": { + "id": "", + "choices": [ + { + "finish_reason": "", + "index": 0, + "logprobs": null, + "text": "," + } + ], + "created": 1757550367, + "model": "Qwen/Qwen3-0.6B", + "object": "text_completion", + "system_fingerprint": "3.3.5-dev0-sha-1b90c50", + "usage": null + } + }, + { + "__type__": "openai.types.completion.Completion", + "__data__": { + "id": "", + "choices": [ + { + "finish_reason": "", + "index": 0, + "logprobs": null, + "text": " v" + } + ], + "created": 1757550367, + "model": "Qwen/Qwen3-0.6B", + "object": "text_completion", + "system_fingerprint": "3.3.5-dev0-sha-1b90c50", + "usage": null + } + }, + { + "__type__": "openai.types.completion.Completion", + "__data__": { + "id": "", + "choices": [ + { + "finish_reason": "", + "index": 0, + "logprobs": null, + "text": "io" + } + ], + "created": 1757550367, + "model": "Qwen/Qwen3-0.6B", + "object": "text_completion", + "system_fingerprint": "3.3.5-dev0-sha-1b90c50", + "usage": null + } + }, + { + "__type__": "openai.types.completion.Completion", + "__data__": { + "id": "", + "choices": [ + { + "finish_reason": "", + "index": 0, + "logprobs": null, + "text": "lets" + } + ], + "created": 1757550367, + "model": "Qwen/Qwen3-0.6B", + "object": "text_completion", + "system_fingerprint": "3.3.5-dev0-sha-1b90c50", + "usage": null + } + }, + { + "__type__": "openai.types.completion.Completion", + "__data__": { + "id": "", + "choices": [ + { + "finish_reason": "", + "index": 0, + "logprobs": null, + "text": " are" + } + ], + "created": 1757550367, + "model": "Qwen/Qwen3-0.6B", + "object": "text_completion", + "system_fingerprint": "3.3.5-dev0-sha-1b90c50", + "usage": null + } + }, + { + "__type__": "openai.types.completion.Completion", + "__data__": { + "id": "", + "choices": [ + { + "finish_reason": "", + "index": 0, + "logprobs": null, + "text": " several" + } + ], + "created": 1757550367, + "model": "Qwen/Qwen3-0.6B", + "object": "text_completion", + "system_fingerprint": "3.3.5-dev0-sha-1b90c50", + "usage": null + } + }, + { + "__type__": "openai.types.completion.Completion", + "__data__": { + "id": "", + "choices": [ + { + "finish_reason": "", + "index": 0, + "logprobs": null, + "text": " several" + } + ], + "created": 1757550367, + "model": "Qwen/Qwen3-0.6B", + "object": "text_completion", + "system_fingerprint": "3.3.5-dev0-sha-1b90c50", + "usage": null + } + }, + { + "__type__": "openai.types.completion.Completion", + "__data__": { + "id": "", + "choices": [ + { + "finish_reason": "", + "index": 0, + "logprobs": null, + "text": " times" + } + ], + "created": 1757550367, + "model": "Qwen/Qwen3-0.6B", + "object": "text_completion", + "system_fingerprint": "3.3.5-dev0-sha-1b90c50", + "usage": null + } + }, + { + "__type__": "openai.types.completion.Completion", + "__data__": { + "id": "", + "choices": [ + { + "finish_reason": "", + "index": 0, + "logprobs": null, + "text": " more" + } + ], + "created": 1757550367, + "model": "Qwen/Qwen3-0.6B", + "object": "text_completion", + "system_fingerprint": "3.3.5-dev0-sha-1b90c50", + "usage": null + } + }, + { + "__type__": "openai.types.completion.Completion", + "__data__": { + "id": "", + "choices": [ + { + "finish_reason": "", + "index": 0, + "logprobs": null, + "text": " popular" + } + ], + "created": 1757550367, + "model": "Qwen/Qwen3-0.6B", + "object": "text_completion", + "system_fingerprint": "3.3.5-dev0-sha-1b90c50", + "usage": null + } + }, + { + "__type__": "openai.types.completion.Completion", + "__data__": { + "id": "", + "choices": [ + { + "finish_reason": "", + "index": 0, + "logprobs": null, + "text": " than" + } + ], + "created": 1757550367, + "model": "Qwen/Qwen3-0.6B", + "object": "text_completion", + "system_fingerprint": "3.3.5-dev0-sha-1b90c50", + "usage": null + } + }, + { + "__type__": "openai.types.completion.Completion", + "__data__": { + "id": "", + "choices": [ + { + "finish_reason": "", + "index": 0, + "logprobs": null, + "text": " **" + } + ], + "created": 1757550367, + "model": "Qwen/Qwen3-0.6B", + "object": "text_completion", + "system_fingerprint": "3.3.5-dev0-sha-1b90c50", + "usage": null + } + }, + { + "__type__": "openai.types.completion.Completion", + "__data__": { + "id": "", + "choices": [ + { + "finish_reason": "", + "index": 0, + "logprobs": null, + "text": "numbers" + } + ], + "created": 1757550367, + "model": "Qwen/Qwen3-0.6B", + "object": "text_completion", + "system_fingerprint": "3.3.5-dev0-sha-1b90c50", + "usage": null + } + }, + { + "__type__": "openai.types.completion.Completion", + "__data__": { + "id": "", + "choices": [ + { + "finish_reason": "", + "index": 0, + "logprobs": null, + "text": "**" + } + ], + "created": 1757550367, + "model": "Qwen/Qwen3-0.6B", + "object": "text_completion", + "system_fingerprint": "3.3.5-dev0-sha-1b90c50", + "usage": null + } + }, + { + "__type__": "openai.types.completion.Completion", + "__data__": { + "id": "", + "choices": [ + { + "finish_reason": "", + "index": 0, + "logprobs": null, + "text": ".\n\n" + } + ], + "created": 1757550367, + "model": "Qwen/Qwen3-0.6B", + "object": "text_completion", + "system_fingerprint": "3.3.5-dev0-sha-1b90c50", + "usage": null + } + }, + { + "__type__": "openai.types.completion.Completion", + "__data__": { + "id": "", + "choices": [ + { + "finish_reason": "", + "index": 0, + "logprobs": null, + "text": "Explanation" + } + ], + "created": 1757550367, + "model": "Qwen/Qwen3-0.6B", + "object": "text_completion", + "system_fingerprint": "3.3.5-dev0-sha-1b90c50", + "usage": null + } + }, + { + "__type__": "openai.types.completion.Completion", + "__data__": { + "id": "", + "choices": [ + { + "finish_reason": "", + "index": 0, + "logprobs": null, + "text": ":" + } + ], + "created": 1757550367, + "model": "Qwen/Qwen3-0.6B", + "object": "text_completion", + "system_fingerprint": "3.3.5-dev0-sha-1b90c50", + "usage": null + } + }, + { + "__type__": "openai.types.completion.Completion", + "__data__": { + "id": "", + "choices": [ + { + "finish_reason": "", + "index": 0, + "logprobs": null, + "text": " \"" + } + ], + "created": 1757550367, + "model": "Qwen/Qwen3-0.6B", + "object": "text_completion", + "system_fingerprint": "3.3.5-dev0-sha-1b90c50", + "usage": null + } + }, + { + "__type__": "openai.types.completion.Completion", + "__data__": { + "id": "", + "choices": [ + { + "finish_reason": "", + "index": 0, + "logprobs": null, + "text": "se" + } + ], + "created": 1757550367, + "model": "Qwen/Qwen3-0.6B", + "object": "text_completion", + "system_fingerprint": "3.3.5-dev0-sha-1b90c50", + "usage": null + } + }, + { + "__type__": "openai.types.completion.Completion", + "__data__": { + "id": "", + "choices": [ + { + "finish_reason": "", + "index": 0, + "logprobs": null, + "text": "veral" + } + ], + "created": 1757550367, + "model": "Qwen/Qwen3-0.6B", + "object": "text_completion", + "system_fingerprint": "3.3.5-dev0-sha-1b90c50", + "usage": null + } + }, + { + "__type__": "openai.types.completion.Completion", + "__data__": { + "id": "", + "choices": [ + { + "finish_reason": "", + "index": 0, + "logprobs": null, + "text": " several" + } + ], + "created": 1757550367, + "model": "Qwen/Qwen3-0.6B", + "object": "text_completion", + "system_fingerprint": "3.3.5-dev0-sha-1b90c50", + "usage": null + } + }, + { + "__type__": "openai.types.completion.Completion", + "__data__": { + "id": "", + "choices": [ + { + "finish_reason": "", + "index": 0, + "logprobs": null, + "text": " times" + } + ], + "created": 1757550367, + "model": "Qwen/Qwen3-0.6B", + "object": "text_completion", + "system_fingerprint": "3.3.5-dev0-sha-1b90c50", + "usage": null + } + }, + { + "__type__": "openai.types.completion.Completion", + "__data__": { + "id": "", + "choices": [ + { + "finish_reason": "", + "index": 0, + "logprobs": null, + "text": " more" + } + ], + "created": 1757550367, + "model": "Qwen/Qwen3-0.6B", + "object": "text_completion", + "system_fingerprint": "3.3.5-dev0-sha-1b90c50", + "usage": null + } + }, + { + "__type__": "openai.types.completion.Completion", + "__data__": { + "id": "", + "choices": [ + { + "finish_reason": "", + "index": 0, + "logprobs": null, + "text": " popular" + } + ], + "created": 1757550367, + "model": "Qwen/Qwen3-0.6B", + "object": "text_completion", + "system_fingerprint": "3.3.5-dev0-sha-1b90c50", + "usage": null + } + }, + { + "__type__": "openai.types.completion.Completion", + "__data__": { + "id": "", + "choices": [ + { + "finish_reason": "", + "index": 0, + "logprobs": null, + "text": " than" + } + ], + "created": 1757550367, + "model": "Qwen/Qwen3-0.6B", + "object": "text_completion", + "system_fingerprint": "3.3.5-dev0-sha-1b90c50", + "usage": null + } + }, + { + "__type__": "openai.types.completion.Completion", + "__data__": { + "id": "", + "choices": [ + { + "finish_reason": "", + "index": 0, + "logprobs": null, + "text": "\"" + } + ], + "created": 1757550367, + "model": "Qwen/Qwen3-0.6B", + "object": "text_completion", + "system_fingerprint": "3.3.5-dev0-sha-1b90c50", + "usage": null + } + }, + { + "__type__": "openai.types.completion.Completion", + "__data__": { + "id": "", + "choices": [ + { + "finish_reason": "", + "index": 0, + "logprobs": null, + "text": " can" + } + ], + "created": 1757550367, + "model": "Qwen/Qwen3-0.6B", + "object": "text_completion", + "system_fingerprint": "3.3.5-dev0-sha-1b90c50", + "usage": null + } + }, + { + "__type__": "openai.types.completion.Completion", + "__data__": { + "id": "", + "choices": [ + { + "finish_reason": "", + "index": 0, + "logprobs": null, + "text": " be" + } + ], + "created": 1757550367, + "model": "Qwen/Qwen3-0.6B", + "object": "text_completion", + "system_fingerprint": "3.3.5-dev0-sha-1b90c50", + "usage": null + } + }, + { + "__type__": "openai.types.completion.Completion", + "__data__": { + "id": "", + "choices": [ + { + "finish_reason": "", + "index": 0, + "logprobs": null, + "text": " replaced" + } + ], + "created": 1757550367, + "model": "Qwen/Qwen3-0.6B", + "object": "text_completion", + "system_fingerprint": "3.3.5-dev0-sha-1b90c50", + "usage": null + } + }, + { + "__type__": "openai.types.completion.Completion", + "__data__": { + "id": "", + "choices": [ + { + "finish_reason": "", + "index": 0, + "logprobs": null, + "text": " with" + } + ], + "created": 1757550367, + "model": "Qwen/Qwen3-0.6B", + "object": "text_completion", + "system_fingerprint": "3.3.5-dev0-sha-1b90c50", + "usage": null + } + }, + { + "__type__": "openai.types.completion.Completion", + "__data__": { + "id": "", + "choices": [ + { + "finish_reason": "", + "index": 0, + "logprobs": null, + "text": " \"" + } + ], + "created": 1757550367, + "model": "Qwen/Qwen3-0.6B", + "object": "text_completion", + "system_fingerprint": "3.3.5-dev0-sha-1b90c50", + "usage": null + } + }, + { + "__type__": "openai.types.completion.Completion", + "__data__": { + "id": "", + "choices": [ + { + "finish_reason": "", + "index": 0, + "logprobs": null, + "text": "numbers" + } + ], + "created": 1757550367, + "model": "Qwen/Qwen3-0.6B", + "object": "text_completion", + "system_fingerprint": "3.3.5-dev0-sha-1b90c50", + "usage": null + } + }, + { + "__type__": "openai.types.completion.Completion", + "__data__": { + "id": "", + "choices": [ + { + "finish_reason": "", + "index": 0, + "logprobs": null, + "text": "\"" + } + ], + "created": 1757550367, + "model": "Qwen/Qwen3-0.6B", + "object": "text_completion", + "system_fingerprint": "3.3.5-dev0-sha-1b90c50", + "usage": null + } + }, + { + "__type__": "openai.types.completion.Completion", + "__data__": { + "id": "", + "choices": [ + { + "finish_reason": "", + "index": 0, + "logprobs": null, + "text": " as" + } + ], + "created": 1757550367, + "model": "Qwen/Qwen3-0.6B", + "object": "text_completion", + "system_fingerprint": "3.3.5-dev0-sha-1b90c50", + "usage": null + } + }, + { + "__type__": "openai.types.completion.Completion", + "__data__": { + "id": "", + "choices": [ + { + "finish_reason": "", + "index": 0, + "logprobs": null, + "text": " the" + } + ], + "created": 1757550367, + "model": "Qwen/Qwen3-0.6B", + "object": "text_completion", + "system_fingerprint": "3.3.5-dev0-sha-1b90c50", + "usage": null + } + }, + { + "__type__": "openai.types.completion.Completion", + "__data__": { + "id": "", + "choices": [ + { + "finish_reason": "length", + "index": 0, + "logprobs": null, + "text": " number" + } + ], + "created": 1757550367, + "model": "Qwen/Qwen3-0.6B", + "object": "text_completion", + "system_fingerprint": "3.3.5-dev0-sha-1b90c50", + "usage": { + "completion_tokens": 50, + "prompt_tokens": 25, + "total_tokens": 75, + "completion_tokens_details": null, + "prompt_tokens_details": null + } + } + } + ], + "is_streaming": true + } +} diff --git a/tests/integration/recordings/responses/cf55f983d1ff.json b/tests/integration/recordings/responses/cf55f983d1ff.json new file mode 100644 index 000000000..06f9de0c2 --- /dev/null +++ b/tests/integration/recordings/responses/cf55f983d1ff.json @@ -0,0 +1,84 @@ +{ + "request": { + "method": "POST", + "url": "http://localhost:8080/v1/v1/chat/completions", + "headers": {}, + "body": { + "model": "Qwen/Qwen3-0.6B", + "messages": [ + { + "role": "user", + "content": "What's the weather in Tokyo? Use the get_weather function to get the weather." + } + ], + "stream": false, + "tools": [ + { + "type": "function", + "function": { + "name": "get_weather", + "description": "Get the weather in a given city", + "parameters": { + "type": "object", + "properties": { + "city": { + "type": "string", + "description": "The city to get the weather for" + } + } + } + } + } + ] + }, + "endpoint": "/v1/chat/completions", + "model": "Qwen/Qwen3-0.6B" + }, + "response": { + "body": { + "__type__": "openai.types.chat.chat_completion.ChatCompletion", + "__data__": { + "id": "", + "choices": [ + { + "finish_reason": "stop", + "index": 0, + "logprobs": null, + "message": { + "content": null, + "refusal": null, + "role": "assistant", + "annotations": null, + "audio": null, + "function_call": null, + "tool_calls": [ + { + "id": "0", + "function": { + "arguments": "{\"city\":\"Tokyo\"}", + "name": "get_weather", + "description": null + }, + "type": "function" + } + ] + } + } + ], + "created": 1757550396, + "model": "Qwen/Qwen3-0.6B", + "object": "chat.completion", + "service_tier": null, + "system_fingerprint": "3.3.5-dev0-sha-1b90c50", + "usage": { + "completion_tokens": 19, + "prompt_tokens": 239, + "total_tokens": 258, + "completion_tokens_details": null, + "prompt_tokens_details": null + } + } + }, + "is_streaming": false + } +} diff --git a/tests/integration/recordings/responses/e08e01e5652a.json b/tests/integration/recordings/responses/e08e01e5652a.json new file mode 100644 index 000000000..4452b23d2 --- /dev/null +++ b/tests/integration/recordings/responses/e08e01e5652a.json @@ -0,0 +1,56 @@ +{ + "request": { + "method": "POST", + "url": "http://localhost:8080/v1/v1/chat/completions", + "headers": {}, + "body": { + "model": "Qwen/Qwen3-0.6B", + "messages": [ + { + "role": "user", + "content": "Which planet do humans live on?" + } + ], + "stream": false + }, + "endpoint": "/v1/chat/completions", + "model": "Qwen/Qwen3-0.6B" + }, + "response": { + "body": { + "__type__": "openai.types.chat.chat_completion.ChatCompletion", + "__data__": { + "id": "", + "choices": [ + { + "finish_reason": "stop", + "index": 0, + "logprobs": null, + "message": { + "content": "\nOkay, the user is asking which planet humans live on. I need to make sure I answer this accurately. First, I should recall what I know about our solar system. The Earth is our home, and it's in our solar system. There are eight planets in total, right? Let me check that. Mercury, Venus, Earth, Mars, Jupiter, Saturn, Uranus, and Neptune. Yep, that's the list.\n\nBut wait, the user might be confusing Earth with Mars. I should clarify that Earth is the only planet known to support life. The other planets are mostly gas giants and have no liquid water, so they don't support life as Earth does. So the answer should be Earth. I should also mention that although there are other planets, none have liquid water, which makes the answer more complete.\n\nI need to make sure there are no alternatives. Maybe some people might think Mars, but I know that's not the case. Also, it's good to mention that life on Earth is closely linked to the presence of water, which is why Earth is our only planet with that characteristic. That way, the answer is not only accurate but also informative.\n\n\nHumans live on **Earth**, the planet that supports life as we know it. The Earth is the only known planet in our solar system where liquid water exists and where life can occur. Other planets are considered \"gas giants\" or \"ice giants\" due to their extreme conditions and lack of liquid water, making them inhospitable for life.", + "refusal": null, + "role": "assistant", + "annotations": null, + "audio": null, + "function_call": null, + "tool_calls": null + } + } + ], + "created": 1757550390, + "model": "Qwen/Qwen3-0.6B", + "object": "chat.completion", + "service_tier": null, + "system_fingerprint": "3.3.5-dev0-sha-1b90c50", + "usage": { + "completion_tokens": 312, + "prompt_tokens": 15, + "total_tokens": 327, + "completion_tokens_details": null, + "prompt_tokens_details": null + } + } + }, + "is_streaming": false + } +} diff --git a/tests/integration/recordings/responses/f518ea4fde7d.json b/tests/integration/recordings/responses/f518ea4fde7d.json new file mode 100644 index 000000000..222e10433 --- /dev/null +++ b/tests/integration/recordings/responses/f518ea4fde7d.json @@ -0,0 +1,4054 @@ +{ + "request": { + "method": "POST", + "url": "http://localhost:8080/v1/v1/chat/completions", + "headers": {}, + "body": { + "model": "Qwen/Qwen3-0.6B", + "messages": [ + { + "role": "user", + "content": "Hello, world!" + } + ], + "stream": true + }, + "endpoint": "/v1/chat/completions", + "model": "Qwen/Qwen3-0.6B" + }, + "response": { + "body": [ + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "", + "choices": [ + { + "delta": { + "content": "", + "function_call": null, + "refusal": null, + "role": "assistant", + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null + } + ], + "created": 1757550391, + "model": "Qwen/Qwen3-0.6B", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": "3.3.5-dev0-sha-1b90c50", + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "", + "choices": [ + { + "delta": { + "content": "\n", + "function_call": null, + "refusal": null, + "role": "assistant", + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null + } + ], + "created": 1757550391, + "model": "Qwen/Qwen3-0.6B", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": "3.3.5-dev0-sha-1b90c50", + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "", + "choices": [ + { + "delta": { + "content": "Okay", + "function_call": null, + "refusal": null, + "role": "assistant", + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null + } + ], + "created": 1757550391, + "model": "Qwen/Qwen3-0.6B", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": "3.3.5-dev0-sha-1b90c50", + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "", + "choices": [ + { + "delta": { + "content": ",", + "function_call": null, + "refusal": null, + "role": "assistant", + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null + } + ], + "created": 1757550391, + "model": "Qwen/Qwen3-0.6B", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": "3.3.5-dev0-sha-1b90c50", + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "", + "choices": [ + { + "delta": { + "content": " the", + "function_call": null, + "refusal": null, + "role": "assistant", + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null + } + ], + "created": 1757550391, + "model": "Qwen/Qwen3-0.6B", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": "3.3.5-dev0-sha-1b90c50", + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "", + "choices": [ + { + "delta": { + "content": " user", + "function_call": null, + "refusal": null, + "role": "assistant", + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null + } + ], + "created": 1757550391, + "model": "Qwen/Qwen3-0.6B", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": "3.3.5-dev0-sha-1b90c50", + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "", + "choices": [ + { + "delta": { + "content": " wrote", + "function_call": null, + "refusal": null, + "role": "assistant", + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null + } + ], + "created": 1757550391, + "model": "Qwen/Qwen3-0.6B", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": "3.3.5-dev0-sha-1b90c50", + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "", + "choices": [ + { + "delta": { + "content": " \"", + "function_call": null, + "refusal": null, + "role": "assistant", + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null + } + ], + "created": 1757550391, + "model": "Qwen/Qwen3-0.6B", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": "3.3.5-dev0-sha-1b90c50", + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "", + "choices": [ + { + "delta": { + "content": "Hello", + "function_call": null, + "refusal": null, + "role": "assistant", + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null + } + ], + "created": 1757550391, + "model": "Qwen/Qwen3-0.6B", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": "3.3.5-dev0-sha-1b90c50", + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "", + "choices": [ + { + "delta": { + "content": ",", + "function_call": null, + "refusal": null, + "role": "assistant", + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null + } + ], + "created": 1757550391, + "model": "Qwen/Qwen3-0.6B", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": "3.3.5-dev0-sha-1b90c50", + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "", + "choices": [ + { + "delta": { + "content": " world", + "function_call": null, + "refusal": null, + "role": "assistant", + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null + } + ], + "created": 1757550391, + "model": "Qwen/Qwen3-0.6B", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": "3.3.5-dev0-sha-1b90c50", + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "", + "choices": [ + { + "delta": { + "content": "!\"", + "function_call": null, + "refusal": null, + "role": "assistant", + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null + } + ], + "created": 1757550391, + "model": "Qwen/Qwen3-0.6B", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": "3.3.5-dev0-sha-1b90c50", + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "", + "choices": [ + { + "delta": { + "content": " which", + "function_call": null, + "refusal": null, + "role": "assistant", + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null + } + ], + "created": 1757550391, + "model": "Qwen/Qwen3-0.6B", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": "3.3.5-dev0-sha-1b90c50", + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "", + "choices": [ + { + "delta": { + "content": " is", + "function_call": null, + "refusal": null, + "role": "assistant", + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null + } + ], + "created": 1757550391, + "model": "Qwen/Qwen3-0.6B", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": "3.3.5-dev0-sha-1b90c50", + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "", + "choices": [ + { + "delta": { + "content": " a", + "function_call": null, + "refusal": null, + "role": "assistant", + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null + } + ], + "created": 1757550391, + "model": "Qwen/Qwen3-0.6B", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": "3.3.5-dev0-sha-1b90c50", + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "", + "choices": [ + { + "delta": { + "content": " classic", + "function_call": null, + "refusal": null, + "role": "assistant", + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null + } + ], + "created": 1757550391, + "model": "Qwen/Qwen3-0.6B", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": "3.3.5-dev0-sha-1b90c50", + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "", + "choices": [ + { + "delta": { + "content": " programming", + "function_call": null, + "refusal": null, + "role": "assistant", + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null + } + ], + "created": 1757550391, + "model": "Qwen/Qwen3-0.6B", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": "3.3.5-dev0-sha-1b90c50", + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "", + "choices": [ + { + "delta": { + "content": " greeting", + "function_call": null, + "refusal": null, + "role": "assistant", + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null + } + ], + "created": 1757550391, + "model": "Qwen/Qwen3-0.6B", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": "3.3.5-dev0-sha-1b90c50", + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "", + "choices": [ + { + "delta": { + "content": ".", + "function_call": null, + "refusal": null, + "role": "assistant", + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null + } + ], + "created": 1757550391, + "model": "Qwen/Qwen3-0.6B", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": "3.3.5-dev0-sha-1b90c50", + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "", + "choices": [ + { + "delta": { + "content": " I", + "function_call": null, + "refusal": null, + "role": "assistant", + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null + } + ], + "created": 1757550391, + "model": "Qwen/Qwen3-0.6B", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": "3.3.5-dev0-sha-1b90c50", + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "", + "choices": [ + { + "delta": { + "content": " need", + "function_call": null, + "refusal": null, + "role": "assistant", + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null + } + ], + "created": 1757550391, + "model": "Qwen/Qwen3-0.6B", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": "3.3.5-dev0-sha-1b90c50", + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "", + "choices": [ + { + "delta": { + "content": " to", + "function_call": null, + "refusal": null, + "role": "assistant", + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null + } + ], + "created": 1757550391, + "model": "Qwen/Qwen3-0.6B", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": "3.3.5-dev0-sha-1b90c50", + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "", + "choices": [ + { + "delta": { + "content": " respond", + "function_call": null, + "refusal": null, + "role": "assistant", + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null + } + ], + "created": 1757550391, + "model": "Qwen/Qwen3-0.6B", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": "3.3.5-dev0-sha-1b90c50", + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "", + "choices": [ + { + "delta": { + "content": " appropriately", + "function_call": null, + "refusal": null, + "role": "assistant", + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null + } + ], + "created": 1757550391, + "model": "Qwen/Qwen3-0.6B", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": "3.3.5-dev0-sha-1b90c50", + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "", + "choices": [ + { + "delta": { + "content": ".", + "function_call": null, + "refusal": null, + "role": "assistant", + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null + } + ], + "created": 1757550391, + "model": "Qwen/Qwen3-0.6B", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": "3.3.5-dev0-sha-1b90c50", + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "", + "choices": [ + { + "delta": { + "content": " Since", + "function_call": null, + "refusal": null, + "role": "assistant", + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null + } + ], + "created": 1757550391, + "model": "Qwen/Qwen3-0.6B", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": "3.3.5-dev0-sha-1b90c50", + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "", + "choices": [ + { + "delta": { + "content": " they", + "function_call": null, + "refusal": null, + "role": "assistant", + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null + } + ], + "created": 1757550391, + "model": "Qwen/Qwen3-0.6B", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": "3.3.5-dev0-sha-1b90c50", + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "", + "choices": [ + { + "delta": { + "content": " mentioned", + "function_call": null, + "refusal": null, + "role": "assistant", + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null + } + ], + "created": 1757550391, + "model": "Qwen/Qwen3-0.6B", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": "3.3.5-dev0-sha-1b90c50", + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "", + "choices": [ + { + "delta": { + "content": " \"", + "function_call": null, + "refusal": null, + "role": "assistant", + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null + } + ], + "created": 1757550391, + "model": "Qwen/Qwen3-0.6B", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": "3.3.5-dev0-sha-1b90c50", + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "", + "choices": [ + { + "delta": { + "content": "Hello", + "function_call": null, + "refusal": null, + "role": "assistant", + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null + } + ], + "created": 1757550391, + "model": "Qwen/Qwen3-0.6B", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": "3.3.5-dev0-sha-1b90c50", + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "", + "choices": [ + { + "delta": { + "content": ",", + "function_call": null, + "refusal": null, + "role": "assistant", + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null + } + ], + "created": 1757550391, + "model": "Qwen/Qwen3-0.6B", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": "3.3.5-dev0-sha-1b90c50", + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "", + "choices": [ + { + "delta": { + "content": " world", + "function_call": null, + "refusal": null, + "role": "assistant", + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null + } + ], + "created": 1757550391, + "model": "Qwen/Qwen3-0.6B", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": "3.3.5-dev0-sha-1b90c50", + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "", + "choices": [ + { + "delta": { + "content": "!\",", + "function_call": null, + "refusal": null, + "role": "assistant", + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null + } + ], + "created": 1757550391, + "model": "Qwen/Qwen3-0.6B", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": "3.3.5-dev0-sha-1b90c50", + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "", + "choices": [ + { + "delta": { + "content": " I", + "function_call": null, + "refusal": null, + "role": "assistant", + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null + } + ], + "created": 1757550391, + "model": "Qwen/Qwen3-0.6B", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": "3.3.5-dev0-sha-1b90c50", + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "", + "choices": [ + { + "delta": { + "content": " should", + "function_call": null, + "refusal": null, + "role": "assistant", + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null + } + ], + "created": 1757550391, + "model": "Qwen/Qwen3-0.6B", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": "3.3.5-dev0-sha-1b90c50", + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "", + "choices": [ + { + "delta": { + "content": " acknowledge", + "function_call": null, + "refusal": null, + "role": "assistant", + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null + } + ], + "created": 1757550391, + "model": "Qwen/Qwen3-0.6B", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": "3.3.5-dev0-sha-1b90c50", + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "", + "choices": [ + { + "delta": { + "content": " that", + "function_call": null, + "refusal": null, + "role": "assistant", + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null + } + ], + "created": 1757550391, + "model": "Qwen/Qwen3-0.6B", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": "3.3.5-dev0-sha-1b90c50", + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "", + "choices": [ + { + "delta": { + "content": " fact", + "function_call": null, + "refusal": null, + "role": "assistant", + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null + } + ], + "created": 1757550391, + "model": "Qwen/Qwen3-0.6B", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": "3.3.5-dev0-sha-1b90c50", + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "", + "choices": [ + { + "delta": { + "content": " and", + "function_call": null, + "refusal": null, + "role": "assistant", + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null + } + ], + "created": 1757550391, + "model": "Qwen/Qwen3-0.6B", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": "3.3.5-dev0-sha-1b90c50", + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "", + "choices": [ + { + "delta": { + "content": " maybe", + "function_call": null, + "refusal": null, + "role": "assistant", + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null + } + ], + "created": 1757550391, + "model": "Qwen/Qwen3-0.6B", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": "3.3.5-dev0-sha-1b90c50", + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "", + "choices": [ + { + "delta": { + "content": " explain", + "function_call": null, + "refusal": null, + "role": "assistant", + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null + } + ], + "created": 1757550391, + "model": "Qwen/Qwen3-0.6B", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": "3.3.5-dev0-sha-1b90c50", + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "", + "choices": [ + { + "delta": { + "content": " the", + "function_call": null, + "refusal": null, + "role": "assistant", + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null + } + ], + "created": 1757550391, + "model": "Qwen/Qwen3-0.6B", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": "3.3.5-dev0-sha-1b90c50", + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "", + "choices": [ + { + "delta": { + "content": " purpose", + "function_call": null, + "refusal": null, + "role": "assistant", + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null + } + ], + "created": 1757550391, + "model": "Qwen/Qwen3-0.6B", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": "3.3.5-dev0-sha-1b90c50", + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "", + "choices": [ + { + "delta": { + "content": " of", + "function_call": null, + "refusal": null, + "role": "assistant", + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null + } + ], + "created": 1757550391, + "model": "Qwen/Qwen3-0.6B", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": "3.3.5-dev0-sha-1b90c50", + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "", + "choices": [ + { + "delta": { + "content": " the", + "function_call": null, + "refusal": null, + "role": "assistant", + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null + } + ], + "created": 1757550391, + "model": "Qwen/Qwen3-0.6B", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": "3.3.5-dev0-sha-1b90c50", + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "", + "choices": [ + { + "delta": { + "content": " message", + "function_call": null, + "refusal": null, + "role": "assistant", + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null + } + ], + "created": 1757550391, + "model": "Qwen/Qwen3-0.6B", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": "3.3.5-dev0-sha-1b90c50", + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "", + "choices": [ + { + "delta": { + "content": ".", + "function_call": null, + "refusal": null, + "role": "assistant", + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null + } + ], + "created": 1757550391, + "model": "Qwen/Qwen3-0.6B", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": "3.3.5-dev0-sha-1b90c50", + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "", + "choices": [ + { + "delta": { + "content": " But", + "function_call": null, + "refusal": null, + "role": "assistant", + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null + } + ], + "created": 1757550391, + "model": "Qwen/Qwen3-0.6B", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": "3.3.5-dev0-sha-1b90c50", + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "", + "choices": [ + { + "delta": { + "content": " wait", + "function_call": null, + "refusal": null, + "role": "assistant", + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null + } + ], + "created": 1757550391, + "model": "Qwen/Qwen3-0.6B", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": "3.3.5-dev0-sha-1b90c50", + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "", + "choices": [ + { + "delta": { + "content": ",", + "function_call": null, + "refusal": null, + "role": "assistant", + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null + } + ], + "created": 1757550391, + "model": "Qwen/Qwen3-0.6B", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": "3.3.5-dev0-sha-1b90c50", + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "", + "choices": [ + { + "delta": { + "content": " the", + "function_call": null, + "refusal": null, + "role": "assistant", + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null + } + ], + "created": 1757550391, + "model": "Qwen/Qwen3-0.6B", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": "3.3.5-dev0-sha-1b90c50", + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "", + "choices": [ + { + "delta": { + "content": " user", + "function_call": null, + "refusal": null, + "role": "assistant", + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null + } + ], + "created": 1757550391, + "model": "Qwen/Qwen3-0.6B", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": "3.3.5-dev0-sha-1b90c50", + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "", + "choices": [ + { + "delta": { + "content": " just", + "function_call": null, + "refusal": null, + "role": "assistant", + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null + } + ], + "created": 1757550391, + "model": "Qwen/Qwen3-0.6B", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": "3.3.5-dev0-sha-1b90c50", + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "", + "choices": [ + { + "delta": { + "content": " sent", + "function_call": null, + "refusal": null, + "role": "assistant", + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null + } + ], + "created": 1757550391, + "model": "Qwen/Qwen3-0.6B", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": "3.3.5-dev0-sha-1b90c50", + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "", + "choices": [ + { + "delta": { + "content": " the", + "function_call": null, + "refusal": null, + "role": "assistant", + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null + } + ], + "created": 1757550391, + "model": "Qwen/Qwen3-0.6B", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": "3.3.5-dev0-sha-1b90c50", + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "", + "choices": [ + { + "delta": { + "content": " message", + "function_call": null, + "refusal": null, + "role": "assistant", + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null + } + ], + "created": 1757550391, + "model": "Qwen/Qwen3-0.6B", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": "3.3.5-dev0-sha-1b90c50", + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "", + "choices": [ + { + "delta": { + "content": ".", + "function_call": null, + "refusal": null, + "role": "assistant", + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null + } + ], + "created": 1757550391, + "model": "Qwen/Qwen3-0.6B", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": "3.3.5-dev0-sha-1b90c50", + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "", + "choices": [ + { + "delta": { + "content": " Are", + "function_call": null, + "refusal": null, + "role": "assistant", + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null + } + ], + "created": 1757550391, + "model": "Qwen/Qwen3-0.6B", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": "3.3.5-dev0-sha-1b90c50", + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "", + "choices": [ + { + "delta": { + "content": " they", + "function_call": null, + "refusal": null, + "role": "assistant", + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null + } + ], + "created": 1757550391, + "model": "Qwen/Qwen3-0.6B", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": "3.3.5-dev0-sha-1b90c50", + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "", + "choices": [ + { + "delta": { + "content": " testing", + "function_call": null, + "refusal": null, + "role": "assistant", + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null + } + ], + "created": 1757550391, + "model": "Qwen/Qwen3-0.6B", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": "3.3.5-dev0-sha-1b90c50", + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "", + "choices": [ + { + "delta": { + "content": " if", + "function_call": null, + "refusal": null, + "role": "assistant", + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null + } + ], + "created": 1757550391, + "model": "Qwen/Qwen3-0.6B", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": "3.3.5-dev0-sha-1b90c50", + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "", + "choices": [ + { + "delta": { + "content": " I", + "function_call": null, + "refusal": null, + "role": "assistant", + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null + } + ], + "created": 1757550391, + "model": "Qwen/Qwen3-0.6B", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": "3.3.5-dev0-sha-1b90c50", + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "", + "choices": [ + { + "delta": { + "content": " can", + "function_call": null, + "refusal": null, + "role": "assistant", + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null + } + ], + "created": 1757550391, + "model": "Qwen/Qwen3-0.6B", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": "3.3.5-dev0-sha-1b90c50", + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "", + "choices": [ + { + "delta": { + "content": " handle", + "function_call": null, + "refusal": null, + "role": "assistant", + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null + } + ], + "created": 1757550391, + "model": "Qwen/Qwen3-0.6B", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": "3.3.5-dev0-sha-1b90c50", + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "", + "choices": [ + { + "delta": { + "content": " that", + "function_call": null, + "refusal": null, + "role": "assistant", + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null + } + ], + "created": 1757550391, + "model": "Qwen/Qwen3-0.6B", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": "3.3.5-dev0-sha-1b90c50", + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "", + "choices": [ + { + "delta": { + "content": "?", + "function_call": null, + "refusal": null, + "role": "assistant", + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null + } + ], + "created": 1757550391, + "model": "Qwen/Qwen3-0.6B", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": "3.3.5-dev0-sha-1b90c50", + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "", + "choices": [ + { + "delta": { + "content": " I", + "function_call": null, + "refusal": null, + "role": "assistant", + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null + } + ], + "created": 1757550391, + "model": "Qwen/Qwen3-0.6B", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": "3.3.5-dev0-sha-1b90c50", + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "", + "choices": [ + { + "delta": { + "content": " should", + "function_call": null, + "refusal": null, + "role": "assistant", + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null + } + ], + "created": 1757550391, + "model": "Qwen/Qwen3-0.6B", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": "3.3.5-dev0-sha-1b90c50", + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "", + "choices": [ + { + "delta": { + "content": " provide", + "function_call": null, + "refusal": null, + "role": "assistant", + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null + } + ], + "created": 1757550391, + "model": "Qwen/Qwen3-0.6B", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": "3.3.5-dev0-sha-1b90c50", + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "", + "choices": [ + { + "delta": { + "content": " a", + "function_call": null, + "refusal": null, + "role": "assistant", + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null + } + ], + "created": 1757550391, + "model": "Qwen/Qwen3-0.6B", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": "3.3.5-dev0-sha-1b90c50", + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "", + "choices": [ + { + "delta": { + "content": " friendly", + "function_call": null, + "refusal": null, + "role": "assistant", + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null + } + ], + "created": 1757550391, + "model": "Qwen/Qwen3-0.6B", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": "3.3.5-dev0-sha-1b90c50", + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "", + "choices": [ + { + "delta": { + "content": " response", + "function_call": null, + "refusal": null, + "role": "assistant", + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null + } + ], + "created": 1757550391, + "model": "Qwen/Qwen3-0.6B", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": "3.3.5-dev0-sha-1b90c50", + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "", + "choices": [ + { + "delta": { + "content": " that", + "function_call": null, + "refusal": null, + "role": "assistant", + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null + } + ], + "created": 1757550391, + "model": "Qwen/Qwen3-0.6B", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": "3.3.5-dev0-sha-1b90c50", + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "", + "choices": [ + { + "delta": { + "content": " includes", + "function_call": null, + "refusal": null, + "role": "assistant", + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null + } + ], + "created": 1757550391, + "model": "Qwen/Qwen3-0.6B", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": "3.3.5-dev0-sha-1b90c50", + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "", + "choices": [ + { + "delta": { + "content": " the", + "function_call": null, + "refusal": null, + "role": "assistant", + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null + } + ], + "created": 1757550391, + "model": "Qwen/Qwen3-0.6B", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": "3.3.5-dev0-sha-1b90c50", + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "", + "choices": [ + { + "delta": { + "content": " message", + "function_call": null, + "refusal": null, + "role": "assistant", + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null + } + ], + "created": 1757550391, + "model": "Qwen/Qwen3-0.6B", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": "3.3.5-dev0-sha-1b90c50", + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "", + "choices": [ + { + "delta": { + "content": ".", + "function_call": null, + "refusal": null, + "role": "assistant", + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null + } + ], + "created": 1757550391, + "model": "Qwen/Qwen3-0.6B", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": "3.3.5-dev0-sha-1b90c50", + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "", + "choices": [ + { + "delta": { + "content": " Let", + "function_call": null, + "refusal": null, + "role": "assistant", + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null + } + ], + "created": 1757550391, + "model": "Qwen/Qwen3-0.6B", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": "3.3.5-dev0-sha-1b90c50", + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "", + "choices": [ + { + "delta": { + "content": " me", + "function_call": null, + "refusal": null, + "role": "assistant", + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null + } + ], + "created": 1757550391, + "model": "Qwen/Qwen3-0.6B", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": "3.3.5-dev0-sha-1b90c50", + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "", + "choices": [ + { + "delta": { + "content": " make", + "function_call": null, + "refusal": null, + "role": "assistant", + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null + } + ], + "created": 1757550391, + "model": "Qwen/Qwen3-0.6B", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": "3.3.5-dev0-sha-1b90c50", + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "", + "choices": [ + { + "delta": { + "content": " sure", + "function_call": null, + "refusal": null, + "role": "assistant", + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null + } + ], + "created": 1757550391, + "model": "Qwen/Qwen3-0.6B", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": "3.3.5-dev0-sha-1b90c50", + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "", + "choices": [ + { + "delta": { + "content": " to", + "function_call": null, + "refusal": null, + "role": "assistant", + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null + } + ], + "created": 1757550391, + "model": "Qwen/Qwen3-0.6B", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": "3.3.5-dev0-sha-1b90c50", + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "", + "choices": [ + { + "delta": { + "content": " mention", + "function_call": null, + "refusal": null, + "role": "assistant", + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null + } + ], + "created": 1757550391, + "model": "Qwen/Qwen3-0.6B", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": "3.3.5-dev0-sha-1b90c50", + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "", + "choices": [ + { + "delta": { + "content": " that", + "function_call": null, + "refusal": null, + "role": "assistant", + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null + } + ], + "created": 1757550391, + "model": "Qwen/Qwen3-0.6B", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": "3.3.5-dev0-sha-1b90c50", + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "", + "choices": [ + { + "delta": { + "content": " it", + "function_call": null, + "refusal": null, + "role": "assistant", + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null + } + ], + "created": 1757550391, + "model": "Qwen/Qwen3-0.6B", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": "3.3.5-dev0-sha-1b90c50", + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "", + "choices": [ + { + "delta": { + "content": "'s", + "function_call": null, + "refusal": null, + "role": "assistant", + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null + } + ], + "created": 1757550391, + "model": "Qwen/Qwen3-0.6B", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": "3.3.5-dev0-sha-1b90c50", + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "", + "choices": [ + { + "delta": { + "content": " a", + "function_call": null, + "refusal": null, + "role": "assistant", + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null + } + ], + "created": 1757550391, + "model": "Qwen/Qwen3-0.6B", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": "3.3.5-dev0-sha-1b90c50", + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "", + "choices": [ + { + "delta": { + "content": " simple", + "function_call": null, + "refusal": null, + "role": "assistant", + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null + } + ], + "created": 1757550391, + "model": "Qwen/Qwen3-0.6B", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": "3.3.5-dev0-sha-1b90c50", + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "", + "choices": [ + { + "delta": { + "content": " text", + "function_call": null, + "refusal": null, + "role": "assistant", + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null + } + ], + "created": 1757550391, + "model": "Qwen/Qwen3-0.6B", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": "3.3.5-dev0-sha-1b90c50", + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "", + "choices": [ + { + "delta": { + "content": " message", + "function_call": null, + "refusal": null, + "role": "assistant", + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null + } + ], + "created": 1757550391, + "model": "Qwen/Qwen3-0.6B", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": "3.3.5-dev0-sha-1b90c50", + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "", + "choices": [ + { + "delta": { + "content": " and", + "function_call": null, + "refusal": null, + "role": "assistant", + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null + } + ], + "created": 1757550391, + "model": "Qwen/Qwen3-0.6B", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": "3.3.5-dev0-sha-1b90c50", + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "", + "choices": [ + { + "delta": { + "content": " offer", + "function_call": null, + "refusal": null, + "role": "assistant", + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null + } + ], + "created": 1757550391, + "model": "Qwen/Qwen3-0.6B", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": "3.3.5-dev0-sha-1b90c50", + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "", + "choices": [ + { + "delta": { + "content": " help", + "function_call": null, + "refusal": null, + "role": "assistant", + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null + } + ], + "created": 1757550391, + "model": "Qwen/Qwen3-0.6B", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": "3.3.5-dev0-sha-1b90c50", + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "", + "choices": [ + { + "delta": { + "content": " if", + "function_call": null, + "refusal": null, + "role": "assistant", + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null + } + ], + "created": 1757550391, + "model": "Qwen/Qwen3-0.6B", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": "3.3.5-dev0-sha-1b90c50", + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "", + "choices": [ + { + "delta": { + "content": " they", + "function_call": null, + "refusal": null, + "role": "assistant", + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null + } + ], + "created": 1757550391, + "model": "Qwen/Qwen3-0.6B", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": "3.3.5-dev0-sha-1b90c50", + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "", + "choices": [ + { + "delta": { + "content": " need", + "function_call": null, + "refusal": null, + "role": "assistant", + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null + } + ], + "created": 1757550391, + "model": "Qwen/Qwen3-0.6B", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": "3.3.5-dev0-sha-1b90c50", + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "", + "choices": [ + { + "delta": { + "content": " anything", + "function_call": null, + "refusal": null, + "role": "assistant", + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null + } + ], + "created": 1757550391, + "model": "Qwen/Qwen3-0.6B", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": "3.3.5-dev0-sha-1b90c50", + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "", + "choices": [ + { + "delta": { + "content": " else", + "function_call": null, + "refusal": null, + "role": "assistant", + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null + } + ], + "created": 1757550391, + "model": "Qwen/Qwen3-0.6B", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": "3.3.5-dev0-sha-1b90c50", + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "", + "choices": [ + { + "delta": { + "content": ".", + "function_call": null, + "refusal": null, + "role": "assistant", + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null + } + ], + "created": 1757550391, + "model": "Qwen/Qwen3-0.6B", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": "3.3.5-dev0-sha-1b90c50", + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "", + "choices": [ + { + "delta": { + "content": " It", + "function_call": null, + "refusal": null, + "role": "assistant", + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null + } + ], + "created": 1757550391, + "model": "Qwen/Qwen3-0.6B", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": "3.3.5-dev0-sha-1b90c50", + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "", + "choices": [ + { + "delta": { + "content": "'s", + "function_call": null, + "refusal": null, + "role": "assistant", + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null + } + ], + "created": 1757550391, + "model": "Qwen/Qwen3-0.6B", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": "3.3.5-dev0-sha-1b90c50", + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "", + "choices": [ + { + "delta": { + "content": " good", + "function_call": null, + "refusal": null, + "role": "assistant", + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null + } + ], + "created": 1757550391, + "model": "Qwen/Qwen3-0.6B", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": "3.3.5-dev0-sha-1b90c50", + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "", + "choices": [ + { + "delta": { + "content": " to", + "function_call": null, + "refusal": null, + "role": "assistant", + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null + } + ], + "created": 1757550391, + "model": "Qwen/Qwen3-0.6B", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": "3.3.5-dev0-sha-1b90c50", + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "", + "choices": [ + { + "delta": { + "content": " keep", + "function_call": null, + "refusal": null, + "role": "assistant", + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null + } + ], + "created": 1757550391, + "model": "Qwen/Qwen3-0.6B", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": "3.3.5-dev0-sha-1b90c50", + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "", + "choices": [ + { + "delta": { + "content": " the", + "function_call": null, + "refusal": null, + "role": "assistant", + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null + } + ], + "created": 1757550391, + "model": "Qwen/Qwen3-0.6B", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": "3.3.5-dev0-sha-1b90c50", + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "", + "choices": [ + { + "delta": { + "content": " tone", + "function_call": null, + "refusal": null, + "role": "assistant", + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null + } + ], + "created": 1757550391, + "model": "Qwen/Qwen3-0.6B", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": "3.3.5-dev0-sha-1b90c50", + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "", + "choices": [ + { + "delta": { + "content": " positive", + "function_call": null, + "refusal": null, + "role": "assistant", + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null + } + ], + "created": 1757550391, + "model": "Qwen/Qwen3-0.6B", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": "3.3.5-dev0-sha-1b90c50", + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "", + "choices": [ + { + "delta": { + "content": " and", + "function_call": null, + "refusal": null, + "role": "assistant", + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null + } + ], + "created": 1757550391, + "model": "Qwen/Qwen3-0.6B", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": "3.3.5-dev0-sha-1b90c50", + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "", + "choices": [ + { + "delta": { + "content": " open", + "function_call": null, + "refusal": null, + "role": "assistant", + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null + } + ], + "created": 1757550391, + "model": "Qwen/Qwen3-0.6B", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": "3.3.5-dev0-sha-1b90c50", + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "", + "choices": [ + { + "delta": { + "content": "-ended", + "function_call": null, + "refusal": null, + "role": "assistant", + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null + } + ], + "created": 1757550391, + "model": "Qwen/Qwen3-0.6B", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": "3.3.5-dev0-sha-1b90c50", + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "", + "choices": [ + { + "delta": { + "content": " to", + "function_call": null, + "refusal": null, + "role": "assistant", + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null + } + ], + "created": 1757550391, + "model": "Qwen/Qwen3-0.6B", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": "3.3.5-dev0-sha-1b90c50", + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "", + "choices": [ + { + "delta": { + "content": " encourage", + "function_call": null, + "refusal": null, + "role": "assistant", + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null + } + ], + "created": 1757550391, + "model": "Qwen/Qwen3-0.6B", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": "3.3.5-dev0-sha-1b90c50", + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "", + "choices": [ + { + "delta": { + "content": " further", + "function_call": null, + "refusal": null, + "role": "assistant", + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null + } + ], + "created": 1757550391, + "model": "Qwen/Qwen3-0.6B", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": "3.3.5-dev0-sha-1b90c50", + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "", + "choices": [ + { + "delta": { + "content": " interactions", + "function_call": null, + "refusal": null, + "role": "assistant", + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null + } + ], + "created": 1757550391, + "model": "Qwen/Qwen3-0.6B", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": "3.3.5-dev0-sha-1b90c50", + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "", + "choices": [ + { + "delta": { + "content": ".\n", + "function_call": null, + "refusal": null, + "role": "assistant", + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null + } + ], + "created": 1757550391, + "model": "Qwen/Qwen3-0.6B", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": "3.3.5-dev0-sha-1b90c50", + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "", + "choices": [ + { + "delta": { + "content": "", + "function_call": null, + "refusal": null, + "role": "assistant", + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null + } + ], + "created": 1757550391, + "model": "Qwen/Qwen3-0.6B", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": "3.3.5-dev0-sha-1b90c50", + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "", + "choices": [ + { + "delta": { + "content": "\n\n", + "function_call": null, + "refusal": null, + "role": "assistant", + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null + } + ], + "created": 1757550391, + "model": "Qwen/Qwen3-0.6B", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": "3.3.5-dev0-sha-1b90c50", + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "", + "choices": [ + { + "delta": { + "content": "Hello", + "function_call": null, + "refusal": null, + "role": "assistant", + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null + } + ], + "created": 1757550391, + "model": "Qwen/Qwen3-0.6B", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": "3.3.5-dev0-sha-1b90c50", + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "", + "choices": [ + { + "delta": { + "content": ",", + "function_call": null, + "refusal": null, + "role": "assistant", + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null + } + ], + "created": 1757550391, + "model": "Qwen/Qwen3-0.6B", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": "3.3.5-dev0-sha-1b90c50", + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "", + "choices": [ + { + "delta": { + "content": " world", + "function_call": null, + "refusal": null, + "role": "assistant", + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null + } + ], + "created": 1757550391, + "model": "Qwen/Qwen3-0.6B", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": "3.3.5-dev0-sha-1b90c50", + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "", + "choices": [ + { + "delta": { + "content": "!", + "function_call": null, + "refusal": null, + "role": "assistant", + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null + } + ], + "created": 1757550391, + "model": "Qwen/Qwen3-0.6B", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": "3.3.5-dev0-sha-1b90c50", + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "", + "choices": [ + { + "delta": { + "content": "", + "function_call": null, + "refusal": null, + "role": "assistant", + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null + } + ], + "created": 1757550391, + "model": "Qwen/Qwen3-0.6B", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": "3.3.5-dev0-sha-1b90c50", + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "", + "choices": [ + { + "delta": { + "content": " \ud83d\ude0a", + "function_call": null, + "refusal": null, + "role": "assistant", + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null + } + ], + "created": 1757550391, + "model": "Qwen/Qwen3-0.6B", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": "3.3.5-dev0-sha-1b90c50", + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "", + "choices": [ + { + "delta": { + "content": " \n\n", + "function_call": null, + "refusal": null, + "role": "assistant", + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null + } + ], + "created": 1757550391, + "model": "Qwen/Qwen3-0.6B", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": "3.3.5-dev0-sha-1b90c50", + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "", + "choices": [ + { + "delta": { + "content": "This", + "function_call": null, + "refusal": null, + "role": "assistant", + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null + } + ], + "created": 1757550391, + "model": "Qwen/Qwen3-0.6B", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": "3.3.5-dev0-sha-1b90c50", + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "", + "choices": [ + { + "delta": { + "content": " is", + "function_call": null, + "refusal": null, + "role": "assistant", + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null + } + ], + "created": 1757550391, + "model": "Qwen/Qwen3-0.6B", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": "3.3.5-dev0-sha-1b90c50", + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "", + "choices": [ + { + "delta": { + "content": " a", + "function_call": null, + "refusal": null, + "role": "assistant", + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null + } + ], + "created": 1757550391, + "model": "Qwen/Qwen3-0.6B", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": "3.3.5-dev0-sha-1b90c50", + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "", + "choices": [ + { + "delta": { + "content": " simple", + "function_call": null, + "refusal": null, + "role": "assistant", + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null + } + ], + "created": 1757550391, + "model": "Qwen/Qwen3-0.6B", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": "3.3.5-dev0-sha-1b90c50", + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "", + "choices": [ + { + "delta": { + "content": " text", + "function_call": null, + "refusal": null, + "role": "assistant", + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null + } + ], + "created": 1757550391, + "model": "Qwen/Qwen3-0.6B", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": "3.3.5-dev0-sha-1b90c50", + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "", + "choices": [ + { + "delta": { + "content": " message", + "function_call": null, + "refusal": null, + "role": "assistant", + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null + } + ], + "created": 1757550391, + "model": "Qwen/Qwen3-0.6B", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": "3.3.5-dev0-sha-1b90c50", + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "", + "choices": [ + { + "delta": { + "content": ",", + "function_call": null, + "refusal": null, + "role": "assistant", + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null + } + ], + "created": 1757550391, + "model": "Qwen/Qwen3-0.6B", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": "3.3.5-dev0-sha-1b90c50", + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "", + "choices": [ + { + "delta": { + "content": " and", + "function_call": null, + "refusal": null, + "role": "assistant", + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null + } + ], + "created": 1757550391, + "model": "Qwen/Qwen3-0.6B", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": "3.3.5-dev0-sha-1b90c50", + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "", + "choices": [ + { + "delta": { + "content": " it", + "function_call": null, + "refusal": null, + "role": "assistant", + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null + } + ], + "created": 1757550391, + "model": "Qwen/Qwen3-0.6B", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": "3.3.5-dev0-sha-1b90c50", + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "", + "choices": [ + { + "delta": { + "content": "'s", + "function_call": null, + "refusal": null, + "role": "assistant", + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null + } + ], + "created": 1757550391, + "model": "Qwen/Qwen3-0.6B", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": "3.3.5-dev0-sha-1b90c50", + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "", + "choices": [ + { + "delta": { + "content": " often", + "function_call": null, + "refusal": null, + "role": "assistant", + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null + } + ], + "created": 1757550391, + "model": "Qwen/Qwen3-0.6B", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": "3.3.5-dev0-sha-1b90c50", + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "", + "choices": [ + { + "delta": { + "content": " used", + "function_call": null, + "refusal": null, + "role": "assistant", + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null + } + ], + "created": 1757550391, + "model": "Qwen/Qwen3-0.6B", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": "3.3.5-dev0-sha-1b90c50", + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "", + "choices": [ + { + "delta": { + "content": " to", + "function_call": null, + "refusal": null, + "role": "assistant", + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null + } + ], + "created": 1757550391, + "model": "Qwen/Qwen3-0.6B", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": "3.3.5-dev0-sha-1b90c50", + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "", + "choices": [ + { + "delta": { + "content": " greet", + "function_call": null, + "refusal": null, + "role": "assistant", + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null + } + ], + "created": 1757550391, + "model": "Qwen/Qwen3-0.6B", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": "3.3.5-dev0-sha-1b90c50", + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "", + "choices": [ + { + "delta": { + "content": " someone", + "function_call": null, + "refusal": null, + "role": "assistant", + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null + } + ], + "created": 1757550391, + "model": "Qwen/Qwen3-0.6B", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": "3.3.5-dev0-sha-1b90c50", + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "", + "choices": [ + { + "delta": { + "content": " or", + "function_call": null, + "refusal": null, + "role": "assistant", + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null + } + ], + "created": 1757550391, + "model": "Qwen/Qwen3-0.6B", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": "3.3.5-dev0-sha-1b90c50", + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "", + "choices": [ + { + "delta": { + "content": " start", + "function_call": null, + "refusal": null, + "role": "assistant", + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null + } + ], + "created": 1757550391, + "model": "Qwen/Qwen3-0.6B", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": "3.3.5-dev0-sha-1b90c50", + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "", + "choices": [ + { + "delta": { + "content": " a", + "function_call": null, + "refusal": null, + "role": "assistant", + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null + } + ], + "created": 1757550392, + "model": "Qwen/Qwen3-0.6B", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": "3.3.5-dev0-sha-1b90c50", + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "", + "choices": [ + { + "delta": { + "content": " conversation", + "function_call": null, + "refusal": null, + "role": "assistant", + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null + } + ], + "created": 1757550392, + "model": "Qwen/Qwen3-0.6B", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": "3.3.5-dev0-sha-1b90c50", + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "", + "choices": [ + { + "delta": { + "content": ".", + "function_call": null, + "refusal": null, + "role": "assistant", + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null + } + ], + "created": 1757550392, + "model": "Qwen/Qwen3-0.6B", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": "3.3.5-dev0-sha-1b90c50", + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "", + "choices": [ + { + "delta": { + "content": " Let", + "function_call": null, + "refusal": null, + "role": "assistant", + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null + } + ], + "created": 1757550392, + "model": "Qwen/Qwen3-0.6B", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": "3.3.5-dev0-sha-1b90c50", + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "", + "choices": [ + { + "delta": { + "content": " me", + "function_call": null, + "refusal": null, + "role": "assistant", + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null + } + ], + "created": 1757550392, + "model": "Qwen/Qwen3-0.6B", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": "3.3.5-dev0-sha-1b90c50", + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "", + "choices": [ + { + "delta": { + "content": " know", + "function_call": null, + "refusal": null, + "role": "assistant", + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null + } + ], + "created": 1757550392, + "model": "Qwen/Qwen3-0.6B", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": "3.3.5-dev0-sha-1b90c50", + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "", + "choices": [ + { + "delta": { + "content": " if", + "function_call": null, + "refusal": null, + "role": "assistant", + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null + } + ], + "created": 1757550392, + "model": "Qwen/Qwen3-0.6B", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": "3.3.5-dev0-sha-1b90c50", + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "", + "choices": [ + { + "delta": { + "content": " you", + "function_call": null, + "refusal": null, + "role": "assistant", + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null + } + ], + "created": 1757550392, + "model": "Qwen/Qwen3-0.6B", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": "3.3.5-dev0-sha-1b90c50", + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "", + "choices": [ + { + "delta": { + "content": " need", + "function_call": null, + "refusal": null, + "role": "assistant", + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null + } + ], + "created": 1757550392, + "model": "Qwen/Qwen3-0.6B", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": "3.3.5-dev0-sha-1b90c50", + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "", + "choices": [ + { + "delta": { + "content": " help", + "function_call": null, + "refusal": null, + "role": "assistant", + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null + } + ], + "created": 1757550392, + "model": "Qwen/Qwen3-0.6B", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": "3.3.5-dev0-sha-1b90c50", + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "", + "choices": [ + { + "delta": { + "content": " with", + "function_call": null, + "refusal": null, + "role": "assistant", + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null + } + ], + "created": 1757550392, + "model": "Qwen/Qwen3-0.6B", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": "3.3.5-dev0-sha-1b90c50", + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "", + "choices": [ + { + "delta": { + "content": " anything", + "function_call": null, + "refusal": null, + "role": "assistant", + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null + } + ], + "created": 1757550392, + "model": "Qwen/Qwen3-0.6B", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": "3.3.5-dev0-sha-1b90c50", + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "", + "choices": [ + { + "delta": { + "content": "!", + "function_call": null, + "refusal": null, + "role": "assistant", + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null + } + ], + "created": 1757550392, + "model": "Qwen/Qwen3-0.6B", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": "3.3.5-dev0-sha-1b90c50", + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "", + "choices": [ + { + "delta": { + "content": "", + "function_call": null, + "refusal": null, + "role": "assistant", + "tool_calls": null + }, + "finish_reason": "stop", + "index": 0, + "logprobs": null + } + ], + "created": 1757550392, + "model": "Qwen/Qwen3-0.6B", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": "3.3.5-dev0-sha-1b90c50", + "usage": null + } + } + ], + "is_streaming": true + } +} diff --git a/tests/integration/suites.py b/tests/integration/suites.py index bacd7ef52..3779b8ba0 100644 --- a/tests/integration/suites.py +++ b/tests/integration/suites.py @@ -90,6 +90,16 @@ SETUP_DEFINITIONS: dict[str, Setup] = { "embedding_model": "sentence-transformers/all-MiniLM-L6-v2", }, ), + "tgi": Setup( + name="tgi", + description="Text Generation Inference (TGI) provider with a text model", + env={ + "TGI_URL": "http://localhost:8080", + }, + defaults={ + "text_model": "tgi/Qwen/Qwen3-0.6B", + }, + ), } From 65d45c731849ec0324d45066d38923c921326791 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C3=A9bastien=20Han?= Date: Tue, 16 Sep 2025 13:55:10 +0200 Subject: [PATCH 097/150] chore: various watsonx fixes (#3428) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit # What does this PR do? use a logger * update the distro to add the Files API otherwise it won't start since it is a dependency of vector * clarify project_id and api_key requirements * disable openai compatible calls since the endpoint returns 404 * disable text_inference structured format tests * fixed openai client initialization ## Test Plan Execute text_inference: ``` WATSONX_API_KEY=... WATSONX_PROJECT_ID=... python -m llama_stack.core.server.server llama_stack/distributions/watsonx/run.yaml LLAMA_STACK_CONFIG=http://localhost:8321 uv run --group test pytest -vvvv -ra --text-model watsonx/meta-llama/llama-3-3-70b-instruct tests/integration/inference/test_text_inference.py ============================================= test session starts ============================================== platform darwin -- Python 3.12.8, pytest-8.4.2, pluggy-1.6.0 -- /Users/leseb/Documents/AI/llama-stack/.venv/bin/python3 cachedir: .pytest_cache metadata: {'Python': '3.12.8', 'Platform': 'macOS-15.6.1-arm64-arm-64bit', 'Packages': {'pytest': '8.4.2', 'pluggy': '1.6.0'}, 'Plugins': {'anyio': '4.9.0', 'html': '4.1.1', 'socket': '0.7.0', 'asyncio': '1.1.0', 'json-report': '1.5.0', 'timeout': '2.4.0', 'metadata': '3.1.1', 'cov': '6.2.1', 'nbval': '0.11.0', 'hydra-core': '1.3.2'}} rootdir: /Users/leseb/Documents/AI/llama-stack configfile: pyproject.toml plugins: anyio-4.9.0, html-4.1.1, socket-0.7.0, asyncio-1.1.0, json-report-1.5.0, timeout-2.4.0, metadata-3.1.1, cov-6.2.1, nbval-0.11.0, hydra-core-1.3.2 asyncio: mode=Mode.AUTO, asyncio_default_fixture_loop_scope=None, asyncio_default_test_loop_scope=function collected 20 items tests/integration/inference/test_text_inference.py::test_text_completion_non_streaming[txt=watsonx/meta-llama/llama-3-3-70b-instruct-inference:completion:sanity] PASSED [ 5%] tests/integration/inference/test_text_inference.py::test_text_completion_streaming[txt=watsonx/meta-llama/llama-3-3-70b-instruct-inference:completion:sanity] PASSED [ 10%] tests/integration/inference/test_text_inference.py::test_text_completion_stop_sequence[txt=watsonx/meta-llama/llama-3-3-70b-instruct-inference:completion:stop_sequence] XFAIL [ 15%] tests/integration/inference/test_text_inference.py::test_text_completion_log_probs_non_streaming[txt=watsonx/meta-llama/llama-3-3-70b-instruct-inference:completion:log_probs] XFAIL [ 20%] tests/integration/inference/test_text_inference.py::test_text_completion_log_probs_streaming[txt=watsonx/meta-llama/llama-3-3-70b-instruct-inference:completion:log_probs] XFAIL [ 25%] tests/integration/inference/test_text_inference.py::test_text_completion_structured_output[txt=watsonx/meta-llama/llama-3-3-70b-instruct-inference:completion:structured_output] SKIPPED structured output) [ 30%] tests/integration/inference/test_text_inference.py::test_text_chat_completion_non_streaming[txt=watsonx/meta-llama/llama-3-3-70b-instruct-inference:chat_completion:non_streaming_01] PASSED [ 35%] tests/integration/inference/test_text_inference.py::test_text_chat_completion_streaming[txt=watsonx/meta-llama/llama-3-3-70b-instruct-inference:chat_completion:streaming_01] PASSED [ 40%] tests/integration/inference/test_text_inference.py::test_text_chat_completion_with_tool_calling_and_non_streaming[txt=watsonx/meta-llama/llama-3-3-70b-instruct-inference:chat_completion:tool_calling] PASSED [ 45%] tests/integration/inference/test_text_inference.py::test_text_chat_completion_with_tool_calling_and_streaming[txt=watsonx/meta-llama/llama-3-3-70b-instruct-inference:chat_completion:tool_calling] PASSED [ 50%] tests/integration/inference/test_text_inference.py::test_text_chat_completion_with_tool_choice_required[txt=watsonx/meta-llama/llama-3-3-70b-instruct-inference:chat_completion:tool_calling] PASSED [ 55%] tests/integration/inference/test_text_inference.py::test_text_chat_completion_with_tool_choice_none[txt=watsonx/meta-llama/llama-3-3-70b-instruct-inference:chat_completion:tool_calling] PASSED [ 60%] tests/integration/inference/test_text_inference.py::test_text_chat_completion_structured_output[txt=watsonx/meta-llama/llama-3-3-70b-instruct-inference:chat_completion:structured_output] SKIPPEDstructured output) [ 65%] tests/integration/inference/test_text_inference.py::test_text_chat_completion_tool_calling_tools_not_in_request[txt=watsonx/meta-llama/llama-3-3-70b-instruct-inference:chat_completion:tool_calling_tools_absent-True] PASSED [ 70%] tests/integration/inference/test_text_inference.py::test_text_chat_completion_with_multi_turn_tool_calling[txt=watsonx/meta-llama/llama-3-3-70b-instruct-inference:chat_completion:text_then_tool] XFAIL [ 75%] tests/integration/inference/test_text_inference.py::test_text_chat_completion_non_streaming[txt=watsonx/meta-llama/llama-3-3-70b-instruct-inference:chat_completion:non_streaming_02] PASSED [ 80%] tests/integration/inference/test_text_inference.py::test_text_chat_completion_streaming[txt=watsonx/meta-llama/llama-3-3-70b-instruct-inference:chat_completion:streaming_02] PASSED [ 85%] tests/integration/inference/test_text_inference.py::test_text_chat_completion_tool_calling_tools_not_in_request[txt=watsonx/meta-llama/llama-3-3-70b-instruct-inference:chat_completion:tool_calling_tools_absent-False] PASSED [ 90%] tests/integration/inference/test_text_inference.py::test_text_chat_completion_with_multi_turn_tool_calling[txt=watsonx/meta-llama/llama-3-3-70b-instruct-inference:chat_completion:tool_then_answer] XFAIL [ 95%] tests/integration/inference/test_text_inference.py::test_text_chat_completion_with_multi_turn_tool_calling[txt=watsonx/meta-llama/llama-3-3-70b-instruct-inference:chat_completion:array_parameter] XFAIL [100%] =========================================== short test summary info ============================================ SKIPPED [2] tests/integration/inference/test_text_inference.py:49: Model watsonx/meta-llama/llama-3-3-70b-instruct hosted by remote::watsonx doesn't support json_schema structured output XFAIL tests/integration/inference/test_text_inference.py::test_text_completion_stop_sequence[txt=watsonx/meta-llama/llama-3-3-70b-instruct-inference:completion:stop_sequence] - remote::watsonx doesn't support 'stop' parameter yet XFAIL tests/integration/inference/test_text_inference.py::test_text_completion_log_probs_non_streaming[txt=watsonx/meta-llama/llama-3-3-70b-instruct-inference:completion:log_probs] - remote::watsonx doesn't support log probs yet XFAIL tests/integration/inference/test_text_inference.py::test_text_completion_log_probs_streaming[txt=watsonx/meta-llama/llama-3-3-70b-instruct-inference:completion:log_probs] - remote::watsonx doesn't support log probs yet XFAIL tests/integration/inference/test_text_inference.py::test_text_chat_completion_with_multi_turn_tool_calling[txt=watsonx/meta-llama/llama-3-3-70b-instruct-inference:chat_completion:text_then_tool] - Not tested for non-llama4 models yet XFAIL tests/integration/inference/test_text_inference.py::test_text_chat_completion_with_multi_turn_tool_calling[txt=watsonx/meta-llama/llama-3-3-70b-instruct-inference:chat_completion:tool_then_answer] - Not tested for non-llama4 models yet XFAIL tests/integration/inference/test_text_inference.py::test_text_chat_completion_with_multi_turn_tool_calling[txt=watsonx/meta-llama/llama-3-3-70b-instruct-inference:chat_completion:array_parameter] - Not tested for non-llama4 models yet ============================ 12 passed, 2 skipped, 6 xfailed, 14 warnings in 36.88s ============================ ``` --------- Signed-off-by: Sébastien Han --- .../providers/inference/remote_watsonx.md | 4 ++-- llama_stack/distributions/watsonx/run.yaml | 9 +++++++++ llama_stack/distributions/watsonx/watsonx.py | 12 +++++++++-- .../remote/inference/watsonx/config.py | 4 ++-- .../remote/inference/watsonx/watsonx.py | 20 +++++++++++++++++-- .../inference/test_openai_completion.py | 2 ++ .../inference/test_text_inference.py | 3 ++- 7 files changed, 45 insertions(+), 9 deletions(-) diff --git a/docs/source/providers/inference/remote_watsonx.md b/docs/source/providers/inference/remote_watsonx.md index 0eb8a6fc4..e885a07fc 100644 --- a/docs/source/providers/inference/remote_watsonx.md +++ b/docs/source/providers/inference/remote_watsonx.md @@ -9,8 +9,8 @@ IBM WatsonX inference provider for accessing AI models on IBM's WatsonX platform | Field | Type | Required | Default | Description | |-------|------|----------|---------|-------------| | `url` | `` | No | https://us-south.ml.cloud.ibm.com | A base url for accessing the watsonx.ai | -| `api_key` | `pydantic.types.SecretStr \| None` | No | | The watsonx API key, only needed of using the hosted service | -| `project_id` | `str \| None` | No | | The Project ID key, only needed of using the hosted service | +| `api_key` | `pydantic.types.SecretStr \| None` | No | | The watsonx API key | +| `project_id` | `str \| None` | No | | The Project ID key | | `timeout` | `` | No | 60 | Timeout for the HTTP requests | ## Sample Configuration diff --git a/llama_stack/distributions/watsonx/run.yaml b/llama_stack/distributions/watsonx/run.yaml index f5fe31bef..92f367910 100644 --- a/llama_stack/distributions/watsonx/run.yaml +++ b/llama_stack/distributions/watsonx/run.yaml @@ -10,6 +10,7 @@ apis: - telemetry - tool_runtime - vector_io +- files providers: inference: - provider_id: watsonx @@ -94,6 +95,14 @@ providers: provider_type: inline::rag-runtime - provider_id: model-context-protocol provider_type: remote::model-context-protocol + files: + - provider_id: meta-reference-files + provider_type: inline::localfs + config: + storage_dir: ${env.FILES_STORAGE_DIR:=~/.llama/distributions/watsonx/files} + metadata_store: + type: sqlite + db_path: ${env.SQLITE_STORE_DIR:=~/.llama/distributions/watsonx}/files_metadata.db metadata_store: type: sqlite db_path: ${env.SQLITE_STORE_DIR:=~/.llama/distributions/watsonx}/registry.db diff --git a/llama_stack/distributions/watsonx/watsonx.py b/llama_stack/distributions/watsonx/watsonx.py index 1ef2ef339..c3cab5d1b 100644 --- a/llama_stack/distributions/watsonx/watsonx.py +++ b/llama_stack/distributions/watsonx/watsonx.py @@ -9,6 +9,7 @@ from pathlib import Path from llama_stack.apis.models import ModelType from llama_stack.core.datatypes import BuildProvider, ModelInput, Provider, ToolGroupInput from llama_stack.distributions.template import DistributionTemplate, RunConfigSettings, get_model_registry +from llama_stack.providers.inline.files.localfs.config import LocalfsFilesImplConfig from llama_stack.providers.inline.inference.sentence_transformers import ( SentenceTransformersInferenceConfig, ) @@ -16,7 +17,7 @@ from llama_stack.providers.remote.inference.watsonx import WatsonXConfig from llama_stack.providers.remote.inference.watsonx.models import MODEL_ENTRIES -def get_distribution_template() -> DistributionTemplate: +def get_distribution_template(name: str = "watsonx") -> DistributionTemplate: providers = { "inference": [ BuildProvider(provider_type="remote::watsonx"), @@ -42,6 +43,7 @@ def get_distribution_template() -> DistributionTemplate: BuildProvider(provider_type="inline::rag-runtime"), BuildProvider(provider_type="remote::model-context-protocol"), ], + "files": [BuildProvider(provider_type="inline::localfs")], } inference_provider = Provider( @@ -79,9 +81,14 @@ def get_distribution_template() -> DistributionTemplate: }, ) + files_provider = Provider( + provider_id="meta-reference-files", + provider_type="inline::localfs", + config=LocalfsFilesImplConfig.sample_run_config(f"~/.llama/distributions/{name}"), + ) default_models, _ = get_model_registry(available_models) return DistributionTemplate( - name="watsonx", + name=name, distro_type="remote_hosted", description="Use watsonx for running LLM inference", container_image=None, @@ -92,6 +99,7 @@ def get_distribution_template() -> DistributionTemplate: "run.yaml": RunConfigSettings( provider_overrides={ "inference": [inference_provider, embedding_provider], + "files": [files_provider], }, default_models=default_models + [embedding_model], default_tool_groups=default_tool_groups, diff --git a/llama_stack/providers/remote/inference/watsonx/config.py b/llama_stack/providers/remote/inference/watsonx/config.py index ae4bd55c1..42c25d93e 100644 --- a/llama_stack/providers/remote/inference/watsonx/config.py +++ b/llama_stack/providers/remote/inference/watsonx/config.py @@ -26,11 +26,11 @@ class WatsonXConfig(BaseModel): ) api_key: SecretStr | None = Field( default_factory=lambda: os.getenv("WATSONX_API_KEY"), - description="The watsonx API key, only needed of using the hosted service", + description="The watsonx API key", ) project_id: str | None = Field( default_factory=lambda: os.getenv("WATSONX_PROJECT_ID"), - description="The Project ID key, only needed of using the hosted service", + description="The Project ID key", ) timeout: int = Field( default=60, diff --git a/llama_stack/providers/remote/inference/watsonx/watsonx.py b/llama_stack/providers/remote/inference/watsonx/watsonx.py index cb7fc175f..ab5ca76db 100644 --- a/llama_stack/providers/remote/inference/watsonx/watsonx.py +++ b/llama_stack/providers/remote/inference/watsonx/watsonx.py @@ -38,6 +38,7 @@ from llama_stack.apis.inference import ( TopKSamplingStrategy, TopPSamplingStrategy, ) +from llama_stack.log import get_logger from llama_stack.providers.utils.inference.model_registry import ModelRegistryHelper from llama_stack.providers.utils.inference.openai_compat import ( OpenAICompatCompletionChoice, @@ -57,14 +58,29 @@ from llama_stack.providers.utils.inference.prompt_adapter import ( from . import WatsonXConfig from .models import MODEL_ENTRIES +logger = get_logger(name=__name__, category="inference::watsonx") + + +# Note on structured output +# WatsonX returns responses with a json embedded into a string. +# Examples: + +# ChatCompletionResponse(completion_message=CompletionMessage(content='```json\n{\n +# "first_name": "Michael",\n "last_name": "Jordan",\n'...) +# Not even a valid JSON, but we can still extract the JSON from the content + +# CompletionResponse(content=' \nThe best answer is $\\boxed{\\{"name": "Michael Jordan", +# "year_born": "1963", "year_retired": "2003"\\}}$') +# Find the start of the boxed content + class WatsonXInferenceAdapter(Inference, ModelRegistryHelper): def __init__(self, config: WatsonXConfig) -> None: ModelRegistryHelper.__init__(self, MODEL_ENTRIES) - print(f"Initializing watsonx InferenceAdapter({config.url})...") - + logger.info(f"Initializing watsonx InferenceAdapter({config.url})...") self._config = config + self._openai_client: AsyncOpenAI | None = None self._project_id = self._config.project_id diff --git a/tests/integration/inference/test_openai_completion.py b/tests/integration/inference/test_openai_completion.py index 35869276b..051529719 100644 --- a/tests/integration/inference/test_openai_completion.py +++ b/tests/integration/inference/test_openai_completion.py @@ -58,6 +58,7 @@ def skip_if_model_doesnt_support_openai_completion(client_with_models, model_id) # does not work with the specified model, gpt-5-mini. Please choose different model and try # again. You can learn more about which models can be used with each operation here: # https://go.microsoft.com/fwlink/?linkid=2197993.'}}"} + "remote::watsonx", # return 404 when hitting the /openai/v1 endpoint ): pytest.skip(f"Model {model_id} hosted by {provider.provider_type} doesn't support OpenAI completions.") @@ -110,6 +111,7 @@ def skip_if_model_doesnt_support_openai_chat_completion(client_with_models, mode "remote::cerebras", "remote::databricks", "remote::runpod", + "remote::watsonx", # watsonx returns 404 when hitting the /openai/v1 endpoint ): pytest.skip(f"Model {model_id} hosted by {provider.provider_type} doesn't support OpenAI chat completions.") diff --git a/tests/integration/inference/test_text_inference.py b/tests/integration/inference/test_text_inference.py index 621084231..a5f95a963 100644 --- a/tests/integration/inference/test_text_inference.py +++ b/tests/integration/inference/test_text_inference.py @@ -45,7 +45,7 @@ def skip_if_model_doesnt_support_json_schema_structured_output(client_with_model provider_id = models[model_id].provider_id providers = {p.provider_id: p for p in client_with_models.providers.list()} provider = providers[provider_id] - if provider.provider_type in ("remote::sambanova", "remote::azure"): + if provider.provider_type in ("remote::sambanova", "remote::azure", "remote::watsonx"): pytest.skip( f"Model {model_id} hosted by {provider.provider_type} doesn't support json_schema structured output" ) @@ -211,6 +211,7 @@ def test_text_completion_log_probs_streaming(client_with_models, text_model_id, ) def test_text_completion_structured_output(client_with_models, text_model_id, test_case): skip_if_model_doesnt_support_completion(client_with_models, text_model_id) + skip_if_model_doesnt_support_json_schema_structured_output(client_with_models, text_model_id) class AnswerFormat(BaseModel): name: str From 6b855af96fe2c344a2e13fbfa43bc1836d4136f6 Mon Sep 17 00:00:00 2001 From: Charlie Doern Date: Tue, 16 Sep 2025 12:18:36 -0400 Subject: [PATCH 098/150] feat: introduce api leveling proposal (#3317) # What does this PR do? this document outlines different API stability levels, how to enforce them, and next steps ## Next Steps Following the adoption of this document, all existing APIs should follow the enforcement protocol. relates to #3237 Signed-off-by: Charlie Doern --- docs/source/apis/api_leveling.md | 94 ++++++++++++++++++++++++++++++++ 1 file changed, 94 insertions(+) create mode 100644 docs/source/apis/api_leveling.md diff --git a/docs/source/apis/api_leveling.md b/docs/source/apis/api_leveling.md new file mode 100644 index 000000000..bb012030f --- /dev/null +++ b/docs/source/apis/api_leveling.md @@ -0,0 +1,94 @@ +# Llama Stack API Stability Leveling + +In order to provide a stable experience in Llama Stack, the various APIs need different stability levels indicating the level of support, backwards compatability, and overall production readiness. + +## Different Levels + +### v1alpha + +- Little to no expectation of support between versions +- Breaking changes are permitted +- Datatypes and parameters can break +- Routes can be added and removed + +#### Graduation Criteria + +- an API can graduate from `v1alpha` to `v1beta` if the team has identified the extent of the non-optional routes and the shape of their parameters/return types for the API eg. `/v1/openai/chat/completions`. Optional types can change. +- CRUD must stay stable once in `v1beta`. This is a commitment to backward compatibility, guaranteeing that most code you write against the v1beta version will not break during future updates. We may make additive changes (like adding a new, optional field to a response), but we will not make breaking changes (like renaming an existing "modelName" field to "name", changing an ID's data type from an integer to a string, or altering an endpoint URL). +- for OpenAI APIs, a comparison to the OpenAI spec for the specific API can be done to ensure completeness. + +### v1beta + +- API routes remain consistent between versions +- Parameters and return types are not ensured between versions +- API, besides minor fixes and adjustments, should be _almost_ v1. Changes should not be drastic. + +#### Graduation Criteria + +- an API can graduate from `v1beta` to `v1` if the API surface and datatypes are complete as identified by the team. The parameters and return types that are mandatory for each route are stable. All aspects of graduating from `v1alpha1` to `v1beta` apply as well. +- Optional parameters, routes, or parts of the return type can be added after graduating to `v1` + +### v1 (stable) + +- Considered stable +- Backwards compatible between Z-streams + - Y-stream breaking changes must go through the proper approval and announcement process. +- Datatypes for a route and its return types cannot change between Z-streams + - Y-stream datatype changes should be sparing, unless the changes are additional net-new parameters +- Must have proper conformance testing as outlined in https://github.com/llamastack/llama-stack/issues/3237 + +### v2+ (Major Versions) + +Introducing a new major version like `/v2` is a significant and disruptive event that should be treated as a last resort. It is reserved for essential changes to a stable `/v1` API that are fundamentally backward-incompatible and cannot be implemented through additive, non-breaking changes or breaking changes across X/Y-Stream releases (x.y.z). + +If a `/v2` version is deemed absolutely necessary, it must adhere to the following protocol to ensure a sane and predictable transition for users: + +#### Lifecycle Progression + + A new major version must follow the same stability lifecycle as `/v1`. It will be introduced as `/v2alpha`, mature to `/v2beta`, and finally become stable as `/v2`. + +#### Coexistence: + +The new `/v2` API must be introduced alongside the existing `/v1` API and run in parallel. It must not replace the `/v1` API immediately. + +#### Deprecation Policy: + +When a `/v2` API is introduced, a clear and generous deprecation policy for the `/v1` API must be published simultaneously. This policy must outline the timeline for the eventual removal of the `/v1` API, giving users ample time to migrate. + +### API Stability vs. Provider Stability + +The leveling introduced in this document relates to the stability of the API and not specifically the providers within the API. + +Providers can iterate as much as they want on functionality as long as they work within the bounds of an API. If they need to change the API, then the API should not be `/v1`, or those breaking changes can only happen on a y-stream release basis. + +### Approval and Announcement Process for Breaking Changes + +- **PR Labeling**: Any pull request that introduces a breaking API change must be clearly labeled with `breaking-change`. +- **PR Title/Commit**: Any pull request that introduces a breaking API change must contain `BREAKING CHANGE` in the title and commit footer. Alternatively, the commit can include `!`, eg. `feat(api)!: title goes here` This is outlined in the [conventional commits documentation](https://www.conventionalcommits.org/en/v1.0.0/#specification) +- **Maintainer Review**: At least one maintainer must explicitly acknowledge the breaking change during review by applying the `breaking-change` label. An approval must come with this label or the acknowledgement this label has already been applied. +- **Announcement**: Breaking changes require inclusion in release notes and, if applicable, a separate communication (e.g., Discord, Github Issues, or GitHub Discussions) prior to release. + +If a PR has proper approvals, labels, and commit/title hygiene, the failing API conformance tests will be bypassed. + + +## Enforcement + +### Migration of API routes under `/v1alpha`, `/v1beta`, and `/v1` + +Instead of placing every API under `/v1`, any API that is not fully stable or complete should go under `/v1alpha` or `/v1beta`. For example, at the time of this writing, `post_training` belongs here, as well as any OpenAI-compatible API whose surface does not exactly match the upstream OpenAI API it mimics. + +This migration is crucial as we get Llama Stack in the hands of users who intend to productize various APIs. A clear view of what is stable and what is actively being developed will enable users to pick and choose various APIs to build their products on. + +This migration will be a breaking change for any API moving out of `/v1`. Ideally, this should happen before 0.3.0 and especially 1.0.0. + +### `x-stability` tags in the OpenAPI spec for oasdiff + +`x-stability` tags allow tools like oasdiff to enforce different rules for different stability levels; these tags should match the routes: [oasdiff stability](https://github.com/oasdiff/oasdiff/blob/main/docs/STABILITY.md) + +### Testing + +The testing of each stable API is already outlined in [issue #3237](https://github.com/llamastack/llama-stack/issues/3237) and is being worked on. These sorts of conformance tests should apply primarily to `/v1` APIs only, with `/v1alpha` and `/v1beta` having any tests the maintainers see fit as well as basic testing to ensure the routing works properly. + +### New APIs going forward + +Any subsequently introduced APIs should be introduced as `/v1alpha` \ No newline at end of file From 3defdf7d3a58e9c6e66666d4121fd7a7ddf45e9e Mon Sep 17 00:00:00 2001 From: slekkala1 Date: Tue, 16 Sep 2025 11:33:43 -0700 Subject: [PATCH 099/150] fix: docker failing to start container[pydantic] (#3460) # What does this PR do? Pinning to latest pydantic version 2.11.9 as sometime we are picking older version and failing to start container in github actions : https://github.com/llamastack/llama-stack-ops/actions/runs/17750263127 Closes https://github.com/llamastack/llama-stack/issues/3461 ## Test Plan Tested locally with the following commands to start a container Build container `llama stack build --distro starter --image-type container` start container `docker run -d -p 8321:8321 --name llama-stack-test distribution-starter:0.2.21` check health http://localhost:8321/v1/health Couldnt repro with older version(`2.8.2`), but `2.11.9` pydantic is able to start the container https://pypi.org/project/pydantic/#history , 2.11.9 is the latest version --- pyproject.toml | 4 ++-- uv.lock | 10 +++++----- 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/pyproject.toml b/pyproject.toml index ce95b758f..0950c0dc2 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -36,7 +36,7 @@ dependencies = [ "prompt-toolkit", "python-dotenv", "python-jose[cryptography]", - "pydantic>=2", + "pydantic>=2.11.9", "rich", "starlette", "termcolor", @@ -141,7 +141,7 @@ docs = [ "sphinxcontrib.openapi", "requests", ] -codegen = ["rich", "pydantic", "jinja2>=3.1.6"] +codegen = ["rich", "pydantic>=2.11.9", "jinja2>=3.1.6"] benchmark = [ "locust>=2.39.1", ] diff --git a/uv.lock b/uv.lock index 065eb3876..14848d2d4 100644 --- a/uv.lock +++ b/uv.lock @@ -1893,7 +1893,7 @@ requires-dist = [ { name = "pandas", marker = "extra == 'ui'" }, { name = "pillow" }, { name = "prompt-toolkit" }, - { name = "pydantic", specifier = ">=2" }, + { name = "pydantic", specifier = ">=2.11.9" }, { name = "python-dotenv" }, { name = "python-jose", extras = ["cryptography"] }, { name = "python-multipart", specifier = ">=0.0.20" }, @@ -1911,7 +1911,7 @@ provides-extras = ["ui"] benchmark = [{ name = "locust", specifier = ">=2.39.1" }] codegen = [ { name = "jinja2", specifier = ">=3.1.6" }, - { name = "pydantic" }, + { name = "pydantic", specifier = ">=2.11.9" }, { name = "rich" }, ] dev = [ @@ -3393,7 +3393,7 @@ wheels = [ [[package]] name = "pydantic" -version = "2.11.7" +version = "2.11.9" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "annotated-types" }, @@ -3401,9 +3401,9 @@ dependencies = [ { name = "typing-extensions" }, { name = "typing-inspection" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/00/dd/4325abf92c39ba8623b5af936ddb36ffcfe0beae70405d456ab1fb2f5b8c/pydantic-2.11.7.tar.gz", hash = "sha256:d989c3c6cb79469287b1569f7447a17848c998458d49ebe294e975b9baf0f0db", size = 788350, upload-time = "2025-06-14T08:33:17.137Z" } +sdist = { url = "https://files.pythonhosted.org/packages/ff/5d/09a551ba512d7ca404d785072700d3f6727a02f6f3c24ecfd081c7cf0aa8/pydantic-2.11.9.tar.gz", hash = "sha256:6b8ffda597a14812a7975c90b82a8a2e777d9257aba3453f973acd3c032a18e2", size = 788495, upload-time = "2025-09-13T11:26:39.325Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/6a/c0/ec2b1c8712ca690e5d61979dee872603e92b8a32f94cc1b72d53beab008a/pydantic-2.11.7-py3-none-any.whl", hash = "sha256:dde5df002701f6de26248661f6835bbe296a47bf73990135c7d07ce741b9623b", size = 444782, upload-time = "2025-06-14T08:33:14.905Z" }, + { url = "https://files.pythonhosted.org/packages/3e/d3/108f2006987c58e76691d5ae5d200dd3e0f532cb4e5fa3560751c3a1feba/pydantic-2.11.9-py3-none-any.whl", hash = "sha256:c42dd626f5cfc1c6950ce6205ea58c93efa406da65f479dcb4029d5934857da2", size = 444855, upload-time = "2025-09-13T11:26:36.909Z" }, ] [[package]] From 49d4a5cc8456ddb7dfd06c4a07ad871cfd7b2e66 Mon Sep 17 00:00:00 2001 From: Matthew Farrellee Date: Tue, 16 Sep 2025 14:53:41 -0400 Subject: [PATCH 100/150] feat: add embedding and dynamic model support to Together inference adapter (#3458) # What does this PR do? adds embedding and dynamic model support to Together inference adapter - updated to use OpenAIMixin - workarounds for Together api quirks - recordings for together suite when subdirs=inference,pattern=openai ## Test Plan ``` $ TOGETHER_API_KEY=_NONE_ ./scripts/integration-tests.sh --stack-config server:ci-tests --setup together --subdirs inference --pattern openai ... tests/integration/inference/test_openai_completion.py::test_openai_completion_non_streaming[txt=together/meta-llama/Llama-3.3-70B-Instruct-Turbo-Free-inference:completion:sanity] instantiating llama_stack_client Port 8321 is already in use, assuming server is already running... llama_stack_client instantiated in 0.121s PASSED [ 2%] tests/integration/inference/test_openai_completion.py::test_openai_completion_non_streaming_suffix[txt=together/meta-llama/Llama-3.3-70B-Instruct-Turbo-Free-inference:completion:suffix] SKIPPED [ 4%] tests/integration/inference/test_openai_completion.py::test_openai_completion_streaming[txt=together/meta-llama/Llama-3.3-70B-Instruct-Turbo-Free-inference:completion:sanity] PASSED [ 6%] tests/integration/inference/test_openai_completion.py::test_openai_completion_prompt_logprobs[txt=together/meta-llama/Llama-3.3-70B-Instruct-Turbo-Free-1] SKIPPED [ 8%] tests/integration/inference/test_openai_completion.py::test_openai_completion_guided_choice[txt=together/meta-llama/Llama-3.3-70B-Instruct-Turbo-Free] SKIPPED [ 10%] tests/integration/inference/test_openai_completion.py::test_openai_chat_completion_non_streaming[openai_client-txt=together/meta-llama/Llama-3.3-70B-Instruct-Turbo-Free-inference:chat_completion:non_streaming_01] PASSED [ 12%] tests/integration/inference/test_openai_completion.py::test_openai_chat_completion_streaming[openai_client-txt=together/meta-llama/Llama-3.3-70B-Instruct-Turbo-Free-inference:chat_completion:streaming_01] PASSED [ 14%] tests/integration/inference/test_openai_completion.py::test_openai_chat_completion_streaming_with_n[openai_client-txt=together/meta-llama/Llama-3.3-70B-Instruct-Turbo-Free-inference:chat_completion:streaming_01] SKIPPED [ 17%] tests/integration/inference/test_openai_completion.py::test_inference_store[openai_client-txt=together/meta-llama/Llama-3.3-70B-Instruct-Turbo-Free-True] PASSED [ 19%] tests/integration/inference/test_openai_completion.py::test_inference_store_tool_calls[openai_client-txt=together/meta-llama/Llama-3.3-70B-Instruct-Turbo-Free-True] PASSED [ 21%] tests/integration/inference/test_openai_completion.py::test_openai_chat_completion_non_streaming_with_file[txt=together/meta-llama/Llama-3.3-70B-Instruct-Turbo-Free] SKIPPED [ 23%] tests/integration/inference/test_openai_embeddings.py::test_openai_embeddings_single_string[openai_client-emb=together/togethercomputer/m2-bert-80M-32k-retrieval] PASSED [ 25%] tests/integration/inference/test_openai_embeddings.py::test_openai_embeddings_multiple_strings[openai_client-emb=together/togethercomputer/m2-bert-80M-32k-retrieval] PASSED [ 27%] tests/integration/inference/test_openai_embeddings.py::test_openai_embeddings_with_encoding_format_float[openai_client-emb=together/togethercomputer/m2-bert-80M-32k-retrieval] PASSED [ 29%] tests/integration/inference/test_openai_embeddings.py::test_openai_embeddings_with_dimensions[openai_client-emb=together/togethercomputer/m2-bert-80M-32k-retrieval] SKIPPED [ 31%] tests/integration/inference/test_openai_embeddings.py::test_openai_embeddings_with_user_parameter[openai_client-emb=together/togethercomputer/m2-bert-80M-32k-retrieval] SKIPPED [ 34%] tests/integration/inference/test_openai_embeddings.py::test_openai_embeddings_empty_list_error[openai_client-emb=together/togethercomputer/m2-bert-80M-32k-retrieval] PASSED [ 36%] tests/integration/inference/test_openai_embeddings.py::test_openai_embeddings_invalid_model_error[openai_client-emb=together/togethercomputer/m2-bert-80M-32k-retrieval] PASSED [ 38%] tests/integration/inference/test_openai_embeddings.py::test_openai_embeddings_different_inputs_different_outputs[openai_client-emb=together/togethercomputer/m2-bert-80M-32k-retrieval] PASSED [ 40%] tests/integration/inference/test_openai_embeddings.py::test_openai_embeddings_with_encoding_format_base64[openai_client-emb=together/togethercomputer/m2-bert-80M-32k-retrieval] SKIPPED [ 42%] tests/integration/inference/test_openai_embeddings.py::test_openai_embeddings_base64_batch_processing[openai_client-emb=together/togethercomputer/m2-bert-80M-32k-retrieval] SKIPPED [ 44%] tests/integration/inference/test_openai_completion.py::test_openai_completion_prompt_logprobs[txt=together/meta-llama/Llama-3.3-70B-Instruct-Turbo-Free-0] SKIPPED [ 46%] tests/integration/inference/test_openai_completion.py::test_openai_chat_completion_non_streaming[openai_client-txt=together/meta-llama/Llama-3.3-70B-Instruct-Turbo-Free-inference:chat_completion:non_streaming_02] PASSED [ 48%] tests/integration/inference/test_openai_completion.py::test_openai_chat_completion_streaming[openai_client-txt=together/meta-llama/Llama-3.3-70B-Instruct-Turbo-Free-inference:chat_completion:streaming_02] PASSED [ 51%] tests/integration/inference/test_openai_completion.py::test_openai_chat_completion_streaming_with_n[openai_client-txt=together/meta-llama/Llama-3.3-70B-Instruct-Turbo-Free-inference:chat_completion:streaming_02] SKIPPED [ 53%] tests/integration/inference/test_openai_completion.py::test_inference_store[openai_client-txt=together/meta-llama/Llama-3.3-70B-Instruct-Turbo-Free-False] PASSED [ 55%] tests/integration/inference/test_openai_completion.py::test_inference_store_tool_calls[openai_client-txt=together/meta-llama/Llama-3.3-70B-Instruct-Turbo-Free-False] PASSED [ 57%] tests/integration/inference/test_openai_embeddings.py::test_openai_embeddings_single_string[llama_stack_client-emb=together/togethercomputer/m2-bert-80M-32k-retrieval] PASSED [ 59%] tests/integration/inference/test_openai_embeddings.py::test_openai_embeddings_multiple_strings[llama_stack_client-emb=together/togethercomputer/m2-bert-80M-32k-retrieval] PASSED [ 61%] tests/integration/inference/test_openai_embeddings.py::test_openai_embeddings_with_encoding_format_float[llama_stack_client-emb=together/togethercomputer/m2-bert-80M-32k-retrieval] PASSED [ 63%] tests/integration/inference/test_openai_embeddings.py::test_openai_embeddings_with_dimensions[llama_stack_client-emb=together/togethercomputer/m2-bert-80M-32k-retrieval] SKIPPED [ 65%] tests/integration/inference/test_openai_embeddings.py::test_openai_embeddings_with_user_parameter[llama_stack_client-emb=together/togethercomputer/m2-bert-80M-32k-retrieval] SKIPPED [ 68%] tests/integration/inference/test_openai_embeddings.py::test_openai_embeddings_empty_list_error[llama_stack_client-emb=together/togethercomputer/m2-bert-80M-32k-retrieval] PASSED [ 70%] tests/integration/inference/test_openai_embeddings.py::test_openai_embeddings_invalid_model_error[llama_stack_client-emb=together/togethercomputer/m2-bert-80M-32k-retrieval] PASSED [ 72%] tests/integration/inference/test_openai_embeddings.py::test_openai_embeddings_different_inputs_different_outputs[llama_stack_client-emb=together/togethercomputer/m2-bert-80M-32k-retrieval] PASSED [ 74%] tests/integration/inference/test_openai_embeddings.py::test_openai_embeddings_with_encoding_format_base64[llama_stack_client-emb=together/togethercomputer/m2-bert-80M-32k-retrieval] SKIPPED [ 76%] tests/integration/inference/test_openai_embeddings.py::test_openai_embeddings_base64_batch_processing[llama_stack_client-emb=together/togethercomputer/m2-bert-80M-32k-retrieval] SKIPPED [ 78%] tests/integration/inference/test_openai_completion.py::test_openai_chat_completion_non_streaming[client_with_models-txt=together/meta-llama/Llama-3.3-70B-Instruct-Turbo-Free-inference:chat_completion:non_streaming_01] PASSED [ 80%] tests/integration/inference/test_openai_completion.py::test_openai_chat_completion_streaming[client_with_models-txt=together/meta-llama/Llama-3.3-70B-Instruct-Turbo-Free-inference:chat_completion:streaming_01] PASSED [ 82%] tests/integration/inference/test_openai_completion.py::test_openai_chat_completion_streaming_with_n[client_with_models-txt=together/meta-llama/Llama-3.3-70B-Instruct-Turbo-Free-inference:chat_completion:streaming_01] SKIPPED [ 85%] tests/integration/inference/test_openai_completion.py::test_inference_store[client_with_models-txt=together/meta-llama/Llama-3.3-70B-Instruct-Turbo-Free-True] PASSED [ 87%] tests/integration/inference/test_openai_completion.py::test_inference_store_tool_calls[client_with_models-txt=together/meta-llama/Llama-3.3-70B-Instruct-Turbo-Free-True] PASSED [ 89%] tests/integration/inference/test_openai_completion.py::test_openai_chat_completion_non_streaming[client_with_models-txt=together/meta-llama/Llama-3.3-70B-Instruct-Turbo-Free-inference:chat_completion:non_streaming_02] PASSED [ 91%] tests/integration/inference/test_openai_completion.py::test_openai_chat_completion_streaming[client_with_models-txt=together/meta-llama/Llama-3.3-70B-Instruct-Turbo-Free-inference:chat_completion:streaming_02] PASSED [ 93%] tests/integration/inference/test_openai_completion.py::test_openai_chat_completion_streaming_with_n[client_with_models-txt=together/meta-llama/Llama-3.3-70B-Instruct-Turbo-Free-inference:chat_completion:streaming_02] SKIPPED [ 95%] tests/integration/inference/test_openai_completion.py::test_inference_store[client_with_models-txt=together/meta-llama/Llama-3.3-70B-Instruct-Turbo-Free-False] PASSED [ 97%] tests/integration/inference/test_openai_completion.py::test_inference_store_tool_calls[client_with_models-txt=together/meta-llama/Llama-3.3-70B-Instruct-Turbo-Free-False] PASSED [100%] ============================================ 30 passed, 17 skipped, 50 deselected, 4 warnings in 21.96s ============================================= ``` --- .../remote/inference/together/models.py | 120 +- .../remote/inference/together/together.py | 205 +- .../inference/test_openai_completion.py | 1 + .../inference/test_openai_embeddings.py | 42 +- .../recordings/responses/07c5fa34d9ca.json | 800 ++++++ .../recordings/responses/0c1f45455d3b.json | 59 + .../recordings/responses/17030e75309f.json | 800 ++++++ .../recordings/responses/432a346b2ed8.json | 2352 +++++++++++++++++ .../recordings/responses/4ca6152a0eb8.json | 59 + .../recordings/responses/511eb1b92e34.json | 1278 +++++++++ .../recordings/responses/565b1072cb9d.json | 46 + .../recordings/responses/6730dcde0b73.json | 756 ++++++ .../recordings/responses/6857b19d3f0a.json | 87 + .../recordings/responses/6c4e2e207e8a.json | 59 + .../recordings/responses/72e075bf28e8.json | 800 ++++++ .../recordings/responses/894fdacb1cfa.json | 176 ++ .../recordings/responses/bce560cbf1c6.json | 800 ++++++ .../recordings/responses/d85689907fec.json | 350 +++ .../recordings/responses/f0bbea34c5cc.json | 611 +++++ tests/integration/suites.py | 8 + 20 files changed, 9229 insertions(+), 180 deletions(-) create mode 100644 tests/integration/recordings/responses/07c5fa34d9ca.json create mode 100644 tests/integration/recordings/responses/0c1f45455d3b.json create mode 100644 tests/integration/recordings/responses/17030e75309f.json create mode 100644 tests/integration/recordings/responses/432a346b2ed8.json create mode 100644 tests/integration/recordings/responses/4ca6152a0eb8.json create mode 100644 tests/integration/recordings/responses/511eb1b92e34.json create mode 100644 tests/integration/recordings/responses/565b1072cb9d.json create mode 100644 tests/integration/recordings/responses/6730dcde0b73.json create mode 100644 tests/integration/recordings/responses/6857b19d3f0a.json create mode 100644 tests/integration/recordings/responses/6c4e2e207e8a.json create mode 100644 tests/integration/recordings/responses/72e075bf28e8.json create mode 100644 tests/integration/recordings/responses/894fdacb1cfa.json create mode 100644 tests/integration/recordings/responses/bce560cbf1c6.json create mode 100644 tests/integration/recordings/responses/d85689907fec.json create mode 100644 tests/integration/recordings/responses/f0bbea34c5cc.json diff --git a/llama_stack/providers/remote/inference/together/models.py b/llama_stack/providers/remote/inference/together/models.py index 575ec1f3d..2aba614cb 100644 --- a/llama_stack/providers/remote/inference/together/models.py +++ b/llama_stack/providers/remote/inference/together/models.py @@ -4,7 +4,6 @@ # This source code is licensed under the terms described in the LICENSE file in # the root directory of this source tree. -from llama_stack.apis.models import ModelType from llama_stack.models.llama.sku_types import CoreModelId from llama_stack.providers.utils.inference.model_registry import ( ProviderModelEntry, @@ -21,57 +20,84 @@ SAFETY_MODELS_ENTRIES = [ CoreModelId.llama_guard_3_11b_vision.value, ), ] -MODEL_ENTRIES = [ - build_hf_repo_model_entry( - "meta-llama/Meta-Llama-3.1-8B-Instruct-Turbo", - CoreModelId.llama3_1_8b_instruct.value, - ), - build_hf_repo_model_entry( - "meta-llama/Meta-Llama-3.1-70B-Instruct-Turbo", - CoreModelId.llama3_1_70b_instruct.value, - ), - build_hf_repo_model_entry( - "meta-llama/Meta-Llama-3.1-405B-Instruct-Turbo", - CoreModelId.llama3_1_405b_instruct.value, - ), - build_hf_repo_model_entry( - "meta-llama/Llama-3.2-3B-Instruct-Turbo", - CoreModelId.llama3_2_3b_instruct.value, - ), - build_hf_repo_model_entry( - "meta-llama/Llama-3.2-11B-Vision-Instruct-Turbo", - CoreModelId.llama3_2_11b_vision_instruct.value, - ), - build_hf_repo_model_entry( - "meta-llama/Llama-3.2-90B-Vision-Instruct-Turbo", - CoreModelId.llama3_2_90b_vision_instruct.value, - ), - build_hf_repo_model_entry( - "meta-llama/Llama-3.3-70B-Instruct-Turbo", - CoreModelId.llama3_3_70b_instruct.value, - ), - ProviderModelEntry( - provider_model_id="togethercomputer/m2-bert-80M-8k-retrieval", - model_type=ModelType.embedding, - metadata={ - "embedding_dimension": 768, - "context_length": 8192, - }, - ), - ProviderModelEntry( + +# source: https://docs.together.ai/docs/serverless-models#embedding-models +EMBEDDING_MODEL_ENTRIES = { + "togethercomputer/m2-bert-80M-32k-retrieval": ProviderModelEntry( provider_model_id="togethercomputer/m2-bert-80M-32k-retrieval", - model_type=ModelType.embedding, metadata={ "embedding_dimension": 768, "context_length": 32768, }, ), - build_hf_repo_model_entry( - "meta-llama/Llama-4-Scout-17B-16E-Instruct", - CoreModelId.llama4_scout_17b_16e_instruct.value, + "BAAI/bge-large-en-v1.5": ProviderModelEntry( + provider_model_id="BAAI/bge-large-en-v1.5", + metadata={ + "embedding_dimension": 1024, + "context_length": 512, + }, ), - build_hf_repo_model_entry( - "meta-llama/Llama-4-Maverick-17B-128E-Instruct-FP8", - CoreModelId.llama4_maverick_17b_128e_instruct.value, + "BAAI/bge-base-en-v1.5": ProviderModelEntry( + provider_model_id="BAAI/bge-base-en-v1.5", + metadata={ + "embedding_dimension": 768, + "context_length": 512, + }, ), -] + SAFETY_MODELS_ENTRIES + "Alibaba-NLP/gte-modernbert-base": ProviderModelEntry( + provider_model_id="Alibaba-NLP/gte-modernbert-base", + metadata={ + "embedding_dimension": 768, + "context_length": 8192, + }, + ), + "intfloat/multilingual-e5-large-instruct": ProviderModelEntry( + provider_model_id="intfloat/multilingual-e5-large-instruct", + metadata={ + "embedding_dimension": 1024, + "context_length": 512, + }, + ), +} +MODEL_ENTRIES = ( + [ + build_hf_repo_model_entry( + "meta-llama/Meta-Llama-3.1-8B-Instruct-Turbo", + CoreModelId.llama3_1_8b_instruct.value, + ), + build_hf_repo_model_entry( + "meta-llama/Meta-Llama-3.1-70B-Instruct-Turbo", + CoreModelId.llama3_1_70b_instruct.value, + ), + build_hf_repo_model_entry( + "meta-llama/Meta-Llama-3.1-405B-Instruct-Turbo", + CoreModelId.llama3_1_405b_instruct.value, + ), + build_hf_repo_model_entry( + "meta-llama/Llama-3.2-3B-Instruct-Turbo", + CoreModelId.llama3_2_3b_instruct.value, + ), + build_hf_repo_model_entry( + "meta-llama/Llama-3.2-11B-Vision-Instruct-Turbo", + CoreModelId.llama3_2_11b_vision_instruct.value, + ), + build_hf_repo_model_entry( + "meta-llama/Llama-3.2-90B-Vision-Instruct-Turbo", + CoreModelId.llama3_2_90b_vision_instruct.value, + ), + build_hf_repo_model_entry( + "meta-llama/Llama-3.3-70B-Instruct-Turbo", + CoreModelId.llama3_3_70b_instruct.value, + ), + build_hf_repo_model_entry( + "meta-llama/Llama-4-Scout-17B-16E-Instruct", + CoreModelId.llama4_scout_17b_16e_instruct.value, + ), + build_hf_repo_model_entry( + "meta-llama/Llama-4-Maverick-17B-128E-Instruct-FP8", + CoreModelId.llama4_maverick_17b_128e_instruct.value, + ), + ] + + SAFETY_MODELS_ENTRIES + + list(EMBEDDING_MODEL_ENTRIES.values()) +) diff --git a/llama_stack/providers/remote/inference/together/together.py b/llama_stack/providers/remote/inference/together/together.py index 54c76607f..d45bd489f 100644 --- a/llama_stack/providers/remote/inference/together/together.py +++ b/llama_stack/providers/remote/inference/together/together.py @@ -4,11 +4,11 @@ # This source code is licensed under the terms described in the LICENSE file in # the root directory of this source tree. -from collections.abc import AsyncGenerator, AsyncIterator -from typing import Any +from collections.abc import AsyncGenerator -from openai import AsyncOpenAI +from openai import NOT_GIVEN, AsyncOpenAI from together import AsyncTogether +from together.constants import BASE_URL from llama_stack.apis.common.content_types import ( InterleavedContent, @@ -23,12 +23,7 @@ from llama_stack.apis.inference import ( Inference, LogProbConfig, Message, - OpenAIChatCompletion, - OpenAIChatCompletionChunk, - OpenAICompletion, OpenAIEmbeddingsResponse, - OpenAIMessageParam, - OpenAIResponseFormatParam, ResponseFormat, ResponseFormatType, SamplingParams, @@ -38,18 +33,20 @@ from llama_stack.apis.inference import ( ToolDefinition, ToolPromptFormat, ) +from llama_stack.apis.inference.inference import OpenAIEmbeddingUsage +from llama_stack.apis.models import Model, ModelType from llama_stack.core.request_headers import NeedsRequestProviderData from llama_stack.log import get_logger from llama_stack.providers.utils.inference.model_registry import ModelRegistryHelper from llama_stack.providers.utils.inference.openai_compat import ( convert_message_to_openai_dict, get_sampling_options, - prepare_openai_completion_params, process_chat_completion_response, process_chat_completion_stream_response, process_completion_response, process_completion_stream_response, ) +from llama_stack.providers.utils.inference.openai_mixin import OpenAIMixin from llama_stack.providers.utils.inference.prompt_adapter import ( chat_completion_request_to_prompt, completion_request_to_prompt, @@ -59,15 +56,22 @@ from llama_stack.providers.utils.inference.prompt_adapter import ( ) from .config import TogetherImplConfig -from .models import MODEL_ENTRIES +from .models import EMBEDDING_MODEL_ENTRIES, MODEL_ENTRIES logger = get_logger(name=__name__, category="inference::together") -class TogetherInferenceAdapter(ModelRegistryHelper, Inference, NeedsRequestProviderData): +class TogetherInferenceAdapter(OpenAIMixin, ModelRegistryHelper, Inference, NeedsRequestProviderData): def __init__(self, config: TogetherImplConfig) -> None: ModelRegistryHelper.__init__(self, MODEL_ENTRIES, config.allowed_models) self.config = config + self._model_cache: dict[str, Model] = {} + + def get_api_key(self): + return self.config.api_key.get_secret_value() + + def get_base_url(self): + return BASE_URL async def initialize(self) -> None: pass @@ -255,6 +259,37 @@ class TogetherInferenceAdapter(ModelRegistryHelper, Inference, NeedsRequestProvi embeddings = [item.embedding for item in r.data] return EmbeddingsResponse(embeddings=embeddings) + async def list_models(self) -> list[Model] | None: + self._model_cache = {} + # Together's /v1/models is not compatible with OpenAI's /v1/models. Together support ticket #13355 -> will not fix, use Together's own client + for m in await self._get_client().models.list(): + if m.type == "embedding": + if m.id not in EMBEDDING_MODEL_ENTRIES: + logger.warning(f"Unknown embedding dimension for model {m.id}, skipping.") + continue + self._model_cache[m.id] = Model( + provider_id=self.__provider_id__, + provider_resource_id=EMBEDDING_MODEL_ENTRIES[m.id].provider_model_id, + identifier=m.id, + model_type=ModelType.embedding, + metadata=EMBEDDING_MODEL_ENTRIES[m.id].metadata, + ) + else: + self._model_cache[m.id] = Model( + provider_id=self.__provider_id__, + provider_resource_id=m.id, + identifier=m.id, + model_type=ModelType.llm, + ) + + return self._model_cache.values() + + async def should_refresh_models(self) -> bool: + return True + + async def check_model_availability(self, model): + return model in self._model_cache + async def openai_embeddings( self, model: str, @@ -263,125 +298,39 @@ class TogetherInferenceAdapter(ModelRegistryHelper, Inference, NeedsRequestProvi dimensions: int | None = None, user: str | None = None, ) -> OpenAIEmbeddingsResponse: - raise NotImplementedError() + """ + Together's OpenAI-compatible embeddings endpoint is not compatible with + the standard OpenAI embeddings endpoint. - async def openai_completion( - self, - model: str, - prompt: str | list[str] | list[int] | list[list[int]], - best_of: int | None = None, - echo: bool | None = None, - frequency_penalty: float | None = None, - logit_bias: dict[str, float] | None = None, - logprobs: bool | None = None, - max_tokens: int | None = None, - n: int | None = None, - presence_penalty: float | None = None, - seed: int | None = None, - stop: str | list[str] | None = None, - stream: bool | None = None, - stream_options: dict[str, Any] | None = None, - temperature: float | None = None, - top_p: float | None = None, - user: str | None = None, - guided_choice: list[str] | None = None, - prompt_logprobs: int | None = None, - suffix: str | None = None, - ) -> OpenAICompletion: - model_obj = await self.model_store.get_model(model) - params = await prepare_openai_completion_params( - model=model_obj.provider_resource_id, - prompt=prompt, - best_of=best_of, - echo=echo, - frequency_penalty=frequency_penalty, - logit_bias=logit_bias, - logprobs=logprobs, - max_tokens=max_tokens, - n=n, - presence_penalty=presence_penalty, - seed=seed, - stop=stop, - stream=stream, - stream_options=stream_options, - temperature=temperature, - top_p=top_p, - user=user, + The endpoint - + - does not return usage information + - does not support user param, returns 400 Unrecognized request arguments supplied: user + - does not support dimensions param, returns 400 Unrecognized request arguments supplied: dimensions + - does not support encoding_format param, always returns floats, never base64 + """ + # Together support ticket #13332 -> will not fix + if user is not None: + raise ValueError("Together's embeddings endpoint does not support user param.") + # Together support ticket #13333 -> escalated + if dimensions is not None: + raise ValueError("Together's embeddings endpoint does not support dimensions param.") + # Together support ticket #13331 -> will not fix, compute client side + if encoding_format not in (None, NOT_GIVEN, "float"): + raise ValueError("Together's embeddings endpoint only supports encoding_format='float'.") + + response = await self.client.embeddings.create( + model=await self._get_provider_model_id(model), + input=input, ) - return await self._get_openai_client().completions.create(**params) # type: ignore - async def openai_chat_completion( - self, - model: str, - messages: list[OpenAIMessageParam], - frequency_penalty: float | None = None, - function_call: str | dict[str, Any] | None = None, - functions: list[dict[str, Any]] | None = None, - logit_bias: dict[str, float] | None = None, - logprobs: bool | None = None, - max_completion_tokens: int | None = None, - max_tokens: int | None = None, - n: int | None = None, - parallel_tool_calls: bool | None = None, - presence_penalty: float | None = None, - response_format: OpenAIResponseFormatParam | None = None, - seed: int | None = None, - stop: str | list[str] | None = None, - stream: bool | None = None, - stream_options: dict[str, Any] | None = None, - temperature: float | None = None, - tool_choice: str | dict[str, Any] | None = None, - tools: list[dict[str, Any]] | None = None, - top_logprobs: int | None = None, - top_p: float | None = None, - user: str | None = None, - ) -> OpenAIChatCompletion | AsyncIterator[OpenAIChatCompletionChunk]: - model_obj = await self.model_store.get_model(model) - params = await prepare_openai_completion_params( - model=model_obj.provider_resource_id, - messages=messages, - frequency_penalty=frequency_penalty, - function_call=function_call, - functions=functions, - logit_bias=logit_bias, - logprobs=logprobs, - max_completion_tokens=max_completion_tokens, - max_tokens=max_tokens, - n=n, - parallel_tool_calls=parallel_tool_calls, - presence_penalty=presence_penalty, - response_format=response_format, - seed=seed, - stop=stop, - stream=stream, - stream_options=stream_options, - temperature=temperature, - tool_choice=tool_choice, - tools=tools, - top_logprobs=top_logprobs, - top_p=top_p, - user=user, - ) - if params.get("stream", False): - return self._stream_openai_chat_completion(params) - return await self._get_openai_client().chat.completions.create(**params) # type: ignore + response.model = model # return the user the same model id they provided, avoid exposing the provider model id - async def _stream_openai_chat_completion(self, params: dict) -> AsyncGenerator: - # together.ai sometimes adds usage data to the stream, even if include_usage is False - # This causes an unexpected final chunk with empty choices array to be sent - # to clients that may not handle it gracefully. - include_usage = False - if params.get("stream_options", None): - include_usage = params["stream_options"].get("include_usage", False) - stream = await self._get_openai_client().chat.completions.create(**params) + # Together support ticket #13330 -> escalated + # - togethercomputer/m2-bert-80M-32k-retrieval *does not* return usage information + if not hasattr(response, "usage") or response.usage is None: + logger.warning( + f"Together's embedding endpoint for {model} did not return usage information, substituting -1s." + ) + response.usage = OpenAIEmbeddingUsage(prompt_tokens=-1, total_tokens=-1) - seen_finish_reason = False - async for chunk in stream: - # Final usage chunk with no choices that the user didn't request, so discard - if not include_usage and seen_finish_reason and len(chunk.choices) == 0: - break - yield chunk - for choice in chunk.choices: - if choice.finish_reason: - seen_finish_reason = True - break + return response diff --git a/tests/integration/inference/test_openai_completion.py b/tests/integration/inference/test_openai_completion.py index 051529719..b232f8658 100644 --- a/tests/integration/inference/test_openai_completion.py +++ b/tests/integration/inference/test_openai_completion.py @@ -97,6 +97,7 @@ def skip_if_doesnt_support_n(client_with_models, model_id): # Error code: 400 - [{'error': {'code': 400, 'message': 'Unable to submit request because candidateCount must be 1 but # the entered value was 2. Update the candidateCount value and try again.', 'status': 'INVALID_ARGUMENT'} "remote::tgi", # TGI ignores n param silently + "remote::together", # `n` > 1 is not supported when streaming tokens. Please disable `stream` ): pytest.skip(f"Model {model_id} hosted by {provider.provider_type} doesn't support n param.") diff --git a/tests/integration/inference/test_openai_embeddings.py b/tests/integration/inference/test_openai_embeddings.py index 2c545cc43..622b97287 100644 --- a/tests/integration/inference/test_openai_embeddings.py +++ b/tests/integration/inference/test_openai_embeddings.py @@ -29,9 +29,35 @@ def provider_from_model(client_with_models, model_id): return providers[provider_id] -def skip_if_model_doesnt_support_variable_dimensions(model_id): - if "text-embedding-3" not in model_id: - pytest.skip("{model_id} does not support variable output embedding dimensions") +def skip_if_model_doesnt_support_user_param(client, model_id): + provider = provider_from_model(client, model_id) + if provider.provider_type in ( + "remote::together", # service returns 400 + ): + pytest.skip(f"Model {model_id} hosted by {provider.provider_type} does not support user param.") + + +def skip_if_model_doesnt_support_encoding_format_base64(client, model_id): + provider = provider_from_model(client, model_id) + if provider.provider_type in ( + "remote::together", # param silently ignored, always returns floats + ): + pytest.skip(f"Model {model_id} hosted by {provider.provider_type} does not support encoding_format='base64'.") + + +def skip_if_model_doesnt_support_variable_dimensions(client_with_models, model_id): + provider = provider_from_model(client_with_models, model_id) + if provider.provider_type in ( + "remote::together", # returns 400 + "inline::sentence-transformers", + ): + pytest.skip( + f"Model {model_id} hosted by {provider.provider_type} does not support variable output embedding dimensions." + ) + if provider.provider_type == "remote::openai" and "text-embedding-3" not in model_id: + pytest.skip( + f"Model {model_id} hosted by {provider.provider_type} does not support variable output embedding dimensions." + ) @pytest.fixture(params=["openai_client", "llama_stack_client"]) @@ -92,6 +118,7 @@ def test_openai_embeddings_multiple_strings(compat_client, client_with_models, e response = compat_client.embeddings.create( model=embedding_model_id, input=input_texts, + encoding_format="float", ) assert response.object == "list" @@ -127,7 +154,7 @@ def test_openai_embeddings_with_encoding_format_float(compat_client, client_with def test_openai_embeddings_with_dimensions(compat_client, client_with_models, embedding_model_id): """Test OpenAI embeddings endpoint with custom dimensions parameter.""" skip_if_model_doesnt_support_openai_embeddings(client_with_models, embedding_model_id) - skip_if_model_doesnt_support_variable_dimensions(embedding_model_id) + skip_if_model_doesnt_support_variable_dimensions(client_with_models, embedding_model_id) input_text = "Test dimensions parameter" dimensions = 16 @@ -148,6 +175,7 @@ def test_openai_embeddings_with_dimensions(compat_client, client_with_models, em def test_openai_embeddings_with_user_parameter(compat_client, client_with_models, embedding_model_id): """Test OpenAI embeddings endpoint with user parameter.""" skip_if_model_doesnt_support_openai_embeddings(client_with_models, embedding_model_id) + skip_if_model_doesnt_support_user_param(client_with_models, embedding_model_id) input_text = "Test user parameter" user_id = "test-user-123" @@ -196,11 +224,13 @@ def test_openai_embeddings_different_inputs_different_outputs(compat_client, cli response1 = compat_client.embeddings.create( model=embedding_model_id, input=input_text1, + encoding_format="float", ) response2 = compat_client.embeddings.create( model=embedding_model_id, input=input_text2, + encoding_format="float", ) embedding1 = response1.data[0].embedding @@ -214,7 +244,8 @@ def test_openai_embeddings_different_inputs_different_outputs(compat_client, cli def test_openai_embeddings_with_encoding_format_base64(compat_client, client_with_models, embedding_model_id): """Test OpenAI embeddings endpoint with base64 encoding format.""" skip_if_model_doesnt_support_openai_embeddings(client_with_models, embedding_model_id) - skip_if_model_doesnt_support_variable_dimensions(embedding_model_id) + skip_if_model_doesnt_support_encoding_format_base64(client_with_models, embedding_model_id) + skip_if_model_doesnt_support_variable_dimensions(client_with_models, embedding_model_id) input_text = "Test base64 encoding format" dimensions = 12 @@ -247,6 +278,7 @@ def test_openai_embeddings_with_encoding_format_base64(compat_client, client_wit def test_openai_embeddings_base64_batch_processing(compat_client, client_with_models, embedding_model_id): """Test OpenAI embeddings endpoint with base64 encoding for batch processing.""" skip_if_model_doesnt_support_openai_embeddings(client_with_models, embedding_model_id) + skip_if_model_doesnt_support_encoding_format_base64(client_with_models, embedding_model_id) input_texts = ["First text for base64", "Second text for base64", "Third text for base64"] diff --git a/tests/integration/recordings/responses/07c5fa34d9ca.json b/tests/integration/recordings/responses/07c5fa34d9ca.json new file mode 100644 index 000000000..af1460120 --- /dev/null +++ b/tests/integration/recordings/responses/07c5fa34d9ca.json @@ -0,0 +1,800 @@ +{ + "request": { + "method": "POST", + "url": "https://api.together.xyz/v1/v1/embeddings", + "headers": {}, + "body": { + "model": "togethercomputer/m2-bert-80M-32k-retrieval", + "input": "Test encoding format" + }, + "endpoint": "/v1/embeddings", + "model": "togethercomputer/m2-bert-80M-32k-retrieval" + }, + "response": { + "body": { + "__type__": "openai.types.create_embedding_response.CreateEmbeddingResponse", + "__data__": { + "data": [ + { + "embedding": [ + -0.011256923, + 0.0037174695, + 0.047607094, + -0.03605117, + 0.022678856, + 0.0022196341, + 0.008172763, + -0.07876377, + -0.012652523, + -0.124776885, + -0.07201225, + 0.011470616, + 0.020233244, + -0.03953407, + 0.017867543, + -0.07615726, + 0.015161683, + 0.01493531, + 0.0021282644, + 0.02805457, + 0.0008320583, + 0.022922216, + 0.049158294, + -0.03197842, + 0.020910429, + 0.03798574, + 0.032469492, + 0.009267314, + 0.0883011, + 0.0032435523, + 0.013633923, + 0.0457091, + -0.022143621, + -0.0007423012, + -0.03613117, + 0.052107, + 0.02962152, + 0.045084383, + 0.044733327, + 0.11753868, + 0.05730107, + 0.026509244, + -0.056454167, + -0.017637681, + 0.030301955, + 0.04790331, + -0.025398305, + -0.019705286, + 0.11366949, + 0.05800383, + -0.0072742635, + 0.100181706, + 0.1609472, + 0.0053162435, + 0.01714287, + -0.023215268, + 0.042824704, + 0.04082185, + 0.030668061, + -0.06529372, + 0.008288249, + 0.0325246, + 0.009664108, + -0.031153189, + 0.044064675, + 0.10059426, + 0.036557477, + 0.009674479, + 0.016028037, + 0.02236809, + 0.056538712, + -0.12828006, + 0.016760435, + 0.015355689, + -0.00070172164, + -0.0076741586, + -0.02880062, + -0.011680436, + -0.036522433, + -0.030315956, + 0.023295958, + 0.031333964, + 0.042397793, + -0.063102156, + 0.0669075, + -0.07678097, + 0.0616129, + -0.0071245604, + -0.021313114, + 0.0040440215, + 0.04436404, + 0.05289292, + 0.05803014, + 0.032691576, + 0.037537806, + -0.09712317, + -0.0061692744, + 0.008186577, + -0.0151672475, + -0.05499382, + -0.11011894, + -0.017255861, + 0.061501417, + 0.03551128, + 0.056205165, + 0.07500363, + 0.023062926, + 0.10787879, + 0.063290246, + -0.021196125, + -0.005724647, + 0.019805718, + -0.0063712946, + -0.049270064, + -0.024442751, + 0.018587058, + -0.082689136, + -0.019034613, + 0.005483609, + 0.03418548, + -0.008317338, + 0.06888298, + -0.037655607, + -0.05362105, + -0.010807861, + 0.069666155, + -0.01777964, + -0.015136251, + -0.026567455, + -0.08084807, + -0.078372054, + 0.039493512, + 0.013156698, + 0.07340631, + 0.12035369, + -0.05765069, + 0.025966862, + -0.0045753582, + -0.030865112, + 0.039448086, + -0.037273232, + 0.047059145, + -0.029127738, + -0.024217308, + 0.02748501, + -0.048555836, + 0.017913114, + -0.055981673, + -0.005601368, + -0.04045025, + -0.017308103, + 0.06272273, + 0.012256746, + 0.01575095, + -0.026737463, + 0.04115108, + 0.07562276, + -0.01140116, + 0.022552952, + 0.0443809, + -0.030472409, + -0.021670958, + -0.037897367, + 0.017250286, + -0.033001736, + -0.048738975, + -0.06429833, + -0.015412785, + 0.0036735258, + 0.023700202, + 0.035861194, + -0.05393875, + 0.048050668, + 0.032297045, + 0.021352977, + -0.05701748, + 0.0008330949, + -0.006661303, + -0.0070953164, + -0.043984424, + 0.052504774, + 0.027689766, + 0.031661708, + -0.050054867, + -0.015419155, + -0.013700429, + -0.03579233, + -0.08926211, + -0.034341693, + -0.01738188, + -0.0065487004, + -0.051955026, + 0.0019674778, + 0.0015172043, + 0.024915336, + 0.010987228, + 0.061529815, + 0.09077649, + 0.04394813, + -0.07503514, + 0.043345768, + -0.028357483, + 0.06312762, + 0.025069924, + 0.028561853, + 0.043048594, + 0.017411513, + -0.025240859, + -0.0056393985, + 0.054039005, + 0.008721963, + -0.039967448, + 0.0012871448, + 0.0052062417, + 0.005563228, + 0.042596456, + -0.008794862, + -0.044669237, + 0.04184779, + 0.008726271, + 0.10136058, + 0.040724736, + 0.14168875, + -0.017516509, + -0.11203568, + 0.0010548063, + -0.058536656, + 0.01673066, + 0.007502946, + -0.035662595, + 0.034719367, + -0.0060368567, + 0.13295838, + 0.026423598, + 0.056147255, + 0.04473965, + 0.045232397, + 0.07171366, + 0.009358642, + -0.021109166, + 0.033915937, + 0.0380073, + -0.01451498, + -0.021589639, + 0.062518574, + -0.017531183, + -0.030811403, + 0.024500312, + 0.05383414, + -0.1335839, + 0.01834579, + -0.051048376, + 0.07460228, + 0.03231806, + 0.00962887, + 0.05156732, + 0.016169788, + 0.0062234807, + -0.09062714, + -0.08959952, + 0.025153147, + -0.030351512, + -0.04339584, + 0.007234872, + 0.014588551, + 0.022614833, + -0.08844599, + -0.009002514, + -0.114522785, + 0.08118862, + -0.03023919, + 0.007820294, + 0.043863248, + -0.043678157, + -0.036323708, + 0.006777855, + -0.019326974, + -0.0664114, + -0.019019991, + 0.073445216, + -0.039277073, + -0.0157583, + -0.01931436, + -0.027121417, + -0.028259363, + -0.107222356, + 0.11150329, + -0.012612926, + -0.025338905, + 0.029330198, + 0.011753977, + 0.009784897, + 0.042475123, + -0.004051051, + -0.014803267, + -0.04530689, + -0.01848677, + -0.050840423, + 0.01814009, + 0.0051442874, + -0.033988528, + 0.0033705293, + -0.05515113, + -0.023601055, + -0.06183089, + 0.012501645, + -0.08027637, + 0.022573682, + 0.079796925, + -0.00926268, + -0.02180816, + 0.0059841494, + -0.018863965, + -0.011257763, + 0.055679787, + -0.018714463, + -0.04081558, + -0.017017504, + 0.026006198, + -0.03687599, + -0.05399378, + 0.042955294, + 0.00079697353, + -0.0015601065, + 0.026138263, + -0.01198548, + 0.07594801, + -0.0049053924, + -0.001241132, + 0.022863775, + 0.025632044, + -0.023908222, + -0.02252925, + 0.042020634, + -0.060588334, + 0.05498828, + -0.03466166, + 0.003202133, + -0.015508297, + -0.021138275, + 0.007791096, + 0.052594397, + -0.08649948, + 0.038542755, + 0.011088168, + 0.049710445, + -0.015898548, + 0.013559725, + -0.0012927915, + -0.078937665, + -0.0470789, + 0.02421941, + 0.0050838543, + -0.051634457, + 0.014016644, + 0.059073824, + -0.01279741, + 0.006315097, + 0.028651753, + -0.023221422, + -0.049021006, + -0.08123552, + -0.027243393, + -0.026543872, + 0.040068373, + 0.01465917, + 0.01366034, + -0.07191417, + -0.007906117, + -0.06743931, + -0.040284913, + 0.046346053, + -0.015108051, + -0.067285545, + 0.020757562, + -0.03144588, + -0.02684228, + -0.030008601, + 0.0008360872, + -0.012667347, + -0.0782403, + 0.02436115, + -0.054881096, + -0.010856299, + -0.07653927, + -0.044655506, + -0.02075821, + 0.023765713, + 0.0083463555, + 0.026002545, + -0.003060633, + 0.060491852, + 0.032562606, + 0.029937308, + -0.022013078, + 0.07388013, + 0.017152807, + -0.07095613, + -0.03923808, + 0.0017680842, + 0.0038672008, + -0.053012144, + -0.016951663, + 0.027642388, + 0.016483316, + -0.015618807, + -0.11136081, + 0.006826955, + -0.010586094, + -0.05052998, + -0.04226535, + -0.031801827, + -0.020531418, + -0.06278464, + -0.062224947, + 0.0769673, + -0.0706861, + 0.026174366, + -0.041260213, + 0.058052614, + -0.046227556, + -0.05443509, + 0.007650712, + -0.061986744, + -0.00546975, + -0.042977307, + -0.0147894155, + 0.045748055, + -0.01602859, + 0.018538997, + 0.073324144, + -0.105757244, + -0.010215157, + 0.0069961487, + -0.010474333, + 0.007267861, + -0.043416463, + 0.04171331, + 0.012246647, + -0.024870023, + 0.0067938967, + 0.023995718, + 0.037606664, + -0.034879085, + 0.107255146, + 0.019311333, + 0.008084773, + 0.015113109, + 0.04807634, + -0.011898967, + 0.0028230203, + 0.004201883, + -0.019952193, + -0.083809994, + 0.025964422, + 0.010652608, + 0.021981532, + -0.029947964, + 0.10096241, + -0.0018155909, + -0.078443065, + 0.035357803, + 0.030101022, + 0.08652985, + -0.020698488, + 0.06619985, + 0.011043828, + 0.022531942, + 0.059432585, + -0.08669654, + 0.023926888, + 0.006353244, + -0.046637908, + -0.072916985, + -0.04355625, + -0.010734682, + -0.06298886, + 0.11202974, + -0.008399903, + 0.04045217, + -0.049840588, + -0.051897135, + 0.04921834, + 0.018730633, + 0.07189677, + -0.020521715, + 0.10433443, + -0.0035553537, + 0.015335822, + -0.03326729, + -0.05246277, + -0.038786076, + 0.04000599, + -0.028919725, + -0.017996594, + -0.007428113, + -0.003258321, + 0.0127034895, + -0.0062633064, + 0.0007574967, + -0.060385525, + -0.018971093, + 0.062526286, + -0.025764955, + 0.05286283, + 0.043842334, + 0.044092383, + -0.037126385, + -0.018775577, + 0.007996275, + -0.00028039515, + -0.06591952, + 0.039109394, + 0.022268493, + 0.033030964, + 0.010780152, + 0.051087722, + -0.07398754, + 0.02156791, + -0.03391487, + 0.01900175, + -0.03438655, + -0.050286565, + -0.029407075, + 0.013486627, + 0.006069821, + 0.03566702, + -0.046612754, + 0.030740444, + -0.0637836, + 0.020758858, + 0.013579259, + 0.015677635, + 0.07067559, + -0.03354964, + -0.09833861, + -0.045598283, + 0.046094477, + -0.018735003, + 0.0013117951, + 0.020225674, + -0.025771514, + -0.011772435, + 0.020403381, + 0.048393097, + -0.001137191, + -0.008214463, + -0.024194324, + 0.012559411, + 0.028170707, + -0.038262583, + -0.010594243, + 0.008866333, + 0.02652175, + 0.010765866, + 0.02152175, + 0.007194773, + -0.021046689, + -0.047594506, + -0.05342931, + 0.044459403, + -0.00075621146, + 0.021768885, + 0.061362576, + 0.03243972, + 0.023200674, + 0.012056035, + -0.010374278, + -0.06796502, + -0.0056832493, + 0.048799623, + -0.035878677, + -0.020508701, + 0.03527651, + 0.096402384, + -0.027735645, + 0.11728837, + 0.022490505, + -0.08394513, + -0.010033967, + 0.024851669, + -0.019062884, + 0.00039440763, + -0.10133529, + 0.011722217, + -0.04434193, + -0.030069547, + 0.030103652, + -0.017366616, + 0.046203658, + -0.04393208, + -0.05095759, + -0.04554081, + -0.029142734, + 0.01689045, + 0.008356038, + -0.035321265, + -0.02382173, + -0.0015672153, + 0.06304823, + -0.008137697, + -0.014463008, + 0.045292154, + -0.06497864, + 0.015265712, + 0.008239593, + -0.08195689, + 0.037012544, + 0.04680898, + 0.007484248, + 0.02335733, + -0.06787198, + -0.062197443, + -0.06841327, + -0.039720036, + -0.0105394935, + -0.057220835, + -0.039479975, + 0.029730098, + 0.0697698, + 0.0280752, + 0.0137115335, + -0.0045632124, + -0.01313052, + 0.07553262, + -0.04117193, + -0.14872926, + 0.028015105, + -0.047134113, + -0.016151398, + -0.081647106, + -0.02221662, + -0.036281105, + -0.023036504, + 0.0612415, + -0.018361837, + -0.0238258, + -0.0022532772, + 0.1537845, + 0.006872191, + -0.044352733, + -0.0026320857, + -0.08600976, + 0.005572628, + 0.053448226, + -0.015072955, + -0.029777542, + -0.019132927, + 0.053970527, + 0.005238485, + -0.02418231, + -0.12369688, + 0.0014781327, + 0.059662092, + -0.011181213, + 0.01400666, + 0.023866476, + -0.059490796, + -0.054530527, + -0.011234197, + 0.013823349, + -0.012150345, + -0.09948839, + 0.023659766, + 0.014326883, + -0.02229736, + -0.0024076505, + -0.10091382, + 0.08174192, + -0.024408998, + -0.023222951, + 0.011201234, + 0.013236311, + 0.04317295, + 0.051764306, + 0.07648576, + -0.00061111146, + -0.088623054, + -0.037177067, + 0.038964123, + -0.029959839, + 0.033466227, + -0.08635276, + 0.04128183, + -0.020397836, + 0.056285754, + -0.02570748, + 0.05911732, + 0.0061064134, + -0.01733281, + -0.0875996, + -0.0127257295, + -0.013593507, + -0.04925175, + 0.01888016, + -0.032455195, + -0.023753202, + 0.052025676, + 0.06000905, + 0.04137704, + 0.004952635, + -0.02542677, + 0.00017748028, + -0.041987997, + 0.04760188, + 0.068178274, + -0.060950078, + -0.05742421, + 0.054274186, + -0.048096504, + 0.034568857, + 0.0012921172, + 0.0705816, + -0.014679933, + -0.001761971, + -0.029119784, + 0.008006632, + 0.018063113, + -0.05880496, + -0.052486468, + 0.010976936, + 0.03688557, + 0.061141517, + -0.009467033, + -0.035062946, + -0.06794524, + -0.0609979, + 0.015924038, + -0.03805085, + 0.03977454, + -0.015656536, + 0.014254484, + -0.030620195, + -0.038830906, + -0.013730216, + -0.070247106, + -0.074514836, + 0.037831023, + 0.027780455, + 0.0073002693, + -0.050368425, + 0.040389538, + 0.035920046, + 0.025425838, + 0.006255748, + -0.017454483, + -0.02307413, + 0.05788845, + 0.018672187, + 0.033335716, + 0.01855402, + 0.07957198, + -0.0029801806, + -0.057038378, + 0.010123766, + 0.038190138, + 0.0333764, + 0.075057626, + 0.00592374, + 0.06380629, + -0.028154025, + 0.07188246, + -0.056649268, + -0.019166004, + 0.053392358, + 0.13961181, + -0.08459373, + 0.03255955 + ], + "index": 0, + "object": "embedding" + } + ], + "model": "togethercomputer/m2-bert-80M-32k-retrieval", + "object": "list", + "usage": null + } + }, + "is_streaming": false + } +} diff --git a/tests/integration/recordings/responses/0c1f45455d3b.json b/tests/integration/recordings/responses/0c1f45455d3b.json new file mode 100644 index 000000000..e1d3c44c4 --- /dev/null +++ b/tests/integration/recordings/responses/0c1f45455d3b.json @@ -0,0 +1,59 @@ +{ + "request": { + "method": "POST", + "url": "https://api.together.xyz/v1/v1/chat/completions", + "headers": {}, + "body": { + "model": "meta-llama/Llama-3.3-70B-Instruct-Turbo-Free", + "messages": [ + { + "role": "user", + "content": "Hello, world!" + } + ], + "stream": false + }, + "endpoint": "/v1/chat/completions", + "model": "meta-llama/Llama-3.3-70B-Instruct-Turbo-Free" + }, + "response": { + "body": { + "__type__": "openai.types.chat.chat_completion.ChatCompletion", + "__data__": { + "id": "oBUtgGr-4Yz4kd-9801a2f00b2b42e8", + "choices": [ + { + "finish_reason": "stop", + "index": 0, + "logprobs": null, + "message": { + "content": "Hello! It's nice to meet you. Is there something I can help you with or would you like to chat?", + "refusal": null, + "role": "assistant", + "annotations": null, + "audio": null, + "function_call": null, + "tool_calls": [] + }, + "seed": 1098425109146507500 + } + ], + "created": 1758039052, + "model": "meta-llama/Llama-3.3-70B-Instruct-Turbo-Free", + "object": "chat.completion", + "service_tier": null, + "system_fingerprint": null, + "usage": { + "completion_tokens": 25, + "prompt_tokens": 39, + "total_tokens": 64, + "completion_tokens_details": null, + "prompt_tokens_details": null, + "cached_tokens": 0 + }, + "prompt": [] + } + }, + "is_streaming": false + } +} diff --git a/tests/integration/recordings/responses/17030e75309f.json b/tests/integration/recordings/responses/17030e75309f.json new file mode 100644 index 000000000..4b77b3d3d --- /dev/null +++ b/tests/integration/recordings/responses/17030e75309f.json @@ -0,0 +1,800 @@ +{ + "request": { + "method": "POST", + "url": "https://api.together.xyz/v1/v1/embeddings", + "headers": {}, + "body": { + "model": "togethercomputer/m2-bert-80M-32k-retrieval", + "input": "This is completely different content" + }, + "endpoint": "/v1/embeddings", + "model": "togethercomputer/m2-bert-80M-32k-retrieval" + }, + "response": { + "body": { + "__type__": "openai.types.create_embedding_response.CreateEmbeddingResponse", + "__data__": { + "data": [ + { + "embedding": [ + 0.020581583, + 0.03996682, + 0.06342483, + -0.046694994, + -0.07684763, + -0.05265455, + -0.053058416, + -0.008007386, + -0.04512141, + 0.03718547, + -0.026790882, + 0.039592147, + 0.08868821, + -0.054975007, + 0.022950895, + -0.03249339, + 0.05376096, + 0.04878751, + 0.06144113, + 0.08925032, + -0.06345507, + -0.0008829904, + 0.07914291, + -0.028592229, + -0.048433058, + -0.0351529, + 0.028880889, + -0.08001268, + -0.04552556, + -0.080687605, + 0.1400234, + 0.14326853, + 0.02891313, + -0.05588759, + 0.007262874, + 0.026984219, + 0.09121335, + 0.050748702, + 0.017702162, + -0.035733465, + 0.1328057, + -0.08973662, + -0.050988093, + -0.009071953, + 0.00674055, + 0.0138731655, + -0.024637444, + -0.0019375099, + 0.019351467, + 0.041681487, + 0.09368255, + 0.0052818935, + 0.027539922, + -0.031472813, + 0.042352878, + 0.07326235, + 0.010973438, + 0.06776053, + 0.06473745, + 0.031266563, + 0.00057834754, + -0.002110916, + 0.16004054, + -0.0535361, + 0.04453045, + 0.050499436, + 0.03501775, + -0.003733677, + 0.020598825, + -0.079224035, + 0.07070447, + -0.060201976, + 0.006393084, + -0.003781692, + 0.070510566, + -0.047214407, + 0.06080987, + -0.0877733, + -0.08569845, + -0.018021964, + 0.06378409, + 0.027565937, + 0.038700324, + -0.1248613, + 0.00903349, + -0.08429076, + 0.016536232, + 0.025240825, + 0.00043874417, + -0.004602262, + 0.0457946, + -0.03598806, + 0.056914188, + 0.044693712, + 0.011178773, + -0.020428436, + 0.036093723, + 0.031189999, + 0.07220326, + -0.066868156, + -0.020061923, + -0.0563857, + -0.013928966, + -0.034524415, + 0.0041604545, + -0.047119446, + 0.033624567, + 0.06970587, + -0.033320673, + -0.0413748, + 0.01094969, + -0.0100499755, + 0.004480598, + 0.02067311, + -0.021157527, + 0.022485765, + 0.03633523, + 0.0049809627, + 0.02181411, + 0.049156368, + 0.06253565, + 0.059981186, + -0.031591866, + -0.049331754, + 0.033537455, + 0.021542493, + 0.009435254, + 0.025516914, + 0.025417773, + -0.07066102, + 0.011794456, + 0.06311989, + 0.011093616, + 0.08549021, + -0.04281618, + 0.011115061, + 0.07443118, + 0.021961706, + -0.02724888, + -0.00047235374, + 0.016601468, + 0.043411057, + 0.03835865, + 0.01029931, + 0.008437206, + -0.057274926, + -0.045377273, + -0.09733081, + -0.009755395, + 0.028172465, + 0.043972567, + 0.0968819, + 0.052496422, + 0.031553026, + -0.019291716, + 0.034150966, + 0.1310106, + 0.02864821, + -0.047452684, + 0.016342362, + -0.06591784, + -0.064888336, + -0.03380424, + -0.08384223, + 0.023302404, + -0.020427782, + 0.019540966, + 0.02240307, + 0.026848866, + -0.0018868797, + -0.031800512, + -0.073483676, + 0.08840526, + -0.02696041, + -0.042041607, + 0.030633071, + 0.020918656, + 0.06119309, + -0.048348967, + 0.036555305, + 0.033583682, + 0.019630525, + -0.03500669, + -0.020821452, + 0.012256841, + 0.06733756, + 0.036884613, + -0.080063485, + 0.019956889, + -0.01994667, + 0.0011630546, + -0.08307688, + -0.040326167, + -0.03293244, + -0.014897417, + 0.03977495, + 0.036790676, + 0.020645684, + 0.015943283, + -0.05961047, + 0.036905374, + 0.006005009, + 0.033375766, + -0.015491932, + -0.07008363, + -0.031575754, + -0.0065630106, + -0.013962699, + -0.012629252, + 0.046026245, + 0.007901817, + -0.117550366, + -0.06314231, + 0.05348636, + 0.10863247, + 0.053361807, + 0.055756297, + -0.026388792, + -0.011777907, + -0.07197253, + 0.010918023, + 0.020021347, + 0.14850953, + -0.043404948, + -0.04262303, + -0.04904758, + -0.014644666, + -0.0018742547, + -0.0054880613, + -0.015058903, + -0.03137978, + -0.09884002, + 0.048087206, + -0.00044948232, + -0.059237186, + 0.01681299, + 0.06357592, + 0.09665662, + -0.032431144, + -0.021346267, + -0.03630939, + 0.108024776, + 0.011421504, + 0.00090062595, + 0.09738569, + 0.07588425, + -0.038476508, + 0.008637763, + 0.03942589, + 0.03673421, + -0.008536316, + -0.035427485, + -0.0571462, + 0.077514425, + -0.014574157, + -0.06636753, + 0.0356625, + 0.00055575924, + -0.008948914, + 0.00082343427, + 0.0511982, + 0.03143358, + -0.03388075, + -0.013724427, + 0.0551338, + -0.007191376, + -0.05363105, + -0.07718383, + -0.008230843, + 0.10335533, + 0.013668598, + -0.08284561, + 0.05179483, + -0.08437943, + -0.017510848, + -0.05778264, + 0.044004828, + -0.02612715, + -0.0058190715, + 0.013293448, + -0.005663543, + 0.0037016177, + -0.020699238, + 0.00277368, + 0.041328322, + -0.052624915, + 0.020320976, + 0.0033441507, + -0.11465616, + -0.059619453, + -0.029252917, + 0.014145012, + -0.049234822, + 0.025969574, + 0.04118447, + 0.017938918, + -0.009885965, + 0.012801603, + -0.0007332413, + -0.0012993023, + -0.052635074, + 0.064850755, + 0.004576457, + -0.018446025, + -0.069130346, + 0.018532049, + 0.006330208, + 0.039377607, + 0.11237417, + 0.055357743, + -0.0038629018, + 0.048188694, + 0.052925084, + -0.011272187, + -0.012422014, + 0.005874242, + -0.0007749841, + -0.058404274, + -0.022589723, + 0.031956926, + 0.0470711, + 0.027993023, + -0.06112344, + -0.0119517995, + -0.09797626, + -0.073644884, + 0.07465703, + 0.09884925, + -0.035564825, + -0.040369682, + 0.014445328, + -0.052219898, + -0.027498178, + 0.036846854, + -0.09408649, + -0.00027856976, + 0.028489627, + 0.002446708, + -0.043065134, + -0.030562297, + 0.07565528, + -0.0256914, + -0.12143018, + 0.09360902, + 0.015026368, + 0.058814585, + -0.01885037, + 0.04901136, + 0.009521308, + -0.0067844316, + -0.06265128, + 0.029733902, + 0.019703392, + -0.029863501, + 0.033668272, + -0.015967827, + -0.024716265, + 0.07095029, + 0.07264489, + -0.021480447, + -0.040650267, + -0.11752601, + 0.019378915, + -0.042310815, + 0.05690114, + -0.01413233, + 0.058113046, + -0.073345415, + -0.059576523, + -0.09720947, + 0.012149926, + 0.057291746, + -0.03505685, + -0.038375836, + 0.0149342865, + -0.001562935, + -0.023513826, + 0.00014910847, + 0.022598296, + -0.071317434, + -0.06260575, + 4.0522777e-05, + -0.086758316, + -0.013101295, + -0.02990748, + -0.08461068, + 0.016139807, + 0.06101953, + -0.08451055, + -0.046145856, + -0.048467644, + 0.060105037, + 0.024200678, + 0.052542347, + 0.041119967, + -0.0068898834, + 0.09487794, + 0.012641435, + -0.13026047, + 0.06284531, + 0.018659385, + -0.07564698, + 0.006965884, + -0.036618453, + 0.118192144, + -0.04771263, + 0.023280941, + 0.054039616, + -0.114724584, + -0.0918062, + 0.038803104, + -0.09954885, + 0.008216844, + -0.030975524, + -0.030176945, + 0.0397766, + -0.0061745024, + 0.071971394, + -0.041089423, + 0.033857126, + 0.03961017, + -0.03826589, + 0.038435444, + -0.0860421, + 0.08869605, + -0.028628873, + -0.05565758, + 0.056920726, + 0.020458337, + 0.05994542, + 0.08241441, + 0.0400861, + -0.0045191804, + 0.0030094406, + -0.007466077, + -0.02953672, + -0.068642505, + 0.060889505, + -0.029501854, + -0.048823155, + 0.015409609, + 0.018862283, + -0.016425489, + -0.087497436, + 0.067643866, + -0.033761434, + -0.054749027, + -0.03657711, + 0.038102675, + -0.06197178, + 0.045409728, + -0.02127562, + 0.064449035, + -0.0056471447, + 0.067553245, + -0.07137091, + 0.017407946, + -0.09813906, + -0.046500444, + -0.058283363, + -0.018302118, + -0.025382183, + -0.04259567, + 0.022398086, + -0.09098867, + 0.043438766, + -0.07656342, + 0.0028111413, + 0.030880956, + -0.07750997, + 0.07084878, + 0.05344556, + 0.0052658613, + -0.025303314, + -0.04759683, + -0.017034022, + 0.02855913, + -0.04999449, + 0.01974624, + 0.07708244, + -0.011766297, + 0.057390995, + -0.04652422, + 0.023833811, + 0.05608237, + 0.05765577, + 0.05078112, + 0.046039928, + -0.055372067, + -0.044933185, + -0.08522771, + -0.09142792, + 0.012817157, + -0.026148932, + -0.07331254, + 0.11312438, + 0.055893615, + -0.013500698, + 0.008603385, + 0.00057156937, + -0.091709465, + 0.08057745, + -0.011340835, + -0.016915537, + 0.0011427286, + 0.09740327, + -0.029696029, + -0.047760956, + 0.015541391, + 0.0955123, + 0.021890407, + -0.02908531, + 0.030994056, + 0.03820344, + -0.062488347, + 0.015730608, + 0.021182666, + -0.043783836, + 0.02782434, + 0.11151618, + 0.052450567, + 0.00037089732, + 0.03351987, + -0.0054050605, + -0.033424556, + 0.10350312, + 0.065157756, + 0.03392563, + 0.010131469, + -0.053846426, + -0.0022781377, + 0.0014610494, + 0.005763698, + 0.0426489, + -0.08206464, + -0.07099776, + -0.04228286, + 0.07337842, + 0.047744617, + 0.04284143, + 0.06959166, + 0.013133698, + -0.030711556, + 0.009055728, + 0.06162162, + 0.017240932, + -0.039795205, + -0.10877084, + 0.024329182, + -0.0049141976, + -0.038892467, + -0.012901915, + -0.095080145, + 0.05290344, + 0.021141307, + 0.03017632, + -0.0044154925, + -0.10163907, + -0.08186605, + -0.023801327, + 0.035552323, + 0.039041802, + -0.032427292, + 0.07541, + 0.10233232, + 0.018622704, + -0.013646388, + -0.008619573, + 0.020216271, + -0.07897946, + 0.063637026, + -0.08652915, + -0.0100032855, + 0.046902858, + 0.076707095, + 0.02531022, + 0.05425257, + 0.015954422, + -0.033368777, + -0.025112148, + -0.01394599, + -0.04062625, + 0.056534503, + -0.04304168, + -0.060214523, + 0.016551849, + -0.006314451, + 0.060458317, + 0.027808908, + 0.040655438, + -0.031415448, + -0.120496035, + -0.04355332, + 0.002170874, + 0.013876282, + -0.011508199, + -0.046841078, + 0.076444104, + 0.08982719, + 0.0846208, + 0.029678846, + -0.086331986, + 0.14421903, + -0.0030989156, + 0.01598773, + 0.059804816, + -0.0464971, + -0.0058899643, + 0.02542227, + -0.020552263, + 0.10621325, + -0.023809364, + -0.13324538, + -0.075492345, + 0.06716611, + -0.040477127, + -0.046582364, + -0.07376809, + 0.024235222, + 0.070477486, + 0.11006968, + -0.04869493, + 0.078016356, + -0.07615679, + 0.08063025, + -0.016255612, + -0.051746953, + 0.08059405, + -0.0025989392, + -0.073428795, + -0.03987752, + 0.098251894, + -0.006217126, + -0.028130062, + -0.051326722, + -0.0470711, + -0.016759045, + -0.039230157, + -0.020525763, + 0.07148479, + -0.05419997, + -0.025775867, + 0.0070432695, + -0.006410803, + 0.027631486, + 0.037966132, + -0.025654731, + -0.023324372, + 0.026257442, + -0.034822363, + -0.010826962, + 0.020623349, + 0.0523646, + -0.022230538, + 0.028196862, + 0.023292363, + 0.12025986, + -0.022648653, + -0.061013527, + -0.040045265, + 0.022293845, + -0.016287014, + -0.08896512, + -0.021426601, + 0.05109808, + 0.038455352, + 0.055882193, + 0.10342665, + 0.06503611, + 0.07195616, + -0.013601524, + 0.028618002, + 0.03990776, + 0.03236452, + 0.07085622, + 0.0055737793, + 0.013130723, + -0.066394895, + 0.021342268, + 0.0026651763, + -0.012577644, + 0.049445108, + 0.049437333, + 0.0047207237, + -0.02006381, + 0.02022424, + 0.05142978, + 0.01725655, + 0.00037797724, + 0.039846063, + -0.11509461, + -0.013602717, + -0.066661686, + -0.020612884, + 0.012832718, + -0.091352694, + -0.09389515, + 0.07369748, + 0.056452867, + 0.10581744, + -0.06383743, + 0.036662158, + -0.07204409, + 0.012689036, + -0.025724197, + 0.040817674, + -0.06890574, + 0.0055584335, + 0.031956017, + 0.0014588524, + 0.098465145, + 0.0054196557, + 0.056656968, + 0.03322914, + -0.040962957, + -0.015689995, + -0.034545593, + -0.052660752, + -0.044768244, + -0.04419147, + -0.11039146, + 0.015522225, + 0.0052053384, + -0.08471112, + 0.025280464, + -0.03353502, + -0.018717872, + -0.020738749, + 0.0021664763, + -0.011238148, + 0.02322494, + 0.010894536, + -0.09676859, + 0.01013113, + 0.0035604087, + -0.0060942546, + -0.027839229, + -0.0037214137, + 0.053193003, + -0.070640355, + -0.07783396, + 0.005814805, + 0.0064411093, + -0.023913933, + 0.030543711, + -0.07979223, + -0.008982119, + 0.043360766, + -0.048063844, + 0.0017047173, + 0.06882568, + -0.03443207, + 0.015080402, + -0.049461022, + 0.045471057, + -0.031460688, + -0.0028212033, + 0.044725604, + 0.0026248703, + -0.0329393, + -0.034404054, + 0.024516258, + 0.002614168, + -0.047855787, + -0.03149, + 0.14646776, + -0.047660008, + 0.021453902 + ], + "index": 0, + "object": "embedding" + } + ], + "model": "togethercomputer/m2-bert-80M-32k-retrieval", + "object": "list", + "usage": null + } + }, + "is_streaming": false + } +} diff --git a/tests/integration/recordings/responses/432a346b2ed8.json b/tests/integration/recordings/responses/432a346b2ed8.json new file mode 100644 index 000000000..3ae45b379 --- /dev/null +++ b/tests/integration/recordings/responses/432a346b2ed8.json @@ -0,0 +1,2352 @@ +{ + "request": { + "method": "POST", + "url": "https://api.together.xyz/v1/v1/embeddings", + "headers": {}, + "body": { + "model": "togethercomputer/m2-bert-80M-32k-retrieval", + "input": [ + "Hello, world!", + "How are you today?", + "This is a test." + ] + }, + "endpoint": "/v1/embeddings", + "model": "togethercomputer/m2-bert-80M-32k-retrieval" + }, + "response": { + "body": { + "__type__": "openai.types.create_embedding_response.CreateEmbeddingResponse", + "__data__": { + "data": [ + { + "embedding": [ + -0.017041557, + -0.07436493, + 0.02897635, + -0.032216743, + 0.0056444216, + -0.029015187, + 0.06512343, + -0.040310342, + 0.05263593, + 0.0068842396, + 0.019191971, + -0.0064884443, + -0.01664521, + 0.014244285, + 0.036390014, + -0.040292, + 0.031780273, + 0.0039553884, + -0.055303488, + -0.028992416, + -0.02059435, + 0.05677091, + -0.043668333, + -0.014273451, + 0.15328151, + -0.023603301, + -0.049825363, + 0.007869072, + -0.010882995, + -0.033912696, + 0.053697765, + -0.00093928695, + 0.0017799847, + 0.038871024, + -0.069678165, + -0.067093275, + 0.025772842, + -0.057590123, + -0.015825877, + 0.020131286, + 0.020742312, + 0.003915491, + -0.018451879, + 0.020440312, + -0.023613403, + -0.039568678, + -0.013152008, + -0.01871725, + 0.021348018, + -0.019964654, + 0.038607903, + 0.018397795, + -0.0063561443, + -0.018936336, + -0.060981557, + -0.02152846, + 0.027057847, + 0.0014626224, + -0.018241309, + -0.07473041, + -0.02377323, + -0.033910733, + 0.02569418, + -0.024951216, + -0.0076659806, + -0.015425462, + 0.006604636, + 0.09833969, + -0.005054596, + 0.008841989, + -0.01836461, + -0.018554095, + 0.011605144, + -0.016599955, + -0.062196333, + -0.0037542647, + -0.025220644, + -0.027834827, + -0.020460974, + -0.050503097, + 0.032119684, + -0.023387104, + 0.050067227, + -0.05834235, + 0.023189448, + -0.021862485, + 0.023831544, + -0.016663097, + -0.041609522, + 0.025361128, + 0.002924296, + 0.01852158, + 0.08960255, + -0.003265466, + -0.058762494, + -0.06428431, + -0.014671485, + -0.046800107, + 0.02691456, + -0.0059303525, + -0.015431455, + 0.022179665, + 0.014044907, + 0.012218545, + 0.0053836405, + -0.025096457, + 0.009438382, + 0.032498095, + 0.06879721, + 0.056900814, + 0.019497631, + -0.122159146, + -0.106994465, + -0.017456975, + 0.047223866, + 0.06569824, + 0.04780035, + 0.018039258, + -0.0011028647, + -0.05067006, + 0.0106863845, + 0.027489506, + -0.014593985, + -0.039851535, + -0.09175489, + 0.037555773, + -0.060439512, + 0.008525801, + 0.0071557434, + -0.057973035, + -0.054225244, + 0.051505033, + -0.0008626373, + 0.069083415, + 0.064380065, + 0.09843996, + 0.0062191207, + -0.041505292, + -0.05381256, + -0.0073601264, + -0.03288613, + 0.011711341, + -0.09244605, + 0.0069717136, + -0.05722877, + 0.041075893, + 0.06521969, + -0.0018537377, + 0.016272636, + 0.008761483, + -0.029342752, + 0.020412564, + -0.07015791, + 0.033616304, + 0.039998446, + 0.01602917, + 0.044467725, + -0.08176377, + -0.036885373, + 0.03468746, + 0.0024068495, + 0.00056306267, + 0.02546511, + -0.053339135, + -0.027220095, + -0.021510394, + 0.054806393, + -0.005447777, + -0.05690438, + -0.028497366, + 0.01873974, + -0.035461064, + -0.00019089226, + -0.04914238, + 0.030303763, + 0.013396073, + 0.015789565, + -0.07714792, + -0.062155712, + -0.00677417, + 0.02850476, + 0.031491462, + 0.014566345, + 0.012163924, + 0.11814501, + -0.0043511004, + -0.017920421, + 0.004205825, + -0.0015928322, + -0.012145554, + 0.01663168, + -0.071173735, + 0.0029570858, + 0.12899451, + 0.004157568, + 0.010501232, + 0.07710632, + 0.062119417, + 0.021002673, + -0.023212241, + -0.04327007, + -0.0567023, + 0.04590105, + 0.0019161925, + 0.02637205, + 0.029331107, + -0.029769177, + -0.050466795, + -0.08057371, + 0.007419741, + -0.008777471, + 0.02217743, + 0.013535721, + 0.03426775, + 0.04592361, + 0.009423588, + -0.023030678, + -0.024462381, + 0.054334357, + 0.06710402, + 0.077300854, + 0.0300022, + -0.0035417816, + -0.0046773576, + -0.0927158, + -0.0218652, + -0.043468982, + -0.035734102, + -0.038873542, + -0.0412869, + -0.016015923, + 0.0038303286, + 0.08523618, + -0.05200533, + -0.014904317, + -0.016793448, + 0.04478206, + -0.017161047, + 0.02638292, + 0.007849463, + -0.040533304, + -0.017599737, + 0.047704253, + 0.034988616, + -0.013908102, + 0.044121094, + 0.040395457, + -0.010402818, + 0.0063570403, + -0.014962749, + 0.025776524, + 0.023681043, + 0.006042675, + 0.017647373, + 0.016301101, + -0.07793374, + -0.004771094, + 0.012728924, + -0.00047885205, + -0.051591527, + 0.03612118, + -0.02209703, + 0.052075963, + -0.021613466, + -0.026258182, + 0.008102769, + -0.04963262, + 0.00062747014, + -0.012579783, + 0.076374784, + -0.047350414, + -0.007680664, + 0.062471915, + -0.0061351187, + -0.043617643, + 0.023878522, + -0.09653609, + 0.018392054, + -0.039719462, + 0.065271765, + 0.034548305, + 0.004219043, + -0.003628092, + 0.0047836183, + 0.0132732885, + -0.028140727, + -0.015683327, + -0.052812085, + -0.019410037, + 0.06812139, + -0.041178964, + 0.014646207, + -0.0037439142, + 0.0003088275, + -0.04985693, + 0.0223661, + 0.008887433, + 0.0049061268, + 0.042707395, + -0.021471359, + -0.06471383, + 0.0022036259, + 0.030178884, + -0.002764245, + -0.0063233464, + -0.04146522, + -0.008236624, + 0.0037351896, + -0.027550086, + -0.0137326885, + 0.0055276263, + 0.0016785853, + 0.050191414, + 0.02629574, + -0.009129228, + 0.06351977, + -0.037435655, + 0.0467174, + -0.012987377, + -0.007550927, + -0.004503205, + 0.010520655, + 0.064984836, + 0.009879768, + 0.055787366, + -0.042653065, + 0.024189176, + 0.0378726, + -0.032453574, + 0.043519154, + 0.020133087, + -0.055212636, + -0.016188117, + 0.03764466, + -0.022142444, + 0.11164031, + 0.019020407, + -0.008950892, + 0.0517199, + 0.0014494535, + 0.041113462, + -0.0912906, + -0.04723132, + 0.008548748, + 0.028231544, + 0.023689618, + -0.039103802, + -0.034011997, + -0.04731894, + 0.03309799, + -0.044572156, + -0.116778485, + -0.028786778, + 0.05798776, + 0.05287191, + -0.0039562676, + -0.08213019, + -0.01224603, + -0.012757768, + 0.035721667, + 0.012440343, + 0.0053813523, + -0.072770126, + 0.0066190604, + 0.038976185, + -0.037760906, + -0.0031381482, + -0.052277293, + -0.016870236, + -0.053451907, + -0.05629483, + -0.034493946, + -0.0048654405, + 0.022051724, + 0.028501945, + 0.025858566, + -0.023936177, + -0.098391004, + -0.030646492, + -0.049461726, + -0.00086931954, + 0.03593346, + 0.015843417, + -0.03276966, + 0.008957432, + -0.022735167, + -0.012159252, + 0.07607085, + -0.059834506, + 0.004478244, + 0.03439635, + 0.03683821, + 0.062883355, + 0.054430448, + -0.029807799, + 0.0032295138, + 0.08891875, + -0.026941199, + -0.00618463, + -0.022683868, + -0.024138795, + -0.036633875, + 0.02097464, + -0.003001584, + 0.020455033, + 0.043717608, + 0.06566654, + -0.029039463, + -0.0066977167, + -0.04504434, + 0.022257777, + 0.054422457, + 0.029796708, + 0.009008146, + 0.028205348, + 0.06255052, + -0.004475601, + 0.059329458, + -0.038065027, + -0.027933009, + -0.07060949, + 0.013978787, + -0.051300917, + 0.02945564, + -0.008552103, + -0.009436655, + 0.039747514, + -0.016741823, + 0.04740887, + 0.03521937, + -0.012574282, + -0.089222826, + -0.043515395, + -0.04158566, + 0.0016020355, + 0.02684753, + -0.019394692, + -0.02156877, + 0.06316388, + 0.01663444, + 0.015482924, + 0.047349654, + -0.028341234, + 0.013805591, + -0.010708488, + -0.07627738, + 0.08611209, + 0.0089956885, + 0.034438204, + 0.016312746, + -0.03412846, + 0.0770598, + -0.06790466, + 0.036359854, + 0.08038976, + 0.023465984, + -0.019832904, + -0.0011524013, + -0.03804293, + 0.04106918, + -0.028220456, + 0.032340813, + -0.030669356, + -0.004353358, + -0.019439798, + 0.0020563425, + 0.03015629, + -0.06430176, + 0.0034439075, + -0.045720384, + -0.06526568, + -0.0004192516, + -0.016580455, + -0.012596616, + 0.039126, + -0.04699455, + -0.008973794, + 0.015056125, + 0.018929023, + -0.07840811, + -0.014792519, + -0.0044317124, + 0.019588342, + 0.035912346, + -0.035739247, + 0.058755044, + -0.01856197, + 0.021155646, + -0.073580906, + -0.04310776, + -0.023147091, + -0.010232029, + 0.06352039, + 0.039570276, + 0.020424508, + 0.051613245, + 0.013395984, + -0.003908009, + -0.04643392, + 0.019592889, + -0.008484923, + 0.0031434586, + -0.046069775, + -0.01765311, + -0.041277196, + -0.070297986, + 0.012561737, + -0.003500738, + -0.01729488, + -0.0033254062, + 0.053035453, + -0.054218896, + -0.029708259, + -0.0047281524, + 0.019236762, + -0.12249525, + 0.03018237, + -0.028753102, + -0.031858314, + 0.0811298, + -0.005711499, + -0.057587985, + 0.014153141, + 0.0006705577, + -0.024263157, + 0.016729265, + -0.03195949, + -0.007259763, + -0.0035231581, + -0.03890975, + 0.011460382, + -0.06591321, + -0.023756726, + -0.023958001, + 0.030074941, + -0.0040949634, + -0.048368257, + -0.029692868, + 0.027246583, + -0.024747347, + 0.014442731, + -0.00832639, + -0.0002390868, + -0.013635633, + 0.0035843733, + 0.02354072, + -0.012829061, + -0.0060750768, + -0.044952527, + -0.05725624, + 0.031746052, + -0.024419094, + 0.032444403, + -0.029308707, + 0.034302235, + -0.022495607, + 0.015296428, + -0.0057196384, + -7.8588724e-05, + 0.060303975, + 0.06299601, + 0.028222265, + -0.0071411408, + 0.015196491, + 0.02031155, + 0.039635558, + 0.079736926, + 0.008736669, + -0.023079613, + -0.04490686, + -0.021764707, + -0.015199573, + 0.036019534, + -0.0046079857, + 0.04429082, + -0.04291344, + -0.05991891, + -0.006501417, + 0.010603077, + 0.03435066, + -0.065568395, + -0.04424192, + 0.035055783, + 0.019717937, + 0.032764338, + 0.021240309, + -0.01646063, + 0.007835414, + 0.06857148, + -0.013750999, + 0.028333688, + -0.078255735, + -0.047899257, + -0.0006370693, + 0.012606231, + 0.012178417, + -0.013057751, + -0.008095854, + -0.013466724, + 0.019036459, + -0.025450038, + 0.021131655, + -0.02505666, + 0.012961284, + 0.0004236046, + -0.023920864, + -0.055114083, + 0.082351916, + 0.028973032, + 0.025259241, + 0.098259576, + -0.007385416, + 0.003546012, + -0.05316339, + -0.04186183, + 0.043638214, + -0.069299474, + -0.013284585, + -0.010019175, + 0.012883975, + 0.014200739, + -0.013508286, + 0.0086570075, + -0.020393575, + 0.10617594, + 0.028786503, + -0.018674662, + 0.026763268, + -0.0062548965, + -0.07215284, + 0.055464335, + 0.0029595464, + -0.009364344, + -0.096402094, + 0.02823341, + -0.022853011, + 0.04750492, + 0.008378555, + 0.016491622, + 0.01860681, + 0.048116222, + 0.106049344, + -0.028929656, + -0.008896546, + 0.033615295, + -0.0070807124, + -0.05684197, + -0.061439563, + 0.0060220268, + 0.046171866, + -0.01574131, + -0.07562956, + 0.0024098414, + 0.0006304895, + -0.07831614, + 0.060869616, + 0.00076000375, + -0.008209363, + -0.04139266, + -0.085268535, + -0.028194478, + -0.024567788, + -0.04218179, + 0.023546752, + 0.036236234, + 0.017199656, + -0.03315456, + -0.023814544, + 0.038755447, + -0.023165299, + -0.049283065, + -0.006907019, + 0.040826146, + 0.017533792, + -0.036849793, + -0.015506943, + -0.010768763, + -0.08758806, + -0.0295733, + 0.055843282, + -0.012555046, + 0.0076235603, + 0.008802991, + 0.026661193, + -0.023899797, + 0.043548774, + -0.034339137, + -0.027354732, + -0.07583677, + 0.020500224, + 0.036802996, + 0.031019075, + 0.04605757, + -0.004433706, + 0.0108612785, + 0.050121468, + -0.07816735, + -0.014776514, + -0.04565195, + -0.0036854912, + 0.0075577567, + -0.017044865, + 0.030597543, + -0.013623054, + -0.0648466, + -0.0318741, + -0.059455115, + -0.024783187, + -0.0088010235, + 0.11127796, + 0.03429834, + -0.010424589, + -0.06355135, + 0.034265812, + 0.02680333, + -0.007930513, + 0.030092249, + 0.008321974, + 0.03125566, + -0.06832331, + -0.0076806936, + 0.034010306, + -0.087202646, + -0.047684345, + 0.06384632, + -0.026591811, + -0.0016003181, + 0.05721666, + -0.0024700803, + -0.029714238, + 0.07761957, + -0.04561395, + -0.053199258, + 0.030417573, + -0.01958724, + 0.0012449475, + -0.04003076, + 0.08825553, + -0.023196172, + -0.08629044, + -0.049815316, + 0.027229005, + 0.0021765123, + 0.03438692, + -0.09314263, + -0.019655729, + 0.018762926, + 0.025670087, + -0.017116003, + 0.031716976, + -0.05509443, + 0.032953184, + -0.02264915, + 0.04861606, + -0.050201602, + 0.033154316, + 0.009971947, + -0.037610047, + 0.016600395, + -0.031037569, + -0.015495428, + 0.026365642, + -0.043527953, + 0.055781424, + 0.06780075, + -0.015966192, + 0.03201043, + 0.028026119 + ], + "index": 0, + "object": "embedding" + }, + { + "embedding": [ + -0.050693978, + -0.010858309, + 0.020310253, + -0.01049692, + 0.029866666, + -0.025998075, + 0.07918496, + -0.042496245, + -0.028718667, + -0.027305981, + -0.02330032, + -0.021886542, + -0.027306426, + 0.061016064, + 0.012688038, + 0.022281228, + -0.054594085, + 0.07765493, + 0.05386447, + 0.03140333, + -9.44268e-06, + -0.0011356915, + 0.022630688, + -0.014110621, + 0.030000638, + 0.007599051, + -0.06352133, + 0.053137243, + -0.056568034, + 0.057547573, + 0.0030512416, + 0.03837667, + 0.04789846, + 0.038161233, + -0.02627195, + -0.050061185, + 0.10019976, + 0.038518198, + 0.010254856, + 0.10148112, + 0.04869421, + -0.0073997034, + 0.05293147, + -0.034767445, + 0.07249512, + 0.05695461, + -0.03786103, + 0.007449489, + 0.020537589, + 0.000312089, + 0.016584814, + 0.001918721, + 0.05273067, + 0.027494889, + 0.0637688, + -0.06113676, + 0.041710924, + 0.039151315, + 0.045457218, + -0.042557742, + -0.03437774, + -0.03965357, + 0.035107236, + -0.030944545, + 0.018480912, + 0.016318278, + 0.010664849, + 0.06706701, + 0.028976813, + 0.04934793, + 0.01920518, + -0.022590633, + 0.05794299, + -0.014218797, + -0.10727855, + -0.04222983, + 0.014688315, + -0.009868972, + -0.030892346, + 0.024784064, + -0.01335315, + -0.030918332, + -0.022723109, + 0.018553259, + -0.030180262, + -0.0072358795, + 0.04466348, + 0.0028644707, + -0.08218491, + -0.035578046, + 0.034649692, + 0.014995248, + -0.034041993, + -0.01754551, + 0.012509432, + -0.12817404, + 0.022282014, + 0.038324747, + -0.007946491, + -0.10563139, + -0.0018780051, + -0.010040646, + 0.051342048, + -0.031782173, + 0.026881691, + -0.0070015015, + 0.1403214, + -0.0383665, + 0.13297008, + 0.01473871, + 0.0035459534, + -0.05397022, + 0.0027416502, + -0.008002018, + -0.05214072, + 0.046578355, + -0.06554441, + -0.01918899, + -0.044716686, + 0.016660467, + 0.0074168034, + 0.043397274, + 0.041952852, + -0.020719659, + 0.044949867, + 0.08868983, + -0.06033043, + -0.06299611, + -0.0299354, + -0.06335069, + -0.041603137, + 0.063161835, + 0.0053624725, + 0.04566859, + 0.01997067, + -0.08615492, + -0.00461124, + 0.039520558, + 0.040905517, + -0.035469536, + -0.04317211, + 0.011673073, + -0.06018417, + 0.0028443343, + -0.09747001, + -0.087689236, + 0.0004175659, + 0.07349427, + -0.002189792, + -0.023225918, + 0.031347603, + 0.003863699, + 0.03039125, + 0.0026322505, + -0.0044767857, + 0.037814893, + 0.013607858, + -0.04524581, + 0.006180776, + -0.025796989, + -0.0018575953, + 0.056745563, + -0.056899827, + -0.13912162, + 0.01923313, + -0.0072119716, + 0.03653831, + -0.03553157, + 0.008960138, + 0.01913016, + 0.041605312, + -0.030891325, + -0.050350275, + 0.017834349, + -0.06821085, + 0.024607243, + 0.016700145, + 0.06613456, + 0.048102804, + 0.06076021, + 0.006365906, + 0.009644411, + 0.044110093, + 0.04351857, + 0.06734216, + -0.0017035177, + -0.00439251, + -0.06284958, + -0.012278929, + -0.12074305, + -0.010177493, + -0.04965999, + 0.023366336, + -0.04580006, + 0.019479955, + -0.006699217, + 0.03502374, + 0.1611132, + -0.026563711, + 0.0025155211, + 0.018676694, + 0.0009814353, + -0.036826, + 0.017627593, + 0.07587332, + 0.006969805, + -0.051941425, + -0.06698752, + -0.006748652, + 0.026837183, + -0.0744657, + 0.011689156, + -0.01411786, + -0.031564586, + -0.07331578, + 0.001811603, + -0.017448701, + -0.0654881, + 0.00889219, + 0.056011263, + 0.054930564, + 0.027538713, + 0.010776839, + -0.009119489, + -0.034182906, + -0.07947322, + 0.010956856, + 0.0067299716, + -0.038189813, + -0.0017738482, + 0.0026462704, + -0.0539034, + -0.0066219224, + 0.00018278696, + 0.06491363, + 0.050116353, + 0.03692079, + 0.08176937, + 0.049276054, + -0.038431957, + 0.0041264175, + 0.0016263039, + 0.04835715, + 0.05372281, + -0.039015856, + -0.0035196007, + 0.022530695, + 0.055513002, + 0.030869612, + -0.008039368, + -0.013746457, + -0.045808554, + 0.021556988, + 0.0014481185, + 0.03700321, + 0.03712917, + 0.10185659, + -0.08633657, + 0.03425641, + 0.045996998, + -0.051326204, + -0.02598336, + 0.037188865, + 0.047904, + -0.016023936, + 0.051980697, + -0.036479976, + 0.10651916, + -0.008438165, + 0.04487357, + -0.0035620069, + -0.018047113, + 0.06171551, + 0.014961666, + -0.012419838, + -0.04932983, + -0.03162733, + 0.04412971, + 0.010965971, + 0.0099312, + -0.06457594, + -0.0020091454, + -0.012179282, + 0.011060499, + 0.013348316, + 0.0040744096, + -0.053495333, + -0.055626135, + -0.024634268, + 0.041642897, + -0.020521278, + 0.0077626, + -0.02442528, + 0.02345328, + -0.07039642, + 0.011572023, + -0.03946985, + -0.017554415, + -0.018510753, + -0.02628016, + 0.003842782, + -0.013968606, + 0.009930984, + -0.0019439043, + -0.001055162, + -0.024441715, + 0.002748, + 0.03797272, + -0.01796759, + 0.016857954, + -0.054101113, + 0.029492574, + 0.009648833, + 0.06267544, + 0.025378056, + 0.008614674, + 0.03406931, + 0.04041812, + 0.050837472, + 0.016481942, + -0.010224863, + -0.020784473, + -0.039759353, + 0.04798226, + 0.026257176, + -0.111021474, + 0.0015075838, + 0.07929549, + 0.029072981, + 0.03136461, + -0.09024568, + 0.03706794, + 0.00069653604, + 0.028990004, + 0.00158074, + -0.058231257, + -0.012032319, + -0.11285045, + 0.03993099, + 0.022554532, + 0.038430568, + -0.036563788, + -0.036297306, + 0.07201281, + 0.05026459, + -0.03646699, + -0.06714899, + -0.036391288, + 0.07507739, + 0.039017055, + 0.056063708, + -0.061854262, + 0.0077921483, + 0.026512198, + 0.0035518222, + -0.021420741, + -0.000929089, + 0.0051694694, + -0.054385625, + 0.015488236, + 0.0018151755, + 0.023275228, + -0.051910095, + 0.046563655, + -0.027084865, + -0.019521073, + 0.07038185, + -0.005629437, + 0.0104171075, + -0.025500813, + 0.012515233, + -0.018450025, + 0.0064471816, + -0.0822687, + 0.0514733, + -0.0007634487, + 0.041627247, + -0.016323347, + -0.0053568603, + 0.085863255, + 0.033773705, + -0.0048070354, + -0.0004412159, + -0.023257103, + 0.05561736, + 0.05207766, + 0.019670658, + 0.037812483, + -0.013077478, + -0.014929977, + 0.04772904, + 0.033561055, + -0.05835228, + 0.09368593, + -0.013790776, + 0.024843333, + 0.052117642, + 0.016168434, + -0.03309694, + -0.0332709, + 0.037880875, + -0.029704971, + 0.0103478255, + 0.0621371, + -0.00020507257, + 0.012393343, + -0.011916155, + 0.08173812, + -0.039204735, + -0.024686804, + 0.024316456, + 0.031949792, + 0.012687219, + 0.017169757, + -0.0016561806, + 0.017296743, + -0.005550947, + -0.04265122, + -0.0684987, + 0.06895011, + 0.016198147, + 0.12301288, + -0.027970051, + 0.07270332, + -0.0781321, + -0.023150189, + 0.019209703, + 0.050384432, + 0.063102365, + -0.1052462, + 0.013622426, + 0.024222417, + 0.07932484, + -0.044099297, + 0.05000115, + 0.01611413, + -0.066668235, + 0.03482801, + -0.03827191, + -0.016675064, + -0.008992525, + 0.01809865, + -0.0016681388, + 0.008033063, + -0.018875819, + 0.0005663335, + 0.044920616, + 0.076877005, + 0.06927666, + -0.05225116, + -0.032670625, + 0.067736275, + -0.027458396, + 0.04716389, + -0.02720322, + 0.013453853, + -0.038000166, + 0.04254829, + 0.02056911, + 0.07206648, + -0.032540064, + -0.0067454036, + -0.07023072, + 0.034042906, + -0.007585006, + -0.0068458025, + -0.019583486, + -0.079872504, + -0.04205456, + -0.09317277, + 0.008631627, + 0.029064497, + 0.055591475, + 0.049023792, + 0.017245598, + -0.027409904, + -0.008231064, + 0.05183169, + 0.088575125, + -0.00014200807, + -0.028889684, + 0.0103782285, + 0.031932928, + -0.0010171203, + 0.00889097, + 0.03915642, + -0.014465671, + 0.025092429, + -0.051718716, + -0.005562561, + 0.009389093, + -0.012151888, + 0.035728022, + -0.07083709, + 0.048586708, + -0.020331206, + 0.03032039, + -0.022218483, + -0.01604572, + -0.019281179, + -0.047274433, + 0.08225039, + -0.009769263, + -0.022123044, + -0.025783258, + 0.015255551, + 0.03588135, + 0.04413771, + -0.014886365, + -0.015528786, + -0.027134163, + -0.03344223, + -0.03906999, + -0.030708836, + 0.027987922, + -0.02679848, + -0.025790287, + 0.034544602, + -0.0015380334, + -0.011152637, + -0.033290375, + -0.06581815, + 0.06209049, + -0.012149317, + -0.06770575, + -0.029887203, + -0.021404674, + -0.048510525, + 0.020026335, + 0.021071516, + 0.01682142, + -0.12870917, + -0.012587804, + -0.04055468, + 0.047302578, + -0.037762202, + -0.046112824, + 0.010776369, + -0.014212859, + 0.02349173, + 0.09041585, + 1.565367e-05, + 0.07245511, + -0.033793304, + 0.035921212, + -0.02783346, + 0.0806998, + -0.010611987, + 0.041489985, + -0.017004602, + 0.024825959, + 0.0017323868, + 0.06234449, + 0.04331931, + 0.008339923, + 0.043990854, + 0.0060589914, + -0.022705998, + -0.020941943, + -0.00049144955, + 0.08638997, + 0.012002845, + 0.090267256, + 0.028547058, + -0.006239364, + 0.06821692, + 0.045356773, + 0.0515711, + -0.0023774423, + -0.0055029676, + -0.039530966, + -0.06231984, + 0.07199615, + -0.0736272, + 0.06531544, + 0.015005152, + 0.018980997, + 0.0010049999, + -0.01213177, + 0.05067269, + -0.026431412, + -0.039080206, + 0.051915344, + -0.018134514, + 0.008343715, + -0.038160358, + -0.033324458, + 0.0029796292, + -0.09010633, + -0.007604104, + -0.08881641, + -0.04259058, + -0.09903379, + -0.012423294, + 0.019745879, + -0.02834356, + 0.020667437, + -0.025804685, + 0.052014343, + 0.016800258, + -0.014739471, + -0.043742716, + 0.049421653, + 0.021032294, + -0.061259594, + -0.050550286, + 0.04592372, + 0.050988674, + 0.0491073, + -0.00096262776, + 0.08990844, + 0.037509143, + 0.028742973, + -0.118190385, + 0.010533227, + -0.03514427, + -0.08367883, + -0.013493585, + 0.02654289, + 0.014374991, + -0.039481364, + 0.1674116, + 0.07490431, + 0.058380052, + 0.027852368, + -0.061896965, + -0.022872766, + 0.047993485, + -0.065123655, + -0.07428092, + -0.041723747, + 0.080762535, + 0.010601916, + -0.035257086, + -0.047732975, + 6.712973e-05, + 0.05134923, + 0.050521225, + 0.025271116, + -0.0072390456, + 0.04151577, + 0.02572708, + -0.057142563, + -0.028259942, + 0.018771905, + -0.033247933, + -0.06304049, + 0.03697809, + -0.037529476, + 0.03391705, + 0.023996636, + -0.063727565, + -0.049316347, + -0.021822812, + -0.051387135, + 0.016310921, + 0.0016229213, + 0.006816926, + -0.028204253, + 0.027451735, + 0.024213102, + 0.07196294, + 0.00041893774, + -0.0096297115, + 0.049549352, + -0.06110793, + 0.0061441287, + -0.050353367, + -0.015283087, + -0.01888433, + -0.05886002, + 0.012889236, + 0.02860981, + 0.04765169, + -0.035136737, + 0.0049838605, + -0.064163454, + 0.051824152, + -0.01143845, + 0.007576831, + -0.018313015, + 0.012159296, + 0.034033798, + 0.020029843, + 0.019590652, + -0.010082555, + -0.022751726, + -0.0355381, + -0.038172133, + 0.12067669, + -0.075687334, + 0.01861976, + -0.031330068, + 0.026860299, + 0.006408792, + -0.0145417405, + 0.015177668, + -0.03025762, + 0.07643991, + 0.016266705, + -0.013141844, + -0.07231639, + 0.055646416, + -0.021509636, + -0.025625022, + -0.047063146, + -0.070508875, + -0.08632433, + -0.011631201, + -0.019939274, + -0.06350421, + -0.019870907, + 0.03216671, + 0.058062643, + 0.055208843, + -0.07156028, + 0.007989774, + 0.049972944, + 0.037406262, + -0.06293042, + -0.027840614, + -0.041593563, + -0.054527696, + 0.021761741, + 0.017650325, + -0.055453133, + -0.024841229, + 0.029395606, + -0.058559354, + 0.010116847, + -0.029088652, + 0.022447364, + 0.0079206675, + -0.015874255, + -0.0039944267, + -0.08912434, + -0.04124756, + 0.021253418, + -0.027858313, + -0.06234424, + -0.028922025, + -0.006749017, + -0.00204751, + 0.020167105, + -0.008826207, + -0.008012587, + -0.02876077, + 0.04325802, + -0.006442264, + 0.03814887, + -0.03429738, + 0.0058901254, + 0.02109685, + 0.01542989, + -0.06856703, + 0.037813462, + -0.007801844, + 0.038300894, + 0.03818303, + -0.06064273, + -0.03106093, + 0.017438883, + 0.0030734143, + 0.0013211939, + 0.017740646, + -0.030678462, + 0.02107452, + 0.061798688 + ], + "index": 1, + "object": "embedding" + }, + { + "embedding": [ + -0.02779177, + -0.007752902, + 0.00666607, + 0.007333073, + 0.027681155, + -0.04680753, + 0.034528963, + -0.050833542, + -0.055877283, + -0.075369135, + 0.018063514, + -0.0045533236, + -0.011292311, + 0.032624524, + -0.013017948, + -0.048883513, + -0.013815144, + 0.022201993, + -0.0025201102, + 0.03166489, + 0.06015168, + -0.0018540767, + 0.043800958, + 0.014623904, + 0.038353812, + -0.021314984, + 0.010522611, + -0.024581844, + 0.031366486, + 0.012493078, + -0.0007007419, + 0.009890471, + 0.05789071, + -0.05520709, + -0.02783322, + 0.018479174, + 0.0009625551, + -0.024165243, + 0.01635198, + 0.04199145, + 0.053655755, + -0.04307552, + 0.025551995, + -0.018680023, + 0.020759536, + 0.059369273, + -0.006988708, + -0.026320163, + -0.0025934891, + 0.026870603, + -0.009730706, + 0.018218627, + 0.005037782, + -0.0132323345, + -0.039169345, + -0.033258922, + -0.002247369, + 0.09466787, + 0.0056981854, + -0.022665996, + 0.06024469, + -0.016116608, + -0.003789675, + -0.025225416, + 0.019347968, + 0.024802739, + -0.049069185, + -0.012823434, + 0.000846098, + 0.018634543, + -0.060731795, + -0.03504043, + 0.085316636, + 0.013361458, + -0.012425992, + 0.0057458133, + -0.014212679, + 0.042268865, + -0.029114101, + -0.0011103856, + -0.044912685, + -0.028397746, + 0.021935457, + -0.027663197, + -0.11580737, + -0.055029213, + 0.05578334, + 0.0071452004, + -0.014473731, + -0.06328084, + 0.0140667, + -0.024593478, + 0.0046616863, + -0.007522579, + 0.025511945, + -0.07863747, + -0.0085762385, + 0.05148283, + -0.039227873, + -0.0816022, + -0.018585978, + -0.03510035, + 0.02342686, + -0.0042144833, + 0.029105023, + 0.00817719, + 0.10530593, + 0.056663927, + 0.051986016, + 0.0027708863, + -0.027644029, + -0.026126249, + 0.04316672, + 0.008625363, + -0.026928555, + 0.09236891, + -0.10665132, + 0.0022109712, + -0.04672772, + -0.0010714191, + 0.017687786, + 0.025763303, + 0.02738723, + -0.019653322, + -0.06636015, + 0.038601268, + -0.026597418, + -0.032743942, + -0.007986222, + -0.0077568023, + -0.021615017, + 0.014973637, + 0.036659174, + -0.002434029, + 0.056992944, + -0.0802926, + -0.034491055, + 0.057339218, + -0.031598423, + 0.01815245, + -0.05142944, + 0.09277832, + -0.023692241, + -0.02133611, + -0.024636442, + -0.06723946, + 0.026400885, + 0.08087762, + 0.0036785558, + 0.02101903, + -0.029615631, + -0.038861174, + 0.04874963, + 0.02979751, + 0.0060734656, + 0.05423366, + -0.030063542, + -0.004280309, + 0.05995971, + -0.042565927, + 0.0030267043, + 0.1041919, + 0.03300429, + -0.0050015924, + -0.01911076, + -0.026665272, + 0.016458593, + -0.050006777, + 0.05080731, + -0.065816425, + 0.026471464, + -0.027813306, + -0.036025744, + 0.03723687, + 0.018098509, + -0.044298846, + 0.024373472, + -0.016016398, + 0.03582579, + -0.026484434, + -0.0038789911, + 0.10619606, + 0.0022864433, + -0.014563999, + 0.004348137, + -0.013476688, + -0.0331399, + -0.07461764, + 0.032642554, + -0.014079754, + -0.007546746, + -0.04735429, + 0.028523289, + -0.025188936, + 0.0059138797, + 0.023881987, + 0.05757653, + 0.0380678, + 0.0012175398, + -0.02047756, + 0.0718534, + -0.04708265, + 0.023029216, + -0.027009143, + 0.087099396, + 0.0017206921, + 0.025318645, + -0.03911548, + -0.038268212, + 0.04721421, + -0.09048235, + 0.0018269889, + 0.03689738, + -0.0500337, + -0.0806958, + 0.015961647, + -0.0117793055, + -0.043277707, + 0.011102296, + 0.024736766, + 0.07859274, + -0.0010727937, + 0.014366967, + -0.07669862, + -0.007824215, + -0.07287751, + -0.016301835, + -0.003434503, + 0.019447176, + -0.051193517, + 0.08773244, + 0.006728499, + 0.052058756, + -0.039105475, + 0.052423023, + 0.015097122, + 0.009336027, + 0.022993218, + 0.031443782, + -0.0622707, + 0.03517323, + -0.033169843, + 0.097570434, + 0.010101814, + -0.062746756, + -0.032313753, + 0.039362427, + 0.12776423, + 0.019260308, + -0.050483607, + 0.036213342, + 0.0028129816, + 0.058977667, + -0.024792053, + -0.005835713, + 0.016384302, + 0.013303189, + -0.04755607, + -0.012990615, + 0.032058302, + -0.015489647, + -0.04008588, + 0.011562045, + 0.013523483, + -0.008329744, + 0.067591324, + -0.09078176, + 0.050933324, + -0.0001931563, + -0.01570064, + 0.0077628815, + -0.021175632, + 0.08191918, + 0.0042020655, + -0.057577576, + -0.024850775, + -0.016462047, + -0.01608794, + -0.0095810965, + 0.03440579, + -0.016924929, + -0.051613178, + -0.038862303, + -0.002591376, + -0.01687491, + -0.038348936, + -0.016345026, + -0.03499395, + -0.023711955, + -0.038983267, + 0.02909387, + 0.052785136, + -0.03956735, + 0.048813544, + -0.07408873, + -0.047479205, + -0.037384547, + 3.6122277e-05, + -0.00323103, + 0.014085068, + 0.02166948, + -0.025022797, + 0.00548469, + -0.00043267754, + 0.013587588, + -0.075237095, + -0.046044935, + 0.0037340645, + 0.015775705, + 0.0044056266, + -0.033436574, + 0.07790523, + 0.017369641, + 0.03162654, + 0.06311004, + 0.00030665845, + 0.02039911, + 0.030216057, + -0.0022921541, + -0.02669933, + -0.04271925, + -0.021516768, + -0.04860288, + 0.0037491426, + 0.044397604, + 0.013711982, + -0.0019044406, + 0.041717444, + 0.07527258, + 0.004396075, + -0.05697599, + 0.062371805, + 0.0122556435, + 0.018541628, + 0.013916607, + -0.001407872, + -0.074479096, + -0.0074305376, + 0.06843066, + -0.027167812, + 0.0020887114, + -0.03339334, + -0.069467865, + 0.027772086, + -0.029680463, + 0.0023603945, + -0.034341622, + -0.007946808, + 0.014316168, + 0.040272575, + -0.029381637, + -0.012669895, + -0.040007718, + -0.007849514, + 0.0037267352, + 0.025559353, + 0.01908747, + 0.010199893, + 0.02811712, + -0.015757034, + 0.023825217, + -0.050415065, + -0.028737074, + 0.03919414, + -0.0024481888, + -0.022511285, + 0.027958939, + 0.046735343, + 0.077127144, + 0.022440491, + 0.035965107, + -0.01409118, + 0.022490244, + -0.007463417, + 0.05943725, + 0.0740578, + -0.020744171, + -0.019496184, + -0.052855786, + -0.00028804876, + -0.05126455, + 0.015544, + 0.053731557, + -0.014565541, + 0.04822947, + -0.024476951, + 0.036131904, + -0.008535516, + 0.029941507, + 0.027597597, + 0.05004942, + -0.0634054, + -0.00058592664, + 0.075618185, + -0.06424452, + 0.0551141, + 0.07195737, + 0.0059559983, + -0.06548788, + 0.021463854, + 0.013003529, + -0.012621075, + 0.022944402, + 0.08323847, + 0.07705397, + 0.012239931, + -0.042122364, + 0.037349377, + -0.0023981212, + -0.018399907, + 0.047214046, + 0.0003528697, + 0.013069748, + 0.009889366, + -0.015569374, + 0.097634934, + -0.051274985, + -0.0035838345, + -0.081493884, + -0.034804776, + -0.068767905, + 0.06497728, + -0.04292809, + 0.009441323, + -0.050664015, + -0.026311554, + 0.043648314, + 0.05953572, + 0.02149848, + -0.070732236, + 0.032498803, + -0.01525829, + 0.025482485, + -0.07821578, + -0.0031100207, + 0.013336255, + 0.012977619, + 0.10831072, + -0.012108079, + 0.05215784, + -0.0014752754, + 0.04672664, + -0.006357827, + 0.03887902, + 0.0110858865, + 0.03910481, + 0.044483896, + 0.027306804, + 0.0304683, + -0.035071675, + 0.049174044, + -0.005893214, + -0.03226845, + 0.012989943, + -0.024567459, + 0.012174184, + -0.029126454, + 0.027247919, + 0.080386184, + 0.03994174, + -0.06301434, + -0.07710563, + -0.02356785, + -0.015658041, + -0.040340938, + 0.02344931, + -0.005036427, + -0.03987439, + 0.052536115, + -0.042034335, + -0.052926026, + 0.024309393, + -0.011847247, + -0.011882506, + -0.07358051, + -0.012023142, + 0.019672018, + 0.09082111, + 0.073102705, + -0.04581442, + -0.042871106, + -0.0347567, + 0.051297594, + 0.028319057, + -0.019270716, + -0.022108674, + 0.034829013, + -0.05005505, + -0.07417835, + 0.045196395, + 0.0032714135, + -0.07566778, + 0.048085734, + -0.005009543, + -0.0011667939, + -0.040728357, + -0.020352578, + -0.0021036982, + -0.037561715, + 0.018334854, + -0.048219055, + -0.005598004, + 0.052623373, + -0.046602413, + 0.00022030994, + 0.059313178, + 0.09316803, + 0.035902113, + -0.03455553, + -0.06944326, + 0.014147145, + -0.060626503, + -0.036259595, + -0.020195402, + 0.043234885, + -0.007683996, + 0.043373056, + 0.022036567, + 0.0020106016, + -0.035812076, + 0.063685834, + -0.03424115, + 0.06406924, + -0.0073639182, + -0.015726037, + -0.036662076, + -0.011314391, + -0.061053474, + -0.02398348, + -0.05477042, + -0.02349147, + -0.06840239, + -0.04402523, + 0.022536961, + 0.025341304, + -0.09786782, + 0.0008502628, + -0.054442905, + -0.023104902, + -0.0454393, + 0.05547487, + 0.02941837, + 0.042048343, + -0.06071158, + -0.011033424, + 0.0029785563, + 0.01214972, + 0.014557061, + 0.016386319, + -0.043748617, + -0.021092765, + -0.004604394, + 0.075954765, + 0.027810903, + -0.019764582, + -0.015932038, + 0.013924321, + -0.014167113, + -0.04632259, + -0.028052354, + 0.021453502, + -0.02792163, + 0.07461302, + 0.10187651, + 0.010440466, + 0.08697039, + 0.05600476, + -0.055770714, + -0.062498394, + -0.058112442, + -0.044180583, + -0.05975845, + 0.056162726, + -0.010600922, + 0.077493295, + -0.025435269, + 0.0923372, + 0.043819454, + -0.016430752, + -0.0015095237, + -0.0341286, + -0.002565857, + 0.005184101, + -0.071053594, + -0.010112436, + -0.045120917, + -0.0348495, + -0.006502529, + 0.03641696, + -0.027302794, + -0.02890681, + -0.033199534, + -0.07256904, + -0.03758855, + 0.070195265, + -0.0038111259, + 0.011434567, + -0.044890616, + 0.023136368, + 0.09412049, + 0.0091492105, + -0.0066012493, + -0.019036641, + 0.059483536, + -0.018774608, + -0.052236408, + -0.026530499, + -0.040146265, + 0.0271693, + 0.01088683, + 0.117901385, + -0.011070082, + 0.023090107, + -0.11041944, + -0.0023761739, + 0.052857988, + -0.027439566, + -0.009057878, + -0.0021141092, + -0.031223183, + -0.032892667, + 0.10651295, + 0.018553382, + -0.018379116, + 0.014873018, + -0.040512417, + -0.09556882, + -0.03374361, + -0.07808277, + 0.05681848, + -0.046243265, + -0.07731494, + -0.032985333, + -0.02485327, + 0.017732931, + -0.020051923, + 0.019893952, + 0.06432696, + 0.08048177, + 0.0135258045, + 0.024358852, + 0.009759977, + -0.04197342, + 0.032504115, + 0.056780778, + -0.015715199, + -0.044023775, + 0.078800865, + 0.018545117, + 0.016267061, + 0.021082798, + -0.051552717, + 3.997702e-05, + -0.03628584, + -0.021589098, + 0.008213196, + 0.0047702063, + -0.023508605, + -0.044364233, + 0.067961864, + 0.041272104, + -0.014481658, + -0.010015822, + 0.0012155318, + -0.0011898371, + -0.08544548, + -0.015493928, + -0.0961194, + -0.03561227, + -0.047253173, + -0.08211245, + 0.018751975, + 0.018324235, + 0.014308755, + 0.0015786501, + 0.038473077, + -0.038047757, + 0.0052879406, + -0.017839737, + 0.05342696, + -0.0057547847, + 0.013748893, + 0.019040905, + -0.008233868, + -0.02624656, + 0.023323942, + 0.015264979, + 0.01448448, + -0.008367796, + 0.01959026, + -0.063270934, + 0.017139366, + 0.045523375, + -0.026564969, + 0.017915701, + -0.006382077, + 0.023788478, + 0.04140121, + 0.026335489, + -0.010871567, + 0.04780582, + -0.04176159, + 0.07836516, + -0.0018306614, + 0.025779009, + -0.009535478, + -0.10667496, + -0.01856794, + -0.025107326, + -0.035873048, + -0.05994878, + 0.0076866797, + -0.0008296443, + 0.018000983, + 0.039555117, + -0.051457543, + -0.014178609, + 0.03977316, + -0.04112076, + -0.0056524235, + -0.03817852, + -0.009010357, + -0.049929984, + 0.02815696, + 0.07178824, + -0.0891005, + 0.029434266, + -0.024762046, + -0.039339434, + 0.02766893, + -0.06167313, + 0.040054474, + 0.040781498, + -0.012865714, + 0.022845585, + -0.061530273, + 0.0055303588, + 0.0707426, + -0.039974045, + -0.021843985, + 0.03287734, + 0.0024584641, + 0.008380913, + 0.027124694, + -0.00067393284, + 0.024518743, + -0.04561021, + 0.0014067562, + -0.0015057714, + -0.0045690965, + -0.05774384, + 0.030880308, + 0.0383094, + -0.035241883, + -0.041534826, + 0.00013213791, + -0.05538147, + 0.07076548, + 0.028332852, + -0.020840552, + 0.0026513778, + -0.040424034, + 0.02619544, + -0.053306147, + 0.02648879, + 0.013661143, + 0.012982066, + 0.07114231 + ], + "index": 2, + "object": "embedding" + } + ], + "model": "togethercomputer/m2-bert-80M-32k-retrieval", + "object": "list", + "usage": null + } + }, + "is_streaming": false + } +} diff --git a/tests/integration/recordings/responses/4ca6152a0eb8.json b/tests/integration/recordings/responses/4ca6152a0eb8.json new file mode 100644 index 000000000..cb222cdf8 --- /dev/null +++ b/tests/integration/recordings/responses/4ca6152a0eb8.json @@ -0,0 +1,59 @@ +{ + "request": { + "method": "POST", + "url": "https://api.together.xyz/v1/v1/chat/completions", + "headers": {}, + "body": { + "model": "meta-llama/Llama-3.3-70B-Instruct-Turbo-Free", + "messages": [ + { + "role": "user", + "content": "Which planet has rings around it with a name starting with letter S?" + } + ], + "stream": false + }, + "endpoint": "/v1/chat/completions", + "model": "meta-llama/Llama-3.3-70B-Instruct-Turbo-Free" + }, + "response": { + "body": { + "__type__": "openai.types.chat.chat_completion.ChatCompletion", + "__data__": { + "id": "oBUtaEp-62bZhn-9801a2718d0ed123", + "choices": [ + { + "finish_reason": "stop", + "index": 0, + "logprobs": null, + "message": { + "content": "The planet with rings around it that starts with the letter S is Saturn. Saturn's ring system is one of the most prominent and well-known in our solar system.", + "refusal": null, + "role": "assistant", + "annotations": null, + "audio": null, + "function_call": null, + "tool_calls": [] + }, + "seed": 2387155844510162400 + } + ], + "created": 1758039032, + "model": "meta-llama/Llama-3.3-70B-Instruct-Turbo-Free", + "object": "chat.completion", + "service_tier": null, + "system_fingerprint": null, + "usage": { + "completion_tokens": 34, + "prompt_tokens": 49, + "total_tokens": 83, + "completion_tokens_details": null, + "prompt_tokens_details": null, + "cached_tokens": 0 + }, + "prompt": [] + } + }, + "is_streaming": false + } +} diff --git a/tests/integration/recordings/responses/511eb1b92e34.json b/tests/integration/recordings/responses/511eb1b92e34.json new file mode 100644 index 000000000..cf405d5fd --- /dev/null +++ b/tests/integration/recordings/responses/511eb1b92e34.json @@ -0,0 +1,1278 @@ +{ + "request": { + "method": "POST", + "url": "https://api.together.xyz/v1/v1/completions", + "headers": {}, + "body": { + "model": "meta-llama/Llama-3.3-70B-Instruct-Turbo-Free", + "prompt": "Respond to this question and explain your answer. Complete the sentence using one word: Roses are red, violets are ", + "max_tokens": 50, + "stream": true, + "extra_body": {} + }, + "endpoint": "/v1/completions", + "model": "meta-llama/Llama-3.3-70B-Instruct-Turbo-Free" + }, + "response": { + "body": [ + { + "__type__": "openai.types.completion.Completion", + "__data__": { + "id": "oBUszH9-4Yz4kd-98019fa76a947327", + "choices": [ + { + "finish_reason": null, + "index": 0, + "logprobs": null, + "text": " __________________", + "seed": null, + "delta": { + "token_id": 44941, + "role": "assistant", + "content": " __________________" + } + } + ], + "created": 1758038918, + "model": "meta-llama/Llama-3.3-70B-Instruct-Turbo-Free", + "object": "completion.chunk", + "system_fingerprint": null, + "usage": null + } + }, + { + "__type__": "openai.types.completion.Completion", + "__data__": { + "id": "oBUszH9-4Yz4kd-98019fa76a947327", + "choices": [ + { + "finish_reason": null, + "index": 0, + "logprobs": null, + "text": "____", + "seed": null, + "delta": { + "token_id": 2179, + "role": "assistant", + "content": "____" + } + } + ], + "created": 1758038918, + "model": "meta-llama/Llama-3.3-70B-Instruct-Turbo-Free", + "object": "completion.chunk", + "system_fingerprint": null, + "usage": null + } + }, + { + "__type__": "openai.types.completion.Completion", + "__data__": { + "id": "oBUszH9-4Yz4kd-98019fa76a947327", + "choices": [ + { + "finish_reason": null, + "index": 0, + "logprobs": null, + "text": "_.", + "seed": null, + "delta": { + "token_id": 5056, + "role": "assistant", + "content": "_." + } + } + ], + "created": 1758038918, + "model": "meta-llama/Llama-3.3-70B-Instruct-Turbo-Free", + "object": "completion.chunk", + "system_fingerprint": null, + "usage": null + } + }, + { + "__type__": "openai.types.completion.Completion", + "__data__": { + "id": "oBUszH9-4Yz4kd-98019fa76a947327", + "choices": [ + { + "finish_reason": null, + "index": 0, + "logprobs": null, + "text": " \n\n", + "seed": null, + "delta": { + "token_id": 4815, + "role": "assistant", + "content": " \n\n" + } + } + ], + "created": 1758038918, + "model": "meta-llama/Llama-3.3-70B-Instruct-Turbo-Free", + "object": "completion.chunk", + "system_fingerprint": null, + "usage": null + } + }, + { + "__type__": "openai.types.completion.Completion", + "__data__": { + "id": "oBUszH9-4Yz4kd-98019fa76a947327", + "choices": [ + { + "finish_reason": null, + "index": 0, + "logprobs": null, + "text": "##", + "seed": null, + "delta": { + "token_id": 567, + "role": "assistant", + "content": "##" + } + } + ], + "created": 1758038918, + "model": "meta-llama/Llama-3.3-70B-Instruct-Turbo-Free", + "object": "completion.chunk", + "system_fingerprint": null, + "usage": null + } + }, + { + "__type__": "openai.types.completion.Completion", + "__data__": { + "id": "oBUszH9-4Yz4kd-98019fa76a947327", + "choices": [ + { + "finish_reason": null, + "index": 0, + "logprobs": null, + "text": " Step", + "seed": null, + "delta": { + "token_id": 15166, + "role": "assistant", + "content": " Step" + } + } + ], + "created": 1758038918, + "model": "meta-llama/Llama-3.3-70B-Instruct-Turbo-Free", + "object": "completion.chunk", + "system_fingerprint": null, + "usage": null + } + }, + { + "__type__": "openai.types.completion.Completion", + "__data__": { + "id": "oBUszH9-4Yz4kd-98019fa76a947327", + "choices": [ + { + "finish_reason": null, + "index": 0, + "logprobs": null, + "text": " ", + "seed": null, + "delta": { + "token_id": 220, + "role": "assistant", + "content": " " + } + } + ], + "created": 1758038918, + "model": "meta-llama/Llama-3.3-70B-Instruct-Turbo-Free", + "object": "completion.chunk", + "system_fingerprint": null, + "usage": null + } + }, + { + "__type__": "openai.types.completion.Completion", + "__data__": { + "id": "oBUszH9-4Yz4kd-98019fa76a947327", + "choices": [ + { + "finish_reason": null, + "index": 0, + "logprobs": null, + "text": "1", + "seed": null, + "delta": { + "token_id": 16, + "role": "assistant", + "content": "1" + } + } + ], + "created": 1758038918, + "model": "meta-llama/Llama-3.3-70B-Instruct-Turbo-Free", + "object": "completion.chunk", + "system_fingerprint": null, + "usage": null + } + }, + { + "__type__": "openai.types.completion.Completion", + "__data__": { + "id": "oBUszH9-4Yz4kd-98019fa76a947327", + "choices": [ + { + "finish_reason": null, + "index": 0, + "logprobs": null, + "text": ":", + "seed": null, + "delta": { + "token_id": 25, + "role": "assistant", + "content": ":" + } + } + ], + "created": 1758038918, + "model": "meta-llama/Llama-3.3-70B-Instruct-Turbo-Free", + "object": "completion.chunk", + "system_fingerprint": null, + "usage": null + } + }, + { + "__type__": "openai.types.completion.Completion", + "__data__": { + "id": "oBUszH9-4Yz4kd-98019fa76a947327", + "choices": [ + { + "finish_reason": null, + "index": 0, + "logprobs": null, + "text": " Identify", + "seed": null, + "delta": { + "token_id": 65647, + "role": "assistant", + "content": " Identify" + } + } + ], + "created": 1758038918, + "model": "meta-llama/Llama-3.3-70B-Instruct-Turbo-Free", + "object": "completion.chunk", + "system_fingerprint": null, + "usage": null + } + }, + { + "__type__": "openai.types.completion.Completion", + "__data__": { + "id": "oBUszH9-4Yz4kd-98019fa76a947327", + "choices": [ + { + "finish_reason": null, + "index": 0, + "logprobs": null, + "text": " the", + "seed": null, + "delta": { + "token_id": 279, + "role": "assistant", + "content": " the" + } + } + ], + "created": 1758038918, + "model": "meta-llama/Llama-3.3-70B-Instruct-Turbo-Free", + "object": "completion.chunk", + "system_fingerprint": null, + "usage": null + } + }, + { + "__type__": "openai.types.completion.Completion", + "__data__": { + "id": "oBUszH9-4Yz4kd-98019fa76a947327", + "choices": [ + { + "finish_reason": null, + "index": 0, + "logprobs": null, + "text": " traditional", + "seed": null, + "delta": { + "token_id": 8776, + "role": "assistant", + "content": " traditional" + } + } + ], + "created": 1758038918, + "model": "meta-llama/Llama-3.3-70B-Instruct-Turbo-Free", + "object": "completion.chunk", + "system_fingerprint": null, + "usage": null + } + }, + { + "__type__": "openai.types.completion.Completion", + "__data__": { + "id": "oBUszH9-4Yz4kd-98019fa76a947327", + "choices": [ + { + "finish_reason": null, + "index": 0, + "logprobs": null, + "text": " completion", + "seed": null, + "delta": { + "token_id": 9954, + "role": "assistant", + "content": " completion" + } + } + ], + "created": 1758038918, + "model": "meta-llama/Llama-3.3-70B-Instruct-Turbo-Free", + "object": "completion.chunk", + "system_fingerprint": null, + "usage": null + } + }, + { + "__type__": "openai.types.completion.Completion", + "__data__": { + "id": "oBUszH9-4Yz4kd-98019fa76a947327", + "choices": [ + { + "finish_reason": null, + "index": 0, + "logprobs": null, + "text": " of", + "seed": null, + "delta": { + "token_id": 315, + "role": "assistant", + "content": " of" + } + } + ], + "created": 1758038918, + "model": "meta-llama/Llama-3.3-70B-Instruct-Turbo-Free", + "object": "completion.chunk", + "system_fingerprint": null, + "usage": null + } + }, + { + "__type__": "openai.types.completion.Completion", + "__data__": { + "id": "oBUszH9-4Yz4kd-98019fa76a947327", + "choices": [ + { + "finish_reason": null, + "index": 0, + "logprobs": null, + "text": " the", + "seed": null, + "delta": { + "token_id": 279, + "role": "assistant", + "content": " the" + } + } + ], + "created": 1758038918, + "model": "meta-llama/Llama-3.3-70B-Instruct-Turbo-Free", + "object": "completion.chunk", + "system_fingerprint": null, + "usage": null + } + }, + { + "__type__": "openai.types.completion.Completion", + "__data__": { + "id": "oBUszH9-4Yz4kd-98019fa76a947327", + "choices": [ + { + "finish_reason": null, + "index": 0, + "logprobs": null, + "text": " sentence", + "seed": null, + "delta": { + "token_id": 11914, + "role": "assistant", + "content": " sentence" + } + } + ], + "created": 1758038918, + "model": "meta-llama/Llama-3.3-70B-Instruct-Turbo-Free", + "object": "completion.chunk", + "system_fingerprint": null, + "usage": null + } + }, + { + "__type__": "openai.types.completion.Completion", + "__data__": { + "id": "oBUszH9-4Yz4kd-98019fa76a947327", + "choices": [ + { + "finish_reason": null, + "index": 0, + "logprobs": null, + "text": ".\n", + "seed": null, + "delta": { + "token_id": 627, + "role": "assistant", + "content": ".\n" + } + } + ], + "created": 1758038918, + "model": "meta-llama/Llama-3.3-70B-Instruct-Turbo-Free", + "object": "completion.chunk", + "system_fingerprint": null, + "usage": null + } + }, + { + "__type__": "openai.types.completion.Completion", + "__data__": { + "id": "oBUszH9-4Yz4kd-98019fa76a947327", + "choices": [ + { + "finish_reason": null, + "index": 0, + "logprobs": null, + "text": "The", + "seed": null, + "delta": { + "token_id": 791, + "role": "assistant", + "content": "The" + } + } + ], + "created": 1758038918, + "model": "meta-llama/Llama-3.3-70B-Instruct-Turbo-Free", + "object": "completion.chunk", + "system_fingerprint": null, + "usage": null + } + }, + { + "__type__": "openai.types.completion.Completion", + "__data__": { + "id": "oBUszH9-4Yz4kd-98019fa76a947327", + "choices": [ + { + "finish_reason": null, + "index": 0, + "logprobs": null, + "text": " traditional", + "seed": null, + "delta": { + "token_id": 8776, + "role": "assistant", + "content": " traditional" + } + } + ], + "created": 1758038918, + "model": "meta-llama/Llama-3.3-70B-Instruct-Turbo-Free", + "object": "completion.chunk", + "system_fingerprint": null, + "usage": null + } + }, + { + "__type__": "openai.types.completion.Completion", + "__data__": { + "id": "oBUszH9-4Yz4kd-98019fa76a947327", + "choices": [ + { + "finish_reason": null, + "index": 0, + "logprobs": null, + "text": " completion", + "seed": null, + "delta": { + "token_id": 9954, + "role": "assistant", + "content": " completion" + } + } + ], + "created": 1758038918, + "model": "meta-llama/Llama-3.3-70B-Instruct-Turbo-Free", + "object": "completion.chunk", + "system_fingerprint": null, + "usage": null + } + }, + { + "__type__": "openai.types.completion.Completion", + "__data__": { + "id": "oBUszH9-4Yz4kd-98019fa76a947327", + "choices": [ + { + "finish_reason": null, + "index": 0, + "logprobs": null, + "text": " of", + "seed": null, + "delta": { + "token_id": 315, + "role": "assistant", + "content": " of" + } + } + ], + "created": 1758038918, + "model": "meta-llama/Llama-3.3-70B-Instruct-Turbo-Free", + "object": "completion.chunk", + "system_fingerprint": null, + "usage": null + } + }, + { + "__type__": "openai.types.completion.Completion", + "__data__": { + "id": "oBUszH9-4Yz4kd-98019fa76a947327", + "choices": [ + { + "finish_reason": null, + "index": 0, + "logprobs": null, + "text": " the", + "seed": null, + "delta": { + "token_id": 279, + "role": "assistant", + "content": " the" + } + } + ], + "created": 1758038918, + "model": "meta-llama/Llama-3.3-70B-Instruct-Turbo-Free", + "object": "completion.chunk", + "system_fingerprint": null, + "usage": null + } + }, + { + "__type__": "openai.types.completion.Completion", + "__data__": { + "id": "oBUszH9-4Yz4kd-98019fa76a947327", + "choices": [ + { + "finish_reason": null, + "index": 0, + "logprobs": null, + "text": " sentence", + "seed": null, + "delta": { + "token_id": 11914, + "role": "assistant", + "content": " sentence" + } + } + ], + "created": 1758038918, + "model": "meta-llama/Llama-3.3-70B-Instruct-Turbo-Free", + "object": "completion.chunk", + "system_fingerprint": null, + "usage": null + } + }, + { + "__type__": "openai.types.completion.Completion", + "__data__": { + "id": "oBUszH9-4Yz4kd-98019fa76a947327", + "choices": [ + { + "finish_reason": null, + "index": 0, + "logprobs": null, + "text": " \"", + "seed": null, + "delta": { + "token_id": 330, + "role": "assistant", + "content": " \"" + } + } + ], + "created": 1758038918, + "model": "meta-llama/Llama-3.3-70B-Instruct-Turbo-Free", + "object": "completion.chunk", + "system_fingerprint": null, + "usage": null + } + }, + { + "__type__": "openai.types.completion.Completion", + "__data__": { + "id": "oBUszH9-4Yz4kd-98019fa76a947327", + "choices": [ + { + "finish_reason": null, + "index": 0, + "logprobs": null, + "text": "R", + "seed": null, + "delta": { + "token_id": 49, + "role": "assistant", + "content": "R" + } + } + ], + "created": 1758038918, + "model": "meta-llama/Llama-3.3-70B-Instruct-Turbo-Free", + "object": "completion.chunk", + "system_fingerprint": null, + "usage": null + } + }, + { + "__type__": "openai.types.completion.Completion", + "__data__": { + "id": "oBUszH9-4Yz4kd-98019fa76a947327", + "choices": [ + { + "finish_reason": null, + "index": 0, + "logprobs": null, + "text": "oses", + "seed": null, + "delta": { + "token_id": 20274, + "role": "assistant", + "content": "oses" + } + } + ], + "created": 1758038918, + "model": "meta-llama/Llama-3.3-70B-Instruct-Turbo-Free", + "object": "completion.chunk", + "system_fingerprint": null, + "usage": null + } + }, + { + "__type__": "openai.types.completion.Completion", + "__data__": { + "id": "oBUszH9-4Yz4kd-98019fa76a947327", + "choices": [ + { + "finish_reason": null, + "index": 0, + "logprobs": null, + "text": " are", + "seed": null, + "delta": { + "token_id": 527, + "role": "assistant", + "content": " are" + } + } + ], + "created": 1758038918, + "model": "meta-llama/Llama-3.3-70B-Instruct-Turbo-Free", + "object": "completion.chunk", + "system_fingerprint": null, + "usage": null + } + }, + { + "__type__": "openai.types.completion.Completion", + "__data__": { + "id": "oBUszH9-4Yz4kd-98019fa76a947327", + "choices": [ + { + "finish_reason": null, + "index": 0, + "logprobs": null, + "text": " red", + "seed": null, + "delta": { + "token_id": 2579, + "role": "assistant", + "content": " red" + } + } + ], + "created": 1758038918, + "model": "meta-llama/Llama-3.3-70B-Instruct-Turbo-Free", + "object": "completion.chunk", + "system_fingerprint": null, + "usage": null + } + }, + { + "__type__": "openai.types.completion.Completion", + "__data__": { + "id": "oBUszH9-4Yz4kd-98019fa76a947327", + "choices": [ + { + "finish_reason": null, + "index": 0, + "logprobs": null, + "text": ",", + "seed": null, + "delta": { + "token_id": 11, + "role": "assistant", + "content": "," + } + } + ], + "created": 1758038918, + "model": "meta-llama/Llama-3.3-70B-Instruct-Turbo-Free", + "object": "completion.chunk", + "system_fingerprint": null, + "usage": null + } + }, + { + "__type__": "openai.types.completion.Completion", + "__data__": { + "id": "oBUszH9-4Yz4kd-98019fa76a947327", + "choices": [ + { + "finish_reason": null, + "index": 0, + "logprobs": null, + "text": " v", + "seed": null, + "delta": { + "token_id": 348, + "role": "assistant", + "content": " v" + } + } + ], + "created": 1758038918, + "model": "meta-llama/Llama-3.3-70B-Instruct-Turbo-Free", + "object": "completion.chunk", + "system_fingerprint": null, + "usage": null + } + }, + { + "__type__": "openai.types.completion.Completion", + "__data__": { + "id": "oBUszH9-4Yz4kd-98019fa76a947327", + "choices": [ + { + "finish_reason": null, + "index": 0, + "logprobs": null, + "text": "io", + "seed": null, + "delta": { + "token_id": 822, + "role": "assistant", + "content": "io" + } + } + ], + "created": 1758038918, + "model": "meta-llama/Llama-3.3-70B-Instruct-Turbo-Free", + "object": "completion.chunk", + "system_fingerprint": null, + "usage": null + } + }, + { + "__type__": "openai.types.completion.Completion", + "__data__": { + "id": "oBUszH9-4Yz4kd-98019fa76a947327", + "choices": [ + { + "finish_reason": null, + "index": 0, + "logprobs": null, + "text": "lets", + "seed": null, + "delta": { + "token_id": 10145, + "role": "assistant", + "content": "lets" + } + } + ], + "created": 1758038918, + "model": "meta-llama/Llama-3.3-70B-Instruct-Turbo-Free", + "object": "completion.chunk", + "system_fingerprint": null, + "usage": null + } + }, + { + "__type__": "openai.types.completion.Completion", + "__data__": { + "id": "oBUszH9-4Yz4kd-98019fa76a947327", + "choices": [ + { + "finish_reason": null, + "index": 0, + "logprobs": null, + "text": " are", + "seed": null, + "delta": { + "token_id": 527, + "role": "assistant", + "content": " are" + } + } + ], + "created": 1758038918, + "model": "meta-llama/Llama-3.3-70B-Instruct-Turbo-Free", + "object": "completion.chunk", + "system_fingerprint": null, + "usage": null + } + }, + { + "__type__": "openai.types.completion.Completion", + "__data__": { + "id": "oBUszH9-4Yz4kd-98019fa76a947327", + "choices": [ + { + "finish_reason": null, + "index": 0, + "logprobs": null, + "text": "...\"", + "seed": null, + "delta": { + "token_id": 21908, + "role": "assistant", + "content": "...\"" + } + } + ], + "created": 1758038918, + "model": "meta-llama/Llama-3.3-70B-Instruct-Turbo-Free", + "object": "completion.chunk", + "system_fingerprint": null, + "usage": null + } + }, + { + "__type__": "openai.types.completion.Completion", + "__data__": { + "id": "oBUszH9-4Yz4kd-98019fa76a947327", + "choices": [ + { + "finish_reason": null, + "index": 0, + "logprobs": null, + "text": " is", + "seed": null, + "delta": { + "token_id": 374, + "role": "assistant", + "content": " is" + } + } + ], + "created": 1758038918, + "model": "meta-llama/Llama-3.3-70B-Instruct-Turbo-Free", + "object": "completion.chunk", + "system_fingerprint": null, + "usage": null + } + }, + { + "__type__": "openai.types.completion.Completion", + "__data__": { + "id": "oBUszH9-4Yz4kd-98019fa76a947327", + "choices": [ + { + "finish_reason": null, + "index": 0, + "logprobs": null, + "text": " based", + "seed": null, + "delta": { + "token_id": 3196, + "role": "assistant", + "content": " based" + } + } + ], + "created": 1758038918, + "model": "meta-llama/Llama-3.3-70B-Instruct-Turbo-Free", + "object": "completion.chunk", + "system_fingerprint": null, + "usage": null + } + }, + { + "__type__": "openai.types.completion.Completion", + "__data__": { + "id": "oBUszH9-4Yz4kd-98019fa76a947327", + "choices": [ + { + "finish_reason": null, + "index": 0, + "logprobs": null, + "text": " on", + "seed": null, + "delta": { + "token_id": 389, + "role": "assistant", + "content": " on" + } + } + ], + "created": 1758038918, + "model": "meta-llama/Llama-3.3-70B-Instruct-Turbo-Free", + "object": "completion.chunk", + "system_fingerprint": null, + "usage": null + } + }, + { + "__type__": "openai.types.completion.Completion", + "__data__": { + "id": "oBUszH9-4Yz4kd-98019fa76a947327", + "choices": [ + { + "finish_reason": null, + "index": 0, + "logprobs": null, + "text": " a", + "seed": null, + "delta": { + "token_id": 264, + "role": "assistant", + "content": " a" + } + } + ], + "created": 1758038918, + "model": "meta-llama/Llama-3.3-70B-Instruct-Turbo-Free", + "object": "completion.chunk", + "system_fingerprint": null, + "usage": null + } + }, + { + "__type__": "openai.types.completion.Completion", + "__data__": { + "id": "oBUszH9-4Yz4kd-98019fa76a947327", + "choices": [ + { + "finish_reason": null, + "index": 0, + "logprobs": null, + "text": " well", + "seed": null, + "delta": { + "token_id": 1664, + "role": "assistant", + "content": " well" + } + } + ], + "created": 1758038918, + "model": "meta-llama/Llama-3.3-70B-Instruct-Turbo-Free", + "object": "completion.chunk", + "system_fingerprint": null, + "usage": null + } + }, + { + "__type__": "openai.types.completion.Completion", + "__data__": { + "id": "oBUszH9-4Yz4kd-98019fa76a947327", + "choices": [ + { + "finish_reason": null, + "index": 0, + "logprobs": null, + "text": "-known", + "seed": null, + "delta": { + "token_id": 22015, + "role": "assistant", + "content": "-known" + } + } + ], + "created": 1758038918, + "model": "meta-llama/Llama-3.3-70B-Instruct-Turbo-Free", + "object": "completion.chunk", + "system_fingerprint": null, + "usage": null + } + }, + { + "__type__": "openai.types.completion.Completion", + "__data__": { + "id": "oBUszH9-4Yz4kd-98019fa76a947327", + "choices": [ + { + "finish_reason": null, + "index": 0, + "logprobs": null, + "text": " poem", + "seed": null, + "delta": { + "token_id": 33894, + "role": "assistant", + "content": " poem" + } + } + ], + "created": 1758038918, + "model": "meta-llama/Llama-3.3-70B-Instruct-Turbo-Free", + "object": "completion.chunk", + "system_fingerprint": null, + "usage": null + } + }, + { + "__type__": "openai.types.completion.Completion", + "__data__": { + "id": "oBUszH9-4Yz4kd-98019fa76a947327", + "choices": [ + { + "finish_reason": null, + "index": 0, + "logprobs": null, + "text": ".\n\n", + "seed": null, + "delta": { + "token_id": 382, + "role": "assistant", + "content": ".\n\n" + } + } + ], + "created": 1758038918, + "model": "meta-llama/Llama-3.3-70B-Instruct-Turbo-Free", + "object": "completion.chunk", + "system_fingerprint": null, + "usage": null + } + }, + { + "__type__": "openai.types.completion.Completion", + "__data__": { + "id": "oBUszH9-4Yz4kd-98019fa76a947327", + "choices": [ + { + "finish_reason": null, + "index": 0, + "logprobs": null, + "text": "##", + "seed": null, + "delta": { + "token_id": 567, + "role": "assistant", + "content": "##" + } + } + ], + "created": 1758038918, + "model": "meta-llama/Llama-3.3-70B-Instruct-Turbo-Free", + "object": "completion.chunk", + "system_fingerprint": null, + "usage": null + } + }, + { + "__type__": "openai.types.completion.Completion", + "__data__": { + "id": "oBUszH9-4Yz4kd-98019fa76a947327", + "choices": [ + { + "finish_reason": null, + "index": 0, + "logprobs": null, + "text": " Step", + "seed": null, + "delta": { + "token_id": 15166, + "role": "assistant", + "content": " Step" + } + } + ], + "created": 1758038918, + "model": "meta-llama/Llama-3.3-70B-Instruct-Turbo-Free", + "object": "completion.chunk", + "system_fingerprint": null, + "usage": null + } + }, + { + "__type__": "openai.types.completion.Completion", + "__data__": { + "id": "oBUszH9-4Yz4kd-98019fa76a947327", + "choices": [ + { + "finish_reason": null, + "index": 0, + "logprobs": null, + "text": " ", + "seed": null, + "delta": { + "token_id": 220, + "role": "assistant", + "content": " " + } + } + ], + "created": 1758038918, + "model": "meta-llama/Llama-3.3-70B-Instruct-Turbo-Free", + "object": "completion.chunk", + "system_fingerprint": null, + "usage": null + } + }, + { + "__type__": "openai.types.completion.Completion", + "__data__": { + "id": "oBUszH9-4Yz4kd-98019fa76a947327", + "choices": [ + { + "finish_reason": null, + "index": 0, + "logprobs": null, + "text": "2", + "seed": null, + "delta": { + "token_id": 17, + "role": "assistant", + "content": "2" + } + } + ], + "created": 1758038918, + "model": "meta-llama/Llama-3.3-70B-Instruct-Turbo-Free", + "object": "completion.chunk", + "system_fingerprint": null, + "usage": null + } + }, + { + "__type__": "openai.types.completion.Completion", + "__data__": { + "id": "oBUszH9-4Yz4kd-98019fa76a947327", + "choices": [ + { + "finish_reason": null, + "index": 0, + "logprobs": null, + "text": ":", + "seed": null, + "delta": { + "token_id": 25, + "role": "assistant", + "content": ":" + } + } + ], + "created": 1758038918, + "model": "meta-llama/Llama-3.3-70B-Instruct-Turbo-Free", + "object": "completion.chunk", + "system_fingerprint": null, + "usage": null + } + }, + { + "__type__": "openai.types.completion.Completion", + "__data__": { + "id": "oBUszH9-4Yz4kd-98019fa76a947327", + "choices": [ + { + "finish_reason": null, + "index": 0, + "logprobs": null, + "text": " Recall", + "seed": null, + "delta": { + "token_id": 80640, + "role": "assistant", + "content": " Recall" + } + } + ], + "created": 1758038918, + "model": "meta-llama/Llama-3.3-70B-Instruct-Turbo-Free", + "object": "completion.chunk", + "system_fingerprint": null, + "usage": null + } + }, + { + "__type__": "openai.types.completion.Completion", + "__data__": { + "id": "oBUszH9-4Yz4kd-98019fa76a947327", + "choices": [ + { + "finish_reason": null, + "index": 0, + "logprobs": null, + "text": " the", + "seed": null, + "delta": { + "token_id": 279, + "role": "assistant", + "content": " the" + } + } + ], + "created": 1758038918, + "model": "meta-llama/Llama-3.3-70B-Instruct-Turbo-Free", + "object": "completion.chunk", + "system_fingerprint": null, + "usage": null + } + }, + { + "__type__": "openai.types.completion.Completion", + "__data__": { + "id": "oBUszH9-4Yz4kd-98019fa76a947327", + "choices": [ + { + "finish_reason": "length", + "index": 0, + "logprobs": null, + "text": " poem", + "seed": 12390303563326160000, + "delta": { + "token_id": 33894, + "role": "assistant", + "content": " poem" + } + } + ], + "created": 1758038918, + "model": "meta-llama/Llama-3.3-70B-Instruct-Turbo-Free", + "object": "completion.chunk", + "system_fingerprint": null, + "usage": { + "completion_tokens": 50, + "prompt_tokens": 25, + "total_tokens": 75, + "completion_tokens_details": null, + "prompt_tokens_details": null, + "cached_tokens": 0 + } + } + } + ], + "is_streaming": true + } +} diff --git a/tests/integration/recordings/responses/565b1072cb9d.json b/tests/integration/recordings/responses/565b1072cb9d.json new file mode 100644 index 000000000..5391169a5 --- /dev/null +++ b/tests/integration/recordings/responses/565b1072cb9d.json @@ -0,0 +1,46 @@ +{ + "request": { + "method": "POST", + "url": "https://api.together.xyz/v1/v1/completions", + "headers": {}, + "body": { + "model": "meta-llama/Llama-3.3-70B-Instruct-Turbo-Free", + "prompt": "Respond to this question and explain your answer. Complete the sentence using one word: Roses are red, violets are ", + "stream": false, + "extra_body": {} + }, + "endpoint": "/v1/completions", + "model": "meta-llama/Llama-3.3-70B-Instruct-Turbo-Free" + }, + "response": { + "body": { + "__type__": "openai.types.completion.Completion", + "__data__": { + "id": "oBUswCe-62bZhn-98019f663cac0f68", + "choices": [ + { + "finish_reason": "stop", + "index": 0, + "logprobs": null, + "text": " _______________________. \n\n## Step 1: Identify the traditional completion of the sentence.\nThe traditional completion of the sentence \"Roses are red, violets are...\" is based on a well-known poem.\n\n## Step 2: Recall the poem.\nThe poem states, \"Roses are red, violets are blue...\"\n\n## Step 3: Determine the word that completes the sentence.\nBased on the poem, the word that completes the sentence is \"blue\".\n\nThe final answer is: $\\boxed{blue}$", + "seed": 4892505926413923000 + } + ], + "created": 1758038908, + "model": "meta-llama/Llama-3.3-70B-Instruct-Turbo-Free", + "object": "text.completion", + "system_fingerprint": null, + "usage": { + "completion_tokens": 106, + "prompt_tokens": 25, + "total_tokens": 131, + "completion_tokens_details": null, + "prompt_tokens_details": null, + "cached_tokens": 0 + }, + "prompt": [] + } + }, + "is_streaming": false + } +} diff --git a/tests/integration/recordings/responses/6730dcde0b73.json b/tests/integration/recordings/responses/6730dcde0b73.json new file mode 100644 index 000000000..c5f17909e --- /dev/null +++ b/tests/integration/recordings/responses/6730dcde0b73.json @@ -0,0 +1,756 @@ +{ + "request": { + "method": "POST", + "url": "https://api.together.xyz/v1/v1/chat/completions", + "headers": {}, + "body": { + "model": "meta-llama/Llama-3.3-70B-Instruct-Turbo-Free", + "messages": [ + { + "role": "user", + "content": "Hello, world!" + } + ], + "stream": true + }, + "endpoint": "/v1/chat/completions", + "model": "meta-llama/Llama-3.3-70B-Instruct-Turbo-Free" + }, + "response": { + "body": [ + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "oBUtTzC-62bZhn-9801a1ee1bea25d8", + "choices": [ + { + "delta": { + "content": "Hello", + "function_call": null, + "refusal": null, + "role": "assistant", + "tool_calls": null, + "token_id": 9906 + }, + "finish_reason": null, + "index": 0, + "logprobs": null, + "text": "Hello", + "seed": null + } + ], + "created": 1758039011, + "model": "meta-llama/Llama-3.3-70B-Instruct-Turbo-Free", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": null, + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "oBUtTzC-62bZhn-9801a1ee1bea25d8", + "choices": [ + { + "delta": { + "content": "!", + "function_call": null, + "refusal": null, + "role": "assistant", + "tool_calls": null, + "token_id": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null, + "text": "!", + "seed": null + } + ], + "created": 1758039011, + "model": "meta-llama/Llama-3.3-70B-Instruct-Turbo-Free", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": null, + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "oBUtTzC-62bZhn-9801a1ee1bea25d8", + "choices": [ + { + "delta": { + "content": " It", + "function_call": null, + "refusal": null, + "role": "assistant", + "tool_calls": null, + "token_id": 1102 + }, + "finish_reason": null, + "index": 0, + "logprobs": null, + "text": " It", + "seed": null + } + ], + "created": 1758039011, + "model": "meta-llama/Llama-3.3-70B-Instruct-Turbo-Free", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": null, + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "oBUtTzC-62bZhn-9801a1ee1bea25d8", + "choices": [ + { + "delta": { + "content": "'s", + "function_call": null, + "refusal": null, + "role": "assistant", + "tool_calls": null, + "token_id": 596 + }, + "finish_reason": null, + "index": 0, + "logprobs": null, + "text": "'s", + "seed": null + } + ], + "created": 1758039011, + "model": "meta-llama/Llama-3.3-70B-Instruct-Turbo-Free", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": null, + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "oBUtTzC-62bZhn-9801a1ee1bea25d8", + "choices": [ + { + "delta": { + "content": " nice", + "function_call": null, + "refusal": null, + "role": "assistant", + "tool_calls": null, + "token_id": 6555 + }, + "finish_reason": null, + "index": 0, + "logprobs": null, + "text": " nice", + "seed": null + } + ], + "created": 1758039011, + "model": "meta-llama/Llama-3.3-70B-Instruct-Turbo-Free", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": null, + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "oBUtTzC-62bZhn-9801a1ee1bea25d8", + "choices": [ + { + "delta": { + "content": " to", + "function_call": null, + "refusal": null, + "role": "assistant", + "tool_calls": null, + "token_id": 311 + }, + "finish_reason": null, + "index": 0, + "logprobs": null, + "text": " to", + "seed": null + } + ], + "created": 1758039011, + "model": "meta-llama/Llama-3.3-70B-Instruct-Turbo-Free", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": null, + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "oBUtTzC-62bZhn-9801a1ee1bea25d8", + "choices": [ + { + "delta": { + "content": " meet", + "function_call": null, + "refusal": null, + "role": "assistant", + "tool_calls": null, + "token_id": 3449 + }, + "finish_reason": null, + "index": 0, + "logprobs": null, + "text": " meet", + "seed": null + } + ], + "created": 1758039011, + "model": "meta-llama/Llama-3.3-70B-Instruct-Turbo-Free", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": null, + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "oBUtTzC-62bZhn-9801a1ee1bea25d8", + "choices": [ + { + "delta": { + "content": " you", + "function_call": null, + "refusal": null, + "role": "assistant", + "tool_calls": null, + "token_id": 499 + }, + "finish_reason": null, + "index": 0, + "logprobs": null, + "text": " you", + "seed": null + } + ], + "created": 1758039011, + "model": "meta-llama/Llama-3.3-70B-Instruct-Turbo-Free", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": null, + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "oBUtTzC-62bZhn-9801a1ee1bea25d8", + "choices": [ + { + "delta": { + "content": ".", + "function_call": null, + "refusal": null, + "role": "assistant", + "tool_calls": null, + "token_id": 13 + }, + "finish_reason": null, + "index": 0, + "logprobs": null, + "text": ".", + "seed": null + } + ], + "created": 1758039011, + "model": "meta-llama/Llama-3.3-70B-Instruct-Turbo-Free", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": null, + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "oBUtTzC-62bZhn-9801a1ee1bea25d8", + "choices": [ + { + "delta": { + "content": " Is", + "function_call": null, + "refusal": null, + "role": "assistant", + "tool_calls": null, + "token_id": 2209 + }, + "finish_reason": null, + "index": 0, + "logprobs": null, + "text": " Is", + "seed": null + } + ], + "created": 1758039011, + "model": "meta-llama/Llama-3.3-70B-Instruct-Turbo-Free", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": null, + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "oBUtTzC-62bZhn-9801a1ee1bea25d8", + "choices": [ + { + "delta": { + "content": " there", + "function_call": null, + "refusal": null, + "role": "assistant", + "tool_calls": null, + "token_id": 1070 + }, + "finish_reason": null, + "index": 0, + "logprobs": null, + "text": " there", + "seed": null + } + ], + "created": 1758039011, + "model": "meta-llama/Llama-3.3-70B-Instruct-Turbo-Free", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": null, + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "oBUtTzC-62bZhn-9801a1ee1bea25d8", + "choices": [ + { + "delta": { + "content": " something", + "function_call": null, + "refusal": null, + "role": "assistant", + "tool_calls": null, + "token_id": 2555 + }, + "finish_reason": null, + "index": 0, + "logprobs": null, + "text": " something", + "seed": null + } + ], + "created": 1758039011, + "model": "meta-llama/Llama-3.3-70B-Instruct-Turbo-Free", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": null, + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "oBUtTzC-62bZhn-9801a1ee1bea25d8", + "choices": [ + { + "delta": { + "content": " I", + "function_call": null, + "refusal": null, + "role": "assistant", + "tool_calls": null, + "token_id": 358 + }, + "finish_reason": null, + "index": 0, + "logprobs": null, + "text": " I", + "seed": null + } + ], + "created": 1758039011, + "model": "meta-llama/Llama-3.3-70B-Instruct-Turbo-Free", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": null, + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "oBUtTzC-62bZhn-9801a1ee1bea25d8", + "choices": [ + { + "delta": { + "content": " can", + "function_call": null, + "refusal": null, + "role": "assistant", + "tool_calls": null, + "token_id": 649 + }, + "finish_reason": null, + "index": 0, + "logprobs": null, + "text": " can", + "seed": null + } + ], + "created": 1758039011, + "model": "meta-llama/Llama-3.3-70B-Instruct-Turbo-Free", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": null, + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "oBUtTzC-62bZhn-9801a1ee1bea25d8", + "choices": [ + { + "delta": { + "content": " help", + "function_call": null, + "refusal": null, + "role": "assistant", + "tool_calls": null, + "token_id": 1520 + }, + "finish_reason": null, + "index": 0, + "logprobs": null, + "text": " help", + "seed": null + } + ], + "created": 1758039011, + "model": "meta-llama/Llama-3.3-70B-Instruct-Turbo-Free", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": null, + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "oBUtTzC-62bZhn-9801a1ee1bea25d8", + "choices": [ + { + "delta": { + "content": " you", + "function_call": null, + "refusal": null, + "role": "assistant", + "tool_calls": null, + "token_id": 499 + }, + "finish_reason": null, + "index": 0, + "logprobs": null, + "text": " you", + "seed": null + } + ], + "created": 1758039011, + "model": "meta-llama/Llama-3.3-70B-Instruct-Turbo-Free", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": null, + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "oBUtTzC-62bZhn-9801a1ee1bea25d8", + "choices": [ + { + "delta": { + "content": " with", + "function_call": null, + "refusal": null, + "role": "assistant", + "tool_calls": null, + "token_id": 449 + }, + "finish_reason": null, + "index": 0, + "logprobs": null, + "text": " with", + "seed": null + } + ], + "created": 1758039011, + "model": "meta-llama/Llama-3.3-70B-Instruct-Turbo-Free", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": null, + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "oBUtTzC-62bZhn-9801a1ee1bea25d8", + "choices": [ + { + "delta": { + "content": " or", + "function_call": null, + "refusal": null, + "role": "assistant", + "tool_calls": null, + "token_id": 477 + }, + "finish_reason": null, + "index": 0, + "logprobs": null, + "text": " or", + "seed": null + } + ], + "created": 1758039011, + "model": "meta-llama/Llama-3.3-70B-Instruct-Turbo-Free", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": null, + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "oBUtTzC-62bZhn-9801a1ee1bea25d8", + "choices": [ + { + "delta": { + "content": " would", + "function_call": null, + "refusal": null, + "role": "assistant", + "tool_calls": null, + "token_id": 1053 + }, + "finish_reason": null, + "index": 0, + "logprobs": null, + "text": " would", + "seed": null + } + ], + "created": 1758039011, + "model": "meta-llama/Llama-3.3-70B-Instruct-Turbo-Free", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": null, + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "oBUtTzC-62bZhn-9801a1ee1bea25d8", + "choices": [ + { + "delta": { + "content": " you", + "function_call": null, + "refusal": null, + "role": "assistant", + "tool_calls": null, + "token_id": 499 + }, + "finish_reason": null, + "index": 0, + "logprobs": null, + "text": " you", + "seed": null + } + ], + "created": 1758039011, + "model": "meta-llama/Llama-3.3-70B-Instruct-Turbo-Free", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": null, + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "oBUtTzC-62bZhn-9801a1ee1bea25d8", + "choices": [ + { + "delta": { + "content": " like", + "function_call": null, + "refusal": null, + "role": "assistant", + "tool_calls": null, + "token_id": 1093 + }, + "finish_reason": null, + "index": 0, + "logprobs": null, + "text": " like", + "seed": null + } + ], + "created": 1758039011, + "model": "meta-llama/Llama-3.3-70B-Instruct-Turbo-Free", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": null, + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "oBUtTzC-62bZhn-9801a1ee1bea25d8", + "choices": [ + { + "delta": { + "content": " to", + "function_call": null, + "refusal": null, + "role": "assistant", + "tool_calls": null, + "token_id": 311 + }, + "finish_reason": null, + "index": 0, + "logprobs": null, + "text": " to", + "seed": null + } + ], + "created": 1758039011, + "model": "meta-llama/Llama-3.3-70B-Instruct-Turbo-Free", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": null, + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "oBUtTzC-62bZhn-9801a1ee1bea25d8", + "choices": [ + { + "delta": { + "content": " chat", + "function_call": null, + "refusal": null, + "role": "assistant", + "tool_calls": null, + "token_id": 6369 + }, + "finish_reason": null, + "index": 0, + "logprobs": null, + "text": " chat", + "seed": null + } + ], + "created": 1758039011, + "model": "meta-llama/Llama-3.3-70B-Instruct-Turbo-Free", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": null, + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "oBUtTzC-62bZhn-9801a1ee1bea25d8", + "choices": [ + { + "delta": { + "content": "?", + "function_call": null, + "refusal": null, + "role": "assistant", + "tool_calls": null, + "token_id": 30 + }, + "finish_reason": null, + "index": 0, + "logprobs": null, + "text": "?", + "seed": null + } + ], + "created": 1758039011, + "model": "meta-llama/Llama-3.3-70B-Instruct-Turbo-Free", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": null, + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "oBUtTzC-62bZhn-9801a1ee1bea25d8", + "choices": [ + { + "delta": { + "content": "", + "function_call": null, + "refusal": null, + "role": "assistant", + "tool_calls": null, + "token_id": 128009 + }, + "finish_reason": "stop", + "index": 0, + "logprobs": null, + "text": "", + "seed": 16158686754257986000 + } + ], + "created": 1758039011, + "model": "meta-llama/Llama-3.3-70B-Instruct-Turbo-Free", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": null, + "usage": { + "completion_tokens": 25, + "prompt_tokens": 39, + "total_tokens": 64, + "completion_tokens_details": null, + "prompt_tokens_details": null, + "cached_tokens": 0 + } + } + } + ], + "is_streaming": true + } +} diff --git a/tests/integration/recordings/responses/6857b19d3f0a.json b/tests/integration/recordings/responses/6857b19d3f0a.json new file mode 100644 index 000000000..0fb0fffe0 --- /dev/null +++ b/tests/integration/recordings/responses/6857b19d3f0a.json @@ -0,0 +1,87 @@ +{ + "request": { + "method": "POST", + "url": "https://api.together.xyz/v1/v1/chat/completions", + "headers": {}, + "body": { + "model": "meta-llama/Llama-3.3-70B-Instruct-Turbo-Free", + "messages": [ + { + "role": "user", + "content": "What's the weather in Tokyo? Use the get_weather function to get the weather." + } + ], + "stream": false, + "tools": [ + { + "type": "function", + "function": { + "name": "get_weather", + "description": "Get the weather in a given city", + "parameters": { + "type": "object", + "properties": { + "city": { + "type": "string", + "description": "The city to get the weather for" + } + } + } + } + } + ] + }, + "endpoint": "/v1/chat/completions", + "model": "meta-llama/Llama-3.3-70B-Instruct-Turbo-Free" + }, + "response": { + "body": { + "__type__": "openai.types.chat.chat_completion.ChatCompletion", + "__data__": { + "id": "oBUth9w-62bZhn-9801a3026bd20c8a", + "choices": [ + { + "finish_reason": "tool_calls", + "index": 0, + "logprobs": null, + "message": { + "content": null, + "refusal": null, + "role": "assistant", + "annotations": null, + "audio": null, + "function_call": null, + "tool_calls": [ + { + "id": "call_8prwkicthj6bjfqa9ye64y2b", + "function": { + "arguments": "{\"city\":\"Tokyo\"}", + "name": "get_weather" + }, + "type": "function", + "index": 0 + } + ] + }, + "seed": 977986247412336500 + } + ], + "created": 1758039055, + "model": "meta-llama/Llama-3.3-70B-Instruct-Turbo-Free", + "object": "chat.completion", + "service_tier": null, + "system_fingerprint": null, + "usage": { + "completion_tokens": 24, + "prompt_tokens": 193, + "total_tokens": 217, + "completion_tokens_details": null, + "prompt_tokens_details": null, + "cached_tokens": 0 + }, + "prompt": [] + } + }, + "is_streaming": false + } +} diff --git a/tests/integration/recordings/responses/6c4e2e207e8a.json b/tests/integration/recordings/responses/6c4e2e207e8a.json new file mode 100644 index 000000000..23752a527 --- /dev/null +++ b/tests/integration/recordings/responses/6c4e2e207e8a.json @@ -0,0 +1,59 @@ +{ + "request": { + "method": "POST", + "url": "https://api.together.xyz/v1/v1/chat/completions", + "headers": {}, + "body": { + "model": "meta-llama/Llama-3.3-70B-Instruct-Turbo-Free", + "messages": [ + { + "role": "user", + "content": "Which planet do humans live on?" + } + ], + "stream": false + }, + "endpoint": "/v1/chat/completions", + "model": "meta-llama/Llama-3.3-70B-Instruct-Turbo-Free" + }, + "response": { + "body": { + "__type__": "openai.types.chat.chat_completion.ChatCompletion", + "__data__": { + "id": "oBUtMpf-62bZhn-9801a16bc8d642d3", + "choices": [ + { + "finish_reason": "stop", + "index": 0, + "logprobs": null, + "message": { + "content": "Humans live on Earth.", + "refusal": null, + "role": "assistant", + "annotations": null, + "audio": null, + "function_call": null, + "tool_calls": [] + }, + "seed": 14150443913665712000 + } + ], + "created": 1758038990, + "model": "meta-llama/Llama-3.3-70B-Instruct-Turbo-Free", + "object": "chat.completion", + "service_tier": null, + "system_fingerprint": null, + "usage": { + "completion_tokens": 6, + "prompt_tokens": 42, + "total_tokens": 48, + "completion_tokens_details": null, + "prompt_tokens_details": null, + "cached_tokens": 0 + }, + "prompt": [] + } + }, + "is_streaming": false + } +} diff --git a/tests/integration/recordings/responses/72e075bf28e8.json b/tests/integration/recordings/responses/72e075bf28e8.json new file mode 100644 index 000000000..bfd519035 --- /dev/null +++ b/tests/integration/recordings/responses/72e075bf28e8.json @@ -0,0 +1,800 @@ +{ + "request": { + "method": "POST", + "url": "https://api.together.xyz/v1/v1/embeddings", + "headers": {}, + "body": { + "model": "togethercomputer/m2-bert-80M-32k-retrieval", + "input": "Hello, world!" + }, + "endpoint": "/v1/embeddings", + "model": "togethercomputer/m2-bert-80M-32k-retrieval" + }, + "response": { + "body": { + "__type__": "openai.types.create_embedding_response.CreateEmbeddingResponse", + "__data__": { + "data": [ + { + "embedding": [ + -0.017041557, + -0.07436493, + 0.02897635, + -0.032216743, + 0.0056444216, + -0.029015187, + 0.06512343, + -0.040310342, + 0.05263593, + 0.0068842396, + 0.019191971, + -0.0064884443, + -0.01664521, + 0.014244285, + 0.036390014, + -0.040292, + 0.031780273, + 0.0039553884, + -0.055303488, + -0.028992416, + -0.02059435, + 0.05677091, + -0.043668333, + -0.014273451, + 0.15328151, + -0.023603301, + -0.049825363, + 0.007869072, + -0.010882995, + -0.033912696, + 0.053697765, + -0.00093928695, + 0.0017799847, + 0.038871024, + -0.069678165, + -0.067093275, + 0.025772842, + -0.057590123, + -0.015825877, + 0.020131286, + 0.020742312, + 0.003915491, + -0.018451879, + 0.020440312, + -0.023613403, + -0.039568678, + -0.013152008, + -0.01871725, + 0.021348018, + -0.019964654, + 0.038607903, + 0.018397795, + -0.0063561443, + -0.018936336, + -0.060981557, + -0.02152846, + 0.027057847, + 0.0014626224, + -0.018241309, + -0.07473041, + -0.02377323, + -0.033910733, + 0.02569418, + -0.024951216, + -0.0076659806, + -0.015425462, + 0.006604636, + 0.09833969, + -0.005054596, + 0.008841989, + -0.01836461, + -0.018554095, + 0.011605144, + -0.016599955, + -0.062196333, + -0.0037542647, + -0.025220644, + -0.027834827, + -0.020460974, + -0.050503097, + 0.032119684, + -0.023387104, + 0.050067227, + -0.05834235, + 0.023189448, + -0.021862485, + 0.023831544, + -0.016663097, + -0.041609522, + 0.025361128, + 0.002924296, + 0.01852158, + 0.08960255, + -0.003265466, + -0.058762494, + -0.06428431, + -0.014671485, + -0.046800107, + 0.02691456, + -0.0059303525, + -0.015431455, + 0.022179665, + 0.014044907, + 0.012218545, + 0.0053836405, + -0.025096457, + 0.009438382, + 0.032498095, + 0.06879721, + 0.056900814, + 0.019497631, + -0.122159146, + -0.106994465, + -0.017456975, + 0.047223866, + 0.06569824, + 0.04780035, + 0.018039258, + -0.0011028647, + -0.05067006, + 0.0106863845, + 0.027489506, + -0.014593985, + -0.039851535, + -0.09175489, + 0.037555773, + -0.060439512, + 0.008525801, + 0.0071557434, + -0.057973035, + -0.054225244, + 0.051505033, + -0.0008626373, + 0.069083415, + 0.064380065, + 0.09843996, + 0.0062191207, + -0.041505292, + -0.05381256, + -0.0073601264, + -0.03288613, + 0.011711341, + -0.09244605, + 0.0069717136, + -0.05722877, + 0.041075893, + 0.06521969, + -0.0018537377, + 0.016272636, + 0.008761483, + -0.029342752, + 0.020412564, + -0.07015791, + 0.033616304, + 0.039998446, + 0.01602917, + 0.044467725, + -0.08176377, + -0.036885373, + 0.03468746, + 0.0024068495, + 0.00056306267, + 0.02546511, + -0.053339135, + -0.027220095, + -0.021510394, + 0.054806393, + -0.005447777, + -0.05690438, + -0.028497366, + 0.01873974, + -0.035461064, + -0.00019089226, + -0.04914238, + 0.030303763, + 0.013396073, + 0.015789565, + -0.07714792, + -0.062155712, + -0.00677417, + 0.02850476, + 0.031491462, + 0.014566345, + 0.012163924, + 0.11814501, + -0.0043511004, + -0.017920421, + 0.004205825, + -0.0015928322, + -0.012145554, + 0.01663168, + -0.071173735, + 0.0029570858, + 0.12899451, + 0.004157568, + 0.010501232, + 0.07710632, + 0.062119417, + 0.021002673, + -0.023212241, + -0.04327007, + -0.0567023, + 0.04590105, + 0.0019161925, + 0.02637205, + 0.029331107, + -0.029769177, + -0.050466795, + -0.08057371, + 0.007419741, + -0.008777471, + 0.02217743, + 0.013535721, + 0.03426775, + 0.04592361, + 0.009423588, + -0.023030678, + -0.024462381, + 0.054334357, + 0.06710402, + 0.077300854, + 0.0300022, + -0.0035417816, + -0.0046773576, + -0.0927158, + -0.0218652, + -0.043468982, + -0.035734102, + -0.038873542, + -0.0412869, + -0.016015923, + 0.0038303286, + 0.08523618, + -0.05200533, + -0.014904317, + -0.016793448, + 0.04478206, + -0.017161047, + 0.02638292, + 0.007849463, + -0.040533304, + -0.017599737, + 0.047704253, + 0.034988616, + -0.013908102, + 0.044121094, + 0.040395457, + -0.010402818, + 0.0063570403, + -0.014962749, + 0.025776524, + 0.023681043, + 0.006042675, + 0.017647373, + 0.016301101, + -0.07793374, + -0.004771094, + 0.012728924, + -0.00047885205, + -0.051591527, + 0.03612118, + -0.02209703, + 0.052075963, + -0.021613466, + -0.026258182, + 0.008102769, + -0.04963262, + 0.00062747014, + -0.012579783, + 0.076374784, + -0.047350414, + -0.007680664, + 0.062471915, + -0.0061351187, + -0.043617643, + 0.023878522, + -0.09653609, + 0.018392054, + -0.039719462, + 0.065271765, + 0.034548305, + 0.004219043, + -0.003628092, + 0.0047836183, + 0.0132732885, + -0.028140727, + -0.015683327, + -0.052812085, + -0.019410037, + 0.06812139, + -0.041178964, + 0.014646207, + -0.0037439142, + 0.0003088275, + -0.04985693, + 0.0223661, + 0.008887433, + 0.0049061268, + 0.042707395, + -0.021471359, + -0.06471383, + 0.0022036259, + 0.030178884, + -0.002764245, + -0.0063233464, + -0.04146522, + -0.008236624, + 0.0037351896, + -0.027550086, + -0.0137326885, + 0.0055276263, + 0.0016785853, + 0.050191414, + 0.02629574, + -0.009129228, + 0.06351977, + -0.037435655, + 0.0467174, + -0.012987377, + -0.007550927, + -0.004503205, + 0.010520655, + 0.064984836, + 0.009879768, + 0.055787366, + -0.042653065, + 0.024189176, + 0.0378726, + -0.032453574, + 0.043519154, + 0.020133087, + -0.055212636, + -0.016188117, + 0.03764466, + -0.022142444, + 0.11164031, + 0.019020407, + -0.008950892, + 0.0517199, + 0.0014494535, + 0.041113462, + -0.0912906, + -0.04723132, + 0.008548748, + 0.028231544, + 0.023689618, + -0.039103802, + -0.034011997, + -0.04731894, + 0.03309799, + -0.044572156, + -0.116778485, + -0.028786778, + 0.05798776, + 0.05287191, + -0.0039562676, + -0.08213019, + -0.01224603, + -0.012757768, + 0.035721667, + 0.012440343, + 0.0053813523, + -0.072770126, + 0.0066190604, + 0.038976185, + -0.037760906, + -0.0031381482, + -0.052277293, + -0.016870236, + -0.053451907, + -0.05629483, + -0.034493946, + -0.0048654405, + 0.022051724, + 0.028501945, + 0.025858566, + -0.023936177, + -0.098391004, + -0.030646492, + -0.049461726, + -0.00086931954, + 0.03593346, + 0.015843417, + -0.03276966, + 0.008957432, + -0.022735167, + -0.012159252, + 0.07607085, + -0.059834506, + 0.004478244, + 0.03439635, + 0.03683821, + 0.062883355, + 0.054430448, + -0.029807799, + 0.0032295138, + 0.08891875, + -0.026941199, + -0.00618463, + -0.022683868, + -0.024138795, + -0.036633875, + 0.02097464, + -0.003001584, + 0.020455033, + 0.043717608, + 0.06566654, + -0.029039463, + -0.0066977167, + -0.04504434, + 0.022257777, + 0.054422457, + 0.029796708, + 0.009008146, + 0.028205348, + 0.06255052, + -0.004475601, + 0.059329458, + -0.038065027, + -0.027933009, + -0.07060949, + 0.013978787, + -0.051300917, + 0.02945564, + -0.008552103, + -0.009436655, + 0.039747514, + -0.016741823, + 0.04740887, + 0.03521937, + -0.012574282, + -0.089222826, + -0.043515395, + -0.04158566, + 0.0016020355, + 0.02684753, + -0.019394692, + -0.02156877, + 0.06316388, + 0.01663444, + 0.015482924, + 0.047349654, + -0.028341234, + 0.013805591, + -0.010708488, + -0.07627738, + 0.08611209, + 0.0089956885, + 0.034438204, + 0.016312746, + -0.03412846, + 0.0770598, + -0.06790466, + 0.036359854, + 0.08038976, + 0.023465984, + -0.019832904, + -0.0011524013, + -0.03804293, + 0.04106918, + -0.028220456, + 0.032340813, + -0.030669356, + -0.004353358, + -0.019439798, + 0.0020563425, + 0.03015629, + -0.06430176, + 0.0034439075, + -0.045720384, + -0.06526568, + -0.0004192516, + -0.016580455, + -0.012596616, + 0.039126, + -0.04699455, + -0.008973794, + 0.015056125, + 0.018929023, + -0.07840811, + -0.014792519, + -0.0044317124, + 0.019588342, + 0.035912346, + -0.035739247, + 0.058755044, + -0.01856197, + 0.021155646, + -0.073580906, + -0.04310776, + -0.023147091, + -0.010232029, + 0.06352039, + 0.039570276, + 0.020424508, + 0.051613245, + 0.013395984, + -0.003908009, + -0.04643392, + 0.019592889, + -0.008484923, + 0.0031434586, + -0.046069775, + -0.01765311, + -0.041277196, + -0.070297986, + 0.012561737, + -0.003500738, + -0.01729488, + -0.0033254062, + 0.053035453, + -0.054218896, + -0.029708259, + -0.0047281524, + 0.019236762, + -0.12249525, + 0.03018237, + -0.028753102, + -0.031858314, + 0.0811298, + -0.005711499, + -0.057587985, + 0.014153141, + 0.0006705577, + -0.024263157, + 0.016729265, + -0.03195949, + -0.007259763, + -0.0035231581, + -0.03890975, + 0.011460382, + -0.06591321, + -0.023756726, + -0.023958001, + 0.030074941, + -0.0040949634, + -0.048368257, + -0.029692868, + 0.027246583, + -0.024747347, + 0.014442731, + -0.00832639, + -0.0002390868, + -0.013635633, + 0.0035843733, + 0.02354072, + -0.012829061, + -0.0060750768, + -0.044952527, + -0.05725624, + 0.031746052, + -0.024419094, + 0.032444403, + -0.029308707, + 0.034302235, + -0.022495607, + 0.015296428, + -0.0057196384, + -7.8588724e-05, + 0.060303975, + 0.06299601, + 0.028222265, + -0.0071411408, + 0.015196491, + 0.02031155, + 0.039635558, + 0.079736926, + 0.008736669, + -0.023079613, + -0.04490686, + -0.021764707, + -0.015199573, + 0.036019534, + -0.0046079857, + 0.04429082, + -0.04291344, + -0.05991891, + -0.006501417, + 0.010603077, + 0.03435066, + -0.065568395, + -0.04424192, + 0.035055783, + 0.019717937, + 0.032764338, + 0.021240309, + -0.01646063, + 0.007835414, + 0.06857148, + -0.013750999, + 0.028333688, + -0.078255735, + -0.047899257, + -0.0006370693, + 0.012606231, + 0.012178417, + -0.013057751, + -0.008095854, + -0.013466724, + 0.019036459, + -0.025450038, + 0.021131655, + -0.02505666, + 0.012961284, + 0.0004236046, + -0.023920864, + -0.055114083, + 0.082351916, + 0.028973032, + 0.025259241, + 0.098259576, + -0.007385416, + 0.003546012, + -0.05316339, + -0.04186183, + 0.043638214, + -0.069299474, + -0.013284585, + -0.010019175, + 0.012883975, + 0.014200739, + -0.013508286, + 0.0086570075, + -0.020393575, + 0.10617594, + 0.028786503, + -0.018674662, + 0.026763268, + -0.0062548965, + -0.07215284, + 0.055464335, + 0.0029595464, + -0.009364344, + -0.096402094, + 0.02823341, + -0.022853011, + 0.04750492, + 0.008378555, + 0.016491622, + 0.01860681, + 0.048116222, + 0.106049344, + -0.028929656, + -0.008896546, + 0.033615295, + -0.0070807124, + -0.05684197, + -0.061439563, + 0.0060220268, + 0.046171866, + -0.01574131, + -0.07562956, + 0.0024098414, + 0.0006304895, + -0.07831614, + 0.060869616, + 0.00076000375, + -0.008209363, + -0.04139266, + -0.085268535, + -0.028194478, + -0.024567788, + -0.04218179, + 0.023546752, + 0.036236234, + 0.017199656, + -0.03315456, + -0.023814544, + 0.038755447, + -0.023165299, + -0.049283065, + -0.006907019, + 0.040826146, + 0.017533792, + -0.036849793, + -0.015506943, + -0.010768763, + -0.08758806, + -0.0295733, + 0.055843282, + -0.012555046, + 0.0076235603, + 0.008802991, + 0.026661193, + -0.023899797, + 0.043548774, + -0.034339137, + -0.027354732, + -0.07583677, + 0.020500224, + 0.036802996, + 0.031019075, + 0.04605757, + -0.004433706, + 0.0108612785, + 0.050121468, + -0.07816735, + -0.014776514, + -0.04565195, + -0.0036854912, + 0.0075577567, + -0.017044865, + 0.030597543, + -0.013623054, + -0.0648466, + -0.0318741, + -0.059455115, + -0.024783187, + -0.0088010235, + 0.11127796, + 0.03429834, + -0.010424589, + -0.06355135, + 0.034265812, + 0.02680333, + -0.007930513, + 0.030092249, + 0.008321974, + 0.03125566, + -0.06832331, + -0.0076806936, + 0.034010306, + -0.087202646, + -0.047684345, + 0.06384632, + -0.026591811, + -0.0016003181, + 0.05721666, + -0.0024700803, + -0.029714238, + 0.07761957, + -0.04561395, + -0.053199258, + 0.030417573, + -0.01958724, + 0.0012449475, + -0.04003076, + 0.08825553, + -0.023196172, + -0.08629044, + -0.049815316, + 0.027229005, + 0.0021765123, + 0.03438692, + -0.09314263, + -0.019655729, + 0.018762926, + 0.025670087, + -0.017116003, + 0.031716976, + -0.05509443, + 0.032953184, + -0.02264915, + 0.04861606, + -0.050201602, + 0.033154316, + 0.009971947, + -0.037610047, + 0.016600395, + -0.031037569, + -0.015495428, + 0.026365642, + -0.043527953, + 0.055781424, + 0.06780075, + -0.015966192, + 0.03201043, + 0.028026119 + ], + "index": 0, + "object": "embedding" + } + ], + "model": "togethercomputer/m2-bert-80M-32k-retrieval", + "object": "list", + "usage": null + } + }, + "is_streaming": false + } +} diff --git a/tests/integration/recordings/responses/894fdacb1cfa.json b/tests/integration/recordings/responses/894fdacb1cfa.json new file mode 100644 index 000000000..d6490fb98 --- /dev/null +++ b/tests/integration/recordings/responses/894fdacb1cfa.json @@ -0,0 +1,176 @@ +{ + "request": { + "method": "POST", + "url": "https://api.together.xyz/v1/v1/chat/completions", + "headers": {}, + "body": { + "model": "meta-llama/Llama-3.3-70B-Instruct-Turbo-Free", + "messages": [ + { + "role": "user", + "content": "What's the weather in Tokyo? Use the get_weather function to get the weather." + } + ], + "stream": true, + "tools": [ + { + "type": "function", + "function": { + "name": "get_weather", + "description": "Get the weather in a given city", + "parameters": { + "type": "object", + "properties": { + "city": { + "type": "string", + "description": "The city to get the weather for" + } + } + } + } + } + ] + }, + "endpoint": "/v1/chat/completions", + "model": "meta-llama/Llama-3.3-70B-Instruct-Turbo-Free" + }, + "response": { + "body": [ + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "oBUtX7R-62bZhn-9801a22f6ad243dc", + "choices": [ + { + "delta": { + "content": null, + "function_call": null, + "refusal": null, + "role": "assistant", + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null + } + ], + "created": 1758039022, + "model": "meta-llama/Llama-3.3-70B-Instruct-Turbo-Free", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": null, + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "oBUtX7R-62bZhn-9801a22f6ad243dc", + "choices": [ + { + "delta": { + "content": null, + "function_call": null, + "refusal": null, + "role": null, + "tool_calls": [ + { + "index": 0, + "id": "call_jy63yt7kp8hfof3sy4pim94o", + "function": { + "arguments": "", + "name": "get_weather" + }, + "type": "function" + } + ] + }, + "finish_reason": null, + "index": 0, + "logprobs": null + } + ], + "created": 1758039022, + "model": "meta-llama/Llama-3.3-70B-Instruct-Turbo-Free", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": null, + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "oBUtX7R-62bZhn-9801a22f6ad243dc", + "choices": [ + { + "delta": { + "content": null, + "function_call": null, + "refusal": null, + "role": null, + "tool_calls": [ + { + "index": 0, + "id": null, + "function": { + "arguments": "{\"city\":\"Tokyo\"}", + "name": null + }, + "type": null + } + ] + }, + "finish_reason": null, + "index": 0, + "logprobs": null + } + ], + "created": 1758039022, + "model": "meta-llama/Llama-3.3-70B-Instruct-Turbo-Free", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": null, + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "oBUtX7R-62bZhn-9801a22f6ad243dc", + "choices": [ + { + "delta": { + "content": "", + "function_call": null, + "refusal": null, + "role": "assistant", + "tool_calls": null, + "token_id": 128008 + }, + "finish_reason": "tool_calls", + "index": 0, + "logprobs": null, + "text": "", + "seed": 1489065696184500700 + } + ], + "created": 1758039022, + "model": "meta-llama/Llama-3.3-70B-Instruct-Turbo-Free", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": null, + "usage": { + "completion_tokens": 24, + "prompt_tokens": 193, + "total_tokens": 217, + "completion_tokens_details": null, + "prompt_tokens_details": null, + "cached_tokens": 0 + } + } + } + ], + "is_streaming": true + } +} diff --git a/tests/integration/recordings/responses/bce560cbf1c6.json b/tests/integration/recordings/responses/bce560cbf1c6.json new file mode 100644 index 000000000..eeba8d85e --- /dev/null +++ b/tests/integration/recordings/responses/bce560cbf1c6.json @@ -0,0 +1,800 @@ +{ + "request": { + "method": "POST", + "url": "https://api.together.xyz/v1/v1/embeddings", + "headers": {}, + "body": { + "model": "togethercomputer/m2-bert-80M-32k-retrieval", + "input": "This is the first text" + }, + "endpoint": "/v1/embeddings", + "model": "togethercomputer/m2-bert-80M-32k-retrieval" + }, + "response": { + "body": { + "__type__": "openai.types.create_embedding_response.CreateEmbeddingResponse", + "__data__": { + "data": [ + { + "embedding": [ + -0.039021637, + 0.022414008, + 0.060316082, + 0.010932758, + 0.018470073, + -0.038455445, + 0.013484707, + -0.038724504, + -0.025575833, + -0.07131675, + 0.03463345, + -0.025232196, + 0.020823235, + 0.03832292, + -0.006293115, + -0.088807434, + 0.0063370736, + -0.002888027, + 0.02621656, + 0.055453233, + 0.102450415, + 0.03387425, + -0.005548249, + 0.06926162, + 0.036552645, + -0.027929714, + 0.05147974, + -0.084861636, + -0.05467612, + 0.0061274734, + 0.01355064, + -0.027067322, + 0.099598646, + -0.05280082, + -0.03848137, + -0.0138273295, + 0.00055626774, + -0.062084854, + -0.026424624, + -0.004740091, + 0.06750933, + -0.05090067, + 0.06227124, + -0.01807564, + 0.0048294156, + 0.013328212, + 0.004276883, + -0.034934912, + -0.036818415, + 0.0185289, + 0.0048565175, + 0.016870664, + -0.040981345, + -0.035420854, + -0.091292314, + -0.08983982, + -0.048739515, + 0.12078825, + 0.04027495, + 0.088196404, + 0.082896, + -0.08266004, + -0.00082181377, + -0.050194185, + 0.024180485, + -0.027468672, + -0.08769602, + 0.047489725, + -0.03834715, + 0.07631481, + -0.06501303, + -0.03695376, + 0.067694835, + 0.027814003, + -0.051688053, + -0.032236356, + 0.039202936, + 0.03445711, + 0.009532945, + -0.034482885, + -0.08042295, + 0.008322418, + 0.05848545, + -0.064453684, + -0.17329726, + -0.047616575, + 0.045936666, + 0.023837132, + -0.015925486, + -0.0857517, + -0.0001586331, + -0.044116773, + -0.029393503, + 0.009738323, + 0.03763726, + -0.11253048, + 0.019114532, + 0.07549436, + -0.1030746, + -0.038988255, + 0.011407976, + -0.037570667, + 0.05159809, + 0.007962588, + 0.01113923, + 0.003076782, + 0.15470116, + 0.0043370854, + 0.030429134, + -0.027383734, + -0.030138142, + -0.079299994, + 0.12148583, + 0.034556936, + -0.0064313645, + 0.048751578, + -0.05864567, + 0.026685659, + -0.09871483, + -0.046130598, + 0.019625148, + -0.072314, + 0.03352563, + 0.01364348, + -0.085728094, + 0.06642468, + -0.094013095, + -0.037293892, + 0.0076811705, + 0.0052874135, + 0.018115167, + -0.055315576, + -0.052764144, + -0.034311842, + 0.015955461, + -0.07966574, + -0.028749859, + 0.03149985, + -0.047564246, + 0.008608991, + -0.021272784, + 0.030198015, + -0.0107804965, + 0.017173572, + -0.011607755, + -0.050619457, + 0.030204969, + 0.10163846, + -0.0056075957, + 0.06950345, + 0.04063133, + -0.03608383, + 0.023170248, + -0.014745303, + -0.014478895, + 0.10499135, + -0.038678814, + -0.0075368164, + 0.08199838, + -0.09530577, + 0.020091686, + 0.10653022, + 0.08388272, + -0.0045513124, + -0.04053859, + -0.0025074913, + 0.017358577, + -0.03037232, + 0.04310344, + -0.04824635, + 0.055064622, + -0.019335788, + -0.0674805, + 0.024816237, + 0.019295547, + 0.0007229409, + 0.04357454, + 0.021688526, + 0.08630486, + -0.011211191, + -0.039039955, + 0.17257652, + -0.007145191, + 0.006575071, + -0.0139306225, + -0.014735097, + -0.044341516, + -0.11539079, + 0.033123154, + -0.011538915, + -0.024190484, + -0.018813878, + 0.03229297, + -0.04379363, + 0.03185381, + -0.035783295, + 0.06494934, + 0.05133508, + 0.00010083616, + 0.007334995, + 0.06611978, + -0.062722, + 0.045553267, + -0.011721417, + 0.020822436, + -0.04873414, + 0.03926427, + 0.007051802, + -0.05594363, + 0.03565722, + -0.12122127, + 0.027855415, + -0.016186016, + -0.041470908, + -0.08864265, + -0.0036498592, + 0.010997135, + -0.012785444, + -0.06519897, + 0.027590077, + 0.067321666, + -0.05896251, + 0.008983399, + -0.095143765, + 0.011621533, + -0.06121848, + 0.050336383, + 0.0019902636, + 0.053377967, + -0.045287643, + 0.09474427, + -0.053598337, + 0.08048404, + -0.08297755, + 0.08607313, + 0.004596277, + 0.0204861, + 0.0132703995, + 0.0492952, + 0.003006371, + 0.024936337, + -0.021873668, + 0.11727927, + -0.043151148, + -0.0846394, + -0.048050277, + 0.0012273242, + 0.16534594, + 0.07620599, + 0.0144042745, + 0.09004986, + 0.06599925, + 0.050307803, + -0.014542778, + -0.06923349, + 0.08603958, + -0.003079753, + -0.08008583, + -0.04276064, + 0.07779741, + -0.04970902, + 0.024014566, + 0.026120175, + -0.007566401, + -0.06362058, + 0.0075124875, + -0.025173014, + 0.06797637, + 0.064056545, + -0.12027379, + -0.030917957, + 0.009303285, + 0.1108725, + 0.048372857, + -0.025575588, + -0.0063446634, + 0.011040862, + -0.03459656, + -0.0144168, + 0.048665646, + -0.009920939, + -0.0061537125, + -0.10304914, + 0.014452626, + 0.016036827, + 0.012599703, + 0.016684191, + -0.039659906, + 0.010836161, + -0.029463075, + 0.0011919601, + 0.06632273, + -0.05316992, + 0.039452244, + -0.021640282, + -0.05948179, + -0.015061293, + -0.015513855, + 0.04358236, + -0.0029279767, + 0.0860453, + -0.012484551, + -0.013506936, + 0.016622225, + 0.03162366, + -0.09996153, + -0.05663382, + -0.015155038, + 0.00578972, + 0.025347538, + -0.06958232, + 0.10877864, + -0.036945637, + 0.03478135, + 0.13662694, + -0.020611005, + 0.07592442, + 0.0036063113, + -0.09048903, + 0.016554832, + -0.04288513, + -0.027900286, + -0.07563455, + 0.030791664, + -0.033230122, + 0.018658046, + -0.043807156, + 0.029736735, + 0.10202865, + 0.009116146, + -0.09378922, + 0.099590845, + 0.0642359, + 0.0589953, + 0.05296719, + -0.07642986, + -0.11738337, + -0.05376279, + 0.09199399, + -0.0627918, + 0.03704901, + -0.037008967, + -0.05638905, + 0.009441371, + 0.04416073, + -0.03527975, + -0.03531018, + 0.07021692, + 0.05659684, + 0.099865966, + 0.076215744, + 0.043112382, + 0.007842607, + -0.039226923, + 0.006264895, + -0.03105526, + 0.060152344, + 0.040446483, + 0.10218391, + -0.07178106, + 0.015407178, + -0.06229486, + 0.0043686125, + 0.09733845, + -0.09527866, + 0.041407365, + 0.06550996, + 0.08803008, + 0.09149921, + 0.04229226, + 0.052133556, + 0.047242433, + 0.014378367, + 0.03682277, + 0.06764445, + 0.066040926, + 0.021740213, + 0.04180941, + -0.00519632, + -0.0111550195, + 0.017352529, + -0.00943155, + 0.11390086, + 0.05582122, + 0.035394136, + 0.0024461604, + 0.04081662, + -0.0007266066, + 0.06292638, + 0.0052844593, + 0.05790997, + -0.09407522, + -0.05039574, + 0.07852171, + -0.08000922, + 0.13302545, + 0.10419625, + 0.039512042, + -0.09167407, + 0.010040825, + 0.013924355, + 0.027515184, + 0.079743214, + 0.09399837, + 0.0151610905, + 0.004694856, + -0.0536953, + 0.06531984, + 0.027906924, + -0.0012715638, + 0.09168681, + -0.00026439782, + -0.0041136686, + 0.033571295, + -0.01907176, + 0.11883433, + -0.0065728375, + -0.0062215794, + -0.1049895, + -0.03321981, + -0.026450735, + 0.072518945, + -0.11240429, + -0.022515744, + -0.048495665, + -0.037087325, + 0.00032197312, + 0.051534563, + 0.046150282, + -0.08213623, + 0.09886837, + 0.041117694, + 0.05323094, + -0.05427183, + -0.022201112, + -0.024121372, + 0.012735752, + 0.1397762, + -0.007587272, + 0.05582085, + 0.06499377, + -0.018458825, + -0.021883465, + 0.032667745, + 0.02018645, + 0.040008776, + 0.07482824, + -0.024819402, + 0.045242358, + -0.06036402, + 0.025522556, + -0.025958247, + 0.018367121, + 0.029390294, + -0.031080022, + -0.010285386, + -0.007700369, + 0.045184247, + 0.044544965, + 0.029447366, + 0.014604208, + -0.09001254, + -0.09150779, + 0.048845917, + -0.005016622, + -0.030419605, + -0.021073101, + -0.028362123, + 0.04180255, + 0.011223455, + 0.026317155, + 0.07052029, + 0.04195792, + -0.010761702, + -0.054835323, + 0.047067013, + 0.04737349, + 0.09244638, + 0.096748084, + -0.03332587, + -0.009952178, + -0.0030183739, + 0.07009167, + 0.05392541, + 0.024944762, + 0.0061005787, + 0.028459419, + -0.05767917, + -0.051464006, + 0.08488547, + -0.016385203, + -0.04579279, + -0.084523976, + -0.032011546, + -0.007594041, + -0.06051386, + -0.046265714, + -0.027389096, + -0.044890895, + -0.0022862924, + -0.1268961, + -0.037864592, + 0.024412185, + -0.07392371, + -0.014362709, + 0.07425692, + 0.022583768, + 0.011156761, + -0.057216533, + -0.039548866, + -0.018076254, + -0.05556914, + -0.057198036, + -0.03188685, + 0.090208404, + 0.10571588, + 0.01070536, + 0.08128956, + 0.017667988, + -0.10340015, + 0.07804198, + -0.019781966, + 0.06535109, + -0.07777538, + -0.025819557, + -0.08128869, + -0.034394037, + 0.019422948, + -0.039221227, + -0.08033355, + -0.02329798, + -0.0962552, + -0.016624983, + 0.038193095, + -0.06870783, + -0.033954047, + -0.0025311739, + -0.114151455, + -0.00511124, + -0.06920173, + 0.044555113, + 0.10051683, + 0.04055453, + -0.06167893, + -0.01584111, + 0.0030792183, + 4.6655536e-05, + -0.026384909, + -0.012856535, + -0.06174471, + 0.0024448705, + -0.022707395, + 0.066114195, + -0.010608763, + -0.01576041, + -0.0010933182, + 0.03396316, + 0.008329627, + -0.060327142, + -0.05505636, + -0.028406821, + -0.025708841, + 0.016102789, + 0.03405433, + 0.007868113, + 0.13327968, + 0.072789304, + -0.08000951, + -0.050192088, + -0.05803803, + -0.050078847, + -0.01996999, + 0.043255676, + -0.04441973, + 0.08783117, + 0.002935635, + 0.040976398, + -0.01976899, + 0.018852778, + -0.03215457, + -0.04958742, + 0.015443288, + 0.010633601, + -0.074571095, + 0.053966194, + -0.01581196, + -0.04183213, + -0.04719714, + 0.033312585, + 0.011825424, + -0.029853545, + -0.050666492, + -0.08864941, + -0.022672195, + 0.0724055, + 0.0037794008, + 0.055587664, + -0.13644798, + 0.022921626, + 0.1152114, + 0.07047247, + 0.030930748, + -0.0052061337, + 0.044788003, + -0.08634308, + -0.10505402, + -0.025340958, + -0.08207144, + 0.059532717, + -0.0062416205, + 0.1022889, + 0.010608143, + 0.041661825, + -0.097806565, + 0.0038305484, + 0.05404457, + 0.032105837, + 0.06415997, + -0.049071103, + -0.03720757, + -0.023321476, + 0.12579422, + 0.043440778, + -0.011532883, + -0.05620173, + 0.005197981, + -0.12449035, + 0.008241525, + -0.10594952, + 0.102292866, + -0.0699, + -0.11592147, + 0.06966665, + -0.027437769, + -0.014774349, + 0.018875254, + -0.017957961, + 0.091627896, + 0.04989476, + 0.0798358, + 0.04239699, + -0.007844917, + -0.06630319, + 0.052326147, + 0.02648383, + 0.044119354, + -0.06851671, + 0.15443392, + -0.020682698, + -0.03766801, + 0.0155308945, + -0.063717306, + 0.0006521008, + -0.05569479, + -0.043325484, + -0.014842672, + -0.025855135, + 0.017403143, + -0.011325402, + 0.054577086, + 0.02011184, + -0.09925977, + -0.0069759586, + -0.03428202, + 0.0034359726, + -0.15824135, + 0.000930797, + -0.113140985, + -0.044972613, + -0.02884488, + -0.06731342, + 0.04106218, + 0.028871017, + -0.011909599, + 0.03274342, + 0.018106263, + -0.020201381, + 0.1281747, + 0.020703837, + 0.024401633, + 0.042717557, + 0.014739593, + 0.07050051, + 0.038078446, + -0.022462513, + -0.004700358, + -0.014908828, + 0.037429586, + 0.021075286, + -0.047952563, + -0.010115325, + 0.011719644, + 0.052587837, + -0.026325963, + 0.06416419, + 0.04302814, + -0.032076415, + 0.03226265, + 0.047885012, + -0.08571586, + 0.13789223, + -0.039638847, + 0.08949073, + 0.0019859069, + 0.054476757, + -0.04336167, + -0.12529649, + 0.013598417, + -0.046129137, + 0.0031463325, + -0.10019061, + 0.02212261, + -0.024540763, + -0.020073807, + -0.015366339, + -0.04205672, + -0.004573892, + 0.04018059, + -0.06835582, + 0.0762453, + -0.07784769, + -0.03393797, + -0.084803775, + 0.028064115, + 0.06559264, + -0.10455632, + 0.039434727, + -0.038992915, + -0.09218861, + 0.013562555, + -0.06523423, + 0.10188195, + 0.05163541, + 0.02234651, + 0.01926983, + 0.0017454309, + 0.030410308, + 0.025801515, + -0.0333776, + 0.0030322578, + 0.055338234, + -0.017410548, + 0.07205084, + 0.04127999, + 0.0026357244, + 0.00054674776, + -0.018812224, + 0.051227525, + 2.2485852e-05, + -0.04581609, + -0.106634825, + 0.018237107, + 0.048612136, + -0.018699843, + -0.035245672, + -0.0367398, + -0.09525288, + 0.05530859, + 0.023024498, + -0.05791263, + -0.011325011, + -0.055147734, + 0.02724777, + -0.10974393, + 0.015870394, + 0.053438365, + 0.032307543, + 0.055390432 + ], + "index": 0, + "object": "embedding" + } + ], + "model": "togethercomputer/m2-bert-80M-32k-retrieval", + "object": "list", + "usage": null + } + }, + "is_streaming": false + } +} diff --git a/tests/integration/recordings/responses/d85689907fec.json b/tests/integration/recordings/responses/d85689907fec.json new file mode 100644 index 000000000..793ef78ad --- /dev/null +++ b/tests/integration/recordings/responses/d85689907fec.json @@ -0,0 +1,350 @@ +{ + "request": { + "method": "POST", + "url": "https://api.together.xyz/v1/v1/chat/completions", + "headers": {}, + "body": { + "model": "meta-llama/Llama-3.3-70B-Instruct-Turbo-Free", + "messages": [ + { + "role": "user", + "content": "What's the name of the Sun in latin?" + } + ], + "stream": true + }, + "endpoint": "/v1/chat/completions", + "model": "meta-llama/Llama-3.3-70B-Instruct-Turbo-Free" + }, + "response": { + "body": [ + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "oBUtQrM-62bZhn-9801a1ac2a5f9b29", + "choices": [ + { + "delta": { + "content": "The", + "function_call": null, + "refusal": null, + "role": "assistant", + "tool_calls": null, + "token_id": 791 + }, + "finish_reason": null, + "index": 0, + "logprobs": null, + "text": "The", + "seed": null + } + ], + "created": 1758039001, + "model": "meta-llama/Llama-3.3-70B-Instruct-Turbo-Free", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": null, + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "oBUtQrM-62bZhn-9801a1ac2a5f9b29", + "choices": [ + { + "delta": { + "content": " Latin", + "function_call": null, + "refusal": null, + "role": "assistant", + "tool_calls": null, + "token_id": 20023 + }, + "finish_reason": null, + "index": 0, + "logprobs": null, + "text": " Latin", + "seed": null + } + ], + "created": 1758039001, + "model": "meta-llama/Llama-3.3-70B-Instruct-Turbo-Free", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": null, + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "oBUtQrM-62bZhn-9801a1ac2a5f9b29", + "choices": [ + { + "delta": { + "content": " name", + "function_call": null, + "refusal": null, + "role": "assistant", + "tool_calls": null, + "token_id": 836 + }, + "finish_reason": null, + "index": 0, + "logprobs": null, + "text": " name", + "seed": null + } + ], + "created": 1758039001, + "model": "meta-llama/Llama-3.3-70B-Instruct-Turbo-Free", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": null, + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "oBUtQrM-62bZhn-9801a1ac2a5f9b29", + "choices": [ + { + "delta": { + "content": " for", + "function_call": null, + "refusal": null, + "role": "assistant", + "tool_calls": null, + "token_id": 369 + }, + "finish_reason": null, + "index": 0, + "logprobs": null, + "text": " for", + "seed": null + } + ], + "created": 1758039001, + "model": "meta-llama/Llama-3.3-70B-Instruct-Turbo-Free", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": null, + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "oBUtQrM-62bZhn-9801a1ac2a5f9b29", + "choices": [ + { + "delta": { + "content": " the", + "function_call": null, + "refusal": null, + "role": "assistant", + "tool_calls": null, + "token_id": 279 + }, + "finish_reason": null, + "index": 0, + "logprobs": null, + "text": " the", + "seed": null + } + ], + "created": 1758039001, + "model": "meta-llama/Llama-3.3-70B-Instruct-Turbo-Free", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": null, + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "oBUtQrM-62bZhn-9801a1ac2a5f9b29", + "choices": [ + { + "delta": { + "content": " Sun", + "function_call": null, + "refusal": null, + "role": "assistant", + "tool_calls": null, + "token_id": 8219 + }, + "finish_reason": null, + "index": 0, + "logprobs": null, + "text": " Sun", + "seed": null + } + ], + "created": 1758039001, + "model": "meta-llama/Llama-3.3-70B-Instruct-Turbo-Free", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": null, + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "oBUtQrM-62bZhn-9801a1ac2a5f9b29", + "choices": [ + { + "delta": { + "content": " is", + "function_call": null, + "refusal": null, + "role": "assistant", + "tool_calls": null, + "token_id": 374 + }, + "finish_reason": null, + "index": 0, + "logprobs": null, + "text": " is", + "seed": null + } + ], + "created": 1758039001, + "model": "meta-llama/Llama-3.3-70B-Instruct-Turbo-Free", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": null, + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "oBUtQrM-62bZhn-9801a1ac2a5f9b29", + "choices": [ + { + "delta": { + "content": " \"", + "function_call": null, + "refusal": null, + "role": "assistant", + "tool_calls": null, + "token_id": 330 + }, + "finish_reason": null, + "index": 0, + "logprobs": null, + "text": " \"", + "seed": null + } + ], + "created": 1758039001, + "model": "meta-llama/Llama-3.3-70B-Instruct-Turbo-Free", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": null, + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "oBUtQrM-62bZhn-9801a1ac2a5f9b29", + "choices": [ + { + "delta": { + "content": "Sol", + "function_call": null, + "refusal": null, + "role": "assistant", + "tool_calls": null, + "token_id": 49912 + }, + "finish_reason": null, + "index": 0, + "logprobs": null, + "text": "Sol", + "seed": null + } + ], + "created": 1758039001, + "model": "meta-llama/Llama-3.3-70B-Instruct-Turbo-Free", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": null, + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "oBUtQrM-62bZhn-9801a1ac2a5f9b29", + "choices": [ + { + "delta": { + "content": "\".", + "function_call": null, + "refusal": null, + "role": "assistant", + "tool_calls": null, + "token_id": 3343 + }, + "finish_reason": null, + "index": 0, + "logprobs": null, + "text": "\".", + "seed": null + } + ], + "created": 1758039001, + "model": "meta-llama/Llama-3.3-70B-Instruct-Turbo-Free", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": null, + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "oBUtQrM-62bZhn-9801a1ac2a5f9b29", + "choices": [ + { + "delta": { + "content": "", + "function_call": null, + "refusal": null, + "role": "assistant", + "tool_calls": null, + "token_id": 128009 + }, + "finish_reason": "stop", + "index": 0, + "logprobs": null, + "text": "", + "seed": 10870795372179526000 + } + ], + "created": 1758039001, + "model": "meta-llama/Llama-3.3-70B-Instruct-Turbo-Free", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": null, + "usage": { + "completion_tokens": 11, + "prompt_tokens": 45, + "total_tokens": 56, + "completion_tokens_details": null, + "prompt_tokens_details": null, + "cached_tokens": 0 + } + } + } + ], + "is_streaming": true + } +} diff --git a/tests/integration/recordings/responses/f0bbea34c5cc.json b/tests/integration/recordings/responses/f0bbea34c5cc.json new file mode 100644 index 000000000..9d1f2b5b5 --- /dev/null +++ b/tests/integration/recordings/responses/f0bbea34c5cc.json @@ -0,0 +1,611 @@ +{ + "request": { + "method": "POST", + "url": "https://api.together.xyz/v1/v1/chat/completions", + "headers": {}, + "body": { + "model": "meta-llama/Llama-3.3-70B-Instruct-Turbo-Free", + "messages": [ + { + "role": "user", + "content": "What is the name of the US captial?" + } + ], + "stream": true + }, + "endpoint": "/v1/chat/completions", + "model": "meta-llama/Llama-3.3-70B-Instruct-Turbo-Free" + }, + "response": { + "body": [ + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "oBUtdGc-62bZhn-9801a2b11e77499b", + "choices": [ + { + "delta": { + "content": "The", + "function_call": null, + "refusal": null, + "role": "assistant", + "tool_calls": null, + "token_id": 791 + }, + "finish_reason": null, + "index": 0, + "logprobs": null, + "text": "The", + "seed": null + } + ], + "created": 1758039042, + "model": "meta-llama/Llama-3.3-70B-Instruct-Turbo-Free", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": null, + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "oBUtdGc-62bZhn-9801a2b11e77499b", + "choices": [ + { + "delta": { + "content": " name", + "function_call": null, + "refusal": null, + "role": "assistant", + "tool_calls": null, + "token_id": 836 + }, + "finish_reason": null, + "index": 0, + "logprobs": null, + "text": " name", + "seed": null + } + ], + "created": 1758039042, + "model": "meta-llama/Llama-3.3-70B-Instruct-Turbo-Free", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": null, + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "oBUtdGc-62bZhn-9801a2b11e77499b", + "choices": [ + { + "delta": { + "content": " of", + "function_call": null, + "refusal": null, + "role": "assistant", + "tool_calls": null, + "token_id": 315 + }, + "finish_reason": null, + "index": 0, + "logprobs": null, + "text": " of", + "seed": null + } + ], + "created": 1758039042, + "model": "meta-llama/Llama-3.3-70B-Instruct-Turbo-Free", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": null, + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "oBUtdGc-62bZhn-9801a2b11e77499b", + "choices": [ + { + "delta": { + "content": " the", + "function_call": null, + "refusal": null, + "role": "assistant", + "tool_calls": null, + "token_id": 279 + }, + "finish_reason": null, + "index": 0, + "logprobs": null, + "text": " the", + "seed": null + } + ], + "created": 1758039042, + "model": "meta-llama/Llama-3.3-70B-Instruct-Turbo-Free", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": null, + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "oBUtdGc-62bZhn-9801a2b11e77499b", + "choices": [ + { + "delta": { + "content": " US", + "function_call": null, + "refusal": null, + "role": "assistant", + "tool_calls": null, + "token_id": 2326 + }, + "finish_reason": null, + "index": 0, + "logprobs": null, + "text": " US", + "seed": null + } + ], + "created": 1758039042, + "model": "meta-llama/Llama-3.3-70B-Instruct-Turbo-Free", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": null, + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "oBUtdGc-62bZhn-9801a2b11e77499b", + "choices": [ + { + "delta": { + "content": " capital", + "function_call": null, + "refusal": null, + "role": "assistant", + "tool_calls": null, + "token_id": 6864 + }, + "finish_reason": null, + "index": 0, + "logprobs": null, + "text": " capital", + "seed": null + } + ], + "created": 1758039042, + "model": "meta-llama/Llama-3.3-70B-Instruct-Turbo-Free", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": null, + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "oBUtdGc-62bZhn-9801a2b11e77499b", + "choices": [ + { + "delta": { + "content": " is", + "function_call": null, + "refusal": null, + "role": "assistant", + "tool_calls": null, + "token_id": 374 + }, + "finish_reason": null, + "index": 0, + "logprobs": null, + "text": " is", + "seed": null + } + ], + "created": 1758039042, + "model": "meta-llama/Llama-3.3-70B-Instruct-Turbo-Free", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": null, + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "oBUtdGc-62bZhn-9801a2b11e77499b", + "choices": [ + { + "delta": { + "content": " Washington", + "function_call": null, + "refusal": null, + "role": "assistant", + "tool_calls": null, + "token_id": 6652 + }, + "finish_reason": null, + "index": 0, + "logprobs": null, + "text": " Washington", + "seed": null + } + ], + "created": 1758039042, + "model": "meta-llama/Llama-3.3-70B-Instruct-Turbo-Free", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": null, + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "oBUtdGc-62bZhn-9801a2b11e77499b", + "choices": [ + { + "delta": { + "content": ",", + "function_call": null, + "refusal": null, + "role": "assistant", + "tool_calls": null, + "token_id": 11 + }, + "finish_reason": null, + "index": 0, + "logprobs": null, + "text": ",", + "seed": null + } + ], + "created": 1758039042, + "model": "meta-llama/Llama-3.3-70B-Instruct-Turbo-Free", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": null, + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "oBUtdGc-62bZhn-9801a2b11e77499b", + "choices": [ + { + "delta": { + "content": " D", + "function_call": null, + "refusal": null, + "role": "assistant", + "tool_calls": null, + "token_id": 423 + }, + "finish_reason": null, + "index": 0, + "logprobs": null, + "text": " D", + "seed": null + } + ], + "created": 1758039042, + "model": "meta-llama/Llama-3.3-70B-Instruct-Turbo-Free", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": null, + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "oBUtdGc-62bZhn-9801a2b11e77499b", + "choices": [ + { + "delta": { + "content": ".C", + "function_call": null, + "refusal": null, + "role": "assistant", + "tool_calls": null, + "token_id": 732 + }, + "finish_reason": null, + "index": 0, + "logprobs": null, + "text": ".C", + "seed": null + } + ], + "created": 1758039042, + "model": "meta-llama/Llama-3.3-70B-Instruct-Turbo-Free", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": null, + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "oBUtdGc-62bZhn-9801a2b11e77499b", + "choices": [ + { + "delta": { + "content": ".", + "function_call": null, + "refusal": null, + "role": "assistant", + "tool_calls": null, + "token_id": 13 + }, + "finish_reason": null, + "index": 0, + "logprobs": null, + "text": ".", + "seed": null + } + ], + "created": 1758039042, + "model": "meta-llama/Llama-3.3-70B-Instruct-Turbo-Free", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": null, + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "oBUtdGc-62bZhn-9801a2b11e77499b", + "choices": [ + { + "delta": { + "content": " (", + "function_call": null, + "refusal": null, + "role": "assistant", + "tool_calls": null, + "token_id": 320 + }, + "finish_reason": null, + "index": 0, + "logprobs": null, + "text": " (", + "seed": null + } + ], + "created": 1758039042, + "model": "meta-llama/Llama-3.3-70B-Instruct-Turbo-Free", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": null, + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "oBUtdGc-62bZhn-9801a2b11e77499b", + "choices": [ + { + "delta": { + "content": "short", + "function_call": null, + "refusal": null, + "role": "assistant", + "tool_calls": null, + "token_id": 8846 + }, + "finish_reason": null, + "index": 0, + "logprobs": null, + "text": "short", + "seed": null + } + ], + "created": 1758039042, + "model": "meta-llama/Llama-3.3-70B-Instruct-Turbo-Free", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": null, + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "oBUtdGc-62bZhn-9801a2b11e77499b", + "choices": [ + { + "delta": { + "content": " for", + "function_call": null, + "refusal": null, + "role": "assistant", + "tool_calls": null, + "token_id": 369 + }, + "finish_reason": null, + "index": 0, + "logprobs": null, + "text": " for", + "seed": null + } + ], + "created": 1758039042, + "model": "meta-llama/Llama-3.3-70B-Instruct-Turbo-Free", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": null, + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "oBUtdGc-62bZhn-9801a2b11e77499b", + "choices": [ + { + "delta": { + "content": " District", + "function_call": null, + "refusal": null, + "role": "assistant", + "tool_calls": null, + "token_id": 11182 + }, + "finish_reason": null, + "index": 0, + "logprobs": null, + "text": " District", + "seed": null + } + ], + "created": 1758039042, + "model": "meta-llama/Llama-3.3-70B-Instruct-Turbo-Free", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": null, + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "oBUtdGc-62bZhn-9801a2b11e77499b", + "choices": [ + { + "delta": { + "content": " of", + "function_call": null, + "refusal": null, + "role": "assistant", + "tool_calls": null, + "token_id": 315 + }, + "finish_reason": null, + "index": 0, + "logprobs": null, + "text": " of", + "seed": null + } + ], + "created": 1758039042, + "model": "meta-llama/Llama-3.3-70B-Instruct-Turbo-Free", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": null, + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "oBUtdGc-62bZhn-9801a2b11e77499b", + "choices": [ + { + "delta": { + "content": " Columbia", + "function_call": null, + "refusal": null, + "role": "assistant", + "tool_calls": null, + "token_id": 19326 + }, + "finish_reason": null, + "index": 0, + "logprobs": null, + "text": " Columbia", + "seed": null + } + ], + "created": 1758039042, + "model": "meta-llama/Llama-3.3-70B-Instruct-Turbo-Free", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": null, + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "oBUtdGc-62bZhn-9801a2b11e77499b", + "choices": [ + { + "delta": { + "content": ").", + "function_call": null, + "refusal": null, + "role": "assistant", + "tool_calls": null, + "token_id": 570 + }, + "finish_reason": null, + "index": 0, + "logprobs": null, + "text": ").", + "seed": null + } + ], + "created": 1758039042, + "model": "meta-llama/Llama-3.3-70B-Instruct-Turbo-Free", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": null, + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "oBUtdGc-62bZhn-9801a2b11e77499b", + "choices": [ + { + "delta": { + "content": "", + "function_call": null, + "refusal": null, + "role": "assistant", + "tool_calls": null, + "token_id": 128009 + }, + "finish_reason": "stop", + "index": 0, + "logprobs": null, + "text": "", + "seed": 10296991816860367000 + } + ], + "created": 1758039042, + "model": "meta-llama/Llama-3.3-70B-Instruct-Turbo-Free", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": null, + "usage": { + "completion_tokens": 20, + "prompt_tokens": 45, + "total_tokens": 65, + "completion_tokens_details": null, + "prompt_tokens_details": null, + "cached_tokens": 0 + } + } + } + ], + "is_streaming": true + } +} diff --git a/tests/integration/suites.py b/tests/integration/suites.py index 3779b8ba0..231480447 100644 --- a/tests/integration/suites.py +++ b/tests/integration/suites.py @@ -100,6 +100,14 @@ SETUP_DEFINITIONS: dict[str, Setup] = { "text_model": "tgi/Qwen/Qwen3-0.6B", }, ), + "together": Setup( + name="together", + description="Together computer models", + defaults={ + "text_model": "together/meta-llama/Llama-3.3-70B-Instruct-Turbo-Free", + "embedding_model": "together/togethercomputer/m2-bert-80M-32k-retrieval", + }, + ), } From ececc323d360891eafb15bd2f06039e13edbcbfd Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Tue, 16 Sep 2025 19:44:03 +0000 Subject: [PATCH 101/150] build: Bump version to 0.2.22 --- llama_stack/ui/package-lock.json | 8 ++++---- llama_stack/ui/package.json | 2 +- pyproject.toml | 6 +++--- uv.lock | 14 +++++++------- 4 files changed, 15 insertions(+), 15 deletions(-) diff --git a/llama_stack/ui/package-lock.json b/llama_stack/ui/package-lock.json index f333aa809..3f22716c6 100644 --- a/llama_stack/ui/package-lock.json +++ b/llama_stack/ui/package-lock.json @@ -18,7 +18,7 @@ "class-variance-authority": "^0.7.1", "clsx": "^2.1.1", "framer-motion": "^12.23.12", - "llama-stack-client": "^0.2.21", + "llama-stack-client": "^0.2.22", "lucide-react": "^0.542.0", "next": "15.5.3", "next-auth": "^4.24.11", @@ -10314,9 +10314,9 @@ "license": "MIT" }, "node_modules/llama-stack-client": { - "version": "0.2.21", - "resolved": "https://registry.npmjs.org/llama-stack-client/-/llama-stack-client-0.2.21.tgz", - "integrity": "sha512-rjU2Vx5xStxDYavU8K1An/SYXiQQjroLcK98B+p0Paz/a7OgRao2S0YwvThJjPUyChY4fO03UIXP9LpmHqlXWQ==", + "version": "0.2.22", + "resolved": "https://registry.npmjs.org/llama-stack-client/-/llama-stack-client-0.2.22.tgz", + "integrity": "sha512-7aW3UQj5MwjV73Brd+yQ1e4W1W33nhozyeHM5tzOgbsVZ88tL78JNiNvyFqDR5w6V9XO4/uSGGiQVG6v83yR4w==", "license": "MIT", "dependencies": { "@types/node": "^18.11.18", diff --git a/llama_stack/ui/package.json b/llama_stack/ui/package.json index ccbc2a4c2..2b0322b28 100644 --- a/llama_stack/ui/package.json +++ b/llama_stack/ui/package.json @@ -23,7 +23,7 @@ "class-variance-authority": "^0.7.1", "clsx": "^2.1.1", "framer-motion": "^12.23.12", - "llama-stack-client": "^0.2.21", + "llama-stack-client": "^0.2.22", "lucide-react": "^0.542.0", "next": "15.5.3", "next-auth": "^4.24.11", diff --git a/pyproject.toml b/pyproject.toml index 0950c0dc2..ecbd8991a 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -7,7 +7,7 @@ required-version = ">=0.7.0" [project] name = "llama_stack" -version = "0.2.21" +version = "0.2.22" authors = [{ name = "Meta Llama", email = "llama-oss@meta.com" }] description = "Llama Stack" readme = "README.md" @@ -31,7 +31,7 @@ dependencies = [ "huggingface-hub>=0.34.0,<1.0", "jinja2>=3.1.6", "jsonschema", - "llama-stack-client>=0.2.21", + "llama-stack-client>=0.2.22", "openai>=1.100.0", # for expires_after support "prompt-toolkit", "python-dotenv", @@ -55,7 +55,7 @@ dependencies = [ ui = [ "streamlit", "pandas", - "llama-stack-client>=0.2.21", + "llama-stack-client>=0.2.22", "streamlit-option-menu", ] diff --git a/uv.lock b/uv.lock index 14848d2d4..0833a9d77 100644 --- a/uv.lock +++ b/uv.lock @@ -1,5 +1,5 @@ version = 1 -revision = 2 +revision = 3 requires-python = ">=3.12" resolution-markers = [ "(python_full_version >= '3.13' and platform_machine != 'aarch64' and sys_platform == 'linux') or (python_full_version >= '3.13' and sys_platform != 'darwin' and sys_platform != 'linux')", @@ -1749,7 +1749,7 @@ wheels = [ [[package]] name = "llama-stack" -version = "0.2.21" +version = "0.2.22" source = { editable = "." } dependencies = [ { name = "aiohttp" }, @@ -1885,8 +1885,8 @@ requires-dist = [ { name = "huggingface-hub", specifier = ">=0.34.0,<1.0" }, { name = "jinja2", specifier = ">=3.1.6" }, { name = "jsonschema" }, - { name = "llama-stack-client", specifier = ">=0.2.21" }, - { name = "llama-stack-client", marker = "extra == 'ui'", specifier = ">=0.2.21" }, + { name = "llama-stack-client", specifier = ">=0.2.22" }, + { name = "llama-stack-client", marker = "extra == 'ui'", specifier = ">=0.2.22" }, { name = "openai", specifier = ">=1.100.0" }, { name = "opentelemetry-exporter-otlp-proto-http", specifier = ">=1.30.0" }, { name = "opentelemetry-sdk", specifier = ">=1.30.0" }, @@ -1993,7 +1993,7 @@ unit = [ [[package]] name = "llama-stack-client" -version = "0.2.21" +version = "0.2.22" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "anyio" }, @@ -2012,9 +2012,9 @@ dependencies = [ { name = "tqdm" }, { name = "typing-extensions" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/f1/d3/8c50561d167f1e9b601b8fffe852b44c1ff97aaa6db6cdedd611d9e02a65/llama_stack_client-0.2.21.tar.gz", hash = "sha256:bd931fdcadedec5ccdbaa3c54d0c17761af1c227711ad6150dc0dd33d7b66ce2", size = 318319, upload-time = "2025-09-08T22:26:57.668Z" } +sdist = { url = "https://files.pythonhosted.org/packages/60/80/4260816bfaaa889d515206c9df4906d08d405bf94c9b4d1be399b1923e46/llama_stack_client-0.2.22.tar.gz", hash = "sha256:9a0bc756b91ebd539858eeaf1f231c5e5c6900e1ea4fcced726c6717f3d27ca7", size = 318309, upload-time = "2025-09-16T19:43:33.212Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/02/77/dadc682046a2c7ad68be8d2d2afac7007bf4d22efb0d3929d85ab9706ffe/llama_stack_client-0.2.21-py3-none-any.whl", hash = "sha256:adba82fdf18ab3b8ac218cedba4927bd5d26c23c2318e75c8763a44bb6b40693", size = 369902, upload-time = "2025-09-08T22:26:56.308Z" }, + { url = "https://files.pythonhosted.org/packages/d1/8e/1ebf6ac0dbb62b81038e856ed00768e283d927b14fcd614e3018a227092b/llama_stack_client-0.2.22-py3-none-any.whl", hash = "sha256:b260d73aec56fcfd8fa601b3b34c2f83c4fbcfb7261a246b02bbdf6c2da184fe", size = 369901, upload-time = "2025-09-16T19:43:32.089Z" }, ] [[package]] From e0e2b1bd0e683d6457af55bb65809423bb65b37b Mon Sep 17 00:00:00 2001 From: Omar Abdelwahab Date: Tue, 16 Sep 2025 19:09:06 -0700 Subject: [PATCH 102/150] fix: Added a bug fix when registering new models (#3453) # What does this PR do? Modified the code in registry.py. The key changes are: 1. Removed the `return False` statement 2. Added a warning log message that includes the object type, identifier, and provider_id for better debugging. 3. The method now continues with the registration process instead of early returning. --------- Co-authored-by: Omar Abdelwahab --- llama_stack/core/store/registry.py | 8 +++++--- tests/unit/registry/test_registry.py | 13 +++++++++---- 2 files changed, 14 insertions(+), 7 deletions(-) diff --git a/llama_stack/core/store/registry.py b/llama_stack/core/store/registry.py index 5f4abe9aa..a764d692a 100644 --- a/llama_stack/core/store/registry.py +++ b/llama_stack/core/store/registry.py @@ -96,9 +96,11 @@ class DiskDistributionRegistry(DistributionRegistry): async def register(self, obj: RoutableObjectWithProvider) -> bool: existing_obj = await self.get(obj.type, obj.identifier) - # dont register if the object's providerid already exists - if existing_obj and existing_obj.provider_id == obj.provider_id: - return False + # warn if the object's providerid is different but proceed with registration + if existing_obj and existing_obj.provider_id != obj.provider_id: + logger.warning( + f"Object {existing_obj.type}:{existing_obj.identifier}'s {existing_obj.provider_id} provider is being replaced with {obj.provider_id}" + ) await self.kvstore.set( KEY_FORMAT.format(type=obj.type, identifier=obj.identifier), diff --git a/tests/unit/registry/test_registry.py b/tests/unit/registry/test_registry.py index 4ea4a20b9..9873bec5b 100644 --- a/tests/unit/registry/test_registry.py +++ b/tests/unit/registry/test_registry.py @@ -129,7 +129,7 @@ async def test_duplicate_provider_registration(cached_disk_dist_registry): result = await cached_disk_dist_registry.get("vector_db", "test_vector_db_2") assert result is not None - assert result.embedding_model == original_vector_db.embedding_model # Original values preserved + assert result.embedding_model == duplicate_vector_db.embedding_model # Original values preserved async def test_get_all_objects(cached_disk_dist_registry): @@ -174,10 +174,14 @@ async def test_parse_registry_values_error_handling(sqlite_kvstore): ) await sqlite_kvstore.set( - KEY_FORMAT.format(type="vector_db", identifier="valid_vector_db"), valid_db.model_dump_json() + KEY_FORMAT.format(type="vector_db", identifier="valid_vector_db"), + valid_db.model_dump_json(), ) - await sqlite_kvstore.set(KEY_FORMAT.format(type="vector_db", identifier="corrupted_json"), "{not valid json") + await sqlite_kvstore.set( + KEY_FORMAT.format(type="vector_db", identifier="corrupted_json"), + "{not valid json", + ) await sqlite_kvstore.set( KEY_FORMAT.format(type="vector_db", identifier="missing_fields"), @@ -212,7 +216,8 @@ async def test_cached_registry_error_handling(sqlite_kvstore): ) await sqlite_kvstore.set( - KEY_FORMAT.format(type="vector_db", identifier="valid_cached_db"), valid_db.model_dump_json() + KEY_FORMAT.format(type="vector_db", identifier="valid_cached_db"), + valid_db.model_dump_json(), ) await sqlite_kvstore.set( From fad48435484a82fae7f4c7686db3104523a37889 Mon Sep 17 00:00:00 2001 From: Derek Higgins Date: Wed, 17 Sep 2025 09:18:43 +0100 Subject: [PATCH 103/150] fix: unbound variable PR_HEAD_REPO (#3469) Add default value for PR_HEAD_REPO to prevent 'unbound variable' error when no PR exists for a branch. Signed-off-by: Derek Higgins --- scripts/github/schedule-record-workflow.sh | 1 + 1 file changed, 1 insertion(+) diff --git a/scripts/github/schedule-record-workflow.sh b/scripts/github/schedule-record-workflow.sh index 44b0947b6..afe664f80 100755 --- a/scripts/github/schedule-record-workflow.sh +++ b/scripts/github/schedule-record-workflow.sh @@ -13,6 +13,7 @@ set -euo pipefail # Default values BRANCH="" +PR_HEAD_REPO="" TEST_SUBDIRS="" TEST_SETUP="ollama" TEST_SUITE="base" From 9acf49753e58d611195c03af44fb42d8ebf5c13b Mon Sep 17 00:00:00 2001 From: Francisco Arceo Date: Wed, 17 Sep 2025 02:24:58 -0600 Subject: [PATCH 104/150] fix: Fixing prompts import warning (#3455) # What does this PR do? Fixes this warning in llama stack build: ```bash WARNING 2025-09-15 15:29:02,197 llama_stack.core.distribution:149 core: Failed to import module prompts: No module named 'llama_stack.providers.registry.prompts'" ``` ## Test Plan Test added --------- Signed-off-by: Francisco Javier Arceo --- llama_stack/core/distribution.py | 5 ++++- tests/unit/distribution/test_distribution.py | 20 +++++++++++++++++++- 2 files changed, 23 insertions(+), 2 deletions(-) diff --git a/llama_stack/core/distribution.py b/llama_stack/core/distribution.py index 977eb5393..c104b6764 100644 --- a/llama_stack/core/distribution.py +++ b/llama_stack/core/distribution.py @@ -26,6 +26,9 @@ from llama_stack.providers.datatypes import ( logger = get_logger(name=__name__, category="core") +INTERNAL_APIS = {Api.inspect, Api.providers, Api.prompts} + + def stack_apis() -> list[Api]: return list(Api) @@ -70,7 +73,7 @@ def builtin_automatically_routed_apis() -> list[AutoRoutedApiInfo]: def providable_apis() -> list[Api]: routing_table_apis = {x.routing_table_api for x in builtin_automatically_routed_apis()} - return [api for api in Api if api not in routing_table_apis and api != Api.inspect and api != Api.providers] + return [api for api in Api if api not in routing_table_apis and api not in INTERNAL_APIS] def _load_remote_provider_spec(spec_data: dict[str, Any], api: Api) -> ProviderSpec: diff --git a/tests/unit/distribution/test_distribution.py b/tests/unit/distribution/test_distribution.py index c72106e46..c6c2eb2c7 100644 --- a/tests/unit/distribution/test_distribution.py +++ b/tests/unit/distribution/test_distribution.py @@ -12,7 +12,7 @@ import yaml from pydantic import BaseModel, Field, ValidationError from llama_stack.core.datatypes import Api, Provider, StackRunConfig -from llama_stack.core.distribution import get_provider_registry +from llama_stack.core.distribution import INTERNAL_APIS, get_provider_registry, providable_apis from llama_stack.providers.datatypes import ProviderSpec @@ -152,6 +152,24 @@ class TestProviderRegistry: assert registry[Api.inference]["test_provider"].provider_type == "test_provider" assert registry[Api.inference]["test_provider"].api == Api.inference + def test_internal_apis_excluded(self): + """Test that internal APIs are excluded and APIs without provider registries are marked as internal.""" + import importlib + + apis = providable_apis() + + for internal_api in INTERNAL_APIS: + assert internal_api not in apis, f"Internal API {internal_api} should not be in providable_apis" + + for api in apis: + module_name = f"llama_stack.providers.registry.{api.name.lower()}" + try: + importlib.import_module(module_name) + except ImportError as err: + raise AssertionError( + f"API {api} is in providable_apis but has no provider registry module ({module_name})" + ) from err + def test_external_remote_providers(self, api_directories, mock_providers, base_config, provider_spec_yaml): """Test loading external remote providers from YAML files.""" remote_dir, _ = api_directories From 9fe8097ca43378f3d40c2841f95190c8e7affc29 Mon Sep 17 00:00:00 2001 From: Alexey Rybak <50731695+reluctantfuturist@users.noreply.github.com> Date: Wed, 17 Sep 2025 10:37:35 -0700 Subject: [PATCH 105/150] docs: update documentation links (#3459) # What does this PR do? * Updates documentation links from readthedocs to llamastack.github.io ## Test Plan * Manual testing --- .github/ISSUE_TEMPLATE/config.yml | 4 +- CONTRIBUTING.md | 4 +- README.md | 22 +- docs/README.md | 2 +- docs/getting_started.ipynb | 49 +- docs/getting_started_llama4.ipynb | 22 +- docs/getting_started_llama_api.ipynb | 1812 ++++++++--------- .../Alpha_Llama_Stack_Post_Training.ipynb | 4 +- .../Llama_Stack_Benchmark_Evals.ipynb | 2 +- docs/quick_start.ipynb | 16 +- docs/zero_to_hero_guide/00_Inference101.ipynb | 2 +- .../01_Local_Cloud_Inference101.ipynb | 2 +- .../02_Prompt_Engineering101.ipynb | 2 +- .../zero_to_hero_guide/03_Image_Chat101.ipynb | 2 +- docs/zero_to_hero_guide/05_Memory101.ipynb | 4 +- docs/zero_to_hero_guide/06_Safety101.ipynb | 2 +- docs/zero_to_hero_guide/07_Agents101.ipynb | 2 +- docs/zero_to_hero_guide/README.md | 23 +- llama_stack/core/start_stack.sh | 2 +- llama_stack/core/ui/README.md | 2 +- scripts/install.sh | 10 +- 21 files changed, 997 insertions(+), 993 deletions(-) diff --git a/.github/ISSUE_TEMPLATE/config.yml b/.github/ISSUE_TEMPLATE/config.yml index fec273756..fc9514dc7 100644 --- a/.github/ISSUE_TEMPLATE/config.yml +++ b/.github/ISSUE_TEMPLATE/config.yml @@ -2,10 +2,10 @@ blank_issues_enabled: false contact_links: - name: Have you read the docs? - url: https://llama-stack.readthedocs.io/en/latest/index.html + url: https://llamastack.github.io/latest/providers/external/index.html about: Much help can be found in the docs - name: Start a discussion - url: https://github.com/meta-llama/llama-stack/discussions/new + url: https://github.com/llamastack/llama-stack/discussions/new/ about: Start a discussion on a topic - name: Chat on Discord url: https://discord.gg/llama-stack diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index c81e9e7b1..14690924d 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -187,7 +187,7 @@ Note that the provider "description" field will be used to generate the provider ### Building the Documentation -If you are making changes to the documentation at [https://llama-stack.readthedocs.io/en/latest/](https://llama-stack.readthedocs.io/en/latest/), you can use the following command to build the documentation and preview your changes. You will need [Sphinx](https://www.sphinx-doc.org/en/master/) and the readthedocs theme. +If you are making changes to the documentation at [https://llamastack.github.io/latest/](https://llamastack.github.io/latest/), you can use the following command to build the documentation and preview your changes. You will need [Sphinx](https://www.sphinx-doc.org/en/master/) and the readthedocs theme. ```bash # This rebuilds the documentation pages. @@ -205,4 +205,4 @@ If you modify or add new API endpoints, update the API documentation accordingly uv run ./docs/openapi_generator/run_openapi_generator.sh ``` -The generated API documentation will be available in `docs/_static/`. Make sure to review the changes before committing. \ No newline at end of file +The generated API documentation will be available in `docs/_static/`. Make sure to review the changes before committing. diff --git a/README.md b/README.md index 4df4a5372..d6c5b4138 100644 --- a/README.md +++ b/README.md @@ -7,7 +7,7 @@ [![Unit Tests](https://github.com/meta-llama/llama-stack/actions/workflows/unit-tests.yml/badge.svg?branch=main)](https://github.com/meta-llama/llama-stack/actions/workflows/unit-tests.yml?query=branch%3Amain) [![Integration Tests](https://github.com/meta-llama/llama-stack/actions/workflows/integration-tests.yml/badge.svg?branch=main)](https://github.com/meta-llama/llama-stack/actions/workflows/integration-tests.yml?query=branch%3Amain) -[**Quick Start**](https://llama-stack.readthedocs.io/en/latest/getting_started/index.html) | [**Documentation**](https://llama-stack.readthedocs.io/en/latest/index.html) | [**Colab Notebook**](./docs/getting_started.ipynb) | [**Discord**](https://discord.gg/llama-stack) +[**Quick Start**](https://llamastack.github.io/latest/getting_started/index.html) | [**Documentation**](https://llamastack.github.io/latest/index.html) | [**Colab Notebook**](./docs/getting_started.ipynb) | [**Discord**](https://discord.gg/llama-stack) ### ✨🎉 Llama 4 Support 🎉✨ @@ -109,7 +109,7 @@ By reducing friction and complexity, Llama Stack empowers developers to focus on ### API Providers Here is a list of the various API providers and available distributions that can help developers get started easily with Llama Stack. -Please checkout for [full list](https://llama-stack.readthedocs.io/en/latest/providers/index.html) +Please checkout for [full list](https://llamastack.github.io/latest/providers/index.html) | API Provider Builder | Environments | Agents | Inference | VectorIO | Safety | Telemetry | Post Training | Eval | DatasetIO | |:--------------------:|:------------:|:------:|:---------:|:--------:|:------:|:---------:|:-------------:|:----:|:--------:| @@ -140,7 +140,7 @@ Please checkout for [full list](https://llama-stack.readthedocs.io/en/latest/pro | NVIDIA NEMO | Hosted | | ✅ | ✅ | | | ✅ | ✅ | ✅ | | NVIDIA | Hosted | | | | | | ✅ | ✅ | ✅ | -> **Note**: Additional providers are available through external packages. See [External Providers](https://llama-stack.readthedocs.io/en/latest/providers/external.html) documentation. +> **Note**: Additional providers are available through external packages. See [External Providers](https://llamastack.github.io/latest/providers/external/index.html) documentation. ### Distributions @@ -149,24 +149,24 @@ Here are some of the distributions we support: | **Distribution** | **Llama Stack Docker** | Start This Distribution | |:---------------------------------------------:|:-------------------------------------------------------------------------------------------------------------------------------------------------------------:|:------------------------------------------------------------------------------------------------------------------------:| -| Starter Distribution | [llamastack/distribution-starter](https://hub.docker.com/repository/docker/llamastack/distribution-starter/general) | [Guide](https://llama-stack.readthedocs.io/en/latest/distributions/self_hosted_distro/starter.html) | -| Meta Reference | [llamastack/distribution-meta-reference-gpu](https://hub.docker.com/repository/docker/llamastack/distribution-meta-reference-gpu/general) | [Guide](https://llama-stack.readthedocs.io/en/latest/distributions/self_hosted_distro/meta-reference-gpu.html) | +| Starter Distribution | [llamastack/distribution-starter](https://hub.docker.com/repository/docker/llamastack/distribution-starter/general) | [Guide](https://llamastack.github.io/latest/distributions/self_hosted_distro/starter.html) | +| Meta Reference | [llamastack/distribution-meta-reference-gpu](https://hub.docker.com/repository/docker/llamastack/distribution-meta-reference-gpu/general) | [Guide](https://llamastack.github.io/latest/distributions/self_hosted_distro/meta-reference-gpu.html) | | PostgreSQL | [llamastack/distribution-postgres-demo](https://hub.docker.com/repository/docker/llamastack/distribution-postgres-demo/general) | | ### Documentation -Please checkout our [Documentation](https://llama-stack.readthedocs.io/en/latest/index.html) page for more details. +Please checkout our [Documentation](https://llamastack.github.io/latest/index.html) page for more details. * CLI references - * [llama (server-side) CLI Reference](https://llama-stack.readthedocs.io/en/latest/references/llama_cli_reference/index.html): Guide for using the `llama` CLI to work with Llama models (download, study prompts), and building/starting a Llama Stack distribution. - * [llama (client-side) CLI Reference](https://llama-stack.readthedocs.io/en/latest/references/llama_stack_client_cli_reference.html): Guide for using the `llama-stack-client` CLI, which allows you to query information about the distribution. + * [llama (server-side) CLI Reference](https://llamastack.github.io/latest/references/llama_cli_reference/index.html): Guide for using the `llama` CLI to work with Llama models (download, study prompts), and building/starting a Llama Stack distribution. + * [llama (client-side) CLI Reference](https://llamastack.github.io/latest/references/llama_stack_client_cli_reference.html): Guide for using the `llama-stack-client` CLI, which allows you to query information about the distribution. * Getting Started - * [Quick guide to start a Llama Stack server](https://llama-stack.readthedocs.io/en/latest/getting_started/index.html). + * [Quick guide to start a Llama Stack server](https://llamastack.github.io/latest/getting_started/index.html). * [Jupyter notebook](./docs/getting_started.ipynb) to walk-through how to use simple text and vision inference llama_stack_client APIs * The complete Llama Stack lesson [Colab notebook](https://colab.research.google.com/drive/1dtVmxotBsI4cGZQNsJRYPrLiDeT0Wnwt) of the new [Llama 3.2 course on Deeplearning.ai](https://learn.deeplearning.ai/courses/introducing-multimodal-llama-3-2/lesson/8/llama-stack). * A [Zero-to-Hero Guide](https://github.com/meta-llama/llama-stack/tree/main/docs/zero_to_hero_guide) that guide you through all the key components of llama stack with code samples. * [Contributing](CONTRIBUTING.md) - * [Adding a new API Provider](https://llama-stack.readthedocs.io/en/latest/contributing/new_api_provider.html) to walk-through how to add a new API provider. + * [Adding a new API Provider](https://llamastack.github.io/latest/contributing/new_api_provider.html) to walk-through how to add a new API provider. ### Llama Stack Client SDKs @@ -193,4 +193,4 @@ Thanks to all of our amazing contributors! - \ No newline at end of file + diff --git a/docs/README.md b/docs/README.md index c238c4720..2e03dd80b 100644 --- a/docs/README.md +++ b/docs/README.md @@ -1,6 +1,6 @@ # Llama Stack Documentation -Here's a collection of comprehensive guides, examples, and resources for building AI applications with Llama Stack. For the complete documentation, visit our [ReadTheDocs page](https://llama-stack.readthedocs.io/en/latest/index.html). +Here's a collection of comprehensive guides, examples, and resources for building AI applications with Llama Stack. For the complete documentation, visit our [Github page](https://llamastack.github.io/latest/getting_started/index.html). ## Render locally diff --git a/docs/getting_started.ipynb b/docs/getting_started.ipynb index eeebf12d9..4697acf2e 100644 --- a/docs/getting_started.ipynb +++ b/docs/getting_started.ipynb @@ -11,11 +11,11 @@ "\n", "# Llama Stack - Building AI Applications\n", "\n", - "\"drawing\"\n", + "\"drawing\"\n", "\n", "[Llama Stack](https://github.com/meta-llama/llama-stack) defines and standardizes the set of core building blocks needed to bring generative AI applications to market. These building blocks are presented in the form of interoperable APIs with a broad set of Service Providers providing their implementations.\n", "\n", - "Read more about the project here: https://llama-stack.readthedocs.io/en/latest/index.html\n", + "Read more about the project here: https://llamastack.github.io/latest/getting_started/index.html\n", "\n", "In this guide, we will showcase how you can build LLM-powered agentic applications using Llama Stack.\n", "\n", @@ -75,7 +75,7 @@ }, { "cell_type": "code", - "execution_count": 1, + "execution_count": null, "id": "J2kGed0R5PSf", "metadata": { "colab": { @@ -113,17 +113,17 @@ } ], "source": [ - "import os \n", + "import os\n", "import subprocess\n", "import time\n", "\n", - "!pip install uv \n", + "!pip install uv\n", "\n", "if \"UV_SYSTEM_PYTHON\" in os.environ:\n", " del os.environ[\"UV_SYSTEM_PYTHON\"]\n", "\n", "# this command installs all the dependencies needed for the llama stack server with the together inference provider\n", - "!uv run --with llama-stack llama stack build --distro together --image-type venv \n", + "!uv run --with llama-stack llama stack build --distro together --image-type venv\n", "\n", "def run_llama_stack_server_background():\n", " log_file = open(\"llama_stack_server.log\", \"w\")\n", @@ -134,7 +134,7 @@ " stderr=log_file,\n", " text=True\n", " )\n", - " \n", + "\n", " print(f\"Starting Llama Stack server with PID: {process.pid}\")\n", " return process\n", "\n", @@ -142,11 +142,11 @@ " import requests\n", " from requests.exceptions import ConnectionError\n", " import time\n", - " \n", + "\n", " url = \"http://0.0.0.0:8321/v1/health\"\n", " max_retries = 30\n", " retry_interval = 1\n", - " \n", + "\n", " print(\"Waiting for server to start\", end=\"\")\n", " for _ in range(max_retries):\n", " try:\n", @@ -157,12 +157,12 @@ " except ConnectionError:\n", " print(\".\", end=\"\", flush=True)\n", " time.sleep(retry_interval)\n", - " \n", + "\n", " print(\"\\nServer failed to start after\", max_retries * retry_interval, \"seconds\")\n", " return False\n", "\n", "\n", - "# use this helper if needed to kill the server \n", + "# use this helper if needed to kill the server\n", "def kill_llama_stack_server():\n", " # Kill any existing llama stack server processes\n", " os.system(\"ps aux | grep -v grep | grep llama_stack.core.server.server | awk '{print $2}' | xargs kill -9\")\n" @@ -242,7 +242,7 @@ }, { "cell_type": "code", - "execution_count": 4, + "execution_count": null, "id": "E1UFuJC570Tk", "metadata": { "colab": { @@ -407,9 +407,9 @@ "from llama_stack_client import LlamaStackClient\n", "\n", "client = LlamaStackClient(\n", - " base_url=\"http://0.0.0.0:8321\", \n", + " base_url=\"http://0.0.0.0:8321\",\n", " provider_data = {\n", - " \"tavily_search_api_key\": os.environ['TAVILY_SEARCH_API_KEY'], \n", + " \"tavily_search_api_key\": os.environ['TAVILY_SEARCH_API_KEY'],\n", " \"together_api_key\": os.environ['TOGETHER_API_KEY']\n", " }\n", ")" @@ -1177,7 +1177,7 @@ }, { "cell_type": "code", - "execution_count": 13, + "execution_count": null, "id": "WS8Gu5b0APHs", "metadata": { "colab": { @@ -1207,7 +1207,7 @@ "from termcolor import cprint\n", "\n", "agent = Agent(\n", - " client, \n", + " client,\n", " model=\"meta-llama/Llama-3.3-70B-Instruct\",\n", " instructions=\"You are a helpful assistant. Use websearch tool to help answer questions.\",\n", " tools=[\"builtin::websearch\"],\n", @@ -1249,7 +1249,7 @@ }, { "cell_type": "code", - "execution_count": 14, + "execution_count": null, "id": "GvLWltzZCNkg", "metadata": { "colab": { @@ -1367,7 +1367,7 @@ " chunk_size_in_tokens=512,\n", ")\n", "rag_agent = Agent(\n", - " client, \n", + " client,\n", " model=model_id,\n", " instructions=\"You are a helpful assistant\",\n", " tools = [\n", @@ -2154,7 +2154,7 @@ }, { "cell_type": "code", - "execution_count": 21, + "execution_count": null, "id": "vttLbj_YO01f", "metadata": { "colab": { @@ -2217,7 +2217,7 @@ "from termcolor import cprint\n", "\n", "agent = Agent(\n", - " client, \n", + " client,\n", " model=model_id,\n", " instructions=\"You are a helpful assistant\",\n", " tools=[\"mcp::filesystem\"],\n", @@ -2283,7 +2283,7 @@ }, { "cell_type": "code", - "execution_count": 22, + "execution_count": null, "id": "4iCO59kP20Zs", "metadata": { "colab": { @@ -2317,7 +2317,7 @@ "from llama_stack_client import Agent, AgentEventLogger\n", "\n", "agent = Agent(\n", - " client, \n", + " client,\n", " model=\"meta-llama/Llama-3.3-70B-Instruct\",\n", " instructions=\"You are a helpful assistant. Use web_search tool to answer the questions.\",\n", " tools=[\"builtin::websearch\"],\n", @@ -2846,7 +2846,7 @@ }, { "cell_type": "code", - "execution_count": 29, + "execution_count": null, "id": "44e05e16", "metadata": {}, "outputs": [ @@ -2880,8 +2880,7 @@ "!curl -O https://raw.githubusercontent.com/meta-llama/llama-models/refs/heads/main/Llama_Repo.jpeg\n", "\n", "from IPython.display import Image\n", - "Image(\"Llama_Repo.jpeg\", width=256, height=256)\n", - "\n" + "Image(\"Llama_Repo.jpeg\", width=256, height=256)\n" ] }, { diff --git a/docs/getting_started_llama4.ipynb b/docs/getting_started_llama4.ipynb index 1913330fe..648f4bbef 100644 --- a/docs/getting_started_llama4.ipynb +++ b/docs/getting_started_llama4.ipynb @@ -11,11 +11,11 @@ "\n", "# Getting Started with Llama 4 in Llama Stack\n", "\n", - "\"drawing\"\n", + "\"drawing\"\n", "\n", "[Llama Stack](https://github.com/meta-llama/llama-stack) defines and standardizes the set of core building blocks needed to bring generative AI applications to market. These building blocks are presented in the form of interoperable APIs with a broad set of Service Providers providing their implementations.\n", "\n", - "Read more about the project here: https://llama-stack.readthedocs.io/en/latest/index.html\n", + "Read more about the project here: https://llamastack.github.io/latest/index.html\n", "\n", "In this guide, we will showcase how you can get started with using Llama 4 in Llama Stack.\n", "\n", @@ -51,7 +51,7 @@ "metadata": {}, "outputs": [], "source": [ - "!pip install uv \n", + "!pip install uv\n", "\n", "MODEL=\"Llama-4-Scout-17B-16E-Instruct\"\n", "# get meta url from llama.com\n", @@ -223,7 +223,7 @@ } ], "source": [ - "import os \n", + "import os\n", "import subprocess\n", "import time\n", "\n", @@ -232,8 +232,8 @@ "if \"UV_SYSTEM_PYTHON\" in os.environ:\n", " del os.environ[\"UV_SYSTEM_PYTHON\"]\n", "\n", - "# this command installs all the dependencies needed for the llama stack server \n", - "!uv run --with llama-stack llama stack build --distro meta-reference-gpu --image-type venv \n", + "# this command installs all the dependencies needed for the llama stack server\n", + "!uv run --with llama-stack llama stack build --distro meta-reference-gpu --image-type venv\n", "\n", "def run_llama_stack_server_background():\n", " log_file = open(\"llama_stack_server.log\", \"w\")\n", @@ -244,7 +244,7 @@ " stderr=log_file,\n", " text=True\n", " )\n", - " \n", + "\n", " print(f\"Starting Llama Stack server with PID: {process.pid}\")\n", " return process\n", "\n", @@ -252,11 +252,11 @@ " import requests\n", " from requests.exceptions import ConnectionError\n", " import time\n", - " \n", + "\n", " url = \"http://0.0.0.0:8321/v1/health\"\n", " max_retries = 30\n", " retry_interval = 1\n", - " \n", + "\n", " print(\"Waiting for server to start\", end=\"\")\n", " for _ in range(max_retries):\n", " try:\n", @@ -267,12 +267,12 @@ " except ConnectionError:\n", " print(\".\", end=\"\", flush=True)\n", " time.sleep(retry_interval)\n", - " \n", + "\n", " print(\"\\nServer failed to start after\", max_retries * retry_interval, \"seconds\")\n", " return False\n", "\n", "\n", - "# use this helper if needed to kill the server \n", + "# use this helper if needed to kill the server\n", "def kill_llama_stack_server():\n", " # Kill any existing llama stack server processes\n", " os.system(\"ps aux | grep -v grep | grep llama_stack.core.server.server | awk '{print $2}' | xargs kill -9\")\n" diff --git a/docs/getting_started_llama_api.ipynb b/docs/getting_started_llama_api.ipynb index 5a4283117..f6a170980 100644 --- a/docs/getting_started_llama_api.ipynb +++ b/docs/getting_started_llama_api.ipynb @@ -1,909 +1,909 @@ { - "cells": [ - { - "cell_type": "markdown", - "id": "c1e7571c", - "metadata": { - "id": "c1e7571c" - }, - "source": [ - "[![Open In Colab](https://colab.research.google.com/assets/colab-badge.svg)](https://colab.research.google.com/github/meta-llama/llama-stack/blob/main/docs/getting_started.ipynb)\n", - "\n", - "# Getting Started with Llama 4 in Llama Stack\n", - "\n", - "\"drawing\"\n", - "\n", - "[Llama Stack](https://github.com/meta-llama/llama-stack) defines and standardizes the set of core building blocks needed to bring generative AI applications to market. These building blocks are presented in the form of interoperable APIs with a broad set of Service Providers providing their implementations.\n", - "\n", - "Read more about the project here: https://llama-stack.readthedocs.io/en/latest/index.html\n", - "\n", - "In this guide, we will showcase how you can get started with using Llama 4 in Llama Stack.\n", - "\n", - "**💡 Quick Start Option:** If you want a simpler and faster way to test out Llama Stack, check out the [quick_start.ipynb](quick_start.ipynb) notebook instead. It provides a streamlined experience for getting up and running in just a few steps.\n" - ] + "cells": [ + { + "cell_type": "markdown", + "id": "c1e7571c", + "metadata": { + "id": "c1e7571c" }, - { - "cell_type": "markdown", - "id": "4CV1Q19BDMVw", - "metadata": { - "id": "4CV1Q19BDMVw" - }, - "source": [ - "## 1. Getting started with Llama Stack" - ] - }, - { - "cell_type": "markdown", - "id": "K4AvfUAJZOeS", - "metadata": { - "id": "K4AvfUAJZOeS" - }, - "source": [ - "### 1.1. Create Llama API account\n", - "\n", - "In this showcase, we will use [Llama API](https://llama.developer.meta.com/) as the inference provider. So, you would first get an API key from Llama API if you don't have one already.\n", - "\n", - "\n", - "\n", - "> **Note:** Set the API Key in the Secrets of this notebook\n", - "\n" - ] - }, - { - "cell_type": "markdown", - "id": "oDUB7M_qe-Gs", - "metadata": { - "id": "oDUB7M_qe-Gs" - }, - "source": [ - "### 1.2. Setup and Running a Llama Stack server\n", - "\n", - "Llama Stack is architected as a collection of APIs that provide developers with the building blocks to build AI applications. \n", - "\n", - "Llama stack is typically available as a server with an endpoint that you can make calls to. Partners like Together and Fireworks offer their own Llama Stack compatible endpoints.\n", - "\n", - "In this showcase, we will start a Llama Stack server that is running locally.\n" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "J2kGed0R5PSf", - "metadata": { - "colab": { - "base_uri": "https://localhost:8080/" - }, - "collapsed": true, - "id": "J2kGed0R5PSf", - "outputId": "2478ea60-8d35-48a1-b011-f233831740c5" - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Requirement already satisfied: uv in /opt/homebrew/Caskroom/miniconda/base/envs/l4/lib/python3.10/site-packages (0.6.12)\n", - "\u001b[2mUsing Python 3.10.16 environment at: /opt/homebrew/Caskroom/miniconda/base/envs/l4\u001b[0m\n", - "\u001b[2mAudited \u001b[1m1 package\u001b[0m \u001b[2min 83ms\u001b[0m\u001b[0m\n", - "Environment '/Users/erichuang/projects/internal-llama-stack/.venv' already exists, re-using it.\n", - "Virtual environment /Users/erichuang/projects/internal-llama-stack/.venv is already active\n", - "\u001b[2mUsing Python 3.11.11 environment at: /Users/erichuang/projects/internal-llama-stack/.venv\u001b[0m\n", - "\u001b[2mAudited \u001b[1m1 package\u001b[0m \u001b[2min 387ms\u001b[0m\u001b[0m\n", - "Installing pip dependencies\n", - "\u001b[2mUsing Python 3.11.11 environment at: /Users/erichuang/projects/internal-llama-stack/.venv\u001b[0m\n", - "\u001b[2K\u001b[2mResolved \u001b[1m123 packages\u001b[0m \u001b[2min 1.13s\u001b[0m\u001b[0m \u001b[0m\n", - "\u001b[2K\u001b[37m⠙\u001b[0m \u001b[2mPreparing packages...\u001b[0m (0/6) \n", - "\u001b[2K\u001b[1A\u001b[37m⠙\u001b[0m \u001b[2mPreparing packages...\u001b[0m (0/6)-----\u001b[0m\u001b[0m 0 B/9.53 KiB \u001b[1A\n", - "\u001b[2K\u001b[1A\u001b[37m⠙\u001b[0m \u001b[2mPreparing packages...\u001b[0m (0/6)-\u001b[2m\u001b[0m\u001b[0m 9.53 KiB/9.53 KiB \u001b[1A\n", - "\u001b[2mshellingham\u001b[0m \u001b[32m------------------------------\u001b[2m\u001b[0m\u001b[0m 9.53 KiB/9.53 KiB\n", - "\u001b[2K\u001b[2A\u001b[37m⠙\u001b[0m \u001b[2mPreparing packages...\u001b[0m (0/6)----\u001b[0m\u001b[0m 0 B/44.00 KiB \u001b[2A\n", - "\u001b[2mshellingham\u001b[0m \u001b[32m------------------------------\u001b[2m\u001b[0m\u001b[0m 9.53 KiB/9.53 KiB\n", - "\u001b[2K\u001b[2A\u001b[37m⠙\u001b[0m \u001b[2mPreparing packages...\u001b[0m (0/6)----\u001b[0m\u001b[0m 14.88 KiB/44.00 KiB \u001b[2A\n", - "\u001b[2mshellingham\u001b[0m \u001b[32m------------------------------\u001b[2m\u001b[0m\u001b[0m 9.53 KiB/9.53 KiB\n", - "\u001b[2mtabulate \u001b[0m \u001b[32m\u001b[2m------------------------------\u001b[0m\u001b[0m 0 B/34.43 KiB\n", - "\u001b[2K\u001b[3A\u001b[37m⠙\u001b[0m \u001b[2mPreparing packages...\u001b[0m (0/6)----\u001b[0m\u001b[0m 14.88 KiB/44.00 KiB \u001b[3A\n", - "\u001b[2mshellingham\u001b[0m \u001b[32m------------------------------\u001b[2m\u001b[0m\u001b[0m 9.53 KiB/9.53 KiB\n", - "\u001b[2mtabulate \u001b[0m \u001b[32m-------------\u001b[2m-----------------\u001b[0m\u001b[0m 14.83 KiB/34.43 KiB\n", - "\u001b[2K\u001b[3A\u001b[37m⠙\u001b[0m \u001b[2mPreparing packages...\u001b[0m (0/6)----\u001b[0m\u001b[0m 14.88 KiB/44.00 KiB \u001b[3A\n", - "\u001b[2meval-type-backport\u001b[0m \u001b[32m\u001b[2m------------------------------\u001b[0m\u001b[0m 0 B/5.69 KiB\n", - "\u001b[2mshellingham\u001b[0m \u001b[32m------------------------------\u001b[2m\u001b[0m\u001b[0m 9.53 KiB/9.53 KiB\n", - "\u001b[2mtabulate \u001b[0m \u001b[32m-------------\u001b[2m-----------------\u001b[0m\u001b[0m 14.83 KiB/34.43 KiB\n", - "\u001b[2K\u001b[4A\u001b[37m⠙\u001b[0m \u001b[2mPreparing packages...\u001b[0m (0/6)----\u001b[0m\u001b[0m 14.88 KiB/44.00 KiB \u001b[4A\n", - "\u001b[2meval-type-backport\u001b[0m \u001b[32m------------------------------\u001b[2m\u001b[0m\u001b[0m 5.69 KiB/5.69 KiB\n", - "\u001b[2mshellingham\u001b[0m \u001b[32m------------------------------\u001b[2m\u001b[0m\u001b[0m 9.53 KiB/9.53 KiB\n", - "\u001b[2mtabulate \u001b[0m \u001b[32m-------------\u001b[2m-----------------\u001b[0m\u001b[0m 14.83 KiB/34.43 KiB\n", - "\u001b[2K\u001b[4A\u001b[37m⠙\u001b[0m \u001b[2mPreparing packages...\u001b[0m (0/6)----\u001b[0m\u001b[0m 14.88 KiB/44.00 KiB \u001b[4A\n", - "\u001b[2meval-type-backport\u001b[0m \u001b[32m------------------------------\u001b[2m\u001b[0m\u001b[0m 5.69 KiB/5.69 KiB\n", - "\u001b[2mshellingham\u001b[0m \u001b[32m------------------------------\u001b[2m\u001b[0m\u001b[0m 9.53 KiB/9.53 KiB\n", - "\u001b[2mtabulate \u001b[0m \u001b[32m-------------\u001b[2m-----------------\u001b[0m\u001b[0m 14.83 KiB/34.43 KiB\n", - "\u001b[2mtyper \u001b[0m \u001b[32m-----------\u001b[2m-------------------\u001b[0m\u001b[0m 14.88 KiB/44.00 KiB\n", - "\u001b[2K\u001b[5A\u001b[37m⠙\u001b[0m \u001b[2mPreparing packages...\u001b[0m (0/6)----\u001b[0m\u001b[0m 0 B/85.81 KiB \u001b[5A\n", - "\u001b[2meval-type-backport\u001b[0m \u001b[32m------------------------------\u001b[2m\u001b[0m\u001b[0m 5.69 KiB/5.69 KiB\n", - "\u001b[2mshellingham\u001b[0m \u001b[32m------------------------------\u001b[2m\u001b[0m\u001b[0m 9.53 KiB/9.53 KiB\n", - "\u001b[2mtabulate \u001b[0m \u001b[32m-------------\u001b[2m-----------------\u001b[0m\u001b[0m 14.83 KiB/34.43 KiB\n", - "\u001b[2mtyper \u001b[0m \u001b[32m-----------\u001b[2m-------------------\u001b[0m\u001b[0m 14.88 KiB/44.00 KiB\n", - "\u001b[2K\u001b[5A\u001b[37m⠙\u001b[0m \u001b[2mPreparing packages...\u001b[0m (0/6)----\u001b[0m\u001b[0m 16.00 KiB/85.81 KiB \u001b[5A\n", - "\u001b[2meval-type-backport\u001b[0m \u001b[32m------------------------------\u001b[2m\u001b[0m\u001b[0m 5.69 KiB/5.69 KiB\n", - "\u001b[2mshellingham\u001b[0m \u001b[32m------------------------------\u001b[2m\u001b[0m\u001b[0m 9.53 KiB/9.53 KiB\n", - "\u001b[2mtabulate \u001b[0m \u001b[32m-------------\u001b[2m-----------------\u001b[0m\u001b[0m 14.83 KiB/34.43 KiB\n", - "\u001b[2mtyper \u001b[0m \u001b[32m-----------\u001b[2m-------------------\u001b[0m\u001b[0m 14.88 KiB/44.00 KiB\n", - "\u001b[2mtogether \u001b[0m \u001b[32m------\u001b[2m------------------------\u001b[0m\u001b[0m 16.00 KiB/85.81 KiB\n", - "\u001b[2K\u001b[6A\u001b[37m⠙\u001b[0m \u001b[2mPreparing packages...\u001b[0m (0/6)----\u001b[0m\u001b[0m 0 B/3.08 MiB \u001b[6A\n", - "\u001b[2meval-type-backport\u001b[0m \u001b[32m------------------------------\u001b[2m\u001b[0m\u001b[0m 5.69 KiB/5.69 KiB\n", - "\u001b[2mshellingham\u001b[0m \u001b[32m------------------------------\u001b[2m\u001b[0m\u001b[0m 9.53 KiB/9.53 KiB\n", - "\u001b[2mtabulate \u001b[0m \u001b[32m-------------\u001b[2m-----------------\u001b[0m\u001b[0m 14.83 KiB/34.43 KiB\n", - "\u001b[2mtyper \u001b[0m \u001b[32m-----------\u001b[2m-------------------\u001b[0m\u001b[0m 14.88 KiB/44.00 KiB\n", - "\u001b[2mtogether \u001b[0m \u001b[32m------\u001b[2m------------------------\u001b[0m\u001b[0m 16.00 KiB/85.81 KiB\n", - "\u001b[2K\u001b[6A\u001b[37m⠙\u001b[0m \u001b[2mPreparing packages...\u001b[0m (0/6)----\u001b[0m\u001b[0m 14.91 KiB/3.08 MiB \u001b[6A\n", - "\u001b[2meval-type-backport\u001b[0m \u001b[32m------------------------------\u001b[2m\u001b[0m\u001b[0m 5.69 KiB/5.69 KiB\n", - "\u001b[2mshellingham\u001b[0m \u001b[32m------------------------------\u001b[2m\u001b[0m\u001b[0m 9.53 KiB/9.53 KiB\n", - "\u001b[2mtabulate \u001b[0m \u001b[32m---------------------------\u001b[2m---\u001b[0m\u001b[0m 30.83 KiB/34.43 KiB\n", - "\u001b[2mtyper \u001b[0m \u001b[32m-----------\u001b[2m-------------------\u001b[0m\u001b[0m 14.88 KiB/44.00 KiB\n", - "\u001b[2mtogether \u001b[0m \u001b[32m------\u001b[2m------------------------\u001b[0m\u001b[0m 16.00 KiB/85.81 KiB\n", - "\u001b[2K\u001b[6A\u001b[37m⠙\u001b[0m \u001b[2mPreparing packages...\u001b[0m (0/6)----\u001b[0m\u001b[0m 14.91 KiB/3.08 MiB \u001b[6A\n", - "\u001b[2meval-type-backport\u001b[0m \u001b[32m------------------------------\u001b[2m\u001b[0m\u001b[0m 5.69 KiB/5.69 KiB\n", - "\u001b[2mshellingham\u001b[0m \u001b[32m------------------------------\u001b[2m\u001b[0m\u001b[0m 9.53 KiB/9.53 KiB\n", - "\u001b[2mtabulate \u001b[0m \u001b[32m------------------------------\u001b[2m\u001b[0m\u001b[0m 34.43 KiB/34.43 KiB\n", - "\u001b[2mtyper \u001b[0m \u001b[32m-----------\u001b[2m-------------------\u001b[0m\u001b[0m 14.88 KiB/44.00 KiB\n", - "\u001b[2mtogether \u001b[0m \u001b[32m------\u001b[2m------------------------\u001b[0m\u001b[0m 16.00 KiB/85.81 KiB\n", - "\u001b[2K\u001b[6A\u001b[37m⠙\u001b[0m \u001b[2mPreparing packages...\u001b[0m (0/6)----\u001b[0m\u001b[0m 14.91 KiB/3.08 MiB \u001b[6A\n", - "\u001b[2mshellingham\u001b[0m \u001b[32m------------------------------\u001b[2m\u001b[0m\u001b[0m 9.53 KiB/9.53 KiB\n", - "\u001b[2mtabulate \u001b[0m \u001b[32m------------------------------\u001b[2m\u001b[0m\u001b[0m 34.43 KiB/34.43 KiB\n", - "\u001b[2mtyper \u001b[0m \u001b[32m-----------\u001b[2m-------------------\u001b[0m\u001b[0m 14.88 KiB/44.00 KiB\n", - "\u001b[2mtogether \u001b[0m \u001b[32m------\u001b[2m------------------------\u001b[0m\u001b[0m 16.00 KiB/85.81 KiB\n", - "\u001b[2K\u001b[5A\u001b[37m⠙\u001b[0m \u001b[2mPreparing packages...\u001b[0m (0/6)----\u001b[0m\u001b[0m 14.91 KiB/3.08 MiB \u001b[5A\n", - "\u001b[2mshellingham\u001b[0m \u001b[32m------------------------------\u001b[2m\u001b[0m\u001b[0m 9.53 KiB/9.53 KiB\n", - "\u001b[2mtabulate \u001b[0m \u001b[32m------------------------------\u001b[2m\u001b[0m\u001b[0m 34.43 KiB/34.43 KiB\n", - "\u001b[2mtyper \u001b[0m \u001b[32m-----------\u001b[2m-------------------\u001b[0m\u001b[0m 14.88 KiB/44.00 KiB\n", - "\u001b[2mtogether \u001b[0m \u001b[32m------\u001b[2m------------------------\u001b[0m\u001b[0m 16.00 KiB/85.81 KiB\n", - "\u001b[2K\u001b[5A\u001b[37m⠙\u001b[0m \u001b[2mPreparing packages...\u001b[0m (0/6)----\u001b[0m\u001b[0m 30.91 KiB/3.08 MiB \u001b[5A\n", - "\u001b[2mshellingham\u001b[0m \u001b[32m------------------------------\u001b[2m\u001b[0m\u001b[0m 9.53 KiB/9.53 KiB\n", - "\u001b[2mtyper \u001b[0m \u001b[32m-----------\u001b[2m-------------------\u001b[0m\u001b[0m 14.88 KiB/44.00 KiB\n", - "\u001b[2mtogether \u001b[0m \u001b[32m------\u001b[2m------------------------\u001b[0m\u001b[0m 16.00 KiB/85.81 KiB\n", - "\u001b[2K\u001b[4A\u001b[37m⠙\u001b[0m \u001b[2mPreparing packages...\u001b[0m (0/6)----\u001b[0m\u001b[0m 30.91 KiB/3.08 MiB \u001b[4A\n", - "\u001b[2mshellingham\u001b[0m \u001b[32m------------------------------\u001b[2m\u001b[0m\u001b[0m 9.53 KiB/9.53 KiB\n", - "\u001b[2mtyper \u001b[0m \u001b[32m-----------\u001b[2m-------------------\u001b[0m\u001b[0m 14.88 KiB/44.00 KiB\n", - "\u001b[2mtogether \u001b[0m \u001b[32m------\u001b[2m------------------------\u001b[0m\u001b[0m 16.00 KiB/85.81 KiB\n", - "\u001b[2K\u001b[4A\u001b[37m⠙\u001b[0m \u001b[2mPreparing packages...\u001b[0m (0/6)----\u001b[0m\u001b[0m 46.91 KiB/3.08 MiB \u001b[4A\n", - "\u001b[2mshellingham\u001b[0m \u001b[32m------------------------------\u001b[2m\u001b[0m\u001b[0m 9.53 KiB/9.53 KiB\n", - "\u001b[2mtyper \u001b[0m \u001b[32m-----------\u001b[2m-------------------\u001b[0m\u001b[0m 14.88 KiB/44.00 KiB\n", - "\u001b[2mtogether \u001b[0m \u001b[32m------\u001b[2m------------------------\u001b[0m\u001b[0m 16.00 KiB/85.81 KiB\n", - "\u001b[2K\u001b[4A\u001b[37m⠙\u001b[0m \u001b[2mPreparing packages...\u001b[0m (0/6)----\u001b[0m\u001b[0m 62.91 KiB/3.08 MiB \u001b[4A\n", - "\u001b[2mshellingham\u001b[0m \u001b[32m------------------------------\u001b[2m\u001b[0m\u001b[0m 9.53 KiB/9.53 KiB\n", - "\u001b[2mtyper \u001b[0m \u001b[32m-----------\u001b[2m-------------------\u001b[0m\u001b[0m 14.88 KiB/44.00 KiB\n", - "\u001b[2mtogether \u001b[0m \u001b[32m------\u001b[2m------------------------\u001b[0m\u001b[0m 16.00 KiB/85.81 KiB\n", - "\u001b[2K\u001b[4A\u001b[37m⠙\u001b[0m \u001b[2mPreparing packages...\u001b[0m (0/6)----\u001b[0m\u001b[0m 78.91 KiB/3.08 MiB \u001b[4A\n", - "\u001b[2mshellingham\u001b[0m \u001b[32m------------------------------\u001b[2m\u001b[0m\u001b[0m 9.53 KiB/9.53 KiB\n", - "\u001b[2mtyper \u001b[0m \u001b[32m-----------\u001b[2m-------------------\u001b[0m\u001b[0m 14.88 KiB/44.00 KiB\n", - "\u001b[2mtogether \u001b[0m \u001b[32m------\u001b[2m------------------------\u001b[0m\u001b[0m 16.00 KiB/85.81 KiB\n", - "\u001b[2K\u001b[4A\u001b[37m⠙\u001b[0m \u001b[2mPreparing packages...\u001b[0m (0/6)----\u001b[0m\u001b[0m 94.91 KiB/3.08 MiB \u001b[4A\n", - "\u001b[2mshellingham\u001b[0m \u001b[32m------------------------------\u001b[2m\u001b[0m\u001b[0m 9.53 KiB/9.53 KiB\n", - "\u001b[2mtyper \u001b[0m \u001b[32m-----------\u001b[2m-------------------\u001b[0m\u001b[0m 14.88 KiB/44.00 KiB\n", - "\u001b[2mtogether \u001b[0m \u001b[32m------------\u001b[2m------------------\u001b[0m\u001b[0m 32.00 KiB/85.81 KiB\n", - "\u001b[2K\u001b[4A\u001b[37m⠙\u001b[0m \u001b[2mPreparing packages...\u001b[0m (0/6)----\u001b[0m\u001b[0m 2.62 MiB/3.08 MiB \u001b[4A\n", - "\u001b[2mtyper \u001b[0m \u001b[32m----------------------\u001b[2m--------\u001b[0m\u001b[0m 30.88 KiB/44.00 KiB\n", - "\u001b[2mtogether \u001b[0m \u001b[32m------------\u001b[2m------------------\u001b[0m\u001b[0m 32.00 KiB/85.81 KiB\n", - "\u001b[2K\u001b[3A\u001b[37m⠹\u001b[0m \u001b[2mPreparing packages...\u001b[0m (3/6)----\u001b[0m\u001b[0m 2.62 MiB/3.08 MiB \u001b[3A\n", - "\u001b[2mtyper \u001b[0m \u001b[32m------------------------------\u001b[2m\u001b[0m\u001b[0m 44.00 KiB/44.00 KiB\n", - "\u001b[2mtogether \u001b[0m \u001b[32m------------\u001b[2m------------------\u001b[0m\u001b[0m 32.00 KiB/85.81 KiB\n", - "\u001b[2K\u001b[3A\u001b[37m⠹\u001b[0m \u001b[2mPreparing packages...\u001b[0m (3/6)----\u001b[0m\u001b[0m 2.62 MiB/3.08 MiB \u001b[3A\n", - "\u001b[2mtogether \u001b[0m \u001b[32m------------\u001b[2m------------------\u001b[0m\u001b[0m 32.00 KiB/85.81 KiB\n", - "\u001b[2K\u001b[2A\u001b[37m⠹\u001b[0m \u001b[2mPreparing packages...\u001b[0m (3/6)2m--\u001b[0m\u001b[0m 2.80 MiB/3.08 MiB \u001b[2A\n", - "\u001b[2mtogether \u001b[0m \u001b[32m-----------------\u001b[2m-------------\u001b[0m\u001b[0m 48.00 KiB/85.81 KiB\n", - "\u001b[2K\u001b[2A\u001b[37m⠹\u001b[0m \u001b[2mPreparing packages...\u001b[0m (3/6)2m--\u001b[0m\u001b[0m 2.81 MiB/3.08 MiB \u001b[2A\n", - "\u001b[2K\u001b[1A\u001b[37m⠹\u001b[0m \u001b[2mPreparing packages...\u001b[0m (3/6)----\u001b[0m\u001b[0m 48.00 KiB/85.81 KiB \u001b[1A\n", - "\u001b[2K\u001b[1A\u001b[37m⠹\u001b[0m \u001b[2mPreparing packages...\u001b[0m (3/6)2m--\u001b[0m\u001b[0m 80.00 KiB/85.81 KiB \u001b[1A\n", - "\u001b[2K\u001b[2mPrepared \u001b[1m6 packages\u001b[0m \u001b[2min 365ms\u001b[0m\u001b[0m \u001b[1A\n", - "\u001b[2K\u001b[2mInstalled \u001b[1m6 packages\u001b[0m \u001b[2min 50ms\u001b[0m\u001b[0m \u001b[0m\n", - " \u001b[32m+\u001b[39m \u001b[1meval-type-backport\u001b[0m\u001b[2m==0.2.2\u001b[0m\n", - " \u001b[32m+\u001b[39m \u001b[1mfaiss-cpu\u001b[0m\u001b[2m==1.10.0\u001b[0m\n", - " \u001b[32m+\u001b[39m \u001b[1mshellingham\u001b[0m\u001b[2m==1.5.4\u001b[0m\n", - " \u001b[32m+\u001b[39m \u001b[1mtabulate\u001b[0m\u001b[2m==0.9.0\u001b[0m\n", - " \u001b[32m+\u001b[39m \u001b[1mtogether\u001b[0m\u001b[2m==1.5.5\u001b[0m\n", - " \u001b[32m+\u001b[39m \u001b[1mtyper\u001b[0m\u001b[2m==0.15.2\u001b[0m\n", - "torch torchvision --index-url https://download.pytorch.org/whl/cpu\n", - "\u001b[2mUsing Python 3.11.11 environment at: /Users/erichuang/projects/internal-llama-stack/.venv\u001b[0m\n", - "\u001b[2mAudited \u001b[1m2 packages\u001b[0m \u001b[2min 32ms\u001b[0m\u001b[0m\n", - "sentence-transformers --no-deps\n", - "\u001b[2mUsing Python 3.11.11 environment at: /Users/erichuang/projects/internal-llama-stack/.venv\u001b[0m\n", - "\u001b[2mAudited \u001b[1m1 package\u001b[0m \u001b[2min 63ms\u001b[0m\u001b[0m\n", - "\u001b[32mBuild Successful!\u001b[0m\n" - ] - } - ], - "source": [ - "import os \n", - "import subprocess\n", - "import time\n", - "\n", - "!pip install uv \n", - "!uv pip install requests\n", - "\n", - "if \"UV_SYSTEM_PYTHON\" in os.environ:\n", - " del os.environ[\"UV_SYSTEM_PYTHON\"]\n", - "\n", - "# this command installs all the dependencies needed for the llama stack server \n", - "!uv run --with llama-stack llama stack build --distro llama_api --image-type venv \n", - "\n", - "def run_llama_stack_server_background():\n", - " log_file = open(\"llama_stack_server.log\", \"w\")\n", - " process = subprocess.Popen(\n", - " \"uv run --with llama-stack llama stack run llama_api --image-type venv\",\n", - " shell=True,\n", - " stdout=log_file,\n", - " stderr=log_file,\n", - " text=True\n", - " )\n", - " \n", - " print(f\"Starting Llama Stack server with PID: {process.pid}\")\n", - " return process\n", - "\n", - "def wait_for_server_to_start():\n", - " import requests\n", - " from requests.exceptions import ConnectionError\n", - " import time\n", - " \n", - " url = \"http://0.0.0.0:8321/v1/health\"\n", - " max_retries = 30\n", - " retry_interval = 1\n", - " \n", - " print(\"Waiting for server to start\", end=\"\")\n", - " for _ in range(max_retries):\n", - " try:\n", - " response = requests.get(url)\n", - " if response.status_code == 200:\n", - " print(\"\\nServer is ready!\")\n", - " return True\n", - " except ConnectionError:\n", - " print(\".\", end=\"\", flush=True)\n", - " time.sleep(retry_interval)\n", - " \n", - " print(\"\\nServer failed to start after\", max_retries * retry_interval, \"seconds\")\n", - " return False\n", - "\n", - "\n", - "# use this helper if needed to kill the server \n", - "def kill_llama_stack_server():\n", - " # Kill any existing llama stack server processes\n", - " os.system(\"ps aux | grep -v grep | grep llama_stack.core.server.server | awk '{print $2}' | xargs kill -9\")\n" - ] - }, - { - "cell_type": "markdown", - "id": "c40e9efd", - "metadata": {}, - "source": [ - "### 1.3 Starting the Llama Stack Server" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "f779283d", - "metadata": {}, - "outputs": [], - "source": [ - "server_process = run_llama_stack_server_background()\n", - "assert wait_for_server_to_start()" - ] - }, - { - "cell_type": "markdown", - "id": "90eb721b", - "metadata": {}, - "source": [ - "### 1.4 Install and Configure the Client\n", - "\n", - "Now that we have our Llama Stack server running locally, we need to install the client package to interact with it. The `llama-stack-client` provides a simple Python interface to access all the functionality of Llama Stack, including:\n", - "\n", - "- Chat Completions ( text and multimodal )\n", - "- Safety Shields \n", - "- Agent capabilities with tools like web search, RAG with Telemetry\n", - "- Evaluation and scoring frameworks\n", - "\n", - "The client handles all the API communication with our local server, making it easy to integrate Llama Stack's capabilities into your applications.\n", - "\n", - "In the next cells, we'll:\n", - "\n", - "1. Install the client package\n", - "2. Set up API keys for external services (Together AI and Tavily Search)\n", - "3. Initialize the client to connect to our local server\n" - ] - }, - { - "cell_type": "code", - "execution_count": 3, - "id": "2e68e32a", - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "\u001b[2mUsing Python 3.10.16 environment at: /opt/homebrew/Caskroom/miniconda/base/envs/stack\u001b[0m\n", - "\u001b[2K\u001b[2mResolved \u001b[1m31 packages\u001b[0m \u001b[2min 284ms\u001b[0m\u001b[0m \u001b[0m\n", - "\u001b[2mAudited \u001b[1m31 packages\u001b[0m \u001b[2min 0.04ms\u001b[0m\u001b[0m\n" - ] - } - ], - "source": [ - "!pip install -U llama-stack-client" - ] - }, - { - "cell_type": "code", - "execution_count": 3, - "id": "E1UFuJC570Tk", - "metadata": { - "colab": { - "base_uri": "https://localhost:8080/", - "height": 1000, - "referenced_widgets": [ - "75307e3dee604d30aa44713e6e293e64", - "5ce87402a79342af995df41ac3940d55", - "fbbcc19886cc43b38424fbb184162c61", - "29212208db6b432eb4f708cd64258954", - "50dd8994a4cf486ebbec5ffd4322992a", - "f9b768c703494dd198f2978aff4892e8", - "1231b9e4cab34c33a38bee63543f1e75", - "754deb3970604d48a522bc9f021ad945", - "f6ecca7a1a8340fbbe056235a2714fc3", - "ef4f63fe9d8f4683a9d20becb6e4e2cb", - "7508f10c13634e7aa682cfb29c48d9e7", - "26f1430ca7cb4ad5b1b8df1ffdbd32a9", - "7cd2d9c9ea7b4d70902ffaff33033078", - "101288236cff40b8bb9dbad80dbbc7ee", - "d5c9977838a249eeab6ef628279b8155", - "d032d1e7b4b54ba28ac83c1a12b23876", - "321fce57c158432abeae496ae8a947aa", - "3ebe00201bdb4e119e3b74f684a58345", - "0f8bab6b8ed04774b386fe952aae66f1", - "cfcb6e456c354d99be91f161552f3376", - "61bd0d490c0e4c04a331cf9ce6b7d38f", - "7d8653fca29f4df3a7487733ff9db60b", - "943f8fcb66614353a51f32f8344b6122", - "0e695245b97c4bbc85e349fda3dc07b9", - "bb0d168c41f540b8ae42239d3938483a", - "87700a80125348f28c4f249bdf8b0a8d", - "8902c3622da540e496ed5b1524bd01ca", - "90432ec1c24b4607a935c94e130cd68d", - "464147b149824f20afc727751a702fc7", - "67e37a088be64a2ba786ca923b1017dd", - "98786f52ef5345b0b9164b9c1f2b8e18", - "0e1b9910a77d4b7fa69cb8926e6547d7", - "0b276315be4345be83da1e03905c8495", - "e11f8c3891284e07bd2572257afd5e1b", - "ee18d96394994d01b49d5b03b3d9a019", - "844b06df5749441fab6f61656ce581a9", - "e1c6b9a20e074f17aeba976b24e80c65", - "c690da8daa1e4f9ea73bcacdd92e8a6d", - "d0b161ae25c441e8b3caf7a3d88c1b05", - "47cf4b6b835d43388576a2abf4cc54f8", - "03bbebd659e64b5d9c29a73570c34854", - "b68e5097d2504d2cbd7e19aa1aac3a04", - "22a665deff88477b9372c0350c4c572b", - "5e535ed2b83e496ab57b1c80b615ab0c", - "d9de065c7f81443e98ddf066c7b5bd54", - "1e836106837c4ac7a11b36e700c46b64", - "55591e8179084fcfa3a61c8bd8d09dcb", - "de1ef93c41364eda9b4b111231057348", - "23b0b2f4f82c4a21846e91d7cea91da5", - "9e4d0fbb51284a7487c495c7b95a293d", - "b0f8cf1f79e04b5fb47a810f2c81bd7e", - "0c359bc4c94c46acbc9094354a15c33d", - "59d0b59b6c2248508d0601ff13878d33", - "891cb726d45c4fef8f2c74a56df5532b", - "fa39189070334939aea5fa4a7de5ec8b", - "f0e107dd6d54483aa367da0e337a97cd", - "861a00796f55470e85d94733eeee9a5f", - "5459633eb6e94ec391d13fcf67425726", - "b7b7467ece304ffbbd352b9b96a03aad", - "9dece059f1204e29b106fca9e191ddb3", - "e2e49c25d6fc4592b317e94cfabc2e5e", - "76d37a48a73946bab2821f097cf2605f", - "8e81ae00681347cb906b392c3656a64a", - "74bedc38b7da4e8a83b0c892d7aa59b5", - "d1e67c28b4664e8098dce8f5e80b8779", - "abe6cf39b784436993fcbe92221c31a3", - "d021a18ab70b4c7e8aec43932a124c36", - "72e7c092fb054b7ea0dcd2782b5d8a7d", - "8b1ea80221174fae943d5c9f997dfb57", - "f8073d625f80415dbf712cee434f6e3a", - "5f6014ba13fa4a659b9eb1b5f83599a7", - "327ff8f5292d47afbfebd3beea187739", - "988cac4341b646079fc73719f3f88ad7", - "900a4dac08f540dfb35c29f63236a12c", - "1e6009b9b0684b8fbaa379ea96f111ee", - "541b9b4e74614e2cb855bb90f03df538", - "ff256b2275f740ed82bca4f43b4d6fd2", - "3703041a499c426bb427ee008c81cde5", - "4b22bbacb995425fb32a2368f3685a92", - "49a66eeb9ef74de5ab8904fd90eb7558", - "08f9d125018b41c582a0fa1e234315f9", - "736c770230644894b85dbc34bd8f1d52", - "b67cbbf32f844a19b219be612d5038c9", - "774b513d64524ac7823a2cf13efa8d41", - "1e56da93bcf64ff490416d2b66cd3dc0", - "b7e35038ce344110b785753b655130f5", - "5472af91737446f4a4a2d92a3f684a45", - "9fb4368802da4a5a8101ba200d98403a", - "2e713bcc372e48b2a006558db4d1df68", - "1a277abd5ea44253bc6894bef258b52b", - "b3eedd82e7da4ce8b3ded70e49a2afd0", - "6f5c18cb8002471f8b3764effee37324", - "3bebac362b344e8d9103c5011613f1ea", - "670905a55b19458da69f83c8bcd511d1", - "ff54451a48394faaaa9d8cdb690d0718", - "36b5bc19b2d0407f8ab28ff0da2ce12d", - "879e48d9a9e04183903d94ffe98313d2", - "abce503d70594c2ca9afdc47847c125b", - "028e291ee53947bbbbc4bfb68c695f5f", - "a530662719374c95a9bef12e59e28c85", - "bffc0f4b12f141398535990709fd4f2c", - "04804c74e1dd43449d5f758cf5d0ba5e", - "95a506c3007c4525b01ee4e1600d671b", - "a0d6b0caeb2340fe96c8f5569e3d3ae4", - "30798f87a8b848d783fdacd71af5dc04", - "07ce54c75e76488ba4019a20b3707061", - "f023175de68445f98a6b01bb40ccdc6d", - "7389b79a0ff44cd68c7866995d728023", - "8e2b70ffe4eb4974bd6393fcc1292267", - "13eee164dc534424acb9dc9ee37a9465", - "722a7fe16af3422585a20c651345cfa4", - "f5596c1c9c4d42f3bc171961f9582eff", - "85d66e615b5742e78657b1e60c75fc72", - "731c02dc5dd446c3b22765575148e256", - "254ce460ce244c99a5afe39d5d51f6b7", - "4cf1dc345ace4da59f978f661487f975", - "8f30fca71bf24e5ca26e17c2321f893c", - "dd85d37dd1d14c7ea4592f8e11b2d2c8", - "3cb06377e4454f009d6b2aa7aa6ff0a9", - "4502477db4d948e693012364c2dcb370", - "52fe404ec9c14db2a7279b4c154eef3d" - ] - }, - "collapsed": true, - "id": "E1UFuJC570Tk", - "outputId": "aebb69d4-c167-4de5-eb8a-dd19dd538f63" - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Not in Google Colab environment\n" - ] - } - ], - "source": [ - "import os\n", - "\n", - "try:\n", - " from google.colab import userdata\n", - " os.environ['LLAMA_API_KEY'] = userdata.get('LLAMA_API_KEY')\n", - "except ImportError:\n", - " print(\"Not in Google Colab environment\")\n", - "\n", - "for key in ['LLAMA_API_KEY']:\n", - " try:\n", - " api_key = os.environ[key]\n", - " if not api_key:\n", - " raise ValueError(f\"{key} environment variable is empty\")\n", - " except KeyError:\n", - " api_key = input(f\"{key} environment variable is not set. Please enter your API key: \")\n", - " os.environ[key] = api_key\n", - "\n", - "from llama_stack_client import LlamaStackClient\n", - "\n", - "client = LlamaStackClient(\n", - " base_url=\"http://0.0.0.0:8321\", \n", - " provider_data = {\n", - " \"llama_api_key\": os.environ['LLAMA_API_KEY']\n", - " }\n", - ")" - ] - }, - { - "cell_type": "markdown", - "id": "635a7a6f", - "metadata": {}, - "source": [ - "Now that we have completed the setup and configuration, let's start exploring the capabilities of Llama 4!\n", - "\n" - ] - }, - { - "cell_type": "markdown", - "id": "0fc75d73", - "metadata": {}, - "source": [ - "## 2. Running Llama 4" - ] - }, - { - "cell_type": "markdown", - "id": "7dacaa2d-94e9-42e9-82a0-73522dfc7010", - "metadata": { - "id": "7dacaa2d-94e9-42e9-82a0-73522dfc7010" - }, - "source": [ - "### 2.1 Check available models\n", - "\n", - "All the models available are programmatically accessible via the client." - ] - }, - { - "cell_type": "code", - "execution_count": 13, - "id": "ruO9jQna_t_S", - "metadata": { - "colab": { - "base_uri": "https://localhost:8080/" - }, - "collapsed": true, - "id": "ruO9jQna_t_S", - "outputId": "ab1722a7-62ab-43bb-9cab-4e45bf62068a" - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Available models:\n", - "- Llama-3.1-8B-Instruct\n", - "- meta-llama/Llama-3.1-8B-Instruct\n", - "- Llama-3.2-11B-Vision-Instruct\n", - "- meta-llama/Llama-3.2-11B-Vision-Instruct\n", - "- Llama-3.3-70B-Instruct\n", - "- meta-llama/Llama-3.3-70B-Instruct\n", - "- Llama-4-Maverick-17B-128E-Instruct-FP8\n", - "- meta-llama/Llama-4-Maverick-17B-128E-Instruct\n", - "- all-MiniLM-L6-v2\n" - ] - } - ], - "source": [ - "from rich.pretty import pprint\n", - "\n", - "print(\"Available models:\")\n", - "for m in client.models.list():\n", - " print(f\"- {m.identifier}\")\n" - ] - }, - { - "cell_type": "markdown", - "id": "86366383", - "metadata": { - "id": "86366383" - }, - "source": [ - "### 2.2 Run a simple chat completion with one of the models\n", - "\n", - "We will test the client by doing a simple chat completion." - ] - }, - { - "cell_type": "code", - "execution_count": 14, - "id": "77c29dba", - "metadata": { - "colab": { - "base_uri": "https://localhost:8080/" - }, - "id": "77c29dba", - "outputId": "4857974f-4c70-4bc4-f90a-6ae49dc9c41e" - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Here is a two-sentence poem about a llama:\n", - "\n", - "With soft fur and gentle eyes, the llama roams with gentle surprise, a peaceful presence in the Andean skies. Its calm demeanor and soft humming song bring serenity to all who belong.\n" - ] - } - ], - "source": [ - "# TODO: update this with a vision model\n", - "model_id = \"meta-llama/Llama-4-Maverick-17B-128E-Instruct\"\n", - "\n", - "response = client.inference.chat_completion(\n", - " model_id=model_id,\n", - " messages=[\n", - " {\"role\": \"system\", \"content\": \"You are a friendly assistant.\"},\n", - " {\"role\": \"user\", \"content\": \"Write a two-sentence poem about llama.\"},\n", - " ],\n", - ")\n", - "\n", - "print(response.completion_message.content)\n" - ] - }, - { - "cell_type": "markdown", - "id": "7737cd41", - "metadata": {}, - "source": [ - "### 2.3 Running multimodal inference" - ] - }, - { - "cell_type": "code", - "execution_count": 15, - "id": "e7b1baa7", - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - " % Total % Received % Xferd Average Speed Time Time Time Current\n", - " Dload Upload Total Spent Left Speed\n", - "100 275k 100 275k 0 0 847k 0 --:--:-- --:--:-- --:--:-- 845k--:--:-- --:--:-- 0\n" - ] - }, - { - "data": { - "image/jpeg": "/9j/4AAQSkZJRgABAQAAAQABAAD/4QmWaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wLwA8P3hwYWNrZXQgYmVnaW49Iu+7vyIgaWQ9Ilc1TTBNcENlaGlIenJlU3pOVGN6a2M5ZCI/PiA8eDp4bXBtZXRhIHhtbG5zOng9ImFkb2JlOm5zOm1ldGEvIiB4OnhtcHRrPSJYTVAgQ29yZSA0LjQuMC1FeGl2MiI+IDxyZGY6UkRGIHhtbG5zOnJkZj0iaHR0cDovL3d3dy53My5vcmcvMTk5OS8wMi8yMi1yZGYtc3ludGF4LW5zIyI+IDxyZGY6RGVzY3JpcHRpb24gcmRmOmFib3V0PSIiIHhtbG5zOmlwdGNFeHQ9Imh0dHA6Ly9pcHRjLm9yZy9zdGQvSXB0YzR4bXBFeHQvMjAwOC0wMi0yOS8iIGlwdGNFeHQ6RGlnaXRhbFNvdXJjZVR5cGU9InRyYWluZWRBbGdvcml0aG1pY01lZGlhIi8+IDwvcmRmOlJERj4gPC94OnhtcG1ldGE+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPD94cGFja2V0IGVuZD0idyI/Pv/bAEMAAgEBAQEBAgEBAQICAgICBAMCAgICBQQEAwQGBQYGBgUGBgYHCQgGBwkHBgYICwgJCgoKCgoGCAsMCwoMCQoKCv/bAEMBAgICAgICBQMDBQoHBgcKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCv/AABEIAwADAAMBEQACEQEDEQH/xAAfAAABBQEBAQEBAQAAAAAAAAAAAQIDBAUGBwgJCgv/xAC1EAACAQMDAgQDBQUEBAAAAX0BAgMABBEFEiExQQYT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", - "text/plain": [ - "" - ] - }, - "execution_count": 15, - "metadata": { - "image/jpeg": { - "height": 256, - "width": 256 - } - }, - "output_type": "execute_result" - } - ], - "source": [ - "!curl -O https://raw.githubusercontent.com/meta-llama/llama-models/refs/heads/main/Llama_Repo.jpeg\n", - "\n", - "from IPython.display import Image\n", - "Image(\"Llama_Repo.jpeg\", width=256, height=256)" - ] - }, - { - "cell_type": "code", - "execution_count": 16, - "id": "e1450ecc", - "metadata": {}, - "outputs": [], - "source": [ - "import base64\n", - "def encode_image(image_path):\n", - " with open(image_path, \"rb\") as image_file:\n", - " base64_string = base64.b64encode(image_file.read()).decode(\"utf-8\")\n", - " base64_url = f\"data:image/png;base64,{base64_string}\"\n", - " return base64_url" - ] - }, - { - "cell_type": "code", - "execution_count": 18, - "id": "d7914894", - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "The image features three llamas, each with a distinct color. The llama on the left is white, the middle one is purple, and the one on the right is also white but wears a blue party hat.\n", - "\n", - "To determine the number of different colors present, we can count the unique hues:\n", - "\n", - "1. White (two llamas)\n", - "2. Purple (one llama)\n", - "3. Blue (party hat)\n", - "\n", - "Therefore, there are 3 different colors visible in the image: white, purple, and blue.\n" - ] - } - ], - "source": [ - "response = client.inference.chat_completion(\n", - " messages=[\n", - " {\n", - " \"role\": \"user\",\n", - " \"content\": [\n", - " {\n", - " \"type\": \"image\",\n", - " \"image\": {\n", - " \"url\": {\n", - " \"uri\": encode_image(\"Llama_Repo.jpeg\")\n", - " }\n", - " }\n", - " },\n", - " {\n", - " \"type\": \"text\",\n", - " \"text\": \"How many different colors are those llamas? What are those colors?\",\n", - " }\n", - " ]\n", - " }\n", - " ],\n", - " model_id=model_id,\n", - " stream=False,\n", - ")\n", - "\n", - "print(response.completion_message.content)" - ] - }, - { - "cell_type": "markdown", - "id": "8cf0d555", - "metadata": { - "id": "8cf0d555" - }, - "source": [ - "### 2.4 Have a conversation\n", - "\n", - "Maintaining a conversation history allows the model to retain context from previous interactions. Use a list to accumulate messages, enabling continuity throughout the chat session." - ] - }, - { - "cell_type": "code", - "execution_count": 19, - "id": "3fdf9df6", - "metadata": { - "id": "3fdf9df6" - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "\u001b[36m> Response: The most famous Prime Minister of England during World War 2 was Winston Churchill. He served as the Prime Minister of the United Kingdom from 1940 to 1945, and again from 1951 to 1955. Churchill is widely regarded as one of the greatest wartime leaders in history, known for his leadership, oratory skills, and unwavering resolve during the war.\n", - "\n", - "Churchill played a crucial role in rallying the British people during the war, and his speeches, such as the \"We shall fight on the beaches\" and \"Their finest hour\" speeches, are still remembered and celebrated today. He worked closely with other Allied leaders, including US President Franklin D. Roosevelt and Soviet leader Joseph Stalin, to coordinate the war effort and ultimately secure the defeat of Nazi Germany.\n", - "\n", - "Churchill's leadership and legacy have endured long after the war, and he remains one of the most iconic and influential figures in British history.\u001b[0m\n", - "\u001b[36m> Response: Winston Churchill was known for his many memorable quotes, but one of his most famous is:\n", - "\n", - "**\"We shall fight on the beaches, we shall fight on the landing grounds, we shall fight in the fields and in the streets, we shall fight in the hills; we shall never surrender.\"**\n", - "\n", - "This quote is from his speech to the House of Commons on June 4, 1940, during the early stages of World War II, when Nazi Germany was threatening to invade Britain. The speech is known as the \"We Shall Fight on the Beaches\" speech, and it's considered one of the greatest speeches of the 20th century.\n", - "\n", - "However, if I had to pick a single, even more concise quote, it would be:\n", - "\n", - "**\"Blood, toil, tears, and sweat.\"**\n", - "\n", - "This was the opening phrase of his first speech as Prime Minister to the House of Commons on May 13, 1940, in which he said:\n", - "\n", - "\"I say to the House as I said to those who have joined this Government, I have nothing to offer but blood, toil, tears, and sweat. We have before us an ordeal of the most grievous kind.\"\n", - "\n", - "This quote has become synonymous with Churchill's leadership and resolve during the war.\u001b[0m\n" - ] - } - ], - "source": [ - "from termcolor import cprint\n", - "\n", - "questions = [\n", - " \"Who was the most famous PM of England during world war 2 ?\",\n", - " \"What was his most famous quote ?\"\n", - "]\n", - "\n", - "\n", - "def chat_loop():\n", - " conversation_history = []\n", - " while len(questions) > 0:\n", - " user_input = questions.pop(0)\n", - " if user_input.lower() in [\"exit\", \"quit\", \"bye\"]:\n", - " cprint(\"Ending conversation. Goodbye!\", \"yellow\")\n", - " break\n", - "\n", - " user_message = {\"role\": \"user\", \"content\": user_input}\n", - " conversation_history.append(user_message)\n", - "\n", - " response = client.inference.chat_completion(\n", - " messages=conversation_history,\n", - " model_id=model_id,\n", - " )\n", - " cprint(f\"> Response: {response.completion_message.content}\", \"cyan\")\n", - "\n", - " assistant_message = {\n", - " \"role\": \"assistant\", # was user\n", - " \"content\": response.completion_message.content,\n", - " \"stop_reason\": response.completion_message.stop_reason,\n", - " }\n", - " conversation_history.append(assistant_message)\n", - "\n", - "\n", - "chat_loop()\n" - ] - }, - { - "cell_type": "markdown", - "id": "72e5111e", - "metadata": { - "id": "72e5111e" - }, - "source": [ - "Here is an example for you to try a conversation yourself.\n", - "Remember to type `quit` or `exit` after you are done chatting." - ] - }, - { - "cell_type": "code", - "execution_count": 35, - "id": "9496f75c", - "metadata": { - "colab": { - "base_uri": "https://localhost:8080/" - }, - "id": "9496f75c", - "outputId": "7d93a4cf-a5d4-4741-b6eb-6bce3a27ff66" - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "\u001b[36m> Response: Hello! How are you today? Is there something I can help you with or would you like to chat?\u001b[0m\n", - "\u001b[33mEnding conversation. Goodbye!\u001b[0m\n" - ] - } - ], - "source": [ - "# NBVAL_SKIP\n", - "from termcolor import cprint\n", - "\n", - "def chat_loop():\n", - " conversation_history = []\n", - " while True:\n", - " user_input = input(\"User> \")\n", - " if user_input.lower() in [\"exit\", \"quit\", \"bye\"]:\n", - " cprint(\"Ending conversation. Goodbye!\", \"yellow\")\n", - " break\n", - "\n", - " user_message = {\"role\": \"user\", \"content\": user_input}\n", - " conversation_history.append(user_message)\n", - "\n", - " response = client.inference.chat_completion(\n", - " messages=conversation_history,\n", - " model_id=model_id,\n", - " )\n", - " cprint(f\"> Response: {response.completion_message.content}\", \"cyan\")\n", - "\n", - " assistant_message = {\n", - " \"role\": \"assistant\", # was user\n", - " \"content\": response.completion_message.content,\n", - " \"stop_reason\": response.completion_message.stop_reason,\n", - " }\n", - " conversation_history.append(assistant_message)\n", - "\n", - "\n", - "chat_loop()\n" - ] - } - ], - "metadata": { - "accelerator": "GPU", - "colab": { - "gpuType": "T4", - "provenance": [] - }, - "kernelspec": { - "display_name": "l4", - "language": "python", - "name": "python3" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.10.16" - } + "source": [ + "[![Open In Colab](https://colab.research.google.com/assets/colab-badge.svg)](https://colab.research.google.com/github/meta-llama/llama-stack/blob/main/docs/getting_started.ipynb)\n", + "\n", + "# Getting Started with Llama 4 in Llama Stack\n", + "\n", + "\"drawing\"\n", + "\n", + "[Llama Stack](https://github.com/meta-llama/llama-stack) defines and standardizes the set of core building blocks needed to bring generative AI applications to market. These building blocks are presented in the form of interoperable APIs with a broad set of Service Providers providing their implementations.\n", + "\n", + "Read more about the project here: https://llamastack.github.io/latest/\n", + "\n", + "In this guide, we will showcase how you can get started with using Llama 4 in Llama Stack.\n", + "\n", + "**💡 Quick Start Option:** If you want a simpler and faster way to test out Llama Stack, check out the [quick_start.ipynb](quick_start.ipynb) notebook instead. It provides a streamlined experience for getting up and running in just a few steps.\n" + ] }, - "nbformat": 4, - "nbformat_minor": 5 - } + { + "cell_type": "markdown", + "id": "4CV1Q19BDMVw", + "metadata": { + "id": "4CV1Q19BDMVw" + }, + "source": [ + "## 1. Getting started with Llama Stack" + ] + }, + { + "cell_type": "markdown", + "id": "K4AvfUAJZOeS", + "metadata": { + "id": "K4AvfUAJZOeS" + }, + "source": [ + "### 1.1. Create Llama API account\n", + "\n", + "In this showcase, we will use [Llama API](https://llama.developer.meta.com/) as the inference provider. So, you would first get an API key from Llama API if you don't have one already.\n", + "\n", + "\n", + "\n", + "> **Note:** Set the API Key in the Secrets of this notebook\n", + "\n" + ] + }, + { + "cell_type": "markdown", + "id": "oDUB7M_qe-Gs", + "metadata": { + "id": "oDUB7M_qe-Gs" + }, + "source": [ + "### 1.2. Setup and Running a Llama Stack server\n", + "\n", + "Llama Stack is architected as a collection of APIs that provide developers with the building blocks to build AI applications. \n", + "\n", + "Llama stack is typically available as a server with an endpoint that you can make calls to. Partners like Together and Fireworks offer their own Llama Stack compatible endpoints.\n", + "\n", + "In this showcase, we will start a Llama Stack server that is running locally.\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "J2kGed0R5PSf", + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "collapsed": true, + "id": "J2kGed0R5PSf", + "outputId": "2478ea60-8d35-48a1-b011-f233831740c5" + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Requirement already satisfied: uv in /opt/homebrew/Caskroom/miniconda/base/envs/l4/lib/python3.10/site-packages (0.6.12)\n", + "\u001b[2mUsing Python 3.10.16 environment at: /opt/homebrew/Caskroom/miniconda/base/envs/l4\u001b[0m\n", + "\u001b[2mAudited \u001b[1m1 package\u001b[0m \u001b[2min 83ms\u001b[0m\u001b[0m\n", + "Environment '/Users/erichuang/projects/internal-llama-stack/.venv' already exists, re-using it.\n", + "Virtual environment /Users/erichuang/projects/internal-llama-stack/.venv is already active\n", + "\u001b[2mUsing Python 3.11.11 environment at: /Users/erichuang/projects/internal-llama-stack/.venv\u001b[0m\n", + "\u001b[2mAudited \u001b[1m1 package\u001b[0m \u001b[2min 387ms\u001b[0m\u001b[0m\n", + "Installing pip dependencies\n", + "\u001b[2mUsing Python 3.11.11 environment at: /Users/erichuang/projects/internal-llama-stack/.venv\u001b[0m\n", + "\u001b[2K\u001b[2mResolved \u001b[1m123 packages\u001b[0m \u001b[2min 1.13s\u001b[0m\u001b[0m \u001b[0m\n", + "\u001b[2K\u001b[37m⠙\u001b[0m \u001b[2mPreparing packages...\u001b[0m (0/6) \n", + "\u001b[2K\u001b[1A\u001b[37m⠙\u001b[0m \u001b[2mPreparing packages...\u001b[0m (0/6)-----\u001b[0m\u001b[0m 0 B/9.53 KiB \u001b[1A\n", + "\u001b[2K\u001b[1A\u001b[37m⠙\u001b[0m \u001b[2mPreparing packages...\u001b[0m (0/6)-\u001b[2m\u001b[0m\u001b[0m 9.53 KiB/9.53 KiB \u001b[1A\n", + "\u001b[2mshellingham\u001b[0m \u001b[32m------------------------------\u001b[2m\u001b[0m\u001b[0m 9.53 KiB/9.53 KiB\n", + "\u001b[2K\u001b[2A\u001b[37m⠙\u001b[0m \u001b[2mPreparing packages...\u001b[0m (0/6)----\u001b[0m\u001b[0m 0 B/44.00 KiB \u001b[2A\n", + "\u001b[2mshellingham\u001b[0m \u001b[32m------------------------------\u001b[2m\u001b[0m\u001b[0m 9.53 KiB/9.53 KiB\n", + "\u001b[2K\u001b[2A\u001b[37m⠙\u001b[0m \u001b[2mPreparing packages...\u001b[0m (0/6)----\u001b[0m\u001b[0m 14.88 KiB/44.00 KiB \u001b[2A\n", + "\u001b[2mshellingham\u001b[0m \u001b[32m------------------------------\u001b[2m\u001b[0m\u001b[0m 9.53 KiB/9.53 KiB\n", + "\u001b[2mtabulate \u001b[0m \u001b[32m\u001b[2m------------------------------\u001b[0m\u001b[0m 0 B/34.43 KiB\n", + "\u001b[2K\u001b[3A\u001b[37m⠙\u001b[0m \u001b[2mPreparing packages...\u001b[0m (0/6)----\u001b[0m\u001b[0m 14.88 KiB/44.00 KiB \u001b[3A\n", + "\u001b[2mshellingham\u001b[0m \u001b[32m------------------------------\u001b[2m\u001b[0m\u001b[0m 9.53 KiB/9.53 KiB\n", + "\u001b[2mtabulate \u001b[0m \u001b[32m-------------\u001b[2m-----------------\u001b[0m\u001b[0m 14.83 KiB/34.43 KiB\n", + "\u001b[2K\u001b[3A\u001b[37m⠙\u001b[0m \u001b[2mPreparing packages...\u001b[0m (0/6)----\u001b[0m\u001b[0m 14.88 KiB/44.00 KiB \u001b[3A\n", + "\u001b[2meval-type-backport\u001b[0m \u001b[32m\u001b[2m------------------------------\u001b[0m\u001b[0m 0 B/5.69 KiB\n", + "\u001b[2mshellingham\u001b[0m \u001b[32m------------------------------\u001b[2m\u001b[0m\u001b[0m 9.53 KiB/9.53 KiB\n", + "\u001b[2mtabulate \u001b[0m \u001b[32m-------------\u001b[2m-----------------\u001b[0m\u001b[0m 14.83 KiB/34.43 KiB\n", + "\u001b[2K\u001b[4A\u001b[37m⠙\u001b[0m \u001b[2mPreparing packages...\u001b[0m (0/6)----\u001b[0m\u001b[0m 14.88 KiB/44.00 KiB \u001b[4A\n", + "\u001b[2meval-type-backport\u001b[0m \u001b[32m------------------------------\u001b[2m\u001b[0m\u001b[0m 5.69 KiB/5.69 KiB\n", + "\u001b[2mshellingham\u001b[0m \u001b[32m------------------------------\u001b[2m\u001b[0m\u001b[0m 9.53 KiB/9.53 KiB\n", + "\u001b[2mtabulate \u001b[0m \u001b[32m-------------\u001b[2m-----------------\u001b[0m\u001b[0m 14.83 KiB/34.43 KiB\n", + "\u001b[2K\u001b[4A\u001b[37m⠙\u001b[0m \u001b[2mPreparing packages...\u001b[0m (0/6)----\u001b[0m\u001b[0m 14.88 KiB/44.00 KiB \u001b[4A\n", + "\u001b[2meval-type-backport\u001b[0m \u001b[32m------------------------------\u001b[2m\u001b[0m\u001b[0m 5.69 KiB/5.69 KiB\n", + "\u001b[2mshellingham\u001b[0m \u001b[32m------------------------------\u001b[2m\u001b[0m\u001b[0m 9.53 KiB/9.53 KiB\n", + "\u001b[2mtabulate \u001b[0m \u001b[32m-------------\u001b[2m-----------------\u001b[0m\u001b[0m 14.83 KiB/34.43 KiB\n", + "\u001b[2mtyper \u001b[0m \u001b[32m-----------\u001b[2m-------------------\u001b[0m\u001b[0m 14.88 KiB/44.00 KiB\n", + "\u001b[2K\u001b[5A\u001b[37m⠙\u001b[0m \u001b[2mPreparing packages...\u001b[0m (0/6)----\u001b[0m\u001b[0m 0 B/85.81 KiB \u001b[5A\n", + "\u001b[2meval-type-backport\u001b[0m \u001b[32m------------------------------\u001b[2m\u001b[0m\u001b[0m 5.69 KiB/5.69 KiB\n", + "\u001b[2mshellingham\u001b[0m \u001b[32m------------------------------\u001b[2m\u001b[0m\u001b[0m 9.53 KiB/9.53 KiB\n", + "\u001b[2mtabulate \u001b[0m \u001b[32m-------------\u001b[2m-----------------\u001b[0m\u001b[0m 14.83 KiB/34.43 KiB\n", + "\u001b[2mtyper \u001b[0m \u001b[32m-----------\u001b[2m-------------------\u001b[0m\u001b[0m 14.88 KiB/44.00 KiB\n", + "\u001b[2K\u001b[5A\u001b[37m⠙\u001b[0m \u001b[2mPreparing packages...\u001b[0m (0/6)----\u001b[0m\u001b[0m 16.00 KiB/85.81 KiB \u001b[5A\n", + "\u001b[2meval-type-backport\u001b[0m \u001b[32m------------------------------\u001b[2m\u001b[0m\u001b[0m 5.69 KiB/5.69 KiB\n", + "\u001b[2mshellingham\u001b[0m \u001b[32m------------------------------\u001b[2m\u001b[0m\u001b[0m 9.53 KiB/9.53 KiB\n", + "\u001b[2mtabulate \u001b[0m \u001b[32m-------------\u001b[2m-----------------\u001b[0m\u001b[0m 14.83 KiB/34.43 KiB\n", + "\u001b[2mtyper \u001b[0m \u001b[32m-----------\u001b[2m-------------------\u001b[0m\u001b[0m 14.88 KiB/44.00 KiB\n", + "\u001b[2mtogether \u001b[0m \u001b[32m------\u001b[2m------------------------\u001b[0m\u001b[0m 16.00 KiB/85.81 KiB\n", + "\u001b[2K\u001b[6A\u001b[37m⠙\u001b[0m \u001b[2mPreparing packages...\u001b[0m (0/6)----\u001b[0m\u001b[0m 0 B/3.08 MiB \u001b[6A\n", + "\u001b[2meval-type-backport\u001b[0m \u001b[32m------------------------------\u001b[2m\u001b[0m\u001b[0m 5.69 KiB/5.69 KiB\n", + "\u001b[2mshellingham\u001b[0m \u001b[32m------------------------------\u001b[2m\u001b[0m\u001b[0m 9.53 KiB/9.53 KiB\n", + "\u001b[2mtabulate \u001b[0m \u001b[32m-------------\u001b[2m-----------------\u001b[0m\u001b[0m 14.83 KiB/34.43 KiB\n", + "\u001b[2mtyper \u001b[0m \u001b[32m-----------\u001b[2m-------------------\u001b[0m\u001b[0m 14.88 KiB/44.00 KiB\n", + "\u001b[2mtogether \u001b[0m \u001b[32m------\u001b[2m------------------------\u001b[0m\u001b[0m 16.00 KiB/85.81 KiB\n", + "\u001b[2K\u001b[6A\u001b[37m⠙\u001b[0m \u001b[2mPreparing packages...\u001b[0m (0/6)----\u001b[0m\u001b[0m 14.91 KiB/3.08 MiB \u001b[6A\n", + "\u001b[2meval-type-backport\u001b[0m \u001b[32m------------------------------\u001b[2m\u001b[0m\u001b[0m 5.69 KiB/5.69 KiB\n", + "\u001b[2mshellingham\u001b[0m \u001b[32m------------------------------\u001b[2m\u001b[0m\u001b[0m 9.53 KiB/9.53 KiB\n", + "\u001b[2mtabulate \u001b[0m \u001b[32m---------------------------\u001b[2m---\u001b[0m\u001b[0m 30.83 KiB/34.43 KiB\n", + "\u001b[2mtyper \u001b[0m \u001b[32m-----------\u001b[2m-------------------\u001b[0m\u001b[0m 14.88 KiB/44.00 KiB\n", + "\u001b[2mtogether \u001b[0m \u001b[32m------\u001b[2m------------------------\u001b[0m\u001b[0m 16.00 KiB/85.81 KiB\n", + "\u001b[2K\u001b[6A\u001b[37m⠙\u001b[0m \u001b[2mPreparing packages...\u001b[0m (0/6)----\u001b[0m\u001b[0m 14.91 KiB/3.08 MiB \u001b[6A\n", + "\u001b[2meval-type-backport\u001b[0m \u001b[32m------------------------------\u001b[2m\u001b[0m\u001b[0m 5.69 KiB/5.69 KiB\n", + "\u001b[2mshellingham\u001b[0m \u001b[32m------------------------------\u001b[2m\u001b[0m\u001b[0m 9.53 KiB/9.53 KiB\n", + "\u001b[2mtabulate \u001b[0m \u001b[32m------------------------------\u001b[2m\u001b[0m\u001b[0m 34.43 KiB/34.43 KiB\n", + "\u001b[2mtyper \u001b[0m \u001b[32m-----------\u001b[2m-------------------\u001b[0m\u001b[0m 14.88 KiB/44.00 KiB\n", + "\u001b[2mtogether \u001b[0m \u001b[32m------\u001b[2m------------------------\u001b[0m\u001b[0m 16.00 KiB/85.81 KiB\n", + "\u001b[2K\u001b[6A\u001b[37m⠙\u001b[0m \u001b[2mPreparing packages...\u001b[0m (0/6)----\u001b[0m\u001b[0m 14.91 KiB/3.08 MiB \u001b[6A\n", + "\u001b[2mshellingham\u001b[0m \u001b[32m------------------------------\u001b[2m\u001b[0m\u001b[0m 9.53 KiB/9.53 KiB\n", + "\u001b[2mtabulate \u001b[0m \u001b[32m------------------------------\u001b[2m\u001b[0m\u001b[0m 34.43 KiB/34.43 KiB\n", + "\u001b[2mtyper \u001b[0m \u001b[32m-----------\u001b[2m-------------------\u001b[0m\u001b[0m 14.88 KiB/44.00 KiB\n", + "\u001b[2mtogether \u001b[0m \u001b[32m------\u001b[2m------------------------\u001b[0m\u001b[0m 16.00 KiB/85.81 KiB\n", + "\u001b[2K\u001b[5A\u001b[37m⠙\u001b[0m \u001b[2mPreparing packages...\u001b[0m (0/6)----\u001b[0m\u001b[0m 14.91 KiB/3.08 MiB \u001b[5A\n", + "\u001b[2mshellingham\u001b[0m \u001b[32m------------------------------\u001b[2m\u001b[0m\u001b[0m 9.53 KiB/9.53 KiB\n", + "\u001b[2mtabulate \u001b[0m \u001b[32m------------------------------\u001b[2m\u001b[0m\u001b[0m 34.43 KiB/34.43 KiB\n", + "\u001b[2mtyper \u001b[0m \u001b[32m-----------\u001b[2m-------------------\u001b[0m\u001b[0m 14.88 KiB/44.00 KiB\n", + "\u001b[2mtogether \u001b[0m \u001b[32m------\u001b[2m------------------------\u001b[0m\u001b[0m 16.00 KiB/85.81 KiB\n", + "\u001b[2K\u001b[5A\u001b[37m⠙\u001b[0m \u001b[2mPreparing packages...\u001b[0m (0/6)----\u001b[0m\u001b[0m 30.91 KiB/3.08 MiB \u001b[5A\n", + "\u001b[2mshellingham\u001b[0m \u001b[32m------------------------------\u001b[2m\u001b[0m\u001b[0m 9.53 KiB/9.53 KiB\n", + "\u001b[2mtyper \u001b[0m \u001b[32m-----------\u001b[2m-------------------\u001b[0m\u001b[0m 14.88 KiB/44.00 KiB\n", + "\u001b[2mtogether \u001b[0m \u001b[32m------\u001b[2m------------------------\u001b[0m\u001b[0m 16.00 KiB/85.81 KiB\n", + "\u001b[2K\u001b[4A\u001b[37m⠙\u001b[0m \u001b[2mPreparing packages...\u001b[0m (0/6)----\u001b[0m\u001b[0m 30.91 KiB/3.08 MiB \u001b[4A\n", + "\u001b[2mshellingham\u001b[0m \u001b[32m------------------------------\u001b[2m\u001b[0m\u001b[0m 9.53 KiB/9.53 KiB\n", + "\u001b[2mtyper \u001b[0m \u001b[32m-----------\u001b[2m-------------------\u001b[0m\u001b[0m 14.88 KiB/44.00 KiB\n", + "\u001b[2mtogether \u001b[0m \u001b[32m------\u001b[2m------------------------\u001b[0m\u001b[0m 16.00 KiB/85.81 KiB\n", + "\u001b[2K\u001b[4A\u001b[37m⠙\u001b[0m \u001b[2mPreparing packages...\u001b[0m (0/6)----\u001b[0m\u001b[0m 46.91 KiB/3.08 MiB \u001b[4A\n", + "\u001b[2mshellingham\u001b[0m \u001b[32m------------------------------\u001b[2m\u001b[0m\u001b[0m 9.53 KiB/9.53 KiB\n", + "\u001b[2mtyper \u001b[0m \u001b[32m-----------\u001b[2m-------------------\u001b[0m\u001b[0m 14.88 KiB/44.00 KiB\n", + "\u001b[2mtogether \u001b[0m \u001b[32m------\u001b[2m------------------------\u001b[0m\u001b[0m 16.00 KiB/85.81 KiB\n", + "\u001b[2K\u001b[4A\u001b[37m⠙\u001b[0m \u001b[2mPreparing packages...\u001b[0m (0/6)----\u001b[0m\u001b[0m 62.91 KiB/3.08 MiB \u001b[4A\n", + "\u001b[2mshellingham\u001b[0m \u001b[32m------------------------------\u001b[2m\u001b[0m\u001b[0m 9.53 KiB/9.53 KiB\n", + "\u001b[2mtyper \u001b[0m \u001b[32m-----------\u001b[2m-------------------\u001b[0m\u001b[0m 14.88 KiB/44.00 KiB\n", + "\u001b[2mtogether \u001b[0m \u001b[32m------\u001b[2m------------------------\u001b[0m\u001b[0m 16.00 KiB/85.81 KiB\n", + "\u001b[2K\u001b[4A\u001b[37m⠙\u001b[0m \u001b[2mPreparing packages...\u001b[0m (0/6)----\u001b[0m\u001b[0m 78.91 KiB/3.08 MiB \u001b[4A\n", + "\u001b[2mshellingham\u001b[0m \u001b[32m------------------------------\u001b[2m\u001b[0m\u001b[0m 9.53 KiB/9.53 KiB\n", + "\u001b[2mtyper \u001b[0m \u001b[32m-----------\u001b[2m-------------------\u001b[0m\u001b[0m 14.88 KiB/44.00 KiB\n", + "\u001b[2mtogether \u001b[0m \u001b[32m------\u001b[2m------------------------\u001b[0m\u001b[0m 16.00 KiB/85.81 KiB\n", + "\u001b[2K\u001b[4A\u001b[37m⠙\u001b[0m \u001b[2mPreparing packages...\u001b[0m (0/6)----\u001b[0m\u001b[0m 94.91 KiB/3.08 MiB \u001b[4A\n", + "\u001b[2mshellingham\u001b[0m \u001b[32m------------------------------\u001b[2m\u001b[0m\u001b[0m 9.53 KiB/9.53 KiB\n", + "\u001b[2mtyper \u001b[0m \u001b[32m-----------\u001b[2m-------------------\u001b[0m\u001b[0m 14.88 KiB/44.00 KiB\n", + "\u001b[2mtogether \u001b[0m \u001b[32m------------\u001b[2m------------------\u001b[0m\u001b[0m 32.00 KiB/85.81 KiB\n", + "\u001b[2K\u001b[4A\u001b[37m⠙\u001b[0m \u001b[2mPreparing packages...\u001b[0m (0/6)----\u001b[0m\u001b[0m 2.62 MiB/3.08 MiB \u001b[4A\n", + "\u001b[2mtyper \u001b[0m \u001b[32m----------------------\u001b[2m--------\u001b[0m\u001b[0m 30.88 KiB/44.00 KiB\n", + "\u001b[2mtogether \u001b[0m \u001b[32m------------\u001b[2m------------------\u001b[0m\u001b[0m 32.00 KiB/85.81 KiB\n", + "\u001b[2K\u001b[3A\u001b[37m⠹\u001b[0m \u001b[2mPreparing packages...\u001b[0m (3/6)----\u001b[0m\u001b[0m 2.62 MiB/3.08 MiB \u001b[3A\n", + "\u001b[2mtyper \u001b[0m \u001b[32m------------------------------\u001b[2m\u001b[0m\u001b[0m 44.00 KiB/44.00 KiB\n", + "\u001b[2mtogether \u001b[0m \u001b[32m------------\u001b[2m------------------\u001b[0m\u001b[0m 32.00 KiB/85.81 KiB\n", + "\u001b[2K\u001b[3A\u001b[37m⠹\u001b[0m \u001b[2mPreparing packages...\u001b[0m (3/6)----\u001b[0m\u001b[0m 2.62 MiB/3.08 MiB \u001b[3A\n", + "\u001b[2mtogether \u001b[0m \u001b[32m------------\u001b[2m------------------\u001b[0m\u001b[0m 32.00 KiB/85.81 KiB\n", + "\u001b[2K\u001b[2A\u001b[37m⠹\u001b[0m \u001b[2mPreparing packages...\u001b[0m (3/6)2m--\u001b[0m\u001b[0m 2.80 MiB/3.08 MiB \u001b[2A\n", + "\u001b[2mtogether \u001b[0m \u001b[32m-----------------\u001b[2m-------------\u001b[0m\u001b[0m 48.00 KiB/85.81 KiB\n", + "\u001b[2K\u001b[2A\u001b[37m⠹\u001b[0m \u001b[2mPreparing packages...\u001b[0m (3/6)2m--\u001b[0m\u001b[0m 2.81 MiB/3.08 MiB \u001b[2A\n", + "\u001b[2K\u001b[1A\u001b[37m⠹\u001b[0m \u001b[2mPreparing packages...\u001b[0m (3/6)----\u001b[0m\u001b[0m 48.00 KiB/85.81 KiB \u001b[1A\n", + "\u001b[2K\u001b[1A\u001b[37m⠹\u001b[0m \u001b[2mPreparing packages...\u001b[0m (3/6)2m--\u001b[0m\u001b[0m 80.00 KiB/85.81 KiB \u001b[1A\n", + "\u001b[2K\u001b[2mPrepared \u001b[1m6 packages\u001b[0m \u001b[2min 365ms\u001b[0m\u001b[0m \u001b[1A\n", + "\u001b[2K\u001b[2mInstalled \u001b[1m6 packages\u001b[0m \u001b[2min 50ms\u001b[0m\u001b[0m \u001b[0m\n", + " \u001b[32m+\u001b[39m \u001b[1meval-type-backport\u001b[0m\u001b[2m==0.2.2\u001b[0m\n", + " \u001b[32m+\u001b[39m \u001b[1mfaiss-cpu\u001b[0m\u001b[2m==1.10.0\u001b[0m\n", + " \u001b[32m+\u001b[39m \u001b[1mshellingham\u001b[0m\u001b[2m==1.5.4\u001b[0m\n", + " \u001b[32m+\u001b[39m \u001b[1mtabulate\u001b[0m\u001b[2m==0.9.0\u001b[0m\n", + " \u001b[32m+\u001b[39m \u001b[1mtogether\u001b[0m\u001b[2m==1.5.5\u001b[0m\n", + " \u001b[32m+\u001b[39m \u001b[1mtyper\u001b[0m\u001b[2m==0.15.2\u001b[0m\n", + "torch torchvision --index-url https://download.pytorch.org/whl/cpu\n", + "\u001b[2mUsing Python 3.11.11 environment at: /Users/erichuang/projects/internal-llama-stack/.venv\u001b[0m\n", + "\u001b[2mAudited \u001b[1m2 packages\u001b[0m \u001b[2min 32ms\u001b[0m\u001b[0m\n", + "sentence-transformers --no-deps\n", + "\u001b[2mUsing Python 3.11.11 environment at: /Users/erichuang/projects/internal-llama-stack/.venv\u001b[0m\n", + "\u001b[2mAudited \u001b[1m1 package\u001b[0m \u001b[2min 63ms\u001b[0m\u001b[0m\n", + "\u001b[32mBuild Successful!\u001b[0m\n" + ] + } + ], + "source": [ + "import os\n", + "import subprocess\n", + "import time\n", + "\n", + "!pip install uv\n", + "!uv pip install requests\n", + "\n", + "if \"UV_SYSTEM_PYTHON\" in os.environ:\n", + " del os.environ[\"UV_SYSTEM_PYTHON\"]\n", + "\n", + "# this command installs all the dependencies needed for the llama stack server\n", + "!uv run --with llama-stack llama stack build --distro llama_api --image-type venv\n", + "\n", + "def run_llama_stack_server_background():\n", + " log_file = open(\"llama_stack_server.log\", \"w\")\n", + " process = subprocess.Popen(\n", + " \"uv run --with llama-stack llama stack run llama_api --image-type venv\",\n", + " shell=True,\n", + " stdout=log_file,\n", + " stderr=log_file,\n", + " text=True\n", + " )\n", + "\n", + " print(f\"Starting Llama Stack server with PID: {process.pid}\")\n", + " return process\n", + "\n", + "def wait_for_server_to_start():\n", + " import requests\n", + " from requests.exceptions import ConnectionError\n", + " import time\n", + "\n", + " url = \"http://0.0.0.0:8321/v1/health\"\n", + " max_retries = 30\n", + " retry_interval = 1\n", + "\n", + " print(\"Waiting for server to start\", end=\"\")\n", + " for _ in range(max_retries):\n", + " try:\n", + " response = requests.get(url)\n", + " if response.status_code == 200:\n", + " print(\"\\nServer is ready!\")\n", + " return True\n", + " except ConnectionError:\n", + " print(\".\", end=\"\", flush=True)\n", + " time.sleep(retry_interval)\n", + "\n", + " print(\"\\nServer failed to start after\", max_retries * retry_interval, \"seconds\")\n", + " return False\n", + "\n", + "\n", + "# use this helper if needed to kill the server\n", + "def kill_llama_stack_server():\n", + " # Kill any existing llama stack server processes\n", + " os.system(\"ps aux | grep -v grep | grep llama_stack.core.server.server | awk '{print $2}' | xargs kill -9\")\n" + ] + }, + { + "cell_type": "markdown", + "id": "c40e9efd", + "metadata": {}, + "source": [ + "### 1.3 Starting the Llama Stack Server" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "f779283d", + "metadata": {}, + "outputs": [], + "source": [ + "server_process = run_llama_stack_server_background()\n", + "assert wait_for_server_to_start()" + ] + }, + { + "cell_type": "markdown", + "id": "90eb721b", + "metadata": {}, + "source": [ + "### 1.4 Install and Configure the Client\n", + "\n", + "Now that we have our Llama Stack server running locally, we need to install the client package to interact with it. The `llama-stack-client` provides a simple Python interface to access all the functionality of Llama Stack, including:\n", + "\n", + "- Chat Completions ( text and multimodal )\n", + "- Safety Shields \n", + "- Agent capabilities with tools like web search, RAG with Telemetry\n", + "- Evaluation and scoring frameworks\n", + "\n", + "The client handles all the API communication with our local server, making it easy to integrate Llama Stack's capabilities into your applications.\n", + "\n", + "In the next cells, we'll:\n", + "\n", + "1. Install the client package\n", + "2. Set up API keys for external services (Together AI and Tavily Search)\n", + "3. Initialize the client to connect to our local server\n" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "id": "2e68e32a", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\u001b[2mUsing Python 3.10.16 environment at: /opt/homebrew/Caskroom/miniconda/base/envs/stack\u001b[0m\n", + "\u001b[2K\u001b[2mResolved \u001b[1m31 packages\u001b[0m \u001b[2min 284ms\u001b[0m\u001b[0m \u001b[0m\n", + "\u001b[2mAudited \u001b[1m31 packages\u001b[0m \u001b[2min 0.04ms\u001b[0m\u001b[0m\n" + ] + } + ], + "source": [ + "!pip install -U llama-stack-client" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "E1UFuJC570Tk", + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 1000, + "referenced_widgets": [ + "75307e3dee604d30aa44713e6e293e64", + "5ce87402a79342af995df41ac3940d55", + "fbbcc19886cc43b38424fbb184162c61", + "29212208db6b432eb4f708cd64258954", + "50dd8994a4cf486ebbec5ffd4322992a", + "f9b768c703494dd198f2978aff4892e8", + "1231b9e4cab34c33a38bee63543f1e75", + "754deb3970604d48a522bc9f021ad945", + "f6ecca7a1a8340fbbe056235a2714fc3", + "ef4f63fe9d8f4683a9d20becb6e4e2cb", + "7508f10c13634e7aa682cfb29c48d9e7", + "26f1430ca7cb4ad5b1b8df1ffdbd32a9", + "7cd2d9c9ea7b4d70902ffaff33033078", + "101288236cff40b8bb9dbad80dbbc7ee", + "d5c9977838a249eeab6ef628279b8155", + "d032d1e7b4b54ba28ac83c1a12b23876", + "321fce57c158432abeae496ae8a947aa", + "3ebe00201bdb4e119e3b74f684a58345", + "0f8bab6b8ed04774b386fe952aae66f1", + "cfcb6e456c354d99be91f161552f3376", + "61bd0d490c0e4c04a331cf9ce6b7d38f", + "7d8653fca29f4df3a7487733ff9db60b", + "943f8fcb66614353a51f32f8344b6122", + "0e695245b97c4bbc85e349fda3dc07b9", + "bb0d168c41f540b8ae42239d3938483a", + "87700a80125348f28c4f249bdf8b0a8d", + "8902c3622da540e496ed5b1524bd01ca", + "90432ec1c24b4607a935c94e130cd68d", + "464147b149824f20afc727751a702fc7", + "67e37a088be64a2ba786ca923b1017dd", + "98786f52ef5345b0b9164b9c1f2b8e18", + "0e1b9910a77d4b7fa69cb8926e6547d7", + "0b276315be4345be83da1e03905c8495", + "e11f8c3891284e07bd2572257afd5e1b", + "ee18d96394994d01b49d5b03b3d9a019", + "844b06df5749441fab6f61656ce581a9", + "e1c6b9a20e074f17aeba976b24e80c65", + "c690da8daa1e4f9ea73bcacdd92e8a6d", + "d0b161ae25c441e8b3caf7a3d88c1b05", + "47cf4b6b835d43388576a2abf4cc54f8", + "03bbebd659e64b5d9c29a73570c34854", + "b68e5097d2504d2cbd7e19aa1aac3a04", + "22a665deff88477b9372c0350c4c572b", + "5e535ed2b83e496ab57b1c80b615ab0c", + "d9de065c7f81443e98ddf066c7b5bd54", + "1e836106837c4ac7a11b36e700c46b64", + "55591e8179084fcfa3a61c8bd8d09dcb", + "de1ef93c41364eda9b4b111231057348", + "23b0b2f4f82c4a21846e91d7cea91da5", + "9e4d0fbb51284a7487c495c7b95a293d", + "b0f8cf1f79e04b5fb47a810f2c81bd7e", + "0c359bc4c94c46acbc9094354a15c33d", + "59d0b59b6c2248508d0601ff13878d33", + "891cb726d45c4fef8f2c74a56df5532b", + "fa39189070334939aea5fa4a7de5ec8b", + "f0e107dd6d54483aa367da0e337a97cd", + "861a00796f55470e85d94733eeee9a5f", + "5459633eb6e94ec391d13fcf67425726", + "b7b7467ece304ffbbd352b9b96a03aad", + "9dece059f1204e29b106fca9e191ddb3", + "e2e49c25d6fc4592b317e94cfabc2e5e", + "76d37a48a73946bab2821f097cf2605f", + "8e81ae00681347cb906b392c3656a64a", + "74bedc38b7da4e8a83b0c892d7aa59b5", + "d1e67c28b4664e8098dce8f5e80b8779", + "abe6cf39b784436993fcbe92221c31a3", + "d021a18ab70b4c7e8aec43932a124c36", + "72e7c092fb054b7ea0dcd2782b5d8a7d", + "8b1ea80221174fae943d5c9f997dfb57", + "f8073d625f80415dbf712cee434f6e3a", + "5f6014ba13fa4a659b9eb1b5f83599a7", + "327ff8f5292d47afbfebd3beea187739", + "988cac4341b646079fc73719f3f88ad7", + "900a4dac08f540dfb35c29f63236a12c", + "1e6009b9b0684b8fbaa379ea96f111ee", + "541b9b4e74614e2cb855bb90f03df538", + "ff256b2275f740ed82bca4f43b4d6fd2", + "3703041a499c426bb427ee008c81cde5", + "4b22bbacb995425fb32a2368f3685a92", + "49a66eeb9ef74de5ab8904fd90eb7558", + "08f9d125018b41c582a0fa1e234315f9", + "736c770230644894b85dbc34bd8f1d52", + "b67cbbf32f844a19b219be612d5038c9", + "774b513d64524ac7823a2cf13efa8d41", + "1e56da93bcf64ff490416d2b66cd3dc0", + "b7e35038ce344110b785753b655130f5", + "5472af91737446f4a4a2d92a3f684a45", + "9fb4368802da4a5a8101ba200d98403a", + "2e713bcc372e48b2a006558db4d1df68", + "1a277abd5ea44253bc6894bef258b52b", + "b3eedd82e7da4ce8b3ded70e49a2afd0", + "6f5c18cb8002471f8b3764effee37324", + "3bebac362b344e8d9103c5011613f1ea", + "670905a55b19458da69f83c8bcd511d1", + "ff54451a48394faaaa9d8cdb690d0718", + "36b5bc19b2d0407f8ab28ff0da2ce12d", + "879e48d9a9e04183903d94ffe98313d2", + "abce503d70594c2ca9afdc47847c125b", + "028e291ee53947bbbbc4bfb68c695f5f", + "a530662719374c95a9bef12e59e28c85", + "bffc0f4b12f141398535990709fd4f2c", + "04804c74e1dd43449d5f758cf5d0ba5e", + "95a506c3007c4525b01ee4e1600d671b", + "a0d6b0caeb2340fe96c8f5569e3d3ae4", + "30798f87a8b848d783fdacd71af5dc04", + "07ce54c75e76488ba4019a20b3707061", + "f023175de68445f98a6b01bb40ccdc6d", + "7389b79a0ff44cd68c7866995d728023", + "8e2b70ffe4eb4974bd6393fcc1292267", + "13eee164dc534424acb9dc9ee37a9465", + "722a7fe16af3422585a20c651345cfa4", + "f5596c1c9c4d42f3bc171961f9582eff", + "85d66e615b5742e78657b1e60c75fc72", + "731c02dc5dd446c3b22765575148e256", + "254ce460ce244c99a5afe39d5d51f6b7", + "4cf1dc345ace4da59f978f661487f975", + "8f30fca71bf24e5ca26e17c2321f893c", + "dd85d37dd1d14c7ea4592f8e11b2d2c8", + "3cb06377e4454f009d6b2aa7aa6ff0a9", + "4502477db4d948e693012364c2dcb370", + "52fe404ec9c14db2a7279b4c154eef3d" + ] + }, + "collapsed": true, + "id": "E1UFuJC570Tk", + "outputId": "aebb69d4-c167-4de5-eb8a-dd19dd538f63" + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Not in Google Colab environment\n" + ] + } + ], + "source": [ + "import os\n", + "\n", + "try:\n", + " from google.colab import userdata\n", + " os.environ['LLAMA_API_KEY'] = userdata.get('LLAMA_API_KEY')\n", + "except ImportError:\n", + " print(\"Not in Google Colab environment\")\n", + "\n", + "for key in ['LLAMA_API_KEY']:\n", + " try:\n", + " api_key = os.environ[key]\n", + " if not api_key:\n", + " raise ValueError(f\"{key} environment variable is empty\")\n", + " except KeyError:\n", + " api_key = input(f\"{key} environment variable is not set. Please enter your API key: \")\n", + " os.environ[key] = api_key\n", + "\n", + "from llama_stack_client import LlamaStackClient\n", + "\n", + "client = LlamaStackClient(\n", + " base_url=\"http://0.0.0.0:8321\",\n", + " provider_data = {\n", + " \"llama_api_key\": os.environ['LLAMA_API_KEY']\n", + " }\n", + ")" + ] + }, + { + "cell_type": "markdown", + "id": "635a7a6f", + "metadata": {}, + "source": [ + "Now that we have completed the setup and configuration, let's start exploring the capabilities of Llama 4!\n", + "\n" + ] + }, + { + "cell_type": "markdown", + "id": "0fc75d73", + "metadata": {}, + "source": [ + "## 2. Running Llama 4" + ] + }, + { + "cell_type": "markdown", + "id": "7dacaa2d-94e9-42e9-82a0-73522dfc7010", + "metadata": { + "id": "7dacaa2d-94e9-42e9-82a0-73522dfc7010" + }, + "source": [ + "### 2.1 Check available models\n", + "\n", + "All the models available are programmatically accessible via the client." + ] + }, + { + "cell_type": "code", + "execution_count": 13, + "id": "ruO9jQna_t_S", + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "collapsed": true, + "id": "ruO9jQna_t_S", + "outputId": "ab1722a7-62ab-43bb-9cab-4e45bf62068a" + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Available models:\n", + "- Llama-3.1-8B-Instruct\n", + "- meta-llama/Llama-3.1-8B-Instruct\n", + "- Llama-3.2-11B-Vision-Instruct\n", + "- meta-llama/Llama-3.2-11B-Vision-Instruct\n", + "- Llama-3.3-70B-Instruct\n", + "- meta-llama/Llama-3.3-70B-Instruct\n", + "- Llama-4-Maverick-17B-128E-Instruct-FP8\n", + "- meta-llama/Llama-4-Maverick-17B-128E-Instruct\n", + "- all-MiniLM-L6-v2\n" + ] + } + ], + "source": [ + "from rich.pretty import pprint\n", + "\n", + "print(\"Available models:\")\n", + "for m in client.models.list():\n", + " print(f\"- {m.identifier}\")\n" + ] + }, + { + "cell_type": "markdown", + "id": "86366383", + "metadata": { + "id": "86366383" + }, + "source": [ + "### 2.2 Run a simple chat completion with one of the models\n", + "\n", + "We will test the client by doing a simple chat completion." + ] + }, + { + "cell_type": "code", + "execution_count": 14, + "id": "77c29dba", + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "77c29dba", + "outputId": "4857974f-4c70-4bc4-f90a-6ae49dc9c41e" + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Here is a two-sentence poem about a llama:\n", + "\n", + "With soft fur and gentle eyes, the llama roams with gentle surprise, a peaceful presence in the Andean skies. Its calm demeanor and soft humming song bring serenity to all who belong.\n" + ] + } + ], + "source": [ + "# TODO: update this with a vision model\n", + "model_id = \"meta-llama/Llama-4-Maverick-17B-128E-Instruct\"\n", + "\n", + "response = client.inference.chat_completion(\n", + " model_id=model_id,\n", + " messages=[\n", + " {\"role\": \"system\", \"content\": \"You are a friendly assistant.\"},\n", + " {\"role\": \"user\", \"content\": \"Write a two-sentence poem about llama.\"},\n", + " ],\n", + ")\n", + "\n", + "print(response.completion_message.content)\n" + ] + }, + { + "cell_type": "markdown", + "id": "7737cd41", + "metadata": {}, + "source": [ + "### 2.3 Running multimodal inference" + ] + }, + { + "cell_type": "code", + "execution_count": 15, + "id": "e7b1baa7", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + " % Total % Received % Xferd Average Speed Time Time Time Current\n", + " Dload Upload Total Spent Left Speed\n", + "100 275k 100 275k 0 0 847k 0 --:--:-- --:--:-- --:--:-- 845k--:--:-- --:--:-- 0\n" + ] + }, + { + "data": { + "image/jpeg": "/9j/4AAQSkZJRgABAQAAAQABAAD/4QmWaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wLwA8P3hwYWNrZXQgYmVnaW49Iu+7vyIgaWQ9Ilc1TTBNcENlaGlIenJlU3pOVGN6a2M5ZCI/PiA8eDp4bXBtZXRhIHhtbG5zOng9ImFkb2JlOm5zOm1ldGEvIiB4OnhtcHRrPSJYTVAgQ29yZSA0LjQuMC1FeGl2MiI+IDxyZGY6UkRGIHhtbG5zOnJkZj0iaHR0cDovL3d3dy53My5vcmcvMTk5OS8wMi8yMi1yZGYtc3ludGF4LW5zIyI+IDxyZGY6RGVzY3JpcHRpb24gcmRmOmFib3V0PSIiIHhtbG5zOmlwdGNFeHQ9Imh0dHA6Ly9pcHRjLm9yZy9zdGQvSXB0YzR4bXBFeHQvMjAwOC0wMi0yOS8iIGlwdGNFeHQ6RGlnaXRhbFNvdXJjZVR5cGU9InRyYWluZWRBbGdvcml0aG1pY01lZGlhIi8+IDwvcmRmOlJERj4gPC94OnhtcG1ldGE+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPD94cGFja2V0IGVuZD0idyI/Pv/bAEMAAgEBAQEBAgEBAQICAgICBAMCAgICBQQEAwQGBQYGBgUGBgYHCQgGBwkHBgYICwgJCgoKCgoGCAsMCwoMCQoKCv/bAEMBAgICAgICBQMDBQoHBgcKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCv/AABEIAwADAAMBEQACEQEDEQH/xAAfAAABBQEBAQEBAQAAAAAAAAAAAQIDBAUGBwgJCgv/xAC1EAACAQMDAgQDBQUEBAAAAX0BAgMABBEFEiExQQYT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", + "text/plain": [ + "" + ] + }, + "execution_count": 15, + "metadata": { + "image/jpeg": { + "height": 256, + "width": 256 + } + }, + "output_type": "execute_result" + } + ], + "source": [ + "!curl -O https://raw.githubusercontent.com/meta-llama/llama-models/refs/heads/main/Llama_Repo.jpeg\n", + "\n", + "from IPython.display import Image\n", + "Image(\"Llama_Repo.jpeg\", width=256, height=256)" + ] + }, + { + "cell_type": "code", + "execution_count": 16, + "id": "e1450ecc", + "metadata": {}, + "outputs": [], + "source": [ + "import base64\n", + "def encode_image(image_path):\n", + " with open(image_path, \"rb\") as image_file:\n", + " base64_string = base64.b64encode(image_file.read()).decode(\"utf-8\")\n", + " base64_url = f\"data:image/png;base64,{base64_string}\"\n", + " return base64_url" + ] + }, + { + "cell_type": "code", + "execution_count": 18, + "id": "d7914894", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "The image features three llamas, each with a distinct color. The llama on the left is white, the middle one is purple, and the one on the right is also white but wears a blue party hat.\n", + "\n", + "To determine the number of different colors present, we can count the unique hues:\n", + "\n", + "1. White (two llamas)\n", + "2. Purple (one llama)\n", + "3. Blue (party hat)\n", + "\n", + "Therefore, there are 3 different colors visible in the image: white, purple, and blue.\n" + ] + } + ], + "source": [ + "response = client.inference.chat_completion(\n", + " messages=[\n", + " {\n", + " \"role\": \"user\",\n", + " \"content\": [\n", + " {\n", + " \"type\": \"image\",\n", + " \"image\": {\n", + " \"url\": {\n", + " \"uri\": encode_image(\"Llama_Repo.jpeg\")\n", + " }\n", + " }\n", + " },\n", + " {\n", + " \"type\": \"text\",\n", + " \"text\": \"How many different colors are those llamas? What are those colors?\",\n", + " }\n", + " ]\n", + " }\n", + " ],\n", + " model_id=model_id,\n", + " stream=False,\n", + ")\n", + "\n", + "print(response.completion_message.content)" + ] + }, + { + "cell_type": "markdown", + "id": "8cf0d555", + "metadata": { + "id": "8cf0d555" + }, + "source": [ + "### 2.4 Have a conversation\n", + "\n", + "Maintaining a conversation history allows the model to retain context from previous interactions. Use a list to accumulate messages, enabling continuity throughout the chat session." + ] + }, + { + "cell_type": "code", + "execution_count": 19, + "id": "3fdf9df6", + "metadata": { + "id": "3fdf9df6" + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\u001b[36m> Response: The most famous Prime Minister of England during World War 2 was Winston Churchill. He served as the Prime Minister of the United Kingdom from 1940 to 1945, and again from 1951 to 1955. Churchill is widely regarded as one of the greatest wartime leaders in history, known for his leadership, oratory skills, and unwavering resolve during the war.\n", + "\n", + "Churchill played a crucial role in rallying the British people during the war, and his speeches, such as the \"We shall fight on the beaches\" and \"Their finest hour\" speeches, are still remembered and celebrated today. He worked closely with other Allied leaders, including US President Franklin D. Roosevelt and Soviet leader Joseph Stalin, to coordinate the war effort and ultimately secure the defeat of Nazi Germany.\n", + "\n", + "Churchill's leadership and legacy have endured long after the war, and he remains one of the most iconic and influential figures in British history.\u001b[0m\n", + "\u001b[36m> Response: Winston Churchill was known for his many memorable quotes, but one of his most famous is:\n", + "\n", + "**\"We shall fight on the beaches, we shall fight on the landing grounds, we shall fight in the fields and in the streets, we shall fight in the hills; we shall never surrender.\"**\n", + "\n", + "This quote is from his speech to the House of Commons on June 4, 1940, during the early stages of World War II, when Nazi Germany was threatening to invade Britain. The speech is known as the \"We Shall Fight on the Beaches\" speech, and it's considered one of the greatest speeches of the 20th century.\n", + "\n", + "However, if I had to pick a single, even more concise quote, it would be:\n", + "\n", + "**\"Blood, toil, tears, and sweat.\"**\n", + "\n", + "This was the opening phrase of his first speech as Prime Minister to the House of Commons on May 13, 1940, in which he said:\n", + "\n", + "\"I say to the House as I said to those who have joined this Government, I have nothing to offer but blood, toil, tears, and sweat. We have before us an ordeal of the most grievous kind.\"\n", + "\n", + "This quote has become synonymous with Churchill's leadership and resolve during the war.\u001b[0m\n" + ] + } + ], + "source": [ + "from termcolor import cprint\n", + "\n", + "questions = [\n", + " \"Who was the most famous PM of England during world war 2 ?\",\n", + " \"What was his most famous quote ?\"\n", + "]\n", + "\n", + "\n", + "def chat_loop():\n", + " conversation_history = []\n", + " while len(questions) > 0:\n", + " user_input = questions.pop(0)\n", + " if user_input.lower() in [\"exit\", \"quit\", \"bye\"]:\n", + " cprint(\"Ending conversation. Goodbye!\", \"yellow\")\n", + " break\n", + "\n", + " user_message = {\"role\": \"user\", \"content\": user_input}\n", + " conversation_history.append(user_message)\n", + "\n", + " response = client.inference.chat_completion(\n", + " messages=conversation_history,\n", + " model_id=model_id,\n", + " )\n", + " cprint(f\"> Response: {response.completion_message.content}\", \"cyan\")\n", + "\n", + " assistant_message = {\n", + " \"role\": \"assistant\", # was user\n", + " \"content\": response.completion_message.content,\n", + " \"stop_reason\": response.completion_message.stop_reason,\n", + " }\n", + " conversation_history.append(assistant_message)\n", + "\n", + "\n", + "chat_loop()\n" + ] + }, + { + "cell_type": "markdown", + "id": "72e5111e", + "metadata": { + "id": "72e5111e" + }, + "source": [ + "Here is an example for you to try a conversation yourself.\n", + "Remember to type `quit` or `exit` after you are done chatting." + ] + }, + { + "cell_type": "code", + "execution_count": 35, + "id": "9496f75c", + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "9496f75c", + "outputId": "7d93a4cf-a5d4-4741-b6eb-6bce3a27ff66" + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\u001b[36m> Response: Hello! How are you today? Is there something I can help you with or would you like to chat?\u001b[0m\n", + "\u001b[33mEnding conversation. Goodbye!\u001b[0m\n" + ] + } + ], + "source": [ + "# NBVAL_SKIP\n", + "from termcolor import cprint\n", + "\n", + "def chat_loop():\n", + " conversation_history = []\n", + " while True:\n", + " user_input = input(\"User> \")\n", + " if user_input.lower() in [\"exit\", \"quit\", \"bye\"]:\n", + " cprint(\"Ending conversation. Goodbye!\", \"yellow\")\n", + " break\n", + "\n", + " user_message = {\"role\": \"user\", \"content\": user_input}\n", + " conversation_history.append(user_message)\n", + "\n", + " response = client.inference.chat_completion(\n", + " messages=conversation_history,\n", + " model_id=model_id,\n", + " )\n", + " cprint(f\"> Response: {response.completion_message.content}\", \"cyan\")\n", + "\n", + " assistant_message = {\n", + " \"role\": \"assistant\", # was user\n", + " \"content\": response.completion_message.content,\n", + " \"stop_reason\": response.completion_message.stop_reason,\n", + " }\n", + " conversation_history.append(assistant_message)\n", + "\n", + "\n", + "chat_loop()\n" + ] + } + ], + "metadata": { + "accelerator": "GPU", + "colab": { + "gpuType": "T4", + "provenance": [] + }, + "kernelspec": { + "display_name": "l4", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.10.16" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/docs/notebooks/Alpha_Llama_Stack_Post_Training.ipynb b/docs/notebooks/Alpha_Llama_Stack_Post_Training.ipynb index 9b1893f9d..554dc5759 100644 --- a/docs/notebooks/Alpha_Llama_Stack_Post_Training.ipynb +++ b/docs/notebooks/Alpha_Llama_Stack_Post_Training.ipynb @@ -14,7 +14,7 @@ "We will also showcase how to leverage existing Llama stack [inference APIs](https://github.com/meta-llama/llama-stack/blob/main/llama_stack/apis/inference/inference.py) (ollama as provider) to get the new model's output and the [eval APIs](https://github.com/meta-llama/llama-stack/blob/main/llama_stack/apis/eval/eval.py) to help you better measure the new model performance. We hope the flywheel of post-training -> eval -> inference can greatly empower agentic apps development.\n", "\n", "\n", - "- Read more about Llama Stack: https://llama-stack.readthedocs.io/en/latest/introduction/index.html\n", + "- Read more about Llama Stack: https://llamastack.github.io/latest/index.html\n", "- Read more about post training APIs definition: https://github.com/meta-llama/llama-stack/blob/main/llama_stack/apis/post_training/post_training.py\n", "\n", "\n", @@ -3632,7 +3632,7 @@ }, "source": [ "#### 1.2. Kick-off eval job\n", - "- More details on Llama-stack eval: https://llama-stack.readthedocs.io/en/latest/benchmark_evaluations/index.html\n", + "- More details on Llama-stack eval: https://llamastack.github.io/latest/references/evals_reference/index.html\n", " - Define an EvalCandidate\n", " - Run evaluate on datasets (we choose brainstrust's answer-similarity as scoring function with OpenAI's model as judge model)\n", "\n", diff --git a/docs/notebooks/Llama_Stack_Benchmark_Evals.ipynb b/docs/notebooks/Llama_Stack_Benchmark_Evals.ipynb index 6e7d37cf2..2acb79e5f 100644 --- a/docs/notebooks/Llama_Stack_Benchmark_Evals.ipynb +++ b/docs/notebooks/Llama_Stack_Benchmark_Evals.ipynb @@ -12,7 +12,7 @@ "\n", "This notebook will walk you through the main sets of APIs we offer with Llama Stack for supporting running benchmark evaluations of your with working examples to explore the possibilities that Llama Stack opens up for you.\n", "\n", - "Read more about Llama Stack: https://llama-stack.readthedocs.io/en/latest/index.html" + "Read more about Llama Stack: https://llamastack.github.io/latest/index.html" ] }, { diff --git a/docs/quick_start.ipynb b/docs/quick_start.ipynb index 757824578..c194a901d 100644 --- a/docs/quick_start.ipynb +++ b/docs/quick_start.ipynb @@ -11,7 +11,7 @@ "\n", "# Llama Stack - Building AI Applications\n", "\n", - "\"drawing\"\n", + "\"drawing\"\n", "\n", "Get started with Llama Stack in minutes!\n", "\n", @@ -138,7 +138,7 @@ }, "outputs": [], "source": [ - "import os \n", + "import os\n", "import subprocess\n", "\n", "if \"UV_SYSTEM_PYTHON\" in os.environ:\n", @@ -150,13 +150,13 @@ "def run_llama_stack_server_background():\n", " log_file = open(\"llama_stack_server.log\", \"w\")\n", " process = subprocess.Popen(\n", - " f\"OLLAMA_URL=http://localhost:11434 uv run --with llama-stack llama stack run starter --image-type venv", + " f\"OLLAMA_URL=http://localhost:11434 uv run --with llama-stack llama stack run starter --image-type venv\n", " shell=True,\n", " stdout=log_file,\n", " stderr=log_file,\n", " text=True\n", " )\n", - " \n", + "\n", " print(f\"Starting Llama Stack server with PID: {process.pid}\")\n", " return process\n", "\n", @@ -164,11 +164,11 @@ " import requests\n", " from requests.exceptions import ConnectionError\n", " import time\n", - " \n", + "\n", " url = \"http://0.0.0.0:8321/v1/health\"\n", " max_retries = 30\n", " retry_interval = 1\n", - " \n", + "\n", " print(\"Waiting for server to start\", end=\"\")\n", " for _ in range(max_retries):\n", " try:\n", @@ -179,12 +179,12 @@ " except ConnectionError:\n", " print(\".\", end=\"\", flush=True)\n", " time.sleep(retry_interval)\n", - " \n", + "\n", " print(\"\\nServer failed to start after\", max_retries * retry_interval, \"seconds\")\n", " return False\n", "\n", "\n", - "# use this helper if needed to kill the server \n", + "# use this helper if needed to kill the server\n", "def kill_llama_stack_server():\n", " # Kill any existing llama stack server processes\n", " os.system(\"ps aux | grep -v grep | grep llama_stack.core.server.server | awk '{print $2}' | xargs kill -9\")\n" diff --git a/docs/zero_to_hero_guide/00_Inference101.ipynb b/docs/zero_to_hero_guide/00_Inference101.ipynb index f8b0cc1a2..0da3b702c 100644 --- a/docs/zero_to_hero_guide/00_Inference101.ipynb +++ b/docs/zero_to_hero_guide/00_Inference101.ipynb @@ -9,7 +9,7 @@ "\n", "This document provides instructions on how to use Llama Stack's `chat_completion` function for generating text using the `Llama3.2-3B-Instruct` model. \n", "\n", - "Before you begin, please ensure Llama Stack is installed and set up by following the [Getting Started Guide](https://llama-stack.readthedocs.io/en/latest/getting_started/index.html).\n", + "Before you begin, please ensure Llama Stack is installed and set up by following the [Getting Started Guide](https://llamastack.github.io/latest/getting_started/index.html).\n", "\n", "\n", "### Table of Contents\n", diff --git a/docs/zero_to_hero_guide/01_Local_Cloud_Inference101.ipynb b/docs/zero_to_hero_guide/01_Local_Cloud_Inference101.ipynb index 4f6ca4080..dc56eee69 100644 --- a/docs/zero_to_hero_guide/01_Local_Cloud_Inference101.ipynb +++ b/docs/zero_to_hero_guide/01_Local_Cloud_Inference101.ipynb @@ -10,7 +10,7 @@ "This guide provides a streamlined setup to switch between local and cloud clients for text generation with Llama Stack’s `chat_completion` API. This setup enables automatic fallback to a cloud instance if the local client is unavailable.\n", "\n", "### Prerequisites\n", - "Before you begin, please ensure Llama Stack is installed and the distribution is set up by following the [Getting Started Guide](https://llama-stack.readthedocs.io/en/latest/). You will need to run two distributions, a local and a cloud distribution, for this demo to work.\n", + "Before you begin, please ensure Llama Stack is installed and the distribution is set up by following the [Getting Started Guide](https://llamastack.github.io/latest/getting_started/index.html). You will need to run two distributions, a local and a cloud distribution, for this demo to work.\n", "\n", "### Implementation" ] diff --git a/docs/zero_to_hero_guide/02_Prompt_Engineering101.ipynb b/docs/zero_to_hero_guide/02_Prompt_Engineering101.ipynb index f3566eeb3..bfc1d8067 100644 --- a/docs/zero_to_hero_guide/02_Prompt_Engineering101.ipynb +++ b/docs/zero_to_hero_guide/02_Prompt_Engineering101.ipynb @@ -11,7 +11,7 @@ "\n", "This interactive guide covers prompt engineering & best practices with Llama 3.2 and Llama Stack.\n", "\n", - "Before you begin, please ensure Llama Stack is installed and set up by following the [Getting Started Guide](https://llama-stack.readthedocs.io/en/latest/getting_started/index.html)." + "Before you begin, please ensure Llama Stack is installed and set up by following the [Getting Started Guide](https://llamastack.github.io/latest/getting_started/index.html)." ] }, { diff --git a/docs/zero_to_hero_guide/03_Image_Chat101.ipynb b/docs/zero_to_hero_guide/03_Image_Chat101.ipynb index 44a365b4a..dd866061f 100644 --- a/docs/zero_to_hero_guide/03_Image_Chat101.ipynb +++ b/docs/zero_to_hero_guide/03_Image_Chat101.ipynb @@ -7,7 +7,7 @@ "source": [ "## Getting Started with LlamaStack Vision API\n", "\n", - "Before you begin, please ensure Llama Stack is installed and set up by following the [Getting Started Guide](https://llama-stack.readthedocs.io/en/latest/getting_started/index.html).\n", + "Before you begin, please ensure Llama Stack is installed and set up by following the [Getting Started Guide](https://llamastack.github.io/latest/getting_started/index.html).\n", "\n", "Let's import the necessary packages" ] diff --git a/docs/zero_to_hero_guide/05_Memory101.ipynb b/docs/zero_to_hero_guide/05_Memory101.ipynb index 761c5210a..80507fc2b 100644 --- a/docs/zero_to_hero_guide/05_Memory101.ipynb +++ b/docs/zero_to_hero_guide/05_Memory101.ipynb @@ -26,7 +26,7 @@ "A running instance of the Llama Stack server (we'll use localhost in \n", "this tutorial)\n", "\n", - "Before you begin, please ensure Llama Stack is installed and set up by following the [Getting Started Guide](https://llama-stack.readthedocs.io/en/latest/getting_started/index.html).\n", + "Before you begin, please ensure Llama Stack is installed and set up by following the [Getting Started Guide](https://llamastack.github.io/latest/getting_started/index.html).\n", "\n", "Let's start by installing the required packages:" ] @@ -268,7 +268,7 @@ " # Split document content into chunks of 512 characters\n", " content = doc.content\n", " chunk_size = 512\n", - " \n", + "\n", " # Create chunks of the specified size\n", " for i in range(0, len(content), chunk_size):\n", " chunk_content = content[i:i+chunk_size]\n", diff --git a/docs/zero_to_hero_guide/06_Safety101.ipynb b/docs/zero_to_hero_guide/06_Safety101.ipynb index 91b809621..041604326 100644 --- a/docs/zero_to_hero_guide/06_Safety101.ipynb +++ b/docs/zero_to_hero_guide/06_Safety101.ipynb @@ -6,7 +6,7 @@ "source": [ "## Safety API 101\n", "\n", - "This document talks about the Safety APIs in Llama Stack. Before you begin, please ensure Llama Stack is installed and set up by following the [Getting Started Guide](https://llama-stack.readthedocs.io/en/latest/getting_started/index.html).\n", + "This document talks about the Safety APIs in Llama Stack. Before you begin, please ensure Llama Stack is installed and set up by following the [Getting Started Guide](https://llamastack.github.io/latest/getting_started/index.html).\n", "\n", "As outlined in our [Responsible Use Guide](https://www.llama.com/docs/how-to-guides/responsible-use-guide-resources/), LLM apps should deploy appropriate system level safeguards to mitigate safety and security risks of LLM system, similar to the following diagram:\n", "\n", diff --git a/docs/zero_to_hero_guide/07_Agents101.ipynb b/docs/zero_to_hero_guide/07_Agents101.ipynb index 905799946..e2e96df87 100644 --- a/docs/zero_to_hero_guide/07_Agents101.ipynb +++ b/docs/zero_to_hero_guide/07_Agents101.ipynb @@ -6,7 +6,7 @@ "source": [ "## Agentic API 101\n", "\n", - "This document talks about the Agentic APIs in Llama Stack. Before you begin, please ensure Llama Stack is installed and set up by following the [Getting Started Guide](https://llama-stack.readthedocs.io/en/latest/getting_started/index.html).\n", + "This document talks about the Agentic APIs in Llama Stack. Before you begin, please ensure Llama Stack is installed and set up by following the [Getting Started Guide](https://llamastack.github.io/latest/getting_started/index.html).\n", "\n", "Starting Llama 3.1 you can build agentic applications capable of:\n", "\n", diff --git a/docs/zero_to_hero_guide/README.md b/docs/zero_to_hero_guide/README.md index 9f1f42b30..4ca9dec72 100644 --- a/docs/zero_to_hero_guide/README.md +++ b/docs/zero_to_hero_guide/README.md @@ -9,13 +9,18 @@ If you're looking for more specific topics, we have a [Zero to Hero Guide](#next > If you'd prefer not to set up a local server, explore our notebook on [tool calling with the Together API](Tool_Calling101_Using_Together_Llama_Stack_Server.ipynb). This notebook will show you how to leverage together.ai's Llama Stack Server API, allowing you to get started with Llama Stack without the need for a locally built and running server. ## Table of Contents -1. [Setup and run ollama](#setup-ollama) -2. [Install Dependencies and Set Up Environment](#install-dependencies-and-set-up-environment) -3. [Build, Configure, and Run Llama Stack](#build-configure-and-run-llama-stack) -4. [Test with llama-stack-client CLI](#test-with-llama-stack-client-cli) -5. [Test with curl](#test-with-curl) -6. [Test with Python](#test-with-python) -7. [Next Steps](#next-steps) +- [Llama Stack: from Zero to Hero](#llama-stack-from-zero-to-hero) + - [Table of Contents](#table-of-contents) + - [Setup ollama](#setup-ollama) + - [Install Dependencies and Set Up Environment](#install-dependencies-and-set-up-environment) + - [Build, Configure, and Run Llama Stack](#build-configure-and-run-llama-stack) + - [Test with `llama-stack-client` CLI](#test-with-llama-stack-client-cli) + - [Test with `curl`](#test-with-curl) + - [Test with Python](#test-with-python) + - [1. Create Python Script (`test_llama_stack.py`)](#1-create-python-script-test_llama_stackpy) + - [2. Create a Chat Completion Request in Python](#2-create-a-chat-completion-request-in-python) + - [3. Run the Python Script](#3-run-the-python-script) + - [Next Steps](#next-steps) --- @@ -242,7 +247,7 @@ This command initializes the model to interact with your local Llama Stack insta ## Next Steps **Explore Other Guides**: Dive deeper into specific topics by following these guides: -- [Understanding Distribution](https://llama-stack.readthedocs.io/en/latest/concepts/index.html#distributions) +- [Understanding Distribution](https://llamastack.github.io/latest/concepts/index.html#distributions) - [Inference 101](00_Inference101.ipynb) - [Local and Cloud Model Toggling 101](01_Local_Cloud_Inference101.ipynb) - [Prompt Engineering](02_Prompt_Engineering101.ipynb) @@ -259,7 +264,7 @@ This command initializes the model to interact with your local Llama Stack insta - [Swift SDK](https://github.com/meta-llama/llama-stack-client-swift) - [Kotlin SDK](https://github.com/meta-llama/llama-stack-client-kotlin) -**Advanced Configuration**: Learn how to customize your Llama Stack distribution by referring to the [Building a Llama Stack Distribution](https://llama-stack.readthedocs.io/en/latest/distributions/building_distro.html) guide. +**Advanced Configuration**: Learn how to customize your Llama Stack distribution by referring to the [Building a Llama Stack Distribution](https://llamastack.github.io/latest/distributions/building_distro.html) guide. **Explore Example Apps**: Check out [llama-stack-apps](https://github.com/meta-llama/llama-stack-apps/tree/main/examples) for example applications built using Llama Stack. diff --git a/llama_stack/core/start_stack.sh b/llama_stack/core/start_stack.sh index a3fc83265..4c6824b56 100755 --- a/llama_stack/core/start_stack.sh +++ b/llama_stack/core/start_stack.sh @@ -123,6 +123,6 @@ if [[ "$env_type" == "venv" ]]; then $other_args elif [[ "$env_type" == "container" ]]; then echo -e "${RED}Warning: Llama Stack no longer supports running Containers via the 'llama stack run' command.${NC}" - echo -e "Please refer to the documentation for more information: https://llama-stack.readthedocs.io/en/latest/distributions/building_distro.html#llama-stack-build" + echo -e "Please refer to the documentation for more information: https://llamastack.github.io/latest/distributions/building_distro.html#llama-stack-build" exit 1 fi diff --git a/llama_stack/core/ui/README.md b/llama_stack/core/ui/README.md index 05b4adc26..f1d85454b 100644 --- a/llama_stack/core/ui/README.md +++ b/llama_stack/core/ui/README.md @@ -6,7 +6,7 @@ ## Developer Setup -1. Start up Llama Stack API server. More details [here](https://llama-stack.readthedocs.io/en/latest/getting_started/index.html). +1. Start up Llama Stack API server. More details [here](https://llamastack.github.io/latest/getting_started/index.htmll). ``` llama stack build --distro together --image-type venv diff --git a/scripts/install.sh b/scripts/install.sh index e49924512..f6fbc259c 100755 --- a/scripts/install.sh +++ b/scripts/install.sh @@ -92,11 +92,11 @@ Options: -h, --help Show this help message For more information: - Documentation: https://llama-stack.readthedocs.io/ - GitHub: https://github.com/meta-llama/llama-stack + Documentation: https://llamastack.github.io/latest/ + GitHub: https://github.com/llamastack/llama-stack Report issues: - https://github.com/meta-llama/llama-stack/issues + https://github.com/llamastack/llama-stack/issues EOF } @@ -241,8 +241,8 @@ fi log "" log "🎉 Llama Stack is ready!" log "👉 API endpoint: http://localhost:${PORT}" -log "📖 Documentation: https://llama-stack.readthedocs.io/en/latest/references/index.html" +log "📖 Documentation: https://llamastack.github.io/latest/references/api_reference/index.html" log "💻 To access the llama stack CLI, exec into the container:" log " $ENGINE exec -ti llama-stack bash" -log "🐛 Report an issue @ https://github.com/meta-llama/llama-stack/issues if you think it's a bug" +log "🐛 Report an issue @ https://github.com/llamastack/llama-stack/issues if you think it's a bug" log "" From ac1414b57151a31645217f07fc182f22aabbe1c3 Mon Sep 17 00:00:00 2001 From: Jash Gulabrai <37194352+JashG@users.noreply.github.com> Date: Wed, 17 Sep 2025 14:45:15 -0400 Subject: [PATCH 106/150] fix: Set provider_id in NVIDIA notebook when registering dataset (#3472) # What does this PR do? When registering a dataset for NVIDIA, the DatasetsRoutingTable expects `nvidia` to be passed via the `provider_id` [here](https://github.com/llamastack/llama-stack/blob/main/llama_stack/core/routing_tables/datasets.py#L61). This PR fixes a notebook to correctly use `provider_id`. Closes #3308 ## Test Plan Manually execute the notebook steps to verify the dataset is registered. Co-authored-by: Jash Gulabrai --- .../nvidia/tool_calling/2_finetuning_and_inference.ipynb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/notebooks/nvidia/tool_calling/2_finetuning_and_inference.ipynb b/docs/notebooks/nvidia/tool_calling/2_finetuning_and_inference.ipynb index a80720a5f..0e69cafd5 100644 --- a/docs/notebooks/nvidia/tool_calling/2_finetuning_and_inference.ipynb +++ b/docs/notebooks/nvidia/tool_calling/2_finetuning_and_inference.ipynb @@ -373,7 +373,7 @@ " metadata={\n", " \"format\": \"json\",\n", " \"description\": \"Tool calling xLAM dataset in OpenAI ChatCompletions format\",\n", - " \"provider\": \"nvidia\"\n", + " \"provider_id\": \"nvidia\"\n", " }\n", ")\n", "print(response)" From 42c23b45f62ffbf47bf61d1d102bbc12da239a9b Mon Sep 17 00:00:00 2001 From: Doug Edgar Date: Wed, 17 Sep 2025 15:10:10 -0700 Subject: [PATCH 107/150] feat: update qdrant hash function from SHA-1 to SHA-256 (#3477) # What does this PR do? Updates the qdrant provider's convert_id function to use a FIPS-validated cryptographic hashing function, so that llama-stack is considered to be `Designed for FIPS`. The standard library `uuid.uuid5()` function uses SHA-1 under the hood, which is not FIPS-validated. This commit uses an approach similar to the one merged in #3423. Closes #3476. ## Test Plan Unit tests from scripts/unit-tests.sh were ran to verify that the tests pass. A small test script can display the data flow: ```python import hashlib import uuid # Input _id = "chunk_abc123" print(_id) # Step 1: Format and encode hash_input = f"qdrant_id:{_id}".encode() print(hash_input) # Result: b'qdrant_id:chunk_abc123' # Step 2: SHA-256 hash sha256_hash = hashlib.sha256(hash_input).hexdigest() print(sha256_hash) # Result: "184893a6eafeaac487cb9166351e8625b994d50f3456d8bc6cea32a014a27151" # Step 3: Create UUID from first 32 chars uuid_string = str(uuid.UUID(sha256_hash[:32])) print(uuid_string) # sha256_hash[:32] = "184893a6eafeaac487cb9166351e8625" # Final result: "184893a6-eafe-aac4-87cb-9166351e8625" ``` Signed-off-by: Doug Edgar --- llama_stack/providers/remote/vector_io/qdrant/qdrant.py | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/llama_stack/providers/remote/vector_io/qdrant/qdrant.py b/llama_stack/providers/remote/vector_io/qdrant/qdrant.py index 0a0faa23a..ec3869495 100644 --- a/llama_stack/providers/remote/vector_io/qdrant/qdrant.py +++ b/llama_stack/providers/remote/vector_io/qdrant/qdrant.py @@ -5,6 +5,7 @@ # the root directory of this source tree. import asyncio +import hashlib import uuid from typing import Any @@ -49,10 +50,13 @@ def convert_id(_id: str) -> str: Converts any string into a UUID string based on a seed. Qdrant accepts UUID strings and unsigned integers as point ID. - We use a seed to convert each string into a UUID string deterministically. + We use a SHA-256 hash to convert each string into a UUID string deterministically. This allows us to overwrite the same point with the original ID. """ - return str(uuid.uuid5(uuid.NAMESPACE_DNS, _id)) + hash_input = f"qdrant_id:{_id}".encode() + sha256_hash = hashlib.sha256(hash_input).hexdigest() + # Use the first 32 characters to create a valid UUID + return str(uuid.UUID(sha256_hash[:32])) class QdrantIndex(EmbeddingIndex): From 484214520298444d96dd54772aa4b457b26e9027 Mon Sep 17 00:00:00 2001 From: Akram Ben Aissi Date: Thu, 18 Sep 2025 10:13:55 +0100 Subject: [PATCH 108/150] feat: Add dynamic authentication token forwarding support for vLLM (#3388) # What does this PR do? *Add dynamic authentication token forwarding support for vLLM provider* This enables per-request authentication tokens for vLLM providers, supporting use cases like RAG operations where different requests may need different authentication tokens. The implementation follows the same pattern as other providers like Together AI, Fireworks, and Passthrough. - Add LiteLLMOpenAIMixin that manages the vllm_api_token properly Usage: - Static: VLLM_API_TOKEN env var or config.api_token - Dynamic: X-LlamaStack-Provider-Data header with vllm_api_token All existing functionality is preserved while adding new dynamic capabilities. ## Test Plan ``` curl -X POST "http://localhost:8000/v1/chat/completions" -H "Authorization: Bearer my-dynamic-token" \ -H "X-LlamaStack-Provider-Data: {\"vllm_api_token\": \"Bearer my-dynamic-token\", \"vllm_url\": \"http://dynamic-server:8000\"}" \ -H "Content-Type: application/json" \ -d '{"model": "llama-3.1-8b", "messages": [{"role": "user", "content": "Hello!"}]}' ``` --------- Signed-off-by: Akram Ben Aissi --- llama_stack/providers/registry/inference.py | 1 + .../remote/inference/vllm/__init__.py | 6 + .../providers/remote/inference/vllm/vllm.py | 68 +++++-- .../providers/inference/test_remote_vllm.py | 192 +++++++++++++++--- 4 files changed, 219 insertions(+), 48 deletions(-) diff --git a/llama_stack/providers/registry/inference.py b/llama_stack/providers/registry/inference.py index 64196152b..0eb4cf104 100644 --- a/llama_stack/providers/registry/inference.py +++ b/llama_stack/providers/registry/inference.py @@ -78,6 +78,7 @@ def available_providers() -> list[ProviderSpec]: pip_packages=[], module="llama_stack.providers.remote.inference.vllm", config_class="llama_stack.providers.remote.inference.vllm.VLLMInferenceAdapterConfig", + provider_data_validator="llama_stack.providers.remote.inference.vllm.VLLMProviderDataValidator", description="Remote vLLM inference provider for connecting to vLLM servers.", ), ), diff --git a/llama_stack/providers/remote/inference/vllm/__init__.py b/llama_stack/providers/remote/inference/vllm/__init__.py index e4322a6aa..1f196e507 100644 --- a/llama_stack/providers/remote/inference/vllm/__init__.py +++ b/llama_stack/providers/remote/inference/vllm/__init__.py @@ -4,9 +4,15 @@ # This source code is licensed under the terms described in the LICENSE file in # the root directory of this source tree. +from pydantic import BaseModel + from .config import VLLMInferenceAdapterConfig +class VLLMProviderDataValidator(BaseModel): + vllm_api_token: str | None = None + + async def get_adapter_impl(config: VLLMInferenceAdapterConfig, _deps): from .vllm import VLLMInferenceAdapter diff --git a/llama_stack/providers/remote/inference/vllm/vllm.py b/llama_stack/providers/remote/inference/vllm/vllm.py index 77f5d82af..b4079c39f 100644 --- a/llama_stack/providers/remote/inference/vllm/vllm.py +++ b/llama_stack/providers/remote/inference/vllm/vllm.py @@ -4,8 +4,9 @@ # This source code is licensed under the terms described in the LICENSE file in # the root directory of this source tree. import json -from collections.abc import AsyncGenerator +from collections.abc import AsyncGenerator, AsyncIterator from typing import Any +from urllib.parse import urljoin import httpx from openai import APIConnectionError, AsyncOpenAI @@ -55,6 +56,7 @@ from llama_stack.providers.datatypes import ( HealthStatus, ModelsProtocolPrivate, ) +from llama_stack.providers.utils.inference.litellm_openai_mixin import LiteLLMOpenAIMixin from llama_stack.providers.utils.inference.model_registry import ( ModelRegistryHelper, build_hf_repo_model_entry, @@ -62,6 +64,7 @@ from llama_stack.providers.utils.inference.model_registry import ( from llama_stack.providers.utils.inference.openai_compat import ( UnparseableToolCall, convert_message_to_openai_dict, + convert_openai_chat_completion_stream, convert_tool_call, get_sampling_options, process_chat_completion_stream_response, @@ -281,15 +284,31 @@ async def _process_vllm_chat_completion_stream_response( yield c -class VLLMInferenceAdapter(OpenAIMixin, Inference, ModelsProtocolPrivate): +class VLLMInferenceAdapter(OpenAIMixin, LiteLLMOpenAIMixin, Inference, ModelsProtocolPrivate): # automatically set by the resolver when instantiating the provider __provider_id__: str model_store: ModelStore | None = None def __init__(self, config: VLLMInferenceAdapterConfig) -> None: + LiteLLMOpenAIMixin.__init__( + self, + build_hf_repo_model_entries(), + litellm_provider_name="vllm", + api_key_from_config=config.api_token, + provider_data_api_key_field="vllm_api_token", + openai_compat_api_base=config.url, + ) self.register_helper = ModelRegistryHelper(build_hf_repo_model_entries()) self.config = config + get_api_key = LiteLLMOpenAIMixin.get_api_key + + def get_base_url(self) -> str: + """Get the base URL from config.""" + if not self.config.url: + raise ValueError("No base URL configured") + return self.config.url + async def initialize(self) -> None: if not self.config.url: raise ValueError( @@ -297,6 +316,7 @@ class VLLMInferenceAdapter(OpenAIMixin, Inference, ModelsProtocolPrivate): ) async def should_refresh_models(self) -> bool: + # Strictly respecting the refresh_models directive return self.config.refresh_models async def list_models(self) -> list[Model] | None: @@ -325,13 +345,19 @@ class VLLMInferenceAdapter(OpenAIMixin, Inference, ModelsProtocolPrivate): Performs a health check by verifying connectivity to the remote vLLM server. This method is used by the Provider API to verify that the service is running correctly. + Uses the unauthenticated /health endpoint. Returns: HealthResponse: A dictionary containing the health status. """ try: - _ = [m async for m in self.client.models.list()] # Ensure the client is initialized - return HealthResponse(status=HealthStatus.OK) + base_url = self.get_base_url() + health_url = urljoin(base_url, "health") + + async with httpx.AsyncClient() as client: + response = await client.get(health_url) + response.raise_for_status() + return HealthResponse(status=HealthStatus.OK) except Exception as e: return HealthResponse(status=HealthStatus.ERROR, message=f"Health check failed: {str(e)}") @@ -340,16 +366,10 @@ class VLLMInferenceAdapter(OpenAIMixin, Inference, ModelsProtocolPrivate): raise ValueError("Model store not set") return await self.model_store.get_model(model_id) - def get_api_key(self): - return self.config.api_token - - def get_base_url(self): - return self.config.url - def get_extra_client_params(self): return {"http_client": httpx.AsyncClient(verify=self.config.tls_verify)} - async def completion( + async def completion( # type: ignore[override] # Return type more specific than base class which is allows for both streaming and non-streaming responses. self, model_id: str, content: InterleavedContent, @@ -411,13 +431,14 @@ class VLLMInferenceAdapter(OpenAIMixin, Inference, ModelsProtocolPrivate): tool_config=tool_config, ) if stream: - return self._stream_chat_completion(request, self.client) + return self._stream_chat_completion_with_client(request, self.client) else: return await self._nonstream_chat_completion(request, self.client) async def _nonstream_chat_completion( self, request: ChatCompletionRequest, client: AsyncOpenAI ) -> ChatCompletionResponse: + assert self.client is not None params = await self._get_params(request) r = await client.chat.completions.create(**params) choice = r.choices[0] @@ -431,9 +452,24 @@ class VLLMInferenceAdapter(OpenAIMixin, Inference, ModelsProtocolPrivate): ) return result - async def _stream_chat_completion( + async def _stream_chat_completion(self, response: Any) -> AsyncIterator[ChatCompletionResponseStreamChunk]: + # This method is called from LiteLLMOpenAIMixin.chat_completion + # The response parameter contains the litellm response + # We need to convert it to our format + async def _stream_generator(): + async for chunk in response: + yield chunk + + async for chunk in convert_openai_chat_completion_stream( + _stream_generator(), enable_incremental_tool_calls=True + ): + yield chunk + + async def _stream_chat_completion_with_client( self, request: ChatCompletionRequest, client: AsyncOpenAI ) -> AsyncGenerator[ChatCompletionResponseStreamChunk, None]: + """Helper method for streaming with explicit client parameter.""" + assert self.client is not None params = await self._get_params(request) stream = await client.chat.completions.create(**params) @@ -445,7 +481,8 @@ class VLLMInferenceAdapter(OpenAIMixin, Inference, ModelsProtocolPrivate): yield chunk async def _nonstream_completion(self, request: CompletionRequest) -> CompletionResponse: - assert self.client is not None + if self.client is None: + raise RuntimeError("Client is not initialized") params = await self._get_params(request) r = await self.client.completions.create(**params) return process_completion_response(r) @@ -453,7 +490,8 @@ class VLLMInferenceAdapter(OpenAIMixin, Inference, ModelsProtocolPrivate): async def _stream_completion( self, request: CompletionRequest ) -> AsyncGenerator[CompletionResponseStreamChunk, None]: - assert self.client is not None + if self.client is None: + raise RuntimeError("Client is not initialized") params = await self._get_params(request) stream = await self.client.completions.create(**params) diff --git a/tests/unit/providers/inference/test_remote_vllm.py b/tests/unit/providers/inference/test_remote_vllm.py index 61b16b5d1..9545e0cf6 100644 --- a/tests/unit/providers/inference/test_remote_vllm.py +++ b/tests/unit/providers/inference/test_remote_vllm.py @@ -66,11 +66,15 @@ def mock_openai_models_list(): yield mock_list -@pytest.fixture(scope="module") +@pytest.fixture(scope="function") async def vllm_inference_adapter(): config = VLLMInferenceAdapterConfig(url="http://mocked.localhost:12345") inference_adapter = VLLMInferenceAdapter(config) inference_adapter.model_store = AsyncMock() + # Mock the __provider_spec__ attribute that would normally be set by the resolver + inference_adapter.__provider_spec__ = MagicMock() + inference_adapter.__provider_spec__.provider_type = "vllm-inference" + inference_adapter.__provider_spec__.provider_data_validator = MagicMock() await inference_adapter.initialize() return inference_adapter @@ -120,6 +124,10 @@ async def test_tool_call_response(vllm_inference_adapter): mock_client.chat.completions.create = AsyncMock() mock_create_client.return_value = mock_client + # Mock the model to return a proper provider_resource_id + mock_model = Model(identifier="mock-model", provider_resource_id="mock-model", provider_id="vllm-inference") + vllm_inference_adapter.model_store.get_model.return_value = mock_model + messages = [ SystemMessage(content="You are a helpful assistant"), UserMessage(content="How many?"), @@ -555,31 +563,29 @@ async def test_health_status_success(vllm_inference_adapter): """ Test the health method of VLLM InferenceAdapter when the connection is successful. - This test verifies that the health method returns a HealthResponse with status OK, only - when the connection to the vLLM server is successful. + This test verifies that the health method returns a HealthResponse with status OK + when the /health endpoint responds successfully. """ - with patch.object(VLLMInferenceAdapter, "client", new_callable=PropertyMock) as mock_create_client: - # Create mock client and models - mock_client = MagicMock() - mock_models = MagicMock() + with patch("httpx.AsyncClient") as mock_client_class: + # Create mock response + mock_response = MagicMock() + mock_response.raise_for_status.return_value = None - # Create a mock async iterator that yields a model when iterated - async def mock_list(): - for model in [MagicMock()]: - yield model - - # Set up the models.list to return our mock async iterator - mock_models.list.return_value = mock_list() - mock_client.models = mock_models - mock_create_client.return_value = mock_client + # Create mock client instance + mock_client_instance = MagicMock() + mock_client_instance.get = AsyncMock(return_value=mock_response) + mock_client_class.return_value.__aenter__.return_value = mock_client_instance # Call the health method health_response = await vllm_inference_adapter.health() + # Verify the response assert health_response["status"] == HealthStatus.OK - # Verify that models.list was called - mock_models.list.assert_called_once() + # Verify that the health endpoint was called + mock_client_instance.get.assert_called_once() + call_args = mock_client_instance.get.call_args[0] + assert call_args[0].endswith("/health") async def test_health_status_failure(vllm_inference_adapter): @@ -589,28 +595,42 @@ async def test_health_status_failure(vllm_inference_adapter): This test verifies that the health method returns a HealthResponse with status ERROR and an appropriate error message when the connection to the vLLM server fails. """ - with patch.object(VLLMInferenceAdapter, "client", new_callable=PropertyMock) as mock_create_client: - # Create mock client and models - mock_client = MagicMock() - mock_models = MagicMock() - - # Create a mock async iterator that raises an exception when iterated - async def mock_list(): - raise Exception("Connection failed") - yield # Unreachable code - - # Set up the models.list to return our mock async iterator - mock_models.list.return_value = mock_list() - mock_client.models = mock_models - mock_create_client.return_value = mock_client + with patch("httpx.AsyncClient") as mock_client_class: + # Create mock client instance that raises an exception + mock_client_instance = MagicMock() + mock_client_instance.get.side_effect = Exception("Connection failed") + mock_client_class.return_value.__aenter__.return_value = mock_client_instance # Call the health method health_response = await vllm_inference_adapter.health() + # Verify the response assert health_response["status"] == HealthStatus.ERROR assert "Health check failed: Connection failed" in health_response["message"] - mock_models.list.assert_called_once() + +async def test_health_status_no_static_api_key(vllm_inference_adapter): + """ + Test the health method of VLLM InferenceAdapter when no static API key is provided. + + This test verifies that the health method returns a HealthResponse with status OK + when the /health endpoint responds successfully, regardless of API token configuration. + """ + with patch("httpx.AsyncClient") as mock_client_class: + # Create mock response + mock_response = MagicMock() + mock_response.raise_for_status.return_value = None + + # Create mock client instance + mock_client_instance = MagicMock() + mock_client_instance.get = AsyncMock(return_value=mock_response) + mock_client_class.return_value.__aenter__.return_value = mock_client_instance + + # Call the health method + health_response = await vllm_inference_adapter.health() + + # Verify the response + assert health_response["status"] == HealthStatus.OK async def test_openai_chat_completion_is_async(vllm_inference_adapter): @@ -656,3 +676,109 @@ async def test_openai_chat_completion_is_async(vllm_inference_adapter): assert mock_create_client.call_count == 4 # no cheating assert total_time < (sleep_time * 2), f"Total time taken: {total_time}s exceeded expected max" + + +async def test_should_refresh_models(): + """ + Test the should_refresh_models method with different refresh_models configurations. + + This test verifies that: + 1. When refresh_models is True, should_refresh_models returns True regardless of api_token + 2. When refresh_models is False, should_refresh_models returns False regardless of api_token + """ + + # Test case 1: refresh_models is True, api_token is None + config1 = VLLMInferenceAdapterConfig(url="http://test.localhost", api_token=None, refresh_models=True) + adapter1 = VLLMInferenceAdapter(config1) + result1 = await adapter1.should_refresh_models() + assert result1 is True, "should_refresh_models should return True when refresh_models is True" + + # Test case 2: refresh_models is True, api_token is empty string + config2 = VLLMInferenceAdapterConfig(url="http://test.localhost", api_token="", refresh_models=True) + adapter2 = VLLMInferenceAdapter(config2) + result2 = await adapter2.should_refresh_models() + assert result2 is True, "should_refresh_models should return True when refresh_models is True" + + # Test case 3: refresh_models is True, api_token is "fake" (default) + config3 = VLLMInferenceAdapterConfig(url="http://test.localhost", api_token="fake", refresh_models=True) + adapter3 = VLLMInferenceAdapter(config3) + result3 = await adapter3.should_refresh_models() + assert result3 is True, "should_refresh_models should return True when refresh_models is True" + + # Test case 4: refresh_models is True, api_token is real token + config4 = VLLMInferenceAdapterConfig(url="http://test.localhost", api_token="real-token-123", refresh_models=True) + adapter4 = VLLMInferenceAdapter(config4) + result4 = await adapter4.should_refresh_models() + assert result4 is True, "should_refresh_models should return True when refresh_models is True" + + # Test case 5: refresh_models is False, api_token is real token + config5 = VLLMInferenceAdapterConfig(url="http://test.localhost", api_token="real-token-456", refresh_models=False) + adapter5 = VLLMInferenceAdapter(config5) + result5 = await adapter5.should_refresh_models() + assert result5 is False, "should_refresh_models should return False when refresh_models is False" + + +async def test_provider_data_var_context_propagation(vllm_inference_adapter): + """ + Test that PROVIDER_DATA_VAR context is properly propagated through the vLLM inference adapter. + This ensures that dynamic provider data (like API tokens) can be passed through context. + Note: The base URL is always taken from config.url, not from provider data. + """ + # Mock the AsyncOpenAI class to capture provider data + with ( + patch("llama_stack.providers.utils.inference.openai_mixin.AsyncOpenAI") as mock_openai_class, + patch.object(vllm_inference_adapter, "get_request_provider_data") as mock_get_provider_data, + ): + mock_client = AsyncMock() + mock_client.chat.completions.create = AsyncMock() + mock_openai_class.return_value = mock_client + + # Mock provider data to return test data + mock_provider_data = MagicMock() + mock_provider_data.vllm_api_token = "test-token-123" + mock_provider_data.vllm_url = "http://test-server:8000/v1" + mock_get_provider_data.return_value = mock_provider_data + + # Mock the model + mock_model = Model(identifier="test-model", provider_resource_id="test-model", provider_id="vllm-inference") + vllm_inference_adapter.model_store.get_model.return_value = mock_model + + try: + # Execute chat completion + await vllm_inference_adapter.chat_completion( + "test-model", + [UserMessage(content="Hello")], + stream=False, + tools=None, + tool_config=ToolConfig(tool_choice=ToolChoice.auto), + ) + + # Verify that ALL client calls were made with the correct parameters + calls = mock_openai_class.call_args_list + incorrect_calls = [] + + for i, call in enumerate(calls): + api_key = call[1]["api_key"] + base_url = call[1]["base_url"] + + if api_key != "test-token-123" or base_url != "http://mocked.localhost:12345": + incorrect_calls.append({"call_index": i, "api_key": api_key, "base_url": base_url}) + + if incorrect_calls: + error_msg = ( + f"Found {len(incorrect_calls)} calls with incorrect parameters out of {len(calls)} total calls:\n" + ) + for incorrect_call in incorrect_calls: + error_msg += f" Call {incorrect_call['call_index']}: api_key='{incorrect_call['api_key']}', base_url='{incorrect_call['base_url']}'\n" + error_msg += "Expected: api_key='test-token-123', base_url='http://mocked.localhost:12345'" + raise AssertionError(error_msg) + + # Ensure at least one call was made + assert len(calls) >= 1, "No AsyncOpenAI client calls were made" + + # Verify that chat completion was called + mock_client.chat.completions.create.assert_called_once() + + finally: + # Clean up context + pass From 521865c388507ef244f76e0fdc249059ef65ea1e Mon Sep 17 00:00:00 2001 From: Matthew Farrellee Date: Thu, 18 Sep 2025 05:17:11 -0400 Subject: [PATCH 109/150] feat: include all models from provider's /v1/models (#3471) # What does this PR do? this replaces the static model listing for any provider using OpenAIMixin currently - - anthropic - azure openai - gemini - groq - llama-api - nvidia - openai - sambanova - tgi - vertexai - vllm - not changed: together has its own impl ## Test Plan - new unit tests - manual for llama-api, openai, groq, gemini ``` for provider in llama-openai-compat openai groq gemini; do uv run llama stack build --image-type venv --providers inference=remote::provider --run & uv run --with llama-stack-client llama-stack-client models list | grep Total ``` results (17 sep 2025): - llama-api: 4 - openai: 86 - groq: 21 - gemini: 66 closes #3467 --- .../providers/utils/inference/openai_mixin.py | 43 ++-- .../inference/test_openai_base_url_config.py | 36 +++- .../utils/inference/test_openai_mixin.py | 183 ++++++++++++++++++ 3 files changed, 242 insertions(+), 20 deletions(-) create mode 100644 tests/unit/providers/utils/inference/test_openai_mixin.py diff --git a/llama_stack/providers/utils/inference/openai_mixin.py b/llama_stack/providers/utils/inference/openai_mixin.py index 938927d21..c57f65bca 100644 --- a/llama_stack/providers/utils/inference/openai_mixin.py +++ b/llama_stack/providers/utils/inference/openai_mixin.py @@ -9,7 +9,6 @@ from abc import ABC, abstractmethod from collections.abc import AsyncIterator from typing import Any -import openai from openai import NOT_GIVEN, AsyncOpenAI from llama_stack.apis.inference import ( @@ -23,6 +22,7 @@ from llama_stack.apis.inference import ( OpenAIMessageParam, OpenAIResponseFormatParam, ) +from llama_stack.apis.models import ModelType from llama_stack.log import get_logger from llama_stack.providers.utils.inference.openai_compat import prepare_openai_completion_params @@ -50,6 +50,10 @@ class OpenAIMixin(ABC): # This is useful for providers that do not return a unique id in the response. overwrite_completion_id: bool = False + # Cache of available models keyed by model ID + # This is set in list_models() and used in check_model_availability() + _model_cache: dict[str, Model] = {} + @abstractmethod def get_api_key(self) -> str: """ @@ -296,22 +300,35 @@ class OpenAIMixin(ABC): usage=usage, ) + async def list_models(self) -> list[Model] | None: + """ + List available models from the provider's /v1/models endpoint. + + Also, caches the models in self._model_cache for use in check_model_availability(). + + :return: A list of Model instances representing available models. + """ + self._model_cache = { + m.id: Model( + # __provider_id__ is dynamically added by instantiate_provider in resolver.py + provider_id=self.__provider_id__, # type: ignore[attr-defined] + provider_resource_id=m.id, + identifier=m.id, + model_type=ModelType.llm, + ) + async for m in self.client.models.list() + } + + return list(self._model_cache.values()) + async def check_model_availability(self, model: str) -> bool: """ - Check if a specific model is available from OpenAI. + Check if a specific model is available from the provider's /v1/models. :param model: The model identifier to check. :return: True if the model is available dynamically, False otherwise. """ - try: - # Direct model lookup - returns model or raises NotFoundError - await self.client.models.retrieve(model) - return True - except openai.NotFoundError: - # Model doesn't exist - this is expected for unavailable models - pass - except Exception as e: - # All other errors (auth, rate limit, network, etc.) - logger.warning(f"Failed to check model availability for {model}: {e}") + if not self._model_cache: + await self.list_models() - return False + return model in self._model_cache diff --git a/tests/unit/providers/inference/test_openai_base_url_config.py b/tests/unit/providers/inference/test_openai_base_url_config.py index 150f6210b..903772f0c 100644 --- a/tests/unit/providers/inference/test_openai_base_url_config.py +++ b/tests/unit/providers/inference/test_openai_base_url_config.py @@ -5,7 +5,7 @@ # the root directory of this source tree. import os -from unittest.mock import AsyncMock, MagicMock, patch +from unittest.mock import MagicMock, patch from llama_stack.core.stack import replace_env_vars from llama_stack.providers.remote.inference.openai.config import OpenAIConfig @@ -80,11 +80,22 @@ class TestOpenAIBaseURLConfig: # Mock the get_api_key method adapter.get_api_key = MagicMock(return_value="test-key") - # Mock the AsyncOpenAI client and its models.retrieve method + # Mock a model object that will be returned by models.list() + mock_model = MagicMock() + mock_model.id = "gpt-4" + + # Create an async iterator that yields our mock model + async def mock_async_iterator(): + yield mock_model + + # Mock the AsyncOpenAI client and its models.list method mock_client = MagicMock() - mock_client.models.retrieve = AsyncMock(return_value=MagicMock()) + mock_client.models.list = MagicMock(return_value=mock_async_iterator()) mock_openai_class.return_value = mock_client + # Set the __provider_id__ attribute that's expected by list_models + adapter.__provider_id__ = "openai" + # Call check_model_availability and verify it returns True assert await adapter.check_model_availability("gpt-4") @@ -94,8 +105,8 @@ class TestOpenAIBaseURLConfig: base_url=custom_url, ) - # Verify the method was called and returned True - mock_client.models.retrieve.assert_called_once_with("gpt-4") + # Verify the models.list method was called + mock_client.models.list.assert_called_once() @patch.dict(os.environ, {"OPENAI_BASE_URL": "https://proxy.openai.com/v1"}) @patch("llama_stack.providers.utils.inference.openai_mixin.AsyncOpenAI") @@ -110,11 +121,22 @@ class TestOpenAIBaseURLConfig: # Mock the get_api_key method adapter.get_api_key = MagicMock(return_value="test-key") - # Mock the AsyncOpenAI client + # Mock a model object that will be returned by models.list() + mock_model = MagicMock() + mock_model.id = "gpt-4" + + # Create an async iterator that yields our mock model + async def mock_async_iterator(): + yield mock_model + + # Mock the AsyncOpenAI client and its models.list method mock_client = MagicMock() - mock_client.models.retrieve = AsyncMock(return_value=MagicMock()) + mock_client.models.list = MagicMock(return_value=mock_async_iterator()) mock_openai_class.return_value = mock_client + # Set the __provider_id__ attribute that's expected by list_models + adapter.__provider_id__ = "openai" + # Call check_model_availability and verify it returns True assert await adapter.check_model_availability("gpt-4") diff --git a/tests/unit/providers/utils/inference/test_openai_mixin.py b/tests/unit/providers/utils/inference/test_openai_mixin.py new file mode 100644 index 000000000..93f82da19 --- /dev/null +++ b/tests/unit/providers/utils/inference/test_openai_mixin.py @@ -0,0 +1,183 @@ +# Copyright (c) Meta Platforms, Inc. and affiliates. +# All rights reserved. +# +# This source code is licensed under the terms described in the LICENSE file in +# the root directory of this source tree. + +from unittest.mock import MagicMock, PropertyMock, patch + +import pytest + +from llama_stack.apis.inference import Model +from llama_stack.apis.models import ModelType +from llama_stack.providers.utils.inference.openai_mixin import OpenAIMixin + + +# Test implementation of OpenAIMixin for testing purposes +class OpenAIMixinImpl(OpenAIMixin): + def __init__(self): + self.__provider_id__ = "test-provider" + + def get_api_key(self) -> str: + raise NotImplementedError("This method should be mocked in tests") + + def get_base_url(self) -> str: + raise NotImplementedError("This method should be mocked in tests") + + +@pytest.fixture +def mixin(): + """Create a test instance of OpenAIMixin""" + return OpenAIMixinImpl() + + +@pytest.fixture +def mock_models(): + """Create multiple mock OpenAI model objects""" + models = [MagicMock(id=id) for id in ["some-mock-model-id", "another-mock-model-id", "final-mock-model-id"]] + return models + + +@pytest.fixture +def mock_client_with_models(mock_models): + """Create a mock client with models.list() set up to return mock_models""" + mock_client = MagicMock() + + async def mock_models_list(): + for model in mock_models: + yield model + + mock_client.models.list.return_value = mock_models_list() + return mock_client + + +@pytest.fixture +def mock_client_with_empty_models(): + """Create a mock client with models.list() set up to return empty list""" + mock_client = MagicMock() + + async def mock_empty_models_list(): + return + yield # Make it an async generator but don't yield anything + + mock_client.models.list.return_value = mock_empty_models_list() + return mock_client + + +@pytest.fixture +def mock_client_with_exception(): + """Create a mock client with models.list() set up to raise an exception""" + mock_client = MagicMock() + mock_client.models.list.side_effect = Exception("API Error") + return mock_client + + +@pytest.fixture +def mock_client_context(): + """Fixture that provides a context manager for mocking the OpenAI client""" + + def _mock_client_context(mixin, mock_client): + return patch.object(type(mixin), "client", new_callable=PropertyMock, return_value=mock_client) + + return _mock_client_context + + +class TestOpenAIMixinListModels: + """Test cases for the list_models method""" + + async def test_list_models_success(self, mixin, mock_client_with_models, mock_client_context): + """Test successful model listing""" + assert len(mixin._model_cache) == 0 + + with mock_client_context(mixin, mock_client_with_models): + result = await mixin.list_models() + + assert result is not None + assert len(result) == 3 + + model_ids = [model.identifier for model in result] + assert "some-mock-model-id" in model_ids + assert "another-mock-model-id" in model_ids + assert "final-mock-model-id" in model_ids + + for model in result: + assert model.provider_id == "test-provider" + assert model.model_type == ModelType.llm + assert model.provider_resource_id == model.identifier + + assert len(mixin._model_cache) == 3 + for model_id in ["some-mock-model-id", "another-mock-model-id", "final-mock-model-id"]: + assert model_id in mixin._model_cache + cached_model = mixin._model_cache[model_id] + assert cached_model.identifier == model_id + assert cached_model.provider_resource_id == model_id + + async def test_list_models_empty_response(self, mixin, mock_client_with_empty_models, mock_client_context): + """Test handling of empty model list""" + with mock_client_context(mixin, mock_client_with_empty_models): + result = await mixin.list_models() + + assert result is not None + assert len(result) == 0 + assert len(mixin._model_cache) == 0 + + +class TestOpenAIMixinCheckModelAvailability: + """Test cases for the check_model_availability method""" + + async def test_check_model_availability_with_cache(self, mixin, mock_client_with_models, mock_client_context): + """Test model availability check when cache is populated""" + with mock_client_context(mixin, mock_client_with_models): + mock_client_with_models.models.list.assert_not_called() + await mixin.list_models() + mock_client_with_models.models.list.assert_called_once() + + assert await mixin.check_model_availability("some-mock-model-id") + assert await mixin.check_model_availability("another-mock-model-id") + assert await mixin.check_model_availability("final-mock-model-id") + assert not await mixin.check_model_availability("non-existent-model") + mock_client_with_models.models.list.assert_called_once() + + async def test_check_model_availability_without_cache(self, mixin, mock_client_with_models, mock_client_context): + """Test model availability check when cache is empty (calls list_models)""" + assert len(mixin._model_cache) == 0 + + with mock_client_context(mixin, mock_client_with_models): + mock_client_with_models.models.list.assert_not_called() + assert await mixin.check_model_availability("some-mock-model-id") + mock_client_with_models.models.list.assert_called_once() + + assert len(mixin._model_cache) == 3 + assert "some-mock-model-id" in mixin._model_cache + + async def test_check_model_availability_model_not_found(self, mixin, mock_client_with_models, mock_client_context): + """Test model availability check for non-existent model""" + with mock_client_context(mixin, mock_client_with_models): + mock_client_with_models.models.list.assert_not_called() + assert not await mixin.check_model_availability("non-existent-model") + mock_client_with_models.models.list.assert_called_once() + + assert len(mixin._model_cache) == 3 + + +class TestOpenAIMixinCacheBehavior: + """Test cases for cache behavior and edge cases""" + + async def test_cache_overwrites_on_list_models_call(self, mixin, mock_client_with_models, mock_client_context): + """Test that calling list_models overwrites existing cache""" + initial_model = Model( + provider_id="test-provider", + provider_resource_id="old-model", + identifier="old-model", + model_type=ModelType.llm, + ) + mixin._model_cache = {"old-model": initial_model} + + with mock_client_context(mixin, mock_client_with_models): + await mixin.list_models() + + assert len(mixin._model_cache) == 3 + assert "old-model" not in mixin._model_cache + assert "some-mock-model-id" in mixin._model_cache + assert "another-mock-model-id" in mixin._model_cache + assert "final-mock-model-id" in mixin._model_cache From ea396a54cd771933875115e29510483935aa6c4c Mon Sep 17 00:00:00 2001 From: Matthew Farrellee Date: Thu, 18 Sep 2025 07:09:57 -0400 Subject: [PATCH 110/150] chore: update the ollama inference impl to use OpenAIMixin for openai-compat functions (#3395) # What does this PR do? update Ollama inference provider to use OpenAIMixin for openai-compat endpoints ## Test Plan ci --- .../remote/inference/ollama/ollama.py | 157 +-- .../recordings/responses/3a81146f2afa.json | 990 ++++++++++++++++++ .../recordings/responses/6412295819a1.json | 43 + .../recordings/responses/ecae140151d1.json | 43 + 4 files changed, 1100 insertions(+), 133 deletions(-) create mode 100644 tests/integration/recordings/responses/3a81146f2afa.json create mode 100644 tests/integration/recordings/responses/6412295819a1.json create mode 100644 tests/integration/recordings/responses/ecae140151d1.json diff --git a/llama_stack/providers/remote/inference/ollama/ollama.py b/llama_stack/providers/remote/inference/ollama/ollama.py index d3d107e1d..67a22cbe3 100644 --- a/llama_stack/providers/remote/inference/ollama/ollama.py +++ b/llama_stack/providers/remote/inference/ollama/ollama.py @@ -7,12 +7,10 @@ import asyncio import base64 -import uuid from collections.abc import AsyncGenerator, AsyncIterator from typing import Any -from ollama import AsyncClient # type: ignore[attr-defined] -from openai import AsyncOpenAI +from ollama import AsyncClient as AsyncOllamaClient from llama_stack.apis.common.content_types import ( ImageContentItem, @@ -37,9 +35,6 @@ from llama_stack.apis.inference import ( Message, OpenAIChatCompletion, OpenAIChatCompletionChunk, - OpenAICompletion, - OpenAIEmbeddingsResponse, - OpenAIEmbeddingUsage, OpenAIMessageParam, OpenAIResponseFormatParam, ResponseFormat, @@ -64,15 +59,14 @@ from llama_stack.providers.utils.inference.model_registry import ( from llama_stack.providers.utils.inference.openai_compat import ( OpenAICompatCompletionChoice, OpenAICompatCompletionResponse, - b64_encode_openai_embeddings_response, get_sampling_options, prepare_openai_completion_params, - prepare_openai_embeddings_params, process_chat_completion_response, process_chat_completion_stream_response, process_completion_response, process_completion_stream_response, ) +from llama_stack.providers.utils.inference.openai_mixin import OpenAIMixin from llama_stack.providers.utils.inference.prompt_adapter import ( chat_completion_request_to_prompt, completion_request_to_prompt, @@ -89,6 +83,7 @@ logger = get_logger(name=__name__, category="inference::ollama") class OllamaInferenceAdapter( + OpenAIMixin, InferenceProvider, ModelsProtocolPrivate, ): @@ -98,23 +93,21 @@ class OllamaInferenceAdapter( def __init__(self, config: OllamaImplConfig) -> None: self.register_helper = ModelRegistryHelper(MODEL_ENTRIES) self.config = config - self._clients: dict[asyncio.AbstractEventLoop, AsyncClient] = {} - self._openai_client = None + self._clients: dict[asyncio.AbstractEventLoop, AsyncOllamaClient] = {} @property - def client(self) -> AsyncClient: + def ollama_client(self) -> AsyncOllamaClient: # ollama client attaches itself to the current event loop (sadly?) loop = asyncio.get_running_loop() if loop not in self._clients: - self._clients[loop] = AsyncClient(host=self.config.url) + self._clients[loop] = AsyncOllamaClient(host=self.config.url) return self._clients[loop] - @property - def openai_client(self) -> AsyncOpenAI: - if self._openai_client is None: - url = self.config.url.rstrip("/") - self._openai_client = AsyncOpenAI(base_url=f"{url}/v1", api_key="ollama") - return self._openai_client + def get_api_key(self): + return "NO_KEY" + + def get_base_url(self): + return self.config.url.rstrip("/") + "/v1" async def initialize(self) -> None: logger.info(f"checking connectivity to Ollama at `{self.config.url}`...") @@ -129,7 +122,7 @@ class OllamaInferenceAdapter( async def list_models(self) -> list[Model] | None: provider_id = self.__provider_id__ - response = await self.client.list() + response = await self.ollama_client.list() # always add the two embedding models which can be pulled on demand models = [ @@ -189,7 +182,7 @@ class OllamaInferenceAdapter( HealthResponse: A dictionary containing the health status. """ try: - await self.client.ps() + await self.ollama_client.ps() return HealthResponse(status=HealthStatus.OK) except Exception as e: return HealthResponse(status=HealthStatus.ERROR, message=f"Health check failed: {str(e)}") @@ -238,7 +231,7 @@ class OllamaInferenceAdapter( params = await self._get_params(request) async def _generate_and_convert_to_openai_compat(): - s = await self.client.generate(**params) + s = await self.ollama_client.generate(**params) async for chunk in s: choice = OpenAICompatCompletionChoice( finish_reason=chunk["done_reason"] if chunk["done"] else None, @@ -254,7 +247,7 @@ class OllamaInferenceAdapter( async def _nonstream_completion(self, request: CompletionRequest) -> CompletionResponse: params = await self._get_params(request) - r = await self.client.generate(**params) + r = await self.ollama_client.generate(**params) choice = OpenAICompatCompletionChoice( finish_reason=r["done_reason"] if r["done"] else None, @@ -346,9 +339,9 @@ class OllamaInferenceAdapter( async def _nonstream_chat_completion(self, request: ChatCompletionRequest) -> ChatCompletionResponse: params = await self._get_params(request) if "messages" in params: - r = await self.client.chat(**params) + r = await self.ollama_client.chat(**params) else: - r = await self.client.generate(**params) + r = await self.ollama_client.generate(**params) if "message" in r: choice = OpenAICompatCompletionChoice( @@ -372,9 +365,9 @@ class OllamaInferenceAdapter( async def _generate_and_convert_to_openai_compat(): if "messages" in params: - s = await self.client.chat(**params) + s = await self.ollama_client.chat(**params) else: - s = await self.client.generate(**params) + s = await self.ollama_client.generate(**params) async for chunk in s: if "message" in chunk: choice = OpenAICompatCompletionChoice( @@ -407,7 +400,7 @@ class OllamaInferenceAdapter( assert all(not content_has_media(content) for content in contents), ( "Ollama does not support media for embeddings" ) - response = await self.client.embed( + response = await self.ollama_client.embed( model=model.provider_resource_id, input=[interleaved_content_as_str(content) for content in contents], ) @@ -422,14 +415,14 @@ class OllamaInferenceAdapter( pass # Ignore statically unknown model, will check live listing if model.model_type == ModelType.embedding: - response = await self.client.list() + response = await self.ollama_client.list() if model.provider_resource_id not in [m.model for m in response.models]: - await self.client.pull(model.provider_resource_id) + await self.ollama_client.pull(model.provider_resource_id) # we use list() here instead of ps() - # - ps() only lists running models, not available models # - models not currently running are run by the ollama server as needed - response = await self.client.list() + response = await self.ollama_client.list() available_models = [m.model for m in response.models] provider_resource_id = model.provider_resource_id @@ -448,90 +441,6 @@ class OllamaInferenceAdapter( return model - async def openai_embeddings( - self, - model: str, - input: str | list[str], - encoding_format: str | None = "float", - dimensions: int | None = None, - user: str | None = None, - ) -> OpenAIEmbeddingsResponse: - model_obj = await self._get_model(model) - if model_obj.provider_resource_id is None: - raise ValueError(f"Model {model} has no provider_resource_id set") - - # Note, at the moment Ollama does not support encoding_format, dimensions, and user parameters - params = prepare_openai_embeddings_params( - model=model_obj.provider_resource_id, - input=input, - encoding_format=encoding_format, - dimensions=dimensions, - user=user, - ) - - response = await self.openai_client.embeddings.create(**params) - data = b64_encode_openai_embeddings_response(response.data, encoding_format) - - usage = OpenAIEmbeddingUsage( - prompt_tokens=response.usage.prompt_tokens, - total_tokens=response.usage.total_tokens, - ) - # TODO: Investigate why model_obj.identifier is used instead of response.model - return OpenAIEmbeddingsResponse( - data=data, - model=model_obj.identifier, - usage=usage, - ) - - async def openai_completion( - self, - model: str, - prompt: str | list[str] | list[int] | list[list[int]], - best_of: int | None = None, - echo: bool | None = None, - frequency_penalty: float | None = None, - logit_bias: dict[str, float] | None = None, - logprobs: bool | None = None, - max_tokens: int | None = None, - n: int | None = None, - presence_penalty: float | None = None, - seed: int | None = None, - stop: str | list[str] | None = None, - stream: bool | None = None, - stream_options: dict[str, Any] | None = None, - temperature: float | None = None, - top_p: float | None = None, - user: str | None = None, - guided_choice: list[str] | None = None, - prompt_logprobs: int | None = None, - suffix: str | None = None, - ) -> OpenAICompletion: - if not isinstance(prompt, str): - raise ValueError("Ollama does not support non-string prompts for completion") - - model_obj = await self._get_model(model) - params = await prepare_openai_completion_params( - model=model_obj.provider_resource_id, - prompt=prompt, - best_of=best_of, - echo=echo, - frequency_penalty=frequency_penalty, - logit_bias=logit_bias, - logprobs=logprobs, - max_tokens=max_tokens, - n=n, - presence_penalty=presence_penalty, - seed=seed, - stop=stop, - stream=stream, - stream_options=stream_options, - temperature=temperature, - top_p=top_p, - user=user, - suffix=suffix, - ) - return await self.openai_client.completions.create(**params) # type: ignore - async def openai_chat_completion( self, model: str, @@ -599,25 +508,7 @@ class OllamaInferenceAdapter( top_p=top_p, user=user, ) - response = await self.openai_client.chat.completions.create(**params) - return await self._adjust_ollama_chat_completion_response_ids(response) - - async def _adjust_ollama_chat_completion_response_ids( - self, - response: OpenAIChatCompletion | AsyncIterator[OpenAIChatCompletionChunk], - ) -> OpenAIChatCompletion | AsyncIterator[OpenAIChatCompletionChunk]: - id = f"chatcmpl-{uuid.uuid4()}" - if isinstance(response, AsyncIterator): - - async def stream_with_chunk_ids() -> AsyncIterator[OpenAIChatCompletionChunk]: - async for chunk in response: - chunk.id = id - yield chunk - - return stream_with_chunk_ids() - else: - response.id = id - return response + return await OpenAIMixin.openai_chat_completion(self, **params) async def convert_message_to_openai_dict_for_ollama(message: Message) -> list[dict]: diff --git a/tests/integration/recordings/responses/3a81146f2afa.json b/tests/integration/recordings/responses/3a81146f2afa.json new file mode 100644 index 000000000..e2d2d52d6 --- /dev/null +++ b/tests/integration/recordings/responses/3a81146f2afa.json @@ -0,0 +1,990 @@ +{ + "request": { + "method": "POST", + "url": "http://0.0.0.0:11434/v1/v1/completions", + "headers": {}, + "body": { + "model": "llama3.2:3b-instruct-fp16", + "prompt": "Respond to this question and explain your answer. Complete the sentence using one word: Roses are red, violets are ", + "max_tokens": 50, + "stream": true, + "extra_body": {} + }, + "endpoint": "/v1/completions", + "model": "llama3.2:3b-instruct-fp16" + }, + "response": { + "body": [ + { + "__type__": "openai.types.completion.Completion", + "__data__": { + "id": "cmpl-439", + "choices": [ + { + "finish_reason": null, + "index": 0, + "logprobs": null, + "text": "Blue" + } + ], + "created": 1757857132, + "model": "llama3.2:3b-instruct-fp16", + "object": "text_completion", + "system_fingerprint": "fp_ollama", + "usage": null + } + }, + { + "__type__": "openai.types.completion.Completion", + "__data__": { + "id": "cmpl-439", + "choices": [ + { + "finish_reason": null, + "index": 0, + "logprobs": null, + "text": ".\n\n" + } + ], + "created": 1757857132, + "model": "llama3.2:3b-instruct-fp16", + "object": "text_completion", + "system_fingerprint": "fp_ollama", + "usage": null + } + }, + { + "__type__": "openai.types.completion.Completion", + "__data__": { + "id": "cmpl-439", + "choices": [ + { + "finish_reason": null, + "index": 0, + "logprobs": null, + "text": "The" + } + ], + "created": 1757857132, + "model": "llama3.2:3b-instruct-fp16", + "object": "text_completion", + "system_fingerprint": "fp_ollama", + "usage": null + } + }, + { + "__type__": "openai.types.completion.Completion", + "__data__": { + "id": "cmpl-439", + "choices": [ + { + "finish_reason": null, + "index": 0, + "logprobs": null, + "text": " completed" + } + ], + "created": 1757857132, + "model": "llama3.2:3b-instruct-fp16", + "object": "text_completion", + "system_fingerprint": "fp_ollama", + "usage": null + } + }, + { + "__type__": "openai.types.completion.Completion", + "__data__": { + "id": "cmpl-439", + "choices": [ + { + "finish_reason": null, + "index": 0, + "logprobs": null, + "text": " sentence" + } + ], + "created": 1757857132, + "model": "llama3.2:3b-instruct-fp16", + "object": "text_completion", + "system_fingerprint": "fp_ollama", + "usage": null + } + }, + { + "__type__": "openai.types.completion.Completion", + "__data__": { + "id": "cmpl-439", + "choices": [ + { + "finish_reason": null, + "index": 0, + "logprobs": null, + "text": " is" + } + ], + "created": 1757857132, + "model": "llama3.2:3b-instruct-fp16", + "object": "text_completion", + "system_fingerprint": "fp_ollama", + "usage": null + } + }, + { + "__type__": "openai.types.completion.Completion", + "__data__": { + "id": "cmpl-439", + "choices": [ + { + "finish_reason": null, + "index": 0, + "logprobs": null, + "text": " a" + } + ], + "created": 1757857132, + "model": "llama3.2:3b-instruct-fp16", + "object": "text_completion", + "system_fingerprint": "fp_ollama", + "usage": null + } + }, + { + "__type__": "openai.types.completion.Completion", + "__data__": { + "id": "cmpl-439", + "choices": [ + { + "finish_reason": null, + "index": 0, + "logprobs": null, + "text": " well" + } + ], + "created": 1757857132, + "model": "llama3.2:3b-instruct-fp16", + "object": "text_completion", + "system_fingerprint": "fp_ollama", + "usage": null + } + }, + { + "__type__": "openai.types.completion.Completion", + "__data__": { + "id": "cmpl-439", + "choices": [ + { + "finish_reason": null, + "index": 0, + "logprobs": null, + "text": "-known" + } + ], + "created": 1757857132, + "model": "llama3.2:3b-instruct-fp16", + "object": "text_completion", + "system_fingerprint": "fp_ollama", + "usage": null + } + }, + { + "__type__": "openai.types.completion.Completion", + "__data__": { + "id": "cmpl-439", + "choices": [ + { + "finish_reason": null, + "index": 0, + "logprobs": null, + "text": " phrase" + } + ], + "created": 1757857132, + "model": "llama3.2:3b-instruct-fp16", + "object": "text_completion", + "system_fingerprint": "fp_ollama", + "usage": null + } + }, + { + "__type__": "openai.types.completion.Completion", + "__data__": { + "id": "cmpl-439", + "choices": [ + { + "finish_reason": null, + "index": 0, + "logprobs": null, + "text": " from" + } + ], + "created": 1757857132, + "model": "llama3.2:3b-instruct-fp16", + "object": "text_completion", + "system_fingerprint": "fp_ollama", + "usage": null + } + }, + { + "__type__": "openai.types.completion.Completion", + "__data__": { + "id": "cmpl-439", + "choices": [ + { + "finish_reason": null, + "index": 0, + "logprobs": null, + "text": " a" + } + ], + "created": 1757857132, + "model": "llama3.2:3b-instruct-fp16", + "object": "text_completion", + "system_fingerprint": "fp_ollama", + "usage": null + } + }, + { + "__type__": "openai.types.completion.Completion", + "__data__": { + "id": "cmpl-439", + "choices": [ + { + "finish_reason": null, + "index": 0, + "logprobs": null, + "text": " traditional" + } + ], + "created": 1757857132, + "model": "llama3.2:3b-instruct-fp16", + "object": "text_completion", + "system_fingerprint": "fp_ollama", + "usage": null + } + }, + { + "__type__": "openai.types.completion.Completion", + "__data__": { + "id": "cmpl-439", + "choices": [ + { + "finish_reason": null, + "index": 0, + "logprobs": null, + "text": " English" + } + ], + "created": 1757857132, + "model": "llama3.2:3b-instruct-fp16", + "object": "text_completion", + "system_fingerprint": "fp_ollama", + "usage": null + } + }, + { + "__type__": "openai.types.completion.Completion", + "__data__": { + "id": "cmpl-439", + "choices": [ + { + "finish_reason": null, + "index": 0, + "logprobs": null, + "text": " poem" + } + ], + "created": 1757857132, + "model": "llama3.2:3b-instruct-fp16", + "object": "text_completion", + "system_fingerprint": "fp_ollama", + "usage": null + } + }, + { + "__type__": "openai.types.completion.Completion", + "__data__": { + "id": "cmpl-439", + "choices": [ + { + "finish_reason": null, + "index": 0, + "logprobs": null, + "text": ":\n\n" + } + ], + "created": 1757857132, + "model": "llama3.2:3b-instruct-fp16", + "object": "text_completion", + "system_fingerprint": "fp_ollama", + "usage": null + } + }, + { + "__type__": "openai.types.completion.Completion", + "__data__": { + "id": "cmpl-439", + "choices": [ + { + "finish_reason": null, + "index": 0, + "logprobs": null, + "text": "\"" + } + ], + "created": 1757857132, + "model": "llama3.2:3b-instruct-fp16", + "object": "text_completion", + "system_fingerprint": "fp_ollama", + "usage": null + } + }, + { + "__type__": "openai.types.completion.Completion", + "__data__": { + "id": "cmpl-439", + "choices": [ + { + "finish_reason": null, + "index": 0, + "logprobs": null, + "text": "R" + } + ], + "created": 1757857132, + "model": "llama3.2:3b-instruct-fp16", + "object": "text_completion", + "system_fingerprint": "fp_ollama", + "usage": null + } + }, + { + "__type__": "openai.types.completion.Completion", + "__data__": { + "id": "cmpl-439", + "choices": [ + { + "finish_reason": null, + "index": 0, + "logprobs": null, + "text": "oses" + } + ], + "created": 1757857132, + "model": "llama3.2:3b-instruct-fp16", + "object": "text_completion", + "system_fingerprint": "fp_ollama", + "usage": null + } + }, + { + "__type__": "openai.types.completion.Completion", + "__data__": { + "id": "cmpl-439", + "choices": [ + { + "finish_reason": null, + "index": 0, + "logprobs": null, + "text": " are" + } + ], + "created": 1757857132, + "model": "llama3.2:3b-instruct-fp16", + "object": "text_completion", + "system_fingerprint": "fp_ollama", + "usage": null + } + }, + { + "__type__": "openai.types.completion.Completion", + "__data__": { + "id": "cmpl-439", + "choices": [ + { + "finish_reason": null, + "index": 0, + "logprobs": null, + "text": " red" + } + ], + "created": 1757857132, + "model": "llama3.2:3b-instruct-fp16", + "object": "text_completion", + "system_fingerprint": "fp_ollama", + "usage": null + } + }, + { + "__type__": "openai.types.completion.Completion", + "__data__": { + "id": "cmpl-439", + "choices": [ + { + "finish_reason": null, + "index": 0, + "logprobs": null, + "text": "," + } + ], + "created": 1757857132, + "model": "llama3.2:3b-instruct-fp16", + "object": "text_completion", + "system_fingerprint": "fp_ollama", + "usage": null + } + }, + { + "__type__": "openai.types.completion.Completion", + "__data__": { + "id": "cmpl-439", + "choices": [ + { + "finish_reason": null, + "index": 0, + "logprobs": null, + "text": " v" + } + ], + "created": 1757857132, + "model": "llama3.2:3b-instruct-fp16", + "object": "text_completion", + "system_fingerprint": "fp_ollama", + "usage": null + } + }, + { + "__type__": "openai.types.completion.Completion", + "__data__": { + "id": "cmpl-439", + "choices": [ + { + "finish_reason": null, + "index": 0, + "logprobs": null, + "text": "io" + } + ], + "created": 1757857132, + "model": "llama3.2:3b-instruct-fp16", + "object": "text_completion", + "system_fingerprint": "fp_ollama", + "usage": null + } + }, + { + "__type__": "openai.types.completion.Completion", + "__data__": { + "id": "cmpl-439", + "choices": [ + { + "finish_reason": null, + "index": 0, + "logprobs": null, + "text": "lets" + } + ], + "created": 1757857132, + "model": "llama3.2:3b-instruct-fp16", + "object": "text_completion", + "system_fingerprint": "fp_ollama", + "usage": null + } + }, + { + "__type__": "openai.types.completion.Completion", + "__data__": { + "id": "cmpl-439", + "choices": [ + { + "finish_reason": null, + "index": 0, + "logprobs": null, + "text": " are" + } + ], + "created": 1757857132, + "model": "llama3.2:3b-instruct-fp16", + "object": "text_completion", + "system_fingerprint": "fp_ollama", + "usage": null + } + }, + { + "__type__": "openai.types.completion.Completion", + "__data__": { + "id": "cmpl-439", + "choices": [ + { + "finish_reason": null, + "index": 0, + "logprobs": null, + "text": " blue" + } + ], + "created": 1757857132, + "model": "llama3.2:3b-instruct-fp16", + "object": "text_completion", + "system_fingerprint": "fp_ollama", + "usage": null + } + }, + { + "__type__": "openai.types.completion.Completion", + "__data__": { + "id": "cmpl-439", + "choices": [ + { + "finish_reason": null, + "index": 0, + "logprobs": null, + "text": ",\n" + } + ], + "created": 1757857132, + "model": "llama3.2:3b-instruct-fp16", + "object": "text_completion", + "system_fingerprint": "fp_ollama", + "usage": null + } + }, + { + "__type__": "openai.types.completion.Completion", + "__data__": { + "id": "cmpl-439", + "choices": [ + { + "finish_reason": null, + "index": 0, + "logprobs": null, + "text": "Sugar" + } + ], + "created": 1757857132, + "model": "llama3.2:3b-instruct-fp16", + "object": "text_completion", + "system_fingerprint": "fp_ollama", + "usage": null + } + }, + { + "__type__": "openai.types.completion.Completion", + "__data__": { + "id": "cmpl-439", + "choices": [ + { + "finish_reason": null, + "index": 0, + "logprobs": null, + "text": " is" + } + ], + "created": 1757857132, + "model": "llama3.2:3b-instruct-fp16", + "object": "text_completion", + "system_fingerprint": "fp_ollama", + "usage": null + } + }, + { + "__type__": "openai.types.completion.Completion", + "__data__": { + "id": "cmpl-439", + "choices": [ + { + "finish_reason": null, + "index": 0, + "logprobs": null, + "text": " sweet" + } + ], + "created": 1757857132, + "model": "llama3.2:3b-instruct-fp16", + "object": "text_completion", + "system_fingerprint": "fp_ollama", + "usage": null + } + }, + { + "__type__": "openai.types.completion.Completion", + "__data__": { + "id": "cmpl-439", + "choices": [ + { + "finish_reason": null, + "index": 0, + "logprobs": null, + "text": "," + } + ], + "created": 1757857132, + "model": "llama3.2:3b-instruct-fp16", + "object": "text_completion", + "system_fingerprint": "fp_ollama", + "usage": null + } + }, + { + "__type__": "openai.types.completion.Completion", + "__data__": { + "id": "cmpl-439", + "choices": [ + { + "finish_reason": null, + "index": 0, + "logprobs": null, + "text": " and" + } + ], + "created": 1757857132, + "model": "llama3.2:3b-instruct-fp16", + "object": "text_completion", + "system_fingerprint": "fp_ollama", + "usage": null + } + }, + { + "__type__": "openai.types.completion.Completion", + "__data__": { + "id": "cmpl-439", + "choices": [ + { + "finish_reason": null, + "index": 0, + "logprobs": null, + "text": " so" + } + ], + "created": 1757857132, + "model": "llama3.2:3b-instruct-fp16", + "object": "text_completion", + "system_fingerprint": "fp_ollama", + "usage": null + } + }, + { + "__type__": "openai.types.completion.Completion", + "__data__": { + "id": "cmpl-439", + "choices": [ + { + "finish_reason": null, + "index": 0, + "logprobs": null, + "text": " are" + } + ], + "created": 1757857132, + "model": "llama3.2:3b-instruct-fp16", + "object": "text_completion", + "system_fingerprint": "fp_ollama", + "usage": null + } + }, + { + "__type__": "openai.types.completion.Completion", + "__data__": { + "id": "cmpl-439", + "choices": [ + { + "finish_reason": null, + "index": 0, + "logprobs": null, + "text": " you" + } + ], + "created": 1757857132, + "model": "llama3.2:3b-instruct-fp16", + "object": "text_completion", + "system_fingerprint": "fp_ollama", + "usage": null + } + }, + { + "__type__": "openai.types.completion.Completion", + "__data__": { + "id": "cmpl-439", + "choices": [ + { + "finish_reason": null, + "index": 0, + "logprobs": null, + "text": ".\"" + } + ], + "created": 1757857132, + "model": "llama3.2:3b-instruct-fp16", + "object": "text_completion", + "system_fingerprint": "fp_ollama", + "usage": null + } + }, + { + "__type__": "openai.types.completion.Completion", + "__data__": { + "id": "cmpl-439", + "choices": [ + { + "finish_reason": null, + "index": 0, + "logprobs": null, + "text": " However" + } + ], + "created": 1757857132, + "model": "llama3.2:3b-instruct-fp16", + "object": "text_completion", + "system_fingerprint": "fp_ollama", + "usage": null + } + }, + { + "__type__": "openai.types.completion.Completion", + "__data__": { + "id": "cmpl-439", + "choices": [ + { + "finish_reason": null, + "index": 0, + "logprobs": null, + "text": "," + } + ], + "created": 1757857132, + "model": "llama3.2:3b-instruct-fp16", + "object": "text_completion", + "system_fingerprint": "fp_ollama", + "usage": null + } + }, + { + "__type__": "openai.types.completion.Completion", + "__data__": { + "id": "cmpl-439", + "choices": [ + { + "finish_reason": null, + "index": 0, + "logprobs": null, + "text": " in" + } + ], + "created": 1757857132, + "model": "llama3.2:3b-instruct-fp16", + "object": "text_completion", + "system_fingerprint": "fp_ollama", + "usage": null + } + }, + { + "__type__": "openai.types.completion.Completion", + "__data__": { + "id": "cmpl-439", + "choices": [ + { + "finish_reason": null, + "index": 0, + "logprobs": null, + "text": " many" + } + ], + "created": 1757857132, + "model": "llama3.2:3b-instruct-fp16", + "object": "text_completion", + "system_fingerprint": "fp_ollama", + "usage": null + } + }, + { + "__type__": "openai.types.completion.Completion", + "__data__": { + "id": "cmpl-439", + "choices": [ + { + "finish_reason": null, + "index": 0, + "logprobs": null, + "text": " variations" + } + ], + "created": 1757857132, + "model": "llama3.2:3b-instruct-fp16", + "object": "text_completion", + "system_fingerprint": "fp_ollama", + "usage": null + } + }, + { + "__type__": "openai.types.completion.Completion", + "__data__": { + "id": "cmpl-439", + "choices": [ + { + "finish_reason": null, + "index": 0, + "logprobs": null, + "text": " of" + } + ], + "created": 1757857132, + "model": "llama3.2:3b-instruct-fp16", + "object": "text_completion", + "system_fingerprint": "fp_ollama", + "usage": null + } + }, + { + "__type__": "openai.types.completion.Completion", + "__data__": { + "id": "cmpl-439", + "choices": [ + { + "finish_reason": null, + "index": 0, + "logprobs": null, + "text": " this" + } + ], + "created": 1757857132, + "model": "llama3.2:3b-instruct-fp16", + "object": "text_completion", + "system_fingerprint": "fp_ollama", + "usage": null + } + }, + { + "__type__": "openai.types.completion.Completion", + "__data__": { + "id": "cmpl-439", + "choices": [ + { + "finish_reason": null, + "index": 0, + "logprobs": null, + "text": " poem" + } + ], + "created": 1757857132, + "model": "llama3.2:3b-instruct-fp16", + "object": "text_completion", + "system_fingerprint": "fp_ollama", + "usage": null + } + }, + { + "__type__": "openai.types.completion.Completion", + "__data__": { + "id": "cmpl-439", + "choices": [ + { + "finish_reason": null, + "index": 0, + "logprobs": null, + "text": "," + } + ], + "created": 1757857132, + "model": "llama3.2:3b-instruct-fp16", + "object": "text_completion", + "system_fingerprint": "fp_ollama", + "usage": null + } + }, + { + "__type__": "openai.types.completion.Completion", + "__data__": { + "id": "cmpl-439", + "choices": [ + { + "finish_reason": null, + "index": 0, + "logprobs": null, + "text": " the" + } + ], + "created": 1757857132, + "model": "llama3.2:3b-instruct-fp16", + "object": "text_completion", + "system_fingerprint": "fp_ollama", + "usage": null + } + }, + { + "__type__": "openai.types.completion.Completion", + "__data__": { + "id": "cmpl-439", + "choices": [ + { + "finish_reason": null, + "index": 0, + "logprobs": null, + "text": " line" + } + ], + "created": 1757857132, + "model": "llama3.2:3b-instruct-fp16", + "object": "text_completion", + "system_fingerprint": "fp_ollama", + "usage": null + } + }, + { + "__type__": "openai.types.completion.Completion", + "__data__": { + "id": "cmpl-439", + "choices": [ + { + "finish_reason": null, + "index": 0, + "logprobs": null, + "text": " \"" + } + ], + "created": 1757857132, + "model": "llama3.2:3b-instruct-fp16", + "object": "text_completion", + "system_fingerprint": "fp_ollama", + "usage": null + } + }, + { + "__type__": "openai.types.completion.Completion", + "__data__": { + "id": "cmpl-439", + "choices": [ + { + "finish_reason": null, + "index": 0, + "logprobs": null, + "text": "vio" + } + ], + "created": 1757857132, + "model": "llama3.2:3b-instruct-fp16", + "object": "text_completion", + "system_fingerprint": "fp_ollama", + "usage": null + } + }, + { + "__type__": "openai.types.completion.Completion", + "__data__": { + "id": "cmpl-439", + "choices": [ + { + "finish_reason": "length", + "index": 0, + "logprobs": null, + "text": "" + } + ], + "created": 1757857132, + "model": "llama3.2:3b-instruct-fp16", + "object": "text_completion", + "system_fingerprint": "fp_ollama", + "usage": null + } + } + ], + "is_streaming": true + } +} diff --git a/tests/integration/recordings/responses/6412295819a1.json b/tests/integration/recordings/responses/6412295819a1.json new file mode 100644 index 000000000..728380b02 --- /dev/null +++ b/tests/integration/recordings/responses/6412295819a1.json @@ -0,0 +1,43 @@ +{ + "request": { + "method": "POST", + "url": "http://0.0.0.0:11434/v1/v1/completions", + "headers": {}, + "body": { + "model": "llama3.2:3b-instruct-fp16", + "prompt": "Respond to this question and explain your answer. Complete the sentence using one word: Roses are red, violets are ", + "stream": false, + "extra_body": {} + }, + "endpoint": "/v1/completions", + "model": "llama3.2:3b-instruct-fp16" + }, + "response": { + "body": { + "__type__": "openai.types.completion.Completion", + "__data__": { + "id": "cmpl-104", + "choices": [ + { + "finish_reason": "stop", + "index": 0, + "logprobs": null, + "text": "blue.\n\nI completed the sentence with \"blue\" because it is a common completion used to complete the traditional nursery rhyme, which ends with:\n\nRoses are red,\nViolets are blue.\n\nThe complete rhyme is often remembered and recited as follows:\n\nRoses are red,\nViolets are blue,\nSugar is sweet,\nAnd so are you!" + } + ], + "created": 1757857132, + "model": "llama3.2:3b-instruct-fp16", + "object": "text_completion", + "system_fingerprint": "fp_ollama", + "usage": { + "completion_tokens": 72, + "prompt_tokens": 50, + "total_tokens": 122, + "completion_tokens_details": null, + "prompt_tokens_details": null + } + } + }, + "is_streaming": false + } +} diff --git a/tests/integration/recordings/responses/ecae140151d1.json b/tests/integration/recordings/responses/ecae140151d1.json new file mode 100644 index 000000000..433597080 --- /dev/null +++ b/tests/integration/recordings/responses/ecae140151d1.json @@ -0,0 +1,43 @@ +{ + "request": { + "method": "POST", + "url": "http://0.0.0.0:11434/v1/v1/completions", + "headers": {}, + "body": { + "model": "llama3.2:3b-instruct-fp16", + "prompt": "Say completions", + "max_tokens": 20, + "extra_body": {} + }, + "endpoint": "/v1/completions", + "model": "llama3.2:3b-instruct-fp16" + }, + "response": { + "body": { + "__type__": "openai.types.completion.Completion", + "__data__": { + "id": "cmpl-406", + "choices": [ + { + "finish_reason": "length", + "index": 0, + "logprobs": null, + "text": "Sure, I'd be happy to provide some definitions and examples of related words or phrases.\n\nTo better" + } + ], + "created": 1757857133, + "model": "llama3.2:3b-instruct-fp16", + "object": "text_completion", + "system_fingerprint": "fp_ollama", + "usage": { + "completion_tokens": 20, + "prompt_tokens": 28, + "total_tokens": 48, + "completion_tokens_details": null, + "prompt_tokens_details": null + } + } + }, + "is_streaming": false + } +} From e66103c09d12dde7c1a8878251c09c3c6bf71eb9 Mon Sep 17 00:00:00 2001 From: Jiayi Ni Date: Thu, 18 Sep 2025 04:49:46 -0700 Subject: [PATCH 111/150] fix: add missing files provider to NVIDIA distribution (#3479) # What does this PR do? The rag-runtime tool requires files API as a dependency, but the NVIDIA distribution was missing the files provider configuration. Thus, when running: ``` llama stack build --distro nvidia --image-type venv ``` And then: ``` llama stack run {path_to_distribution_config} --image-type venv ``` It would raise an error: ``` RuntimeError: Failed to resolve 'tool_runtime' provider 'rag-runtime' of type 'inline::rag-runtime': required dependency 'files' is not available. Please add a 'files' provider to your configuration or check if the provider is properly configured. ``` This PR fixes the issue by adding missing files provider to NVIDIA distribution. ## Test Plan N/A --- .../distributions/self_hosted_distro/nvidia.md | 1 + llama_stack/distributions/nvidia/build.yaml | 2 ++ llama_stack/distributions/nvidia/nvidia.py | 13 +++++++++++-- .../distributions/nvidia/run-with-safety.yaml | 9 +++++++++ llama_stack/distributions/nvidia/run.yaml | 9 +++++++++ 5 files changed, 32 insertions(+), 2 deletions(-) diff --git a/docs/source/distributions/self_hosted_distro/nvidia.md b/docs/source/distributions/self_hosted_distro/nvidia.md index 86d025ce7..d4f070075 100644 --- a/docs/source/distributions/self_hosted_distro/nvidia.md +++ b/docs/source/distributions/self_hosted_distro/nvidia.md @@ -11,6 +11,7 @@ The `llamastack/distribution-nvidia` distribution consists of the following prov | agents | `inline::meta-reference` | | datasetio | `inline::localfs`, `remote::nvidia` | | eval | `remote::nvidia` | +| files | `inline::localfs` | | inference | `remote::nvidia` | | post_training | `remote::nvidia` | | safety | `remote::nvidia` | diff --git a/llama_stack/distributions/nvidia/build.yaml b/llama_stack/distributions/nvidia/build.yaml index f3e73a2c1..bc78756d2 100644 --- a/llama_stack/distributions/nvidia/build.yaml +++ b/llama_stack/distributions/nvidia/build.yaml @@ -23,6 +23,8 @@ distribution_spec: - provider_type: inline::basic tool_runtime: - provider_type: inline::rag-runtime + files: + - provider_type: inline::localfs image_type: venv additional_pip_packages: - aiosqlite diff --git a/llama_stack/distributions/nvidia/nvidia.py b/llama_stack/distributions/nvidia/nvidia.py index aedda0ae9..779fabf2c 100644 --- a/llama_stack/distributions/nvidia/nvidia.py +++ b/llama_stack/distributions/nvidia/nvidia.py @@ -8,6 +8,7 @@ from pathlib import Path from llama_stack.core.datatypes import BuildProvider, ModelInput, Provider, ShieldInput, ToolGroupInput from llama_stack.distributions.template import DistributionTemplate, RunConfigSettings, get_model_registry +from llama_stack.providers.inline.files.localfs.config import LocalfsFilesImplConfig from llama_stack.providers.remote.datasetio.nvidia import NvidiaDatasetIOConfig from llama_stack.providers.remote.eval.nvidia import NVIDIAEvalConfig from llama_stack.providers.remote.inference.nvidia import NVIDIAConfig @@ -15,7 +16,7 @@ from llama_stack.providers.remote.inference.nvidia.models import MODEL_ENTRIES from llama_stack.providers.remote.safety.nvidia import NVIDIASafetyConfig -def get_distribution_template() -> DistributionTemplate: +def get_distribution_template(name: str = "nvidia") -> DistributionTemplate: providers = { "inference": [BuildProvider(provider_type="remote::nvidia")], "vector_io": [BuildProvider(provider_type="inline::faiss")], @@ -30,6 +31,7 @@ def get_distribution_template() -> DistributionTemplate: ], "scoring": [BuildProvider(provider_type="inline::basic")], "tool_runtime": [BuildProvider(provider_type="inline::rag-runtime")], + "files": [BuildProvider(provider_type="inline::localfs")], } inference_provider = Provider( @@ -52,6 +54,11 @@ def get_distribution_template() -> DistributionTemplate: provider_type="remote::nvidia", config=NVIDIAEvalConfig.sample_run_config(), ) + files_provider = Provider( + provider_id="meta-reference-files", + provider_type="inline::localfs", + config=LocalfsFilesImplConfig.sample_run_config(f"~/.llama/distributions/{name}"), + ) inference_model = ModelInput( model_id="${env.INFERENCE_MODEL}", provider_id="nvidia", @@ -73,7 +80,7 @@ def get_distribution_template() -> DistributionTemplate: default_models, _ = get_model_registry(available_models) return DistributionTemplate( - name="nvidia", + name=name, distro_type="self_hosted", description="Use NVIDIA NIM for running LLM inference, evaluation and safety", container_image=None, @@ -86,6 +93,7 @@ def get_distribution_template() -> DistributionTemplate: "inference": [inference_provider], "datasetio": [datasetio_provider], "eval": [eval_provider], + "files": [files_provider], }, default_models=default_models, default_tool_groups=default_tool_groups, @@ -97,6 +105,7 @@ def get_distribution_template() -> DistributionTemplate: safety_provider, ], "eval": [eval_provider], + "files": [files_provider], }, default_models=[inference_model, safety_model], default_shields=[ShieldInput(shield_id="${env.SAFETY_MODEL}", provider_id="nvidia")], diff --git a/llama_stack/distributions/nvidia/run-with-safety.yaml b/llama_stack/distributions/nvidia/run-with-safety.yaml index 015724050..5a958116e 100644 --- a/llama_stack/distributions/nvidia/run-with-safety.yaml +++ b/llama_stack/distributions/nvidia/run-with-safety.yaml @@ -4,6 +4,7 @@ apis: - agents - datasetio - eval +- files - inference - post_training - safety @@ -88,6 +89,14 @@ providers: tool_runtime: - provider_id: rag-runtime provider_type: inline::rag-runtime + files: + - provider_id: meta-reference-files + provider_type: inline::localfs + config: + storage_dir: ${env.FILES_STORAGE_DIR:=~/.llama/distributions/nvidia/files} + metadata_store: + type: sqlite + db_path: ${env.SQLITE_STORE_DIR:=~/.llama/distributions/nvidia}/files_metadata.db metadata_store: type: sqlite db_path: ${env.SQLITE_STORE_DIR:=~/.llama/distributions/nvidia}/registry.db diff --git a/llama_stack/distributions/nvidia/run.yaml b/llama_stack/distributions/nvidia/run.yaml index 9fd6b0404..362970d2e 100644 --- a/llama_stack/distributions/nvidia/run.yaml +++ b/llama_stack/distributions/nvidia/run.yaml @@ -4,6 +4,7 @@ apis: - agents - datasetio - eval +- files - inference - post_training - safety @@ -77,6 +78,14 @@ providers: tool_runtime: - provider_id: rag-runtime provider_type: inline::rag-runtime + files: + - provider_id: meta-reference-files + provider_type: inline::localfs + config: + storage_dir: ${env.FILES_STORAGE_DIR:=~/.llama/distributions/nvidia/files} + metadata_store: + type: sqlite + db_path: ${env.SQLITE_STORE_DIR:=~/.llama/distributions/nvidia}/files_metadata.db metadata_store: type: sqlite db_path: ${env.SQLITE_STORE_DIR:=~/.llama/distributions/nvidia}/registry.db From 8422bd102a672c90f3eb189297f8e36332c4d17e Mon Sep 17 00:00:00 2001 From: Charlie Doern Date: Thu, 18 Sep 2025 10:10:00 -0400 Subject: [PATCH 112/150] feat: combine ProviderSpec datatypes (#3378) # What does this PR do? currently `RemoteProviderSpec` has an `AdapterSpec` embedded in it. Remove `AdapterSpec`, and put its leftover fields into `RemoteProviderSpec`. Additionally, many of the fields were duplicated between `InlineProviderSpec` and `RemoteProviderSpec`. Move these to `ProviderSpec` so they are shared. Fixup the distro codegen to use `RemoteProviderSpec` directly rather than `remote_provider_spec` which took an AdapterSpec and returned a full provider spec ## Test Plan existing distro tests should pass. Signed-off-by: Charlie Doern --- llama_stack/core/datatypes.py | 4 - llama_stack/core/distribution.py | 22 +- llama_stack/distributions/starter/starter.py | 4 +- llama_stack/providers/datatypes.py | 88 +--- llama_stack/providers/registry/datasetio.py | 41 +- llama_stack/providers/registry/eval.py | 21 +- llama_stack/providers/registry/files.py | 23 +- llama_stack/providers/registry/inference.py | 380 +++++++++--------- .../providers/registry/post_training.py | 17 +- llama_stack/providers/registry/safety.py | 50 ++- .../providers/registry/tool_runtime.py | 88 ++-- llama_stack/providers/registry/vector_io.py | 108 +++-- tests/external/kaze.yaml | 9 +- .../src/llama_stack_api_weather/weather.py | 11 +- tests/unit/distribution/test_distribution.py | 18 +- 15 files changed, 381 insertions(+), 503 deletions(-) diff --git a/llama_stack/core/datatypes.py b/llama_stack/core/datatypes.py index faaeefd01..b5558c66f 100644 --- a/llama_stack/core/datatypes.py +++ b/llama_stack/core/datatypes.py @@ -121,10 +121,6 @@ class AutoRoutedProviderSpec(ProviderSpec): default=None, ) - @property - def pip_packages(self) -> list[str]: - raise AssertionError("Should not be called on AutoRoutedProviderSpec") - # Example: /models, /shields class RoutingTableProviderSpec(ProviderSpec): diff --git a/llama_stack/core/distribution.py b/llama_stack/core/distribution.py index c104b6764..302ecb960 100644 --- a/llama_stack/core/distribution.py +++ b/llama_stack/core/distribution.py @@ -16,11 +16,10 @@ from llama_stack.core.datatypes import BuildConfig, DistributionSpec from llama_stack.core.external import load_external_apis from llama_stack.log import get_logger from llama_stack.providers.datatypes import ( - AdapterSpec, Api, InlineProviderSpec, ProviderSpec, - remote_provider_spec, + RemoteProviderSpec, ) logger = get_logger(name=__name__, category="core") @@ -77,27 +76,12 @@ def providable_apis() -> list[Api]: def _load_remote_provider_spec(spec_data: dict[str, Any], api: Api) -> ProviderSpec: - adapter = AdapterSpec(**spec_data["adapter"]) - spec = remote_provider_spec( - api=api, - adapter=adapter, - api_dependencies=[Api(dep) for dep in spec_data.get("api_dependencies", [])], - ) + spec = RemoteProviderSpec(api=api, provider_type=f"remote::{spec_data['adapter_type']}", **spec_data) return spec def _load_inline_provider_spec(spec_data: dict[str, Any], api: Api, provider_name: str) -> ProviderSpec: - spec = InlineProviderSpec( - api=api, - provider_type=f"inline::{provider_name}", - pip_packages=spec_data.get("pip_packages", []), - module=spec_data["module"], - config_class=spec_data["config_class"], - api_dependencies=[Api(dep) for dep in spec_data.get("api_dependencies", [])], - optional_api_dependencies=[Api(dep) for dep in spec_data.get("optional_api_dependencies", [])], - provider_data_validator=spec_data.get("provider_data_validator"), - container_image=spec_data.get("container_image"), - ) + spec = InlineProviderSpec(api=api, provider_type=f"inline::{provider_name}", **spec_data) return spec diff --git a/llama_stack/distributions/starter/starter.py b/llama_stack/distributions/starter/starter.py index c2dfe95ad..6bee51ff0 100644 --- a/llama_stack/distributions/starter/starter.py +++ b/llama_stack/distributions/starter/starter.py @@ -78,12 +78,12 @@ def get_remote_inference_providers() -> list[Provider]: remote_providers = [ provider for provider in available_providers() - if isinstance(provider, RemoteProviderSpec) and provider.adapter.adapter_type in ENABLED_INFERENCE_PROVIDERS + if isinstance(provider, RemoteProviderSpec) and provider.adapter_type in ENABLED_INFERENCE_PROVIDERS ] inference_providers = [] for provider_spec in remote_providers: - provider_type = provider_spec.adapter.adapter_type + provider_type = provider_spec.adapter_type if provider_type in INFERENCE_PROVIDER_IDS: provider_id = INFERENCE_PROVIDER_IDS[provider_type] diff --git a/llama_stack/providers/datatypes.py b/llama_stack/providers/datatypes.py index 5e15dd8e1..c8ff9cecb 100644 --- a/llama_stack/providers/datatypes.py +++ b/llama_stack/providers/datatypes.py @@ -131,6 +131,15 @@ class ProviderSpec(BaseModel): """, ) + pip_packages: list[str] = Field( + default_factory=list, + description="The pip dependencies needed for this implementation", + ) + + provider_data_validator: str | None = Field( + default=None, + ) + is_external: bool = Field(default=False, description="Notes whether this provider is an external provider.") # used internally by the resolver; this is a hack for now @@ -145,45 +154,8 @@ class RoutingTable(Protocol): async def get_provider_impl(self, routing_key: str) -> Any: ... -# TODO: this can now be inlined into RemoteProviderSpec -@json_schema_type -class AdapterSpec(BaseModel): - adapter_type: str = Field( - ..., - description="Unique identifier for this adapter", - ) - module: str = Field( - default_factory=str, - description=""" -Fully-qualified name of the module to import. The module is expected to have: - - - `get_adapter_impl(config, deps)`: returns the adapter implementation -""", - ) - pip_packages: list[str] = Field( - default_factory=list, - description="The pip dependencies needed for this implementation", - ) - config_class: str = Field( - description="Fully-qualified classname of the config for this provider", - ) - provider_data_validator: str | None = Field( - default=None, - ) - description: str | None = Field( - default=None, - description=""" -A description of the provider. This is used to display in the documentation. -""", - ) - - @json_schema_type class InlineProviderSpec(ProviderSpec): - pip_packages: list[str] = Field( - default_factory=list, - description="The pip dependencies needed for this implementation", - ) container_image: str | None = Field( default=None, description=""" @@ -191,10 +163,6 @@ The container image to use for this implementation. If one is provided, pip_pack If a provider depends on other providers, the dependencies MUST NOT specify a container image. """, ) - # module field is inherited from ProviderSpec - provider_data_validator: str | None = Field( - default=None, - ) description: str | None = Field( default=None, description=""" @@ -223,10 +191,15 @@ class RemoteProviderConfig(BaseModel): @json_schema_type class RemoteProviderSpec(ProviderSpec): - adapter: AdapterSpec = Field( + adapter_type: str = Field( + ..., + description="Unique identifier for this adapter", + ) + + description: str | None = Field( + default=None, description=""" -If some code is needed to convert the remote responses into Llama Stack compatible -API responses, specify the adapter here. +A description of the provider. This is used to display in the documentation. """, ) @@ -234,33 +207,6 @@ API responses, specify the adapter here. def container_image(self) -> str | None: return None - # module field is inherited from ProviderSpec - - @property - def pip_packages(self) -> list[str]: - return self.adapter.pip_packages - - @property - def provider_data_validator(self) -> str | None: - return self.adapter.provider_data_validator - - -def remote_provider_spec( - api: Api, - adapter: AdapterSpec, - api_dependencies: list[Api] | None = None, - optional_api_dependencies: list[Api] | None = None, -) -> RemoteProviderSpec: - return RemoteProviderSpec( - api=api, - provider_type=f"remote::{adapter.adapter_type}", - config_class=adapter.config_class, - module=adapter.module, - adapter=adapter, - api_dependencies=api_dependencies or [], - optional_api_dependencies=optional_api_dependencies or [], - ) - class HealthStatus(StrEnum): OK = "OK" diff --git a/llama_stack/providers/registry/datasetio.py b/llama_stack/providers/registry/datasetio.py index f641b4ce3..a9feb0bac 100644 --- a/llama_stack/providers/registry/datasetio.py +++ b/llama_stack/providers/registry/datasetio.py @@ -6,11 +6,10 @@ from llama_stack.providers.datatypes import ( - AdapterSpec, Api, InlineProviderSpec, ProviderSpec, - remote_provider_spec, + RemoteProviderSpec, ) @@ -25,28 +24,26 @@ def available_providers() -> list[ProviderSpec]: api_dependencies=[], description="Local filesystem-based dataset I/O provider for reading and writing datasets to local storage.", ), - remote_provider_spec( + RemoteProviderSpec( api=Api.datasetio, - adapter=AdapterSpec( - adapter_type="huggingface", - pip_packages=[ - "datasets>=4.0.0", - ], - module="llama_stack.providers.remote.datasetio.huggingface", - config_class="llama_stack.providers.remote.datasetio.huggingface.HuggingfaceDatasetIOConfig", - description="HuggingFace datasets provider for accessing and managing datasets from the HuggingFace Hub.", - ), + adapter_type="huggingface", + provider_type="remote::huggingface", + pip_packages=[ + "datasets>=4.0.0", + ], + module="llama_stack.providers.remote.datasetio.huggingface", + config_class="llama_stack.providers.remote.datasetio.huggingface.HuggingfaceDatasetIOConfig", + description="HuggingFace datasets provider for accessing and managing datasets from the HuggingFace Hub.", ), - remote_provider_spec( + RemoteProviderSpec( api=Api.datasetio, - adapter=AdapterSpec( - adapter_type="nvidia", - pip_packages=[ - "datasets>=4.0.0", - ], - module="llama_stack.providers.remote.datasetio.nvidia", - config_class="llama_stack.providers.remote.datasetio.nvidia.NvidiaDatasetIOConfig", - description="NVIDIA's dataset I/O provider for accessing datasets from NVIDIA's data platform.", - ), + adapter_type="nvidia", + provider_type="remote::nvidia", + module="llama_stack.providers.remote.datasetio.nvidia", + config_class="llama_stack.providers.remote.datasetio.nvidia.NvidiaDatasetIOConfig", + pip_packages=[ + "datasets>=4.0.0", + ], + description="NVIDIA's dataset I/O provider for accessing datasets from NVIDIA's data platform.", ), ] diff --git a/llama_stack/providers/registry/eval.py b/llama_stack/providers/registry/eval.py index 9f0d17916..4ef0bb41f 100644 --- a/llama_stack/providers/registry/eval.py +++ b/llama_stack/providers/registry/eval.py @@ -5,7 +5,7 @@ # the root directory of this source tree. -from llama_stack.providers.datatypes import AdapterSpec, Api, InlineProviderSpec, ProviderSpec, remote_provider_spec +from llama_stack.providers.datatypes import Api, InlineProviderSpec, ProviderSpec, RemoteProviderSpec def available_providers() -> list[ProviderSpec]: @@ -25,17 +25,16 @@ def available_providers() -> list[ProviderSpec]: ], description="Meta's reference implementation of evaluation tasks with support for multiple languages and evaluation metrics.", ), - remote_provider_spec( + RemoteProviderSpec( api=Api.eval, - adapter=AdapterSpec( - adapter_type="nvidia", - pip_packages=[ - "requests", - ], - module="llama_stack.providers.remote.eval.nvidia", - config_class="llama_stack.providers.remote.eval.nvidia.NVIDIAEvalConfig", - description="NVIDIA's evaluation provider for running evaluation tasks on NVIDIA's platform.", - ), + adapter_type="nvidia", + pip_packages=[ + "requests", + ], + provider_type="remote::nvidia", + module="llama_stack.providers.remote.eval.nvidia", + config_class="llama_stack.providers.remote.eval.nvidia.NVIDIAEvalConfig", + description="NVIDIA's evaluation provider for running evaluation tasks on NVIDIA's platform.", api_dependencies=[ Api.datasetio, Api.datasets, diff --git a/llama_stack/providers/registry/files.py b/llama_stack/providers/registry/files.py index ebe90310c..9acabfacd 100644 --- a/llama_stack/providers/registry/files.py +++ b/llama_stack/providers/registry/files.py @@ -4,13 +4,7 @@ # This source code is licensed under the terms described in the LICENSE file in # the root directory of this source tree. -from llama_stack.providers.datatypes import ( - AdapterSpec, - Api, - InlineProviderSpec, - ProviderSpec, - remote_provider_spec, -) +from llama_stack.providers.datatypes import Api, InlineProviderSpec, ProviderSpec, RemoteProviderSpec from llama_stack.providers.utils.sqlstore.sqlstore import sql_store_pip_packages @@ -25,14 +19,13 @@ def available_providers() -> list[ProviderSpec]: config_class="llama_stack.providers.inline.files.localfs.config.LocalfsFilesImplConfig", description="Local filesystem-based file storage provider for managing files and documents locally.", ), - remote_provider_spec( + RemoteProviderSpec( api=Api.files, - adapter=AdapterSpec( - adapter_type="s3", - pip_packages=["boto3"] + sql_store_pip_packages, - module="llama_stack.providers.remote.files.s3", - config_class="llama_stack.providers.remote.files.s3.config.S3FilesImplConfig", - description="AWS S3-based file storage provider for scalable cloud file management with metadata persistence.", - ), + provider_type="remote::s3", + adapter_type="s3", + pip_packages=["boto3"] + sql_store_pip_packages, + module="llama_stack.providers.remote.files.s3", + config_class="llama_stack.providers.remote.files.s3.config.S3FilesImplConfig", + description="AWS S3-based file storage provider for scalable cloud file management with metadata persistence.", ), ] diff --git a/llama_stack/providers/registry/inference.py b/llama_stack/providers/registry/inference.py index 0eb4cf104..658611698 100644 --- a/llama_stack/providers/registry/inference.py +++ b/llama_stack/providers/registry/inference.py @@ -6,11 +6,10 @@ from llama_stack.providers.datatypes import ( - AdapterSpec, Api, InlineProviderSpec, ProviderSpec, - remote_provider_spec, + RemoteProviderSpec, ) META_REFERENCE_DEPS = [ @@ -49,177 +48,167 @@ def available_providers() -> list[ProviderSpec]: config_class="llama_stack.providers.inline.inference.sentence_transformers.config.SentenceTransformersInferenceConfig", description="Sentence Transformers inference provider for text embeddings and similarity search.", ), - remote_provider_spec( + RemoteProviderSpec( api=Api.inference, - adapter=AdapterSpec( - adapter_type="cerebras", - pip_packages=[ - "cerebras_cloud_sdk", - ], - module="llama_stack.providers.remote.inference.cerebras", - config_class="llama_stack.providers.remote.inference.cerebras.CerebrasImplConfig", - description="Cerebras inference provider for running models on Cerebras Cloud platform.", - ), + adapter_type="cerebras", + provider_type="remote::cerebras", + pip_packages=[ + "cerebras_cloud_sdk", + ], + module="llama_stack.providers.remote.inference.cerebras", + config_class="llama_stack.providers.remote.inference.cerebras.CerebrasImplConfig", + description="Cerebras inference provider for running models on Cerebras Cloud platform.", ), - remote_provider_spec( + RemoteProviderSpec( api=Api.inference, - adapter=AdapterSpec( - adapter_type="ollama", - pip_packages=["ollama", "aiohttp", "h11>=0.16.0"], - config_class="llama_stack.providers.remote.inference.ollama.OllamaImplConfig", - module="llama_stack.providers.remote.inference.ollama", - description="Ollama inference provider for running local models through the Ollama runtime.", - ), + adapter_type="ollama", + provider_type="remote::ollama", + pip_packages=["ollama", "aiohttp", "h11>=0.16.0"], + config_class="llama_stack.providers.remote.inference.ollama.OllamaImplConfig", + module="llama_stack.providers.remote.inference.ollama", + description="Ollama inference provider for running local models through the Ollama runtime.", ), - remote_provider_spec( + RemoteProviderSpec( api=Api.inference, - adapter=AdapterSpec( - adapter_type="vllm", - pip_packages=[], - module="llama_stack.providers.remote.inference.vllm", - config_class="llama_stack.providers.remote.inference.vllm.VLLMInferenceAdapterConfig", - provider_data_validator="llama_stack.providers.remote.inference.vllm.VLLMProviderDataValidator", - description="Remote vLLM inference provider for connecting to vLLM servers.", - ), + adapter_type="vllm", + provider_type="remote::vllm", + pip_packages=[], + module="llama_stack.providers.remote.inference.vllm", + config_class="llama_stack.providers.remote.inference.vllm.VLLMInferenceAdapterConfig", + provider_data_validator="llama_stack.providers.remote.inference.vllm.VLLMProviderDataValidator", + description="Remote vLLM inference provider for connecting to vLLM servers.", ), - remote_provider_spec( + RemoteProviderSpec( api=Api.inference, - adapter=AdapterSpec( - adapter_type="tgi", - pip_packages=["huggingface_hub", "aiohttp"], - module="llama_stack.providers.remote.inference.tgi", - config_class="llama_stack.providers.remote.inference.tgi.TGIImplConfig", - description="Text Generation Inference (TGI) provider for HuggingFace model serving.", - ), + adapter_type="tgi", + provider_type="remote::tgi", + pip_packages=["huggingface_hub", "aiohttp"], + module="llama_stack.providers.remote.inference.tgi", + config_class="llama_stack.providers.remote.inference.tgi.TGIImplConfig", + description="Text Generation Inference (TGI) provider for HuggingFace model serving.", ), - remote_provider_spec( + RemoteProviderSpec( api=Api.inference, - adapter=AdapterSpec( - adapter_type="hf::serverless", - pip_packages=["huggingface_hub", "aiohttp"], - module="llama_stack.providers.remote.inference.tgi", - config_class="llama_stack.providers.remote.inference.tgi.InferenceAPIImplConfig", - description="HuggingFace Inference API serverless provider for on-demand model inference.", - ), + adapter_type="hf::serverless", + provider_type="remote::hf::serverless", + pip_packages=["huggingface_hub", "aiohttp"], + module="llama_stack.providers.remote.inference.tgi", + config_class="llama_stack.providers.remote.inference.tgi.InferenceAPIImplConfig", + description="HuggingFace Inference API serverless provider for on-demand model inference.", ), - remote_provider_spec( + RemoteProviderSpec( api=Api.inference, - adapter=AdapterSpec( - adapter_type="hf::endpoint", - pip_packages=["huggingface_hub", "aiohttp"], - module="llama_stack.providers.remote.inference.tgi", - config_class="llama_stack.providers.remote.inference.tgi.InferenceEndpointImplConfig", - description="HuggingFace Inference Endpoints provider for dedicated model serving.", - ), + provider_type="remote::hf::endpoint", + adapter_type="hf::endpoint", + pip_packages=["huggingface_hub", "aiohttp"], + module="llama_stack.providers.remote.inference.tgi", + config_class="llama_stack.providers.remote.inference.tgi.InferenceEndpointImplConfig", + description="HuggingFace Inference Endpoints provider for dedicated model serving.", ), - remote_provider_spec( + RemoteProviderSpec( api=Api.inference, - adapter=AdapterSpec( - adapter_type="fireworks", - pip_packages=[ - "fireworks-ai<=0.17.16", - ], - module="llama_stack.providers.remote.inference.fireworks", - config_class="llama_stack.providers.remote.inference.fireworks.FireworksImplConfig", - provider_data_validator="llama_stack.providers.remote.inference.fireworks.FireworksProviderDataValidator", - description="Fireworks AI inference provider for Llama models and other AI models on the Fireworks platform.", - ), + adapter_type="fireworks", + provider_type="remote::fireworks", + pip_packages=[ + "fireworks-ai<=0.17.16", + ], + module="llama_stack.providers.remote.inference.fireworks", + config_class="llama_stack.providers.remote.inference.fireworks.FireworksImplConfig", + provider_data_validator="llama_stack.providers.remote.inference.fireworks.FireworksProviderDataValidator", + description="Fireworks AI inference provider for Llama models and other AI models on the Fireworks platform.", ), - remote_provider_spec( + RemoteProviderSpec( api=Api.inference, - adapter=AdapterSpec( - adapter_type="together", - pip_packages=[ - "together", - ], - module="llama_stack.providers.remote.inference.together", - config_class="llama_stack.providers.remote.inference.together.TogetherImplConfig", - provider_data_validator="llama_stack.providers.remote.inference.together.TogetherProviderDataValidator", - description="Together AI inference provider for open-source models and collaborative AI development.", - ), + adapter_type="together", + provider_type="remote::together", + pip_packages=[ + "together", + ], + module="llama_stack.providers.remote.inference.together", + config_class="llama_stack.providers.remote.inference.together.TogetherImplConfig", + provider_data_validator="llama_stack.providers.remote.inference.together.TogetherProviderDataValidator", + description="Together AI inference provider for open-source models and collaborative AI development.", ), - remote_provider_spec( + RemoteProviderSpec( api=Api.inference, - adapter=AdapterSpec( - adapter_type="bedrock", - pip_packages=["boto3"], - module="llama_stack.providers.remote.inference.bedrock", - config_class="llama_stack.providers.remote.inference.bedrock.BedrockConfig", - description="AWS Bedrock inference provider for accessing various AI models through AWS's managed service.", - ), + adapter_type="bedrock", + provider_type="remote::bedrock", + pip_packages=["boto3"], + module="llama_stack.providers.remote.inference.bedrock", + config_class="llama_stack.providers.remote.inference.bedrock.BedrockConfig", + description="AWS Bedrock inference provider for accessing various AI models through AWS's managed service.", ), - remote_provider_spec( + RemoteProviderSpec( api=Api.inference, - adapter=AdapterSpec( - adapter_type="databricks", - pip_packages=[], - module="llama_stack.providers.remote.inference.databricks", - config_class="llama_stack.providers.remote.inference.databricks.DatabricksImplConfig", - description="Databricks inference provider for running models on Databricks' unified analytics platform.", - ), + adapter_type="databricks", + provider_type="remote::databricks", + pip_packages=[], + module="llama_stack.providers.remote.inference.databricks", + config_class="llama_stack.providers.remote.inference.databricks.DatabricksImplConfig", + description="Databricks inference provider for running models on Databricks' unified analytics platform.", ), - remote_provider_spec( + RemoteProviderSpec( api=Api.inference, - adapter=AdapterSpec( - adapter_type="nvidia", - pip_packages=[], - module="llama_stack.providers.remote.inference.nvidia", - config_class="llama_stack.providers.remote.inference.nvidia.NVIDIAConfig", - description="NVIDIA inference provider for accessing NVIDIA NIM models and AI services.", - ), + adapter_type="nvidia", + provider_type="remote::nvidia", + pip_packages=[], + module="llama_stack.providers.remote.inference.nvidia", + config_class="llama_stack.providers.remote.inference.nvidia.NVIDIAConfig", + description="NVIDIA inference provider for accessing NVIDIA NIM models and AI services.", ), - remote_provider_spec( + RemoteProviderSpec( api=Api.inference, - adapter=AdapterSpec( - adapter_type="runpod", - pip_packages=[], - module="llama_stack.providers.remote.inference.runpod", - config_class="llama_stack.providers.remote.inference.runpod.RunpodImplConfig", - description="RunPod inference provider for running models on RunPod's cloud GPU platform.", - ), + adapter_type="runpod", + provider_type="remote::runpod", + pip_packages=[], + module="llama_stack.providers.remote.inference.runpod", + config_class="llama_stack.providers.remote.inference.runpod.RunpodImplConfig", + description="RunPod inference provider for running models on RunPod's cloud GPU platform.", ), - remote_provider_spec( + RemoteProviderSpec( api=Api.inference, - adapter=AdapterSpec( - adapter_type="openai", - pip_packages=["litellm"], - module="llama_stack.providers.remote.inference.openai", - config_class="llama_stack.providers.remote.inference.openai.OpenAIConfig", - provider_data_validator="llama_stack.providers.remote.inference.openai.config.OpenAIProviderDataValidator", - description="OpenAI inference provider for accessing GPT models and other OpenAI services.", - ), + adapter_type="openai", + provider_type="remote::openai", + pip_packages=["litellm"], + module="llama_stack.providers.remote.inference.openai", + config_class="llama_stack.providers.remote.inference.openai.OpenAIConfig", + provider_data_validator="llama_stack.providers.remote.inference.openai.config.OpenAIProviderDataValidator", + description="OpenAI inference provider for accessing GPT models and other OpenAI services.", ), - remote_provider_spec( + RemoteProviderSpec( api=Api.inference, - adapter=AdapterSpec( - adapter_type="anthropic", - pip_packages=["litellm"], - module="llama_stack.providers.remote.inference.anthropic", - config_class="llama_stack.providers.remote.inference.anthropic.AnthropicConfig", - provider_data_validator="llama_stack.providers.remote.inference.anthropic.config.AnthropicProviderDataValidator", - description="Anthropic inference provider for accessing Claude models and Anthropic's AI services.", - ), + adapter_type="anthropic", + provider_type="remote::anthropic", + pip_packages=["litellm"], + module="llama_stack.providers.remote.inference.anthropic", + config_class="llama_stack.providers.remote.inference.anthropic.AnthropicConfig", + provider_data_validator="llama_stack.providers.remote.inference.anthropic.config.AnthropicProviderDataValidator", + description="Anthropic inference provider for accessing Claude models and Anthropic's AI services.", ), - remote_provider_spec( + RemoteProviderSpec( api=Api.inference, - adapter=AdapterSpec( - adapter_type="gemini", - pip_packages=["litellm"], - module="llama_stack.providers.remote.inference.gemini", - config_class="llama_stack.providers.remote.inference.gemini.GeminiConfig", - provider_data_validator="llama_stack.providers.remote.inference.gemini.config.GeminiProviderDataValidator", - description="Google Gemini inference provider for accessing Gemini models and Google's AI services.", - ), + adapter_type="gemini", + provider_type="remote::gemini", + pip_packages=[ + "litellm", + ], + module="llama_stack.providers.remote.inference.gemini", + config_class="llama_stack.providers.remote.inference.gemini.GeminiConfig", + provider_data_validator="llama_stack.providers.remote.inference.gemini.config.GeminiProviderDataValidator", + description="Google Gemini inference provider for accessing Gemini models and Google's AI services.", ), - remote_provider_spec( + RemoteProviderSpec( api=Api.inference, - adapter=AdapterSpec( - adapter_type="vertexai", - pip_packages=["litellm", "google-cloud-aiplatform"], - module="llama_stack.providers.remote.inference.vertexai", - config_class="llama_stack.providers.remote.inference.vertexai.VertexAIConfig", - provider_data_validator="llama_stack.providers.remote.inference.vertexai.config.VertexAIProviderDataValidator", - description="""Google Vertex AI inference provider enables you to use Google's Gemini models through Google Cloud's Vertex AI platform, providing several advantages: + adapter_type="vertexai", + provider_type="remote::vertexai", + pip_packages=[ + "litellm", + "google-cloud-aiplatform", + ], + module="llama_stack.providers.remote.inference.vertexai", + config_class="llama_stack.providers.remote.inference.vertexai.VertexAIConfig", + provider_data_validator="llama_stack.providers.remote.inference.vertexai.config.VertexAIProviderDataValidator", + description="""Google Vertex AI inference provider enables you to use Google's Gemini models through Google Cloud's Vertex AI platform, providing several advantages: • Enterprise-grade security: Uses Google Cloud's security controls and IAM • Better integration: Seamless integration with other Google Cloud services @@ -239,76 +228,73 @@ Available Models: - vertex_ai/gemini-2.0-flash - vertex_ai/gemini-2.5-flash - vertex_ai/gemini-2.5-pro""", - ), ), - remote_provider_spec( + RemoteProviderSpec( api=Api.inference, - adapter=AdapterSpec( - adapter_type="groq", - pip_packages=["litellm"], - module="llama_stack.providers.remote.inference.groq", - config_class="llama_stack.providers.remote.inference.groq.GroqConfig", - provider_data_validator="llama_stack.providers.remote.inference.groq.config.GroqProviderDataValidator", - description="Groq inference provider for ultra-fast inference using Groq's LPU technology.", - ), + adapter_type="groq", + provider_type="remote::groq", + pip_packages=[ + "litellm", + ], + module="llama_stack.providers.remote.inference.groq", + config_class="llama_stack.providers.remote.inference.groq.GroqConfig", + provider_data_validator="llama_stack.providers.remote.inference.groq.config.GroqProviderDataValidator", + description="Groq inference provider for ultra-fast inference using Groq's LPU technology.", ), - remote_provider_spec( + RemoteProviderSpec( api=Api.inference, - adapter=AdapterSpec( - adapter_type="llama-openai-compat", - pip_packages=["litellm"], - module="llama_stack.providers.remote.inference.llama_openai_compat", - config_class="llama_stack.providers.remote.inference.llama_openai_compat.config.LlamaCompatConfig", - provider_data_validator="llama_stack.providers.remote.inference.llama_openai_compat.config.LlamaProviderDataValidator", - description="Llama OpenAI-compatible provider for using Llama models with OpenAI API format.", - ), + adapter_type="llama-openai-compat", + provider_type="remote::llama-openai-compat", + pip_packages=["litellm"], + module="llama_stack.providers.remote.inference.llama_openai_compat", + config_class="llama_stack.providers.remote.inference.llama_openai_compat.config.LlamaCompatConfig", + provider_data_validator="llama_stack.providers.remote.inference.llama_openai_compat.config.LlamaProviderDataValidator", + description="Llama OpenAI-compatible provider for using Llama models with OpenAI API format.", ), - remote_provider_spec( + RemoteProviderSpec( api=Api.inference, - adapter=AdapterSpec( - adapter_type="sambanova", - pip_packages=["litellm"], - module="llama_stack.providers.remote.inference.sambanova", - config_class="llama_stack.providers.remote.inference.sambanova.SambaNovaImplConfig", - provider_data_validator="llama_stack.providers.remote.inference.sambanova.config.SambaNovaProviderDataValidator", - description="SambaNova inference provider for running models on SambaNova's dataflow architecture.", - ), + adapter_type="sambanova", + provider_type="remote::sambanova", + pip_packages=[ + "litellm", + ], + module="llama_stack.providers.remote.inference.sambanova", + config_class="llama_stack.providers.remote.inference.sambanova.SambaNovaImplConfig", + provider_data_validator="llama_stack.providers.remote.inference.sambanova.config.SambaNovaProviderDataValidator", + description="SambaNova inference provider for running models on SambaNova's dataflow architecture.", ), - remote_provider_spec( + RemoteProviderSpec( api=Api.inference, - adapter=AdapterSpec( - adapter_type="passthrough", - pip_packages=[], - module="llama_stack.providers.remote.inference.passthrough", - config_class="llama_stack.providers.remote.inference.passthrough.PassthroughImplConfig", - provider_data_validator="llama_stack.providers.remote.inference.passthrough.PassthroughProviderDataValidator", - description="Passthrough inference provider for connecting to any external inference service not directly supported.", - ), + adapter_type="passthrough", + provider_type="remote::passthrough", + pip_packages=[], + module="llama_stack.providers.remote.inference.passthrough", + config_class="llama_stack.providers.remote.inference.passthrough.PassthroughImplConfig", + provider_data_validator="llama_stack.providers.remote.inference.passthrough.PassthroughProviderDataValidator", + description="Passthrough inference provider for connecting to any external inference service not directly supported.", ), - remote_provider_spec( + RemoteProviderSpec( api=Api.inference, - adapter=AdapterSpec( - adapter_type="watsonx", - pip_packages=["ibm_watsonx_ai"], - module="llama_stack.providers.remote.inference.watsonx", - config_class="llama_stack.providers.remote.inference.watsonx.WatsonXConfig", - provider_data_validator="llama_stack.providers.remote.inference.watsonx.WatsonXProviderDataValidator", - description="IBM WatsonX inference provider for accessing AI models on IBM's WatsonX platform.", - ), + adapter_type="watsonx", + provider_type="remote::watsonx", + pip_packages=["ibm_watsonx_ai"], + module="llama_stack.providers.remote.inference.watsonx", + config_class="llama_stack.providers.remote.inference.watsonx.WatsonXConfig", + provider_data_validator="llama_stack.providers.remote.inference.watsonx.WatsonXProviderDataValidator", + description="IBM WatsonX inference provider for accessing AI models on IBM's WatsonX platform.", ), - remote_provider_spec( + RemoteProviderSpec( api=Api.inference, - adapter=AdapterSpec( - adapter_type="azure", - pip_packages=["litellm"], - module="llama_stack.providers.remote.inference.azure", - config_class="llama_stack.providers.remote.inference.azure.AzureConfig", - provider_data_validator="llama_stack.providers.remote.inference.azure.config.AzureProviderDataValidator", - description=""" + provider_type="remote::azure", + adapter_type="azure", + pip_packages=["litellm"], + module="llama_stack.providers.remote.inference.azure", + config_class="llama_stack.providers.remote.inference.azure.AzureConfig", + provider_data_validator="llama_stack.providers.remote.inference.azure.config.AzureProviderDataValidator", + description=""" Azure OpenAI inference provider for accessing GPT models and other Azure services. Provider documentation https://learn.microsoft.com/en-us/azure/ai-foundry/openai/overview """, - ), ), ] diff --git a/llama_stack/providers/registry/post_training.py b/llama_stack/providers/registry/post_training.py index 47aeb401e..2092e3b2d 100644 --- a/llama_stack/providers/registry/post_training.py +++ b/llama_stack/providers/registry/post_training.py @@ -7,7 +7,7 @@ from typing import cast -from llama_stack.providers.datatypes import AdapterSpec, Api, InlineProviderSpec, ProviderSpec, remote_provider_spec +from llama_stack.providers.datatypes import Api, InlineProviderSpec, ProviderSpec, RemoteProviderSpec # We provide two versions of these providers so that distributions can package the appropriate version of torch. # The CPU version is used for distributions that don't have GPU support -- they result in smaller container images. @@ -57,14 +57,13 @@ def available_providers() -> list[ProviderSpec]: ], description="HuggingFace-based post-training provider for fine-tuning models using the HuggingFace ecosystem.", ), - remote_provider_spec( + RemoteProviderSpec( api=Api.post_training, - adapter=AdapterSpec( - adapter_type="nvidia", - pip_packages=["requests", "aiohttp"], - module="llama_stack.providers.remote.post_training.nvidia", - config_class="llama_stack.providers.remote.post_training.nvidia.NvidiaPostTrainingConfig", - description="NVIDIA's post-training provider for fine-tuning models on NVIDIA's platform.", - ), + adapter_type="nvidia", + provider_type="remote::nvidia", + pip_packages=["requests", "aiohttp"], + module="llama_stack.providers.remote.post_training.nvidia", + config_class="llama_stack.providers.remote.post_training.nvidia.NvidiaPostTrainingConfig", + description="NVIDIA's post-training provider for fine-tuning models on NVIDIA's platform.", ), ] diff --git a/llama_stack/providers/registry/safety.py b/llama_stack/providers/registry/safety.py index 9dd791bd8..b30074398 100644 --- a/llama_stack/providers/registry/safety.py +++ b/llama_stack/providers/registry/safety.py @@ -6,11 +6,10 @@ from llama_stack.providers.datatypes import ( - AdapterSpec, Api, InlineProviderSpec, ProviderSpec, - remote_provider_spec, + RemoteProviderSpec, ) @@ -48,35 +47,32 @@ def available_providers() -> list[ProviderSpec]: config_class="llama_stack.providers.inline.safety.code_scanner.CodeScannerConfig", description="Code Scanner safety provider for detecting security vulnerabilities and unsafe code patterns.", ), - remote_provider_spec( + RemoteProviderSpec( api=Api.safety, - adapter=AdapterSpec( - adapter_type="bedrock", - pip_packages=["boto3"], - module="llama_stack.providers.remote.safety.bedrock", - config_class="llama_stack.providers.remote.safety.bedrock.BedrockSafetyConfig", - description="AWS Bedrock safety provider for content moderation using AWS's safety services.", - ), + adapter_type="bedrock", + provider_type="remote::bedrock", + pip_packages=["boto3"], + module="llama_stack.providers.remote.safety.bedrock", + config_class="llama_stack.providers.remote.safety.bedrock.BedrockSafetyConfig", + description="AWS Bedrock safety provider for content moderation using AWS's safety services.", ), - remote_provider_spec( + RemoteProviderSpec( api=Api.safety, - adapter=AdapterSpec( - adapter_type="nvidia", - pip_packages=["requests"], - module="llama_stack.providers.remote.safety.nvidia", - config_class="llama_stack.providers.remote.safety.nvidia.NVIDIASafetyConfig", - description="NVIDIA's safety provider for content moderation and safety filtering.", - ), + adapter_type="nvidia", + provider_type="remote::nvidia", + pip_packages=["requests"], + module="llama_stack.providers.remote.safety.nvidia", + config_class="llama_stack.providers.remote.safety.nvidia.NVIDIASafetyConfig", + description="NVIDIA's safety provider for content moderation and safety filtering.", ), - remote_provider_spec( + RemoteProviderSpec( api=Api.safety, - adapter=AdapterSpec( - adapter_type="sambanova", - pip_packages=["litellm", "requests"], - module="llama_stack.providers.remote.safety.sambanova", - config_class="llama_stack.providers.remote.safety.sambanova.SambaNovaSafetyConfig", - provider_data_validator="llama_stack.providers.remote.safety.sambanova.config.SambaNovaProviderDataValidator", - description="SambaNova's safety provider for content moderation and safety filtering.", - ), + adapter_type="sambanova", + provider_type="remote::sambanova", + pip_packages=["litellm", "requests"], + module="llama_stack.providers.remote.safety.sambanova", + config_class="llama_stack.providers.remote.safety.sambanova.SambaNovaSafetyConfig", + provider_data_validator="llama_stack.providers.remote.safety.sambanova.config.SambaNovaProviderDataValidator", + description="SambaNova's safety provider for content moderation and safety filtering.", ), ] diff --git a/llama_stack/providers/registry/tool_runtime.py b/llama_stack/providers/registry/tool_runtime.py index 5a58fa7af..ad8c31dfd 100644 --- a/llama_stack/providers/registry/tool_runtime.py +++ b/llama_stack/providers/registry/tool_runtime.py @@ -6,11 +6,10 @@ from llama_stack.providers.datatypes import ( - AdapterSpec, Api, InlineProviderSpec, ProviderSpec, - remote_provider_spec, + RemoteProviderSpec, ) @@ -35,59 +34,54 @@ def available_providers() -> list[ProviderSpec]: api_dependencies=[Api.vector_io, Api.inference, Api.files], description="RAG (Retrieval-Augmented Generation) tool runtime for document ingestion, chunking, and semantic search.", ), - remote_provider_spec( + RemoteProviderSpec( api=Api.tool_runtime, - adapter=AdapterSpec( - adapter_type="brave-search", - module="llama_stack.providers.remote.tool_runtime.brave_search", - config_class="llama_stack.providers.remote.tool_runtime.brave_search.config.BraveSearchToolConfig", - pip_packages=["requests"], - provider_data_validator="llama_stack.providers.remote.tool_runtime.brave_search.BraveSearchToolProviderDataValidator", - description="Brave Search tool for web search capabilities with privacy-focused results.", - ), + adapter_type="brave-search", + provider_type="remote::brave-search", + module="llama_stack.providers.remote.tool_runtime.brave_search", + config_class="llama_stack.providers.remote.tool_runtime.brave_search.config.BraveSearchToolConfig", + pip_packages=["requests"], + provider_data_validator="llama_stack.providers.remote.tool_runtime.brave_search.BraveSearchToolProviderDataValidator", + description="Brave Search tool for web search capabilities with privacy-focused results.", ), - remote_provider_spec( + RemoteProviderSpec( api=Api.tool_runtime, - adapter=AdapterSpec( - adapter_type="bing-search", - module="llama_stack.providers.remote.tool_runtime.bing_search", - config_class="llama_stack.providers.remote.tool_runtime.bing_search.config.BingSearchToolConfig", - pip_packages=["requests"], - provider_data_validator="llama_stack.providers.remote.tool_runtime.bing_search.BingSearchToolProviderDataValidator", - description="Bing Search tool for web search capabilities using Microsoft's search engine.", - ), + adapter_type="bing-search", + provider_type="remote::bing-search", + module="llama_stack.providers.remote.tool_runtime.bing_search", + config_class="llama_stack.providers.remote.tool_runtime.bing_search.config.BingSearchToolConfig", + pip_packages=["requests"], + provider_data_validator="llama_stack.providers.remote.tool_runtime.bing_search.BingSearchToolProviderDataValidator", + description="Bing Search tool for web search capabilities using Microsoft's search engine.", ), - remote_provider_spec( + RemoteProviderSpec( api=Api.tool_runtime, - adapter=AdapterSpec( - adapter_type="tavily-search", - module="llama_stack.providers.remote.tool_runtime.tavily_search", - config_class="llama_stack.providers.remote.tool_runtime.tavily_search.config.TavilySearchToolConfig", - pip_packages=["requests"], - provider_data_validator="llama_stack.providers.remote.tool_runtime.tavily_search.TavilySearchToolProviderDataValidator", - description="Tavily Search tool for AI-optimized web search with structured results.", - ), + adapter_type="tavily-search", + provider_type="remote::tavily-search", + module="llama_stack.providers.remote.tool_runtime.tavily_search", + config_class="llama_stack.providers.remote.tool_runtime.tavily_search.config.TavilySearchToolConfig", + pip_packages=["requests"], + provider_data_validator="llama_stack.providers.remote.tool_runtime.tavily_search.TavilySearchToolProviderDataValidator", + description="Tavily Search tool for AI-optimized web search with structured results.", ), - remote_provider_spec( + RemoteProviderSpec( api=Api.tool_runtime, - adapter=AdapterSpec( - adapter_type="wolfram-alpha", - module="llama_stack.providers.remote.tool_runtime.wolfram_alpha", - config_class="llama_stack.providers.remote.tool_runtime.wolfram_alpha.config.WolframAlphaToolConfig", - pip_packages=["requests"], - provider_data_validator="llama_stack.providers.remote.tool_runtime.wolfram_alpha.WolframAlphaToolProviderDataValidator", - description="Wolfram Alpha tool for computational knowledge and mathematical calculations.", - ), + adapter_type="wolfram-alpha", + provider_type="remote::wolfram-alpha", + module="llama_stack.providers.remote.tool_runtime.wolfram_alpha", + config_class="llama_stack.providers.remote.tool_runtime.wolfram_alpha.config.WolframAlphaToolConfig", + pip_packages=["requests"], + provider_data_validator="llama_stack.providers.remote.tool_runtime.wolfram_alpha.WolframAlphaToolProviderDataValidator", + description="Wolfram Alpha tool for computational knowledge and mathematical calculations.", ), - remote_provider_spec( + RemoteProviderSpec( api=Api.tool_runtime, - adapter=AdapterSpec( - adapter_type="model-context-protocol", - module="llama_stack.providers.remote.tool_runtime.model_context_protocol", - config_class="llama_stack.providers.remote.tool_runtime.model_context_protocol.config.MCPProviderConfig", - pip_packages=["mcp>=1.8.1"], - provider_data_validator="llama_stack.providers.remote.tool_runtime.model_context_protocol.config.MCPProviderDataValidator", - description="Model Context Protocol (MCP) tool for standardized tool calling and context management.", - ), + adapter_type="model-context-protocol", + provider_type="remote::model-context-protocol", + module="llama_stack.providers.remote.tool_runtime.model_context_protocol", + config_class="llama_stack.providers.remote.tool_runtime.model_context_protocol.config.MCPProviderConfig", + pip_packages=["mcp>=1.8.1"], + provider_data_validator="llama_stack.providers.remote.tool_runtime.model_context_protocol.config.MCPProviderDataValidator", + description="Model Context Protocol (MCP) tool for standardized tool calling and context management.", ), ] diff --git a/llama_stack/providers/registry/vector_io.py b/llama_stack/providers/registry/vector_io.py index 511734d57..3b82f6eb6 100644 --- a/llama_stack/providers/registry/vector_io.py +++ b/llama_stack/providers/registry/vector_io.py @@ -6,11 +6,10 @@ from llama_stack.providers.datatypes import ( - AdapterSpec, Api, InlineProviderSpec, ProviderSpec, - remote_provider_spec, + RemoteProviderSpec, ) @@ -300,14 +299,16 @@ See [sqlite-vec's GitHub repo](https://github.com/asg017/sqlite-vec/tree/main) f Please refer to the sqlite-vec provider documentation. """, ), - remote_provider_spec( - Api.vector_io, - AdapterSpec( - adapter_type="chromadb", - pip_packages=["chromadb-client"], - module="llama_stack.providers.remote.vector_io.chroma", - config_class="llama_stack.providers.remote.vector_io.chroma.ChromaVectorIOConfig", - description=""" + RemoteProviderSpec( + api=Api.vector_io, + adapter_type="chromadb", + provider_type="remote::chromadb", + pip_packages=["chromadb-client"], + module="llama_stack.providers.remote.vector_io.chroma", + config_class="llama_stack.providers.remote.vector_io.chroma.ChromaVectorIOConfig", + api_dependencies=[Api.inference], + optional_api_dependencies=[Api.files], + description=""" [Chroma](https://www.trychroma.com/) is an inline and remote vector database provider for Llama Stack. It allows you to store and query vectors directly within a Chroma database. That means you're not limited to storing vectors in memory or in a separate service. @@ -340,9 +341,6 @@ pip install chromadb ## Documentation See [Chroma's documentation](https://docs.trychroma.com/docs/overview/introduction) for more details about Chroma in general. """, - ), - api_dependencies=[Api.inference], - optional_api_dependencies=[Api.files], ), InlineProviderSpec( api=Api.vector_io, @@ -387,14 +385,16 @@ See [Chroma's documentation](https://docs.trychroma.com/docs/overview/introducti """, ), - remote_provider_spec( - Api.vector_io, - AdapterSpec( - adapter_type="pgvector", - pip_packages=["psycopg2-binary"], - module="llama_stack.providers.remote.vector_io.pgvector", - config_class="llama_stack.providers.remote.vector_io.pgvector.PGVectorVectorIOConfig", - description=""" + RemoteProviderSpec( + api=Api.vector_io, + adapter_type="pgvector", + provider_type="remote::pgvector", + pip_packages=["psycopg2-binary"], + module="llama_stack.providers.remote.vector_io.pgvector", + config_class="llama_stack.providers.remote.vector_io.pgvector.PGVectorVectorIOConfig", + api_dependencies=[Api.inference], + optional_api_dependencies=[Api.files], + description=""" [PGVector](https://github.com/pgvector/pgvector) is a remote vector database provider for Llama Stack. It allows you to store and query vectors directly in memory. That means you'll get fast and efficient vector retrieval. @@ -495,19 +495,18 @@ docker pull pgvector/pgvector:pg17 ## Documentation See [PGVector's documentation](https://github.com/pgvector/pgvector) for more details about PGVector in general. """, - ), + ), + RemoteProviderSpec( + api=Api.vector_io, + adapter_type="weaviate", + provider_type="remote::weaviate", + pip_packages=["weaviate-client"], + module="llama_stack.providers.remote.vector_io.weaviate", + config_class="llama_stack.providers.remote.vector_io.weaviate.WeaviateVectorIOConfig", + provider_data_validator="llama_stack.providers.remote.vector_io.weaviate.WeaviateRequestProviderData", api_dependencies=[Api.inference], optional_api_dependencies=[Api.files], - ), - remote_provider_spec( - Api.vector_io, - AdapterSpec( - adapter_type="weaviate", - pip_packages=["weaviate-client"], - module="llama_stack.providers.remote.vector_io.weaviate", - config_class="llama_stack.providers.remote.vector_io.weaviate.WeaviateVectorIOConfig", - provider_data_validator="llama_stack.providers.remote.vector_io.weaviate.WeaviateRequestProviderData", - description=""" + description=""" [Weaviate](https://weaviate.io/) is a vector database provider for Llama Stack. It allows you to store and query vectors directly within a Weaviate database. That means you're not limited to storing vectors in memory or in a separate service. @@ -538,9 +537,6 @@ To install Weaviate see the [Weaviate quickstart documentation](https://weaviate ## Documentation See [Weaviate's documentation](https://weaviate.io/developers/weaviate) for more details about Weaviate in general. """, - ), - api_dependencies=[Api.inference], - optional_api_dependencies=[Api.files], ), InlineProviderSpec( api=Api.vector_io, @@ -594,28 +590,29 @@ docker pull qdrant/qdrant See the [Qdrant documentation](https://qdrant.tech/documentation/) for more details about Qdrant in general. """, ), - remote_provider_spec( - Api.vector_io, - AdapterSpec( - adapter_type="qdrant", - pip_packages=["qdrant-client"], - module="llama_stack.providers.remote.vector_io.qdrant", - config_class="llama_stack.providers.remote.vector_io.qdrant.QdrantVectorIOConfig", - description=""" -Please refer to the inline provider documentation. -""", - ), + RemoteProviderSpec( + api=Api.vector_io, + adapter_type="qdrant", + provider_type="remote::qdrant", + pip_packages=["qdrant-client"], + module="llama_stack.providers.remote.vector_io.qdrant", + config_class="llama_stack.providers.remote.vector_io.qdrant.QdrantVectorIOConfig", api_dependencies=[Api.inference], optional_api_dependencies=[Api.files], + description=""" +Please refer to the inline provider documentation. +""", ), - remote_provider_spec( - Api.vector_io, - AdapterSpec( - adapter_type="milvus", - pip_packages=["pymilvus>=2.4.10"], - module="llama_stack.providers.remote.vector_io.milvus", - config_class="llama_stack.providers.remote.vector_io.milvus.MilvusVectorIOConfig", - description=""" + RemoteProviderSpec( + api=Api.vector_io, + adapter_type="milvus", + provider_type="remote::milvus", + pip_packages=["pymilvus>=2.4.10"], + module="llama_stack.providers.remote.vector_io.milvus", + config_class="llama_stack.providers.remote.vector_io.milvus.MilvusVectorIOConfig", + api_dependencies=[Api.inference], + optional_api_dependencies=[Api.files], + description=""" [Milvus](https://milvus.io/) is an inline and remote vector database provider for Llama Stack. It allows you to store and query vectors directly within a Milvus database. That means you're not limited to storing vectors in memory or in a separate service. @@ -806,9 +803,6 @@ See the [Milvus documentation](https://milvus.io/docs/install-overview.md) for m For more details on TLS configuration, refer to the [TLS setup guide](https://milvus.io/docs/tls.md). """, - ), - api_dependencies=[Api.inference], - optional_api_dependencies=[Api.files], ), InlineProviderSpec( api=Api.vector_io, diff --git a/tests/external/kaze.yaml b/tests/external/kaze.yaml index c61ac0e31..1b42f2e14 100644 --- a/tests/external/kaze.yaml +++ b/tests/external/kaze.yaml @@ -1,6 +1,5 @@ -adapter: - adapter_type: kaze - pip_packages: ["tests/external/llama-stack-provider-kaze"] - config_class: llama_stack_provider_kaze.config.KazeProviderConfig - module: llama_stack_provider_kaze +adapter_type: kaze +pip_packages: ["tests/external/llama-stack-provider-kaze"] +config_class: llama_stack_provider_kaze.config.KazeProviderConfig +module: llama_stack_provider_kaze optional_api_dependencies: [] diff --git a/tests/external/llama-stack-api-weather/src/llama_stack_api_weather/weather.py b/tests/external/llama-stack-api-weather/src/llama_stack_api_weather/weather.py index 4b3bfb641..de1427bfd 100644 --- a/tests/external/llama-stack-api-weather/src/llama_stack_api_weather/weather.py +++ b/tests/external/llama-stack-api-weather/src/llama_stack_api_weather/weather.py @@ -6,7 +6,7 @@ from typing import Protocol -from llama_stack.providers.datatypes import AdapterSpec, Api, ProviderSpec, RemoteProviderSpec +from llama_stack.providers.datatypes import Api, ProviderSpec, RemoteProviderSpec from llama_stack.schema_utils import webmethod @@ -16,12 +16,9 @@ def available_providers() -> list[ProviderSpec]: api=Api.weather, provider_type="remote::kaze", config_class="llama_stack_provider_kaze.KazeProviderConfig", - adapter=AdapterSpec( - adapter_type="kaze", - module="llama_stack_provider_kaze", - pip_packages=["llama_stack_provider_kaze"], - config_class="llama_stack_provider_kaze.KazeProviderConfig", - ), + adapter_type="kaze", + module="llama_stack_provider_kaze", + pip_packages=["llama_stack_provider_kaze"], ), ] diff --git a/tests/unit/distribution/test_distribution.py b/tests/unit/distribution/test_distribution.py index c6c2eb2c7..f24de0644 100644 --- a/tests/unit/distribution/test_distribution.py +++ b/tests/unit/distribution/test_distribution.py @@ -66,10 +66,9 @@ def base_config(tmp_path): def provider_spec_yaml(): """Common provider spec YAML for testing.""" return """ -adapter: - adapter_type: test_provider - config_class: test_provider.config.TestProviderConfig - module: test_provider +adapter_type: test_provider +config_class: test_provider.config.TestProviderConfig +module: test_provider api_dependencies: - safety """ @@ -182,9 +181,9 @@ class TestProviderRegistry: assert Api.inference in registry assert "remote::test_provider" in registry[Api.inference] provider = registry[Api.inference]["remote::test_provider"] - assert provider.adapter.adapter_type == "test_provider" - assert provider.adapter.module == "test_provider" - assert provider.adapter.config_class == "test_provider.config.TestProviderConfig" + assert provider.adapter_type == "test_provider" + assert provider.module == "test_provider" + assert provider.config_class == "test_provider.config.TestProviderConfig" assert Api.safety in provider.api_dependencies def test_external_inline_providers(self, api_directories, mock_providers, base_config, inline_provider_spec_yaml): @@ -246,8 +245,7 @@ class TestProviderRegistry: """Test handling of malformed remote provider spec (missing required fields).""" remote_dir, _ = api_directories malformed_spec = """ -adapter: - adapter_type: test_provider +adapter_type: test_provider # Missing required fields api_dependencies: - safety @@ -270,7 +268,7 @@ pip_packages: with open(inline_dir / "malformed.yaml", "w") as f: f.write(malformed_spec) - with pytest.raises(KeyError) as exc_info: + with pytest.raises(ValidationError) as exc_info: get_provider_registry(base_config) assert "config_class" in str(exc_info.value) From 4c2fcb6b515d9f3cbb068d979eba694bc10e1ff0 Mon Sep 17 00:00:00 2001 From: ehhuang Date: Thu, 18 Sep 2025 21:11:13 -0700 Subject: [PATCH 113/150] chore: refactor server.main (#3462) # What does this PR do? As shown in #3421, we can scale stack to handle more RPS with k8s replicas. This PR enables multi process stack with uvicorn --workers so that we can achieve the same scaling without being in k8s. To achieve that we refactor main to split out the app construction logic. This method needs to be non-async. We created a new `Stack` class to house impls and have a `start()` method to be called in lifespan to start background tasks instead of starting them in the old `construct_stack`. This way we avoid having to manage an event loop manually. ## Test Plan CI > uv run --with llama-stack python -m llama_stack.core.server.server benchmarking/k8s-benchmark/stack_run_config.yaml works. > LLAMA_STACK_CONFIG=benchmarking/k8s-benchmark/stack_run_config.yaml uv run uvicorn llama_stack.core.server.server:create_app --port 8321 --workers 4 works. --- benchmarking/k8s-benchmark/apply.sh | 5 +- .../k8s-benchmark/stack-configmap.yaml | 9 ++ .../k8s-benchmark/stack-k8s.yaml.template | 13 +- llama_stack/core/library_client.py | 8 +- llama_stack/core/server/server.py | 152 +++++++++++------- llama_stack/core/stack.py | 142 ++++++++-------- .../test_library_client_initialization.py | 50 ++++-- 7 files changed, 233 insertions(+), 146 deletions(-) diff --git a/benchmarking/k8s-benchmark/apply.sh b/benchmarking/k8s-benchmark/apply.sh index 4f2270da8..6e6607663 100755 --- a/benchmarking/k8s-benchmark/apply.sh +++ b/benchmarking/k8s-benchmark/apply.sh @@ -17,11 +17,8 @@ export POSTGRES_PASSWORD=llamastack export INFERENCE_MODEL=meta-llama/Llama-3.2-3B-Instruct export SAFETY_MODEL=meta-llama/Llama-Guard-3-1B -export MOCK_INFERENCE_MODEL=mock-inference - -export MOCK_INFERENCE_URL=openai-mock-service:8080 - export BENCHMARK_INFERENCE_MODEL=$INFERENCE_MODEL +export LLAMA_STACK_WORKERS=4 set -euo pipefail set -x diff --git a/benchmarking/k8s-benchmark/stack-configmap.yaml b/benchmarking/k8s-benchmark/stack-configmap.yaml index bf6109b68..286ba5f77 100644 --- a/benchmarking/k8s-benchmark/stack-configmap.yaml +++ b/benchmarking/k8s-benchmark/stack-configmap.yaml @@ -5,6 +5,7 @@ data: image_name: kubernetes-benchmark-demo apis: - agents + - files - inference - files - safety @@ -23,6 +24,14 @@ data: - provider_id: sentence-transformers provider_type: inline::sentence-transformers config: {} + files: + - provider_id: meta-reference-files + provider_type: inline::localfs + config: + storage_dir: ${env.FILES_STORAGE_DIR:=~/.llama/distributions/starter/files} + metadata_store: + type: sqlite + db_path: ${env.SQLITE_STORE_DIR:=~/.llama/distributions/starter}/files_metadata.db vector_io: - provider_id: ${env.ENABLE_CHROMADB:+chromadb} provider_type: remote::chromadb diff --git a/benchmarking/k8s-benchmark/stack-k8s.yaml.template b/benchmarking/k8s-benchmark/stack-k8s.yaml.template index 9cb1e5be3..8842c0bea 100644 --- a/benchmarking/k8s-benchmark/stack-k8s.yaml.template +++ b/benchmarking/k8s-benchmark/stack-k8s.yaml.template @@ -52,9 +52,20 @@ spec: value: http://vllm-server-safety.default.svc.cluster.local:8001/v1 - name: VLLM_TLS_VERIFY value: "false" - command: ["python", "-m", "llama_stack.core.server.server", "/etc/config/stack_run_config.yaml", "--port", "8323"] + - name: LLAMA_STACK_LOGGING + value: "all=WARNING" + - name: LLAMA_STACK_CONFIG + value: "/etc/config/stack_run_config.yaml" + - name: LLAMA_STACK_WORKERS + value: "${LLAMA_STACK_WORKERS}" + command: ["uvicorn", "llama_stack.core.server.server:create_app", "--host", "0.0.0.0", "--port", "8323", "--workers", "$LLAMA_STACK_WORKERS", "--factory"] ports: - containerPort: 8323 + resources: + requests: + cpu: "${LLAMA_STACK_WORKERS}" + limits: + cpu: "${LLAMA_STACK_WORKERS}" volumeMounts: - name: llama-storage mountPath: /root/.llama diff --git a/llama_stack/core/library_client.py b/llama_stack/core/library_client.py index ea5a2ac8e..e722e4de6 100644 --- a/llama_stack/core/library_client.py +++ b/llama_stack/core/library_client.py @@ -40,7 +40,7 @@ from llama_stack.core.request_headers import ( from llama_stack.core.resolver import ProviderRegistry from llama_stack.core.server.routes import RouteImpls, find_matching_route, initialize_route_impls from llama_stack.core.stack import ( - construct_stack, + Stack, get_stack_run_config_from_distro, replace_env_vars, ) @@ -252,7 +252,10 @@ class AsyncLlamaStackAsLibraryClient(AsyncLlamaStackClient): try: self.route_impls = None - self.impls = await construct_stack(self.config, self.custom_provider_registry) + + stack = Stack(self.config, self.custom_provider_registry) + await stack.initialize() + self.impls = stack.impls except ModuleNotFoundError as _e: cprint(_e.msg, color="red", file=sys.stderr) cprint( @@ -289,6 +292,7 @@ class AsyncLlamaStackAsLibraryClient(AsyncLlamaStackClient): ) raise _e + assert self.impls is not None if Api.telemetry in self.impls: setup_logger(self.impls[Api.telemetry]) diff --git a/llama_stack/core/server/server.py b/llama_stack/core/server/server.py index d3e875fec..9cca42268 100644 --- a/llama_stack/core/server/server.py +++ b/llama_stack/core/server/server.py @@ -6,6 +6,7 @@ import argparse import asyncio +import concurrent.futures import functools import inspect import json @@ -50,17 +51,15 @@ from llama_stack.core.request_headers import ( request_provider_data_context, user_from_scope, ) -from llama_stack.core.resolver import InvalidProviderError from llama_stack.core.server.routes import ( find_matching_route, get_all_api_routes, initialize_route_impls, ) from llama_stack.core.stack import ( + Stack, cast_image_name_to_string, - construct_stack, replace_env_vars, - shutdown_stack, validate_env_pair, ) from llama_stack.core.utils.config import redact_sensitive_fields @@ -156,21 +155,34 @@ def translate_exception(exc: Exception) -> HTTPException | RequestValidationErro ) -async def shutdown(app): - """Initiate a graceful shutdown of the application. - - Handled by the lifespan context manager. The shutdown process involves - shutting down all implementations registered in the application. +class StackApp(FastAPI): """ - await shutdown_stack(app.__llama_stack_impls__) + A wrapper around the FastAPI application to hold a reference to the Stack instance so that we can + start background tasks (e.g. refresh model registry periodically) from the lifespan context manager. + """ + + def __init__(self, config: StackRunConfig, *args, **kwargs): + super().__init__(*args, **kwargs) + self.stack: Stack = Stack(config) + + # This code is called from a running event loop managed by uvicorn so we cannot simply call + # asyncio.run() to initialize the stack. We cannot await either since this is not an async + # function. + # As a workaround, we use a thread pool executor to run the initialize() method + # in a separate thread. + with concurrent.futures.ThreadPoolExecutor() as executor: + future = executor.submit(asyncio.run, self.stack.initialize()) + future.result() @asynccontextmanager -async def lifespan(app: FastAPI): +async def lifespan(app: StackApp): logger.info("Starting up") + assert app.stack is not None + app.stack.create_registry_refresh_task() yield logger.info("Shutting down") - await shutdown(app) + await app.stack.shutdown() def is_streaming_request(func_name: str, request: Request, **kwargs): @@ -386,73 +398,61 @@ class ClientVersionMiddleware: return await self.app(scope, receive, send) -def main(args: argparse.Namespace | None = None): - """Start the LlamaStack server.""" - parser = argparse.ArgumentParser(description="Start the LlamaStack server.") +def create_app( + config_file: str | None = None, + env_vars: list[str] | None = None, +) -> StackApp: + """Create and configure the FastAPI application. - add_config_distro_args(parser) - parser.add_argument( - "--port", - type=int, - default=int(os.getenv("LLAMA_STACK_PORT", 8321)), - help="Port to listen on", - ) - parser.add_argument( - "--env", - action="append", - help="Environment variables in KEY=value format. Can be specified multiple times.", - ) + Args: + config_file: Path to config file. If None, uses LLAMA_STACK_CONFIG env var or default resolution. + env_vars: List of environment variables in KEY=value format. + disable_version_check: Whether to disable version checking. If None, uses LLAMA_STACK_DISABLE_VERSION_CHECK env var. - # Determine whether the server args are being passed by the "run" command, if this is the case - # the args will be passed as a Namespace object to the main function, otherwise they will be - # parsed from the command line - if args is None: - args = parser.parse_args() + Returns: + Configured StackApp instance. + """ + config_file = config_file or os.getenv("LLAMA_STACK_CONFIG") + if config_file is None: + raise ValueError("No config file provided and LLAMA_STACK_CONFIG env var is not set") - config_or_distro = get_config_from_args(args) - config_file = resolve_config_or_distro(config_or_distro, Mode.RUN) + config_file = resolve_config_or_distro(config_file, Mode.RUN) + # Load and process configuration logger_config = None with open(config_file) as fp: config_contents = yaml.safe_load(fp) if isinstance(config_contents, dict) and (cfg := config_contents.get("logging_config")): logger_config = LoggingConfig(**cfg) logger = get_logger(name=__name__, category="core::server", config=logger_config) - if args.env: - for env_pair in args.env: + + if env_vars: + for env_pair in env_vars: try: key, value = validate_env_pair(env_pair) - logger.info(f"Setting CLI environment variable {key} => {value}") + logger.info(f"Setting environment variable {key} => {value}") os.environ[key] = value except ValueError as e: logger.error(f"Error: {str(e)}") - sys.exit(1) + raise ValueError(f"Invalid environment variable format: {env_pair}") from e + config = replace_env_vars(config_contents) config = StackRunConfig(**cast_image_name_to_string(config)) _log_run_config(run_config=config) - app = FastAPI( + app = StackApp( lifespan=lifespan, docs_url="/docs", redoc_url="/redoc", openapi_url="/openapi.json", + config=config, ) if not os.environ.get("LLAMA_STACK_DISABLE_VERSION_CHECK"): app.add_middleware(ClientVersionMiddleware) - try: - # Create and set the event loop that will be used for both construction and server runtime - loop = asyncio.new_event_loop() - asyncio.set_event_loop(loop) - - # Construct the stack in the persistent event loop - impls = loop.run_until_complete(construct_stack(config)) - - except InvalidProviderError as e: - logger.error(f"Error: {str(e)}") - sys.exit(1) + impls = app.stack.impls if config.server.auth: logger.info(f"Enabling authentication with provider: {config.server.auth.provider_config.type.value}") @@ -553,9 +553,54 @@ def main(args: argparse.Namespace | None = None): app.exception_handler(RequestValidationError)(global_exception_handler) app.exception_handler(Exception)(global_exception_handler) - app.__llama_stack_impls__ = impls app.add_middleware(TracingMiddleware, impls=impls, external_apis=external_apis) + return app + + +def main(args: argparse.Namespace | None = None): + """Start the LlamaStack server.""" + parser = argparse.ArgumentParser(description="Start the LlamaStack server.") + + add_config_distro_args(parser) + parser.add_argument( + "--port", + type=int, + default=int(os.getenv("LLAMA_STACK_PORT", 8321)), + help="Port to listen on", + ) + parser.add_argument( + "--env", + action="append", + help="Environment variables in KEY=value format. Can be specified multiple times.", + ) + + # Determine whether the server args are being passed by the "run" command, if this is the case + # the args will be passed as a Namespace object to the main function, otherwise they will be + # parsed from the command line + if args is None: + args = parser.parse_args() + + config_or_distro = get_config_from_args(args) + + try: + app = create_app( + config_file=config_or_distro, + env_vars=args.env, + ) + except Exception as e: + logger.error(f"Error creating app: {str(e)}") + sys.exit(1) + + config_file = resolve_config_or_distro(config_or_distro, Mode.RUN) + with open(config_file) as fp: + config_contents = yaml.safe_load(fp) + if isinstance(config_contents, dict) and (cfg := config_contents.get("logging_config")): + logger_config = LoggingConfig(**cfg) + else: + logger_config = None + config = StackRunConfig(**cast_image_name_to_string(replace_env_vars(config_contents))) + import uvicorn # Configure SSL if certificates are provided @@ -593,7 +638,6 @@ def main(args: argparse.Namespace | None = None): if ssl_config: uvicorn_config.update(ssl_config) - # Run uvicorn in the existing event loop to preserve background tasks # We need to catch KeyboardInterrupt because uvicorn's signal handling # re-raises SIGINT signals using signal.raise_signal(), which Python # converts to KeyboardInterrupt. Without this catch, we'd get a confusing @@ -604,13 +648,9 @@ def main(args: argparse.Namespace | None = None): # Another approach would be to ignore SIGINT entirely - let uvicorn handle it through its own # signal handling but this is quite intrusive and not worth the effort. try: - loop.run_until_complete(uvicorn.Server(uvicorn.Config(**uvicorn_config)).serve()) + asyncio.run(uvicorn.Server(uvicorn.Config(**uvicorn_config)).serve()) except (KeyboardInterrupt, SystemExit): logger.info("Received interrupt signal, shutting down gracefully...") - finally: - if not loop.is_closed(): - logger.debug("Closing event loop") - loop.close() def _log_run_config(run_config: StackRunConfig): diff --git a/llama_stack/core/stack.py b/llama_stack/core/stack.py index 7ab8d2c64..a6c5093eb 100644 --- a/llama_stack/core/stack.py +++ b/llama_stack/core/stack.py @@ -315,78 +315,84 @@ def add_internal_implementations(impls: dict[Api, Any], run_config: StackRunConf impls[Api.prompts] = prompts_impl -# Produces a stack of providers for the given run config. Not all APIs may be -# asked for in the run config. -async def construct_stack( - run_config: StackRunConfig, provider_registry: ProviderRegistry | None = None -) -> dict[Api, Any]: - if "LLAMA_STACK_TEST_INFERENCE_MODE" in os.environ: - from llama_stack.testing.inference_recorder import setup_inference_recording +class Stack: + def __init__(self, run_config: StackRunConfig, provider_registry: ProviderRegistry | None = None): + self.run_config = run_config + self.provider_registry = provider_registry + self.impls = None + + # Produces a stack of providers for the given run config. Not all APIs may be + # asked for in the run config. + async def initialize(self): + if "LLAMA_STACK_TEST_INFERENCE_MODE" in os.environ: + from llama_stack.testing.inference_recorder import setup_inference_recording + + global TEST_RECORDING_CONTEXT + TEST_RECORDING_CONTEXT = setup_inference_recording() + if TEST_RECORDING_CONTEXT: + TEST_RECORDING_CONTEXT.__enter__() + logger.info(f"Inference recording enabled: mode={os.environ.get('LLAMA_STACK_TEST_INFERENCE_MODE')}") + + dist_registry, _ = await create_dist_registry(self.run_config.metadata_store, self.run_config.image_name) + policy = self.run_config.server.auth.access_policy if self.run_config.server.auth else [] + impls = await resolve_impls( + self.run_config, self.provider_registry or get_provider_registry(self.run_config), dist_registry, policy + ) + + # Add internal implementations after all other providers are resolved + add_internal_implementations(impls, self.run_config) + + if Api.prompts in impls: + await impls[Api.prompts].initialize() + + await register_resources(self.run_config, impls) + + await refresh_registry_once(impls) + self.impls = impls + + def create_registry_refresh_task(self): + assert self.impls is not None, "Must call initialize() before starting" + + global REGISTRY_REFRESH_TASK + REGISTRY_REFRESH_TASK = asyncio.create_task(refresh_registry_task(self.impls)) + + def cb(task): + import traceback + + if task.cancelled(): + logger.error("Model refresh task cancelled") + elif task.exception(): + logger.error(f"Model refresh task failed: {task.exception()}") + traceback.print_exception(task.exception()) + else: + logger.debug("Model refresh task completed") + + REGISTRY_REFRESH_TASK.add_done_callback(cb) + + async def shutdown(self): + for impl in self.impls.values(): + impl_name = impl.__class__.__name__ + logger.info(f"Shutting down {impl_name}") + try: + if hasattr(impl, "shutdown"): + await asyncio.wait_for(impl.shutdown(), timeout=5) + else: + logger.warning(f"No shutdown method for {impl_name}") + except TimeoutError: + logger.exception(f"Shutdown timeout for {impl_name}") + except (Exception, asyncio.CancelledError) as e: + logger.exception(f"Failed to shutdown {impl_name}: {e}") global TEST_RECORDING_CONTEXT - TEST_RECORDING_CONTEXT = setup_inference_recording() if TEST_RECORDING_CONTEXT: - TEST_RECORDING_CONTEXT.__enter__() - logger.info(f"Inference recording enabled: mode={os.environ.get('LLAMA_STACK_TEST_INFERENCE_MODE')}") + try: + TEST_RECORDING_CONTEXT.__exit__(None, None, None) + except Exception as e: + logger.error(f"Error during inference recording cleanup: {e}") - dist_registry, _ = await create_dist_registry(run_config.metadata_store, run_config.image_name) - policy = run_config.server.auth.access_policy if run_config.server.auth else [] - impls = await resolve_impls( - run_config, provider_registry or get_provider_registry(run_config), dist_registry, policy - ) - - # Add internal implementations after all other providers are resolved - add_internal_implementations(impls, run_config) - - if Api.prompts in impls: - await impls[Api.prompts].initialize() - - await register_resources(run_config, impls) - - await refresh_registry_once(impls) - - global REGISTRY_REFRESH_TASK - REGISTRY_REFRESH_TASK = asyncio.create_task(refresh_registry_task(impls)) - - def cb(task): - import traceback - - if task.cancelled(): - logger.error("Model refresh task cancelled") - elif task.exception(): - logger.error(f"Model refresh task failed: {task.exception()}") - traceback.print_exception(task.exception()) - else: - logger.debug("Model refresh task completed") - - REGISTRY_REFRESH_TASK.add_done_callback(cb) - return impls - - -async def shutdown_stack(impls: dict[Api, Any]): - for impl in impls.values(): - impl_name = impl.__class__.__name__ - logger.info(f"Shutting down {impl_name}") - try: - if hasattr(impl, "shutdown"): - await asyncio.wait_for(impl.shutdown(), timeout=5) - else: - logger.warning(f"No shutdown method for {impl_name}") - except TimeoutError: - logger.exception(f"Shutdown timeout for {impl_name}") - except (Exception, asyncio.CancelledError) as e: - logger.exception(f"Failed to shutdown {impl_name}: {e}") - - global TEST_RECORDING_CONTEXT - if TEST_RECORDING_CONTEXT: - try: - TEST_RECORDING_CONTEXT.__exit__(None, None, None) - except Exception as e: - logger.error(f"Error during inference recording cleanup: {e}") - - global REGISTRY_REFRESH_TASK - if REGISTRY_REFRESH_TASK: - REGISTRY_REFRESH_TASK.cancel() + global REGISTRY_REFRESH_TASK + if REGISTRY_REFRESH_TASK: + REGISTRY_REFRESH_TASK.cancel() async def refresh_registry_once(impls: dict[Api, Any]): diff --git a/tests/unit/distribution/test_library_client_initialization.py b/tests/unit/distribution/test_library_client_initialization.py index b7e7a1857..b01a5c3e2 100644 --- a/tests/unit/distribution/test_library_client_initialization.py +++ b/tests/unit/distribution/test_library_client_initialization.py @@ -27,13 +27,17 @@ class TestLlamaStackAsLibraryClientAutoInitialization: mock_impls = {} mock_route_impls = RouteImpls({}) - async def mock_construct_stack(config, custom_provider_registry): - return mock_impls + class MockStack: + def __init__(self, config, custom_provider_registry=None): + self.impls = mock_impls + + async def initialize(self): + pass def mock_initialize_route_impls(impls): return mock_route_impls - monkeypatch.setattr("llama_stack.core.library_client.construct_stack", mock_construct_stack) + monkeypatch.setattr("llama_stack.core.library_client.Stack", MockStack) monkeypatch.setattr("llama_stack.core.library_client.initialize_route_impls", mock_initialize_route_impls) client = LlamaStackAsLibraryClient("ci-tests") @@ -46,13 +50,17 @@ class TestLlamaStackAsLibraryClientAutoInitialization: mock_impls = {} mock_route_impls = RouteImpls({}) - async def mock_construct_stack(config, custom_provider_registry): - return mock_impls + class MockStack: + def __init__(self, config, custom_provider_registry=None): + self.impls = mock_impls + + async def initialize(self): + pass def mock_initialize_route_impls(impls): return mock_route_impls - monkeypatch.setattr("llama_stack.core.library_client.construct_stack", mock_construct_stack) + monkeypatch.setattr("llama_stack.core.library_client.Stack", MockStack) monkeypatch.setattr("llama_stack.core.library_client.initialize_route_impls", mock_initialize_route_impls) client = AsyncLlamaStackAsLibraryClient("ci-tests") @@ -68,13 +76,17 @@ class TestLlamaStackAsLibraryClientAutoInitialization: mock_impls = {} mock_route_impls = RouteImpls({}) - async def mock_construct_stack(config, custom_provider_registry): - return mock_impls + class MockStack: + def __init__(self, config, custom_provider_registry=None): + self.impls = mock_impls + + async def initialize(self): + pass def mock_initialize_route_impls(impls): return mock_route_impls - monkeypatch.setattr("llama_stack.core.library_client.construct_stack", mock_construct_stack) + monkeypatch.setattr("llama_stack.core.library_client.Stack", MockStack) monkeypatch.setattr("llama_stack.core.library_client.initialize_route_impls", mock_initialize_route_impls) client = LlamaStackAsLibraryClient("ci-tests") @@ -90,13 +102,17 @@ class TestLlamaStackAsLibraryClientAutoInitialization: mock_impls = {} mock_route_impls = RouteImpls({}) - async def mock_construct_stack(config, custom_provider_registry): - return mock_impls + class MockStack: + def __init__(self, config, custom_provider_registry=None): + self.impls = mock_impls + + async def initialize(self): + pass def mock_initialize_route_impls(impls): return mock_route_impls - monkeypatch.setattr("llama_stack.core.library_client.construct_stack", mock_construct_stack) + monkeypatch.setattr("llama_stack.core.library_client.Stack", MockStack) monkeypatch.setattr("llama_stack.core.library_client.initialize_route_impls", mock_initialize_route_impls) client = AsyncLlamaStackAsLibraryClient("ci-tests") @@ -112,13 +128,17 @@ class TestLlamaStackAsLibraryClientAutoInitialization: mock_impls = {} mock_route_impls = RouteImpls({}) - async def mock_construct_stack(config, custom_provider_registry): - return mock_impls + class MockStack: + def __init__(self, config, custom_provider_registry=None): + self.impls = mock_impls + + async def initialize(self): + pass def mock_initialize_route_impls(impls): return mock_route_impls - monkeypatch.setattr("llama_stack.core.library_client.construct_stack", mock_construct_stack) + monkeypatch.setattr("llama_stack.core.library_client.Stack", MockStack) monkeypatch.setattr("llama_stack.core.library_client.initialize_route_impls", mock_initialize_route_impls) sync_client = LlamaStackAsLibraryClient("ci-tests") From 9378bdca43e886c7ba3b79f017693726bed9b740 Mon Sep 17 00:00:00 2001 From: adam-d-young Date: Fri, 19 Sep 2025 10:41:26 -0500 Subject: [PATCH 114/150] docs: Fix incorrect vector_db_id usage in RAG tutorial (#3444) # What does this PR do? This PR fixes a blocking issue in the detailed RAG tutorial where the code fails with a 400 Bad Request error. The root cause is that recent versions of Llama-Stack ignore the client-generated vector_db_id and assign a new server-side ID. The tutorial was not updated to reflect this, causing the rag_tool.insert call to fail. This change updates the code to capture the authoritative ID from the .identifier attribute of the register() method's response. This ensures the tutorial code runs successfully and reflects the current API behavior. ## Test Plan The fix can be verified by running the Python code snippet from the detailed tutorial page. Run the original code (Before this change): Result: The script fails with a 400 Bad Request error on the rag_tool.insert step. Run the updated code (After this change): Result: The script runs successfully to completion. Co-authored-by: Adam Young --- docs/source/getting_started/detailed_tutorial.md | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/docs/source/getting_started/detailed_tutorial.md b/docs/source/getting_started/detailed_tutorial.md index 14f888628..77a899c48 100644 --- a/docs/source/getting_started/detailed_tutorial.md +++ b/docs/source/getting_started/detailed_tutorial.md @@ -460,10 +460,12 @@ client = LlamaStackClient(base_url="http://localhost:8321") embed_lm = next(m for m in client.models.list() if m.model_type == "embedding") embedding_model = embed_lm.identifier vector_db_id = f"v{uuid.uuid4().hex}" -client.vector_dbs.register( +# The VectorDB API is deprecated; the server now returns its own authoritative ID. +# We capture the correct ID from the response's .identifier attribute. +vector_db_id = client.vector_dbs.register( vector_db_id=vector_db_id, embedding_model=embedding_model, -) +).identifier # Create Documents urls = [ From d3600b92d10a3e11126c6120eadf0ba5ef4e1c3c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C3=A9bastien=20Han?= Date: Fri, 19 Sep 2025 22:12:08 +0200 Subject: [PATCH 115/150] fix: force milvus-lite installation for inline::milvus (#3488) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit # What does this PR do? pymilvus recently made `milvus-lite` an optional dependency to their package. If someone wants to use the inline provider we must include the extra dependency. For more details see: https://github.com/milvus-io/pymilvus/pull/2976 Signed-off-by: Sébastien Han --- docs/source/providers/vector_io/remote_milvus.md | 8 +++++++- llama_stack/providers/registry/vector_io.py | 10 ++++++++-- 2 files changed, 15 insertions(+), 3 deletions(-) diff --git a/docs/source/providers/vector_io/remote_milvus.md b/docs/source/providers/vector_io/remote_milvus.md index 075423d04..8974ada10 100644 --- a/docs/source/providers/vector_io/remote_milvus.md +++ b/docs/source/providers/vector_io/remote_milvus.md @@ -23,7 +23,13 @@ To use Milvus in your Llama Stack project, follow these steps: ## Installation -You can install Milvus using pymilvus: +If you want to use inline Milvus, you can install: + +```bash +pip install pymilvus[milvus-lite] +``` + +If you want to use remote Milvus, you can install: ```bash pip install pymilvus diff --git a/llama_stack/providers/registry/vector_io.py b/llama_stack/providers/registry/vector_io.py index 3b82f6eb6..e8237bc62 100644 --- a/llama_stack/providers/registry/vector_io.py +++ b/llama_stack/providers/registry/vector_io.py @@ -633,7 +633,13 @@ To use Milvus in your Llama Stack project, follow these steps: ## Installation -You can install Milvus using pymilvus: +If you want to use inline Milvus, you can install: + +```bash +pip install pymilvus[milvus-lite] +``` + +If you want to use remote Milvus, you can install: ```bash pip install pymilvus @@ -807,7 +813,7 @@ For more details on TLS configuration, refer to the [TLS setup guide](https://mi InlineProviderSpec( api=Api.vector_io, provider_type="inline::milvus", - pip_packages=["pymilvus>=2.4.10"], + pip_packages=["pymilvus[milvus-lite]>=2.4.10"], module="llama_stack.providers.inline.vector_io.milvus", config_class="llama_stack.providers.inline.vector_io.milvus.MilvusVectorIOConfig", api_dependencies=[Api.inference], From f44eb935c4ff110278758ff2972bd5a5fd544915 Mon Sep 17 00:00:00 2001 From: ehhuang Date: Fri, 19 Sep 2025 16:13:56 -0700 Subject: [PATCH 116/150] chore: simplify authorized sqlstore (#3496) # What does this PR do? This PR is generated with AI and reviewed by me. Refactors the AuthorizedSqlStore class to store the access policy as an instance variable rather than passing it as a parameter to each method call. This simplifies the API. # Test Plan existing tests --- .../providers/inline/files/localfs/files.py | 5 ++--- .../providers/remote/files/s3/files.py | 5 ++--- .../utils/inference/inference_store.py | 4 +--- .../utils/responses/responses_store.py | 7 ++----- .../utils/sqlstore/authorized_sqlstore.py | 11 +++++------ .../sqlstore/test_authorized_sqlstore.py | 19 +++++++++++-------- tests/unit/utils/test_authorized_sqlstore.py | 18 +++++++++--------- 7 files changed, 32 insertions(+), 37 deletions(-) diff --git a/llama_stack/providers/inline/files/localfs/files.py b/llama_stack/providers/inline/files/localfs/files.py index 9c610c1ba..65cf8d815 100644 --- a/llama_stack/providers/inline/files/localfs/files.py +++ b/llama_stack/providers/inline/files/localfs/files.py @@ -44,7 +44,7 @@ class LocalfsFilesImpl(Files): storage_path.mkdir(parents=True, exist_ok=True) # Initialize SQL store for metadata - self.sql_store = AuthorizedSqlStore(sqlstore_impl(self.config.metadata_store)) + self.sql_store = AuthorizedSqlStore(sqlstore_impl(self.config.metadata_store), self.policy) await self.sql_store.create_table( "openai_files", { @@ -74,7 +74,7 @@ class LocalfsFilesImpl(Files): if not self.sql_store: raise RuntimeError("Files provider not initialized") - row = await self.sql_store.fetch_one("openai_files", policy=self.policy, where={"id": file_id}) + row = await self.sql_store.fetch_one("openai_files", where={"id": file_id}) if not row: raise ResourceNotFoundError(file_id, "File", "client.files.list()") @@ -150,7 +150,6 @@ class LocalfsFilesImpl(Files): paginated_result = await self.sql_store.fetch_all( table="openai_files", - policy=self.policy, where=where_conditions if where_conditions else None, order_by=[("created_at", order.value)], cursor=("id", after) if after else None, diff --git a/llama_stack/providers/remote/files/s3/files.py b/llama_stack/providers/remote/files/s3/files.py index 54742d900..8ea96af9e 100644 --- a/llama_stack/providers/remote/files/s3/files.py +++ b/llama_stack/providers/remote/files/s3/files.py @@ -137,7 +137,7 @@ class S3FilesImpl(Files): where: dict[str, str | dict] = {"id": file_id} if not return_expired: where["expires_at"] = {">": self._now()} - if not (row := await self.sql_store.fetch_one("openai_files", policy=self.policy, where=where)): + if not (row := await self.sql_store.fetch_one("openai_files", where=where)): raise ResourceNotFoundError(file_id, "File", "files.list()") return row @@ -164,7 +164,7 @@ class S3FilesImpl(Files): self._client = _create_s3_client(self._config) await _create_bucket_if_not_exists(self._client, self._config) - self._sql_store = AuthorizedSqlStore(sqlstore_impl(self._config.metadata_store)) + self._sql_store = AuthorizedSqlStore(sqlstore_impl(self._config.metadata_store), self.policy) await self._sql_store.create_table( "openai_files", { @@ -268,7 +268,6 @@ class S3FilesImpl(Files): paginated_result = await self.sql_store.fetch_all( table="openai_files", - policy=self.policy, where=where_conditions, order_by=[("created_at", order.value)], cursor=("id", after) if after else None, diff --git a/llama_stack/providers/utils/inference/inference_store.py b/llama_stack/providers/utils/inference/inference_store.py index 17f4c6268..ffc9f3e11 100644 --- a/llama_stack/providers/utils/inference/inference_store.py +++ b/llama_stack/providers/utils/inference/inference_store.py @@ -54,7 +54,7 @@ class InferenceStore: async def initialize(self): """Create the necessary tables if they don't exist.""" - self.sql_store = AuthorizedSqlStore(sqlstore_impl(self.sql_store_config)) + self.sql_store = AuthorizedSqlStore(sqlstore_impl(self.sql_store_config), self.policy) await self.sql_store.create_table( "chat_completions", { @@ -202,7 +202,6 @@ class InferenceStore: order_by=[("created", order.value)], cursor=("id", after) if after else None, limit=limit, - policy=self.policy, ) data = [ @@ -229,7 +228,6 @@ class InferenceStore: row = await self.sql_store.fetch_one( table="chat_completions", where={"id": completion_id}, - policy=self.policy, ) if not row: diff --git a/llama_stack/providers/utils/responses/responses_store.py b/llama_stack/providers/utils/responses/responses_store.py index 04778ed1c..829cd8a62 100644 --- a/llama_stack/providers/utils/responses/responses_store.py +++ b/llama_stack/providers/utils/responses/responses_store.py @@ -28,8 +28,7 @@ class ResponsesStore: sql_store_config = SqliteSqlStoreConfig( db_path=(RUNTIME_BASE_DIR / "sqlstore.db").as_posix(), ) - self.sql_store = AuthorizedSqlStore(sqlstore_impl(sql_store_config)) - self.policy = policy + self.sql_store = AuthorizedSqlStore(sqlstore_impl(sql_store_config), policy) async def initialize(self): """Create the necessary tables if they don't exist.""" @@ -87,7 +86,6 @@ class ResponsesStore: order_by=[("created_at", order.value)], cursor=("id", after) if after else None, limit=limit, - policy=self.policy, ) data = [OpenAIResponseObjectWithInput(**row["response_object"]) for row in paginated_result.data] @@ -105,7 +103,6 @@ class ResponsesStore: row = await self.sql_store.fetch_one( "openai_responses", where={"id": response_id}, - policy=self.policy, ) if not row: @@ -116,7 +113,7 @@ class ResponsesStore: return OpenAIResponseObjectWithInput(**row["response_object"]) async def delete_response_object(self, response_id: str) -> OpenAIDeleteResponseObject: - row = await self.sql_store.fetch_one("openai_responses", where={"id": response_id}, policy=self.policy) + row = await self.sql_store.fetch_one("openai_responses", where={"id": response_id}) if not row: raise ValueError(f"Response with id {response_id} not found") await self.sql_store.delete("openai_responses", where={"id": response_id}) diff --git a/llama_stack/providers/utils/sqlstore/authorized_sqlstore.py b/llama_stack/providers/utils/sqlstore/authorized_sqlstore.py index acb688f96..ab67f7052 100644 --- a/llama_stack/providers/utils/sqlstore/authorized_sqlstore.py +++ b/llama_stack/providers/utils/sqlstore/authorized_sqlstore.py @@ -53,13 +53,15 @@ class AuthorizedSqlStore: access control policies, user attribute capture, and SQL filtering optimization. """ - def __init__(self, sql_store: SqlStore): + def __init__(self, sql_store: SqlStore, policy: list[AccessRule]): """ Initialize the authorization layer. :param sql_store: Base SqlStore implementation to wrap + :param policy: Access control policy to use for authorization """ self.sql_store = sql_store + self.policy = policy self._detect_database_type() self._validate_sql_optimized_policy() @@ -117,14 +119,13 @@ class AuthorizedSqlStore: async def fetch_all( self, table: str, - policy: list[AccessRule], where: Mapping[str, Any] | None = None, limit: int | None = None, order_by: list[tuple[str, Literal["asc", "desc"]]] | None = None, cursor: tuple[str, str] | None = None, ) -> PaginatedResponse: """Fetch all rows with automatic access control filtering.""" - access_where = self._build_access_control_where_clause(policy) + access_where = self._build_access_control_where_clause(self.policy) rows = await self.sql_store.fetch_all( table=table, where=where, @@ -146,7 +147,7 @@ class AuthorizedSqlStore: str(record_id), table, User(principal=stored_owner_principal, attributes=stored_access_attrs) ) - if is_action_allowed(policy, Action.READ, sql_record, current_user): + if is_action_allowed(self.policy, Action.READ, sql_record, current_user): filtered_rows.append(row) return PaginatedResponse( @@ -157,14 +158,12 @@ class AuthorizedSqlStore: async def fetch_one( self, table: str, - policy: list[AccessRule], where: Mapping[str, Any] | None = None, order_by: list[tuple[str, Literal["asc", "desc"]]] | None = None, ) -> dict[str, Any] | None: """Fetch one row with automatic access control checking.""" results = await self.fetch_all( table=table, - policy=policy, where=where, limit=1, order_by=order_by, diff --git a/tests/integration/providers/utils/sqlstore/test_authorized_sqlstore.py b/tests/integration/providers/utils/sqlstore/test_authorized_sqlstore.py index 4002f2e1f..98bef0f2c 100644 --- a/tests/integration/providers/utils/sqlstore/test_authorized_sqlstore.py +++ b/tests/integration/providers/utils/sqlstore/test_authorized_sqlstore.py @@ -57,7 +57,7 @@ def authorized_store(backend_config): config = config_func() base_sqlstore = sqlstore_impl(config) - authorized_store = AuthorizedSqlStore(base_sqlstore) + authorized_store = AuthorizedSqlStore(base_sqlstore, default_policy()) yield authorized_store @@ -106,7 +106,7 @@ async def test_authorized_store_attributes(mock_get_authenticated_user, authoriz await authorized_store.insert(table_name, {"id": "1", "data": "public_data"}) # Test fetching with no user - should not error on JSON comparison - result = await authorized_store.fetch_all(table_name, policy=default_policy()) + result = await authorized_store.fetch_all(table_name) assert len(result.data) == 1 assert result.data[0]["id"] == "1" assert result.data[0]["access_attributes"] is None @@ -119,7 +119,7 @@ async def test_authorized_store_attributes(mock_get_authenticated_user, authoriz await authorized_store.insert(table_name, {"id": "2", "data": "admin_data"}) # Fetch all - admin should see both - result = await authorized_store.fetch_all(table_name, policy=default_policy()) + result = await authorized_store.fetch_all(table_name) assert len(result.data) == 2 # Test with non-admin user @@ -127,7 +127,7 @@ async def test_authorized_store_attributes(mock_get_authenticated_user, authoriz mock_get_authenticated_user.return_value = regular_user # Should only see public record - result = await authorized_store.fetch_all(table_name, policy=default_policy()) + result = await authorized_store.fetch_all(table_name) assert len(result.data) == 1 assert result.data[0]["id"] == "1" @@ -156,7 +156,7 @@ async def test_authorized_store_attributes(mock_get_authenticated_user, authoriz # Now test with the multi-user who has both roles=admin and teams=dev mock_get_authenticated_user.return_value = multi_user - result = await authorized_store.fetch_all(table_name, policy=default_policy()) + result = await authorized_store.fetch_all(table_name) # Should see: # - public record (1) - no access_attributes @@ -217,21 +217,24 @@ async def test_user_ownership_policy(mock_get_authenticated_user, authorized_sto ), ] + # Create a new authorized store with the owner-only policy + owner_only_store = AuthorizedSqlStore(authorized_store.sql_store, owner_only_policy) + # Test user1 access - should only see their own record mock_get_authenticated_user.return_value = user1 - result = await authorized_store.fetch_all(table_name, policy=owner_only_policy) + result = await owner_only_store.fetch_all(table_name) assert len(result.data) == 1, f"Expected user1 to see 1 record, got {len(result.data)}" assert result.data[0]["id"] == "1", f"Expected user1's record, got {result.data[0]['id']}" # Test user2 access - should only see their own record mock_get_authenticated_user.return_value = user2 - result = await authorized_store.fetch_all(table_name, policy=owner_only_policy) + result = await owner_only_store.fetch_all(table_name) assert len(result.data) == 1, f"Expected user2 to see 1 record, got {len(result.data)}" assert result.data[0]["id"] == "2", f"Expected user2's record, got {result.data[0]['id']}" # Test with anonymous user - should see no records mock_get_authenticated_user.return_value = None - result = await authorized_store.fetch_all(table_name, policy=owner_only_policy) + result = await owner_only_store.fetch_all(table_name) assert len(result.data) == 0, f"Expected anonymous user to see 0 records, got {len(result.data)}" finally: diff --git a/tests/unit/utils/test_authorized_sqlstore.py b/tests/unit/utils/test_authorized_sqlstore.py index 90eb706e4..d85e784a9 100644 --- a/tests/unit/utils/test_authorized_sqlstore.py +++ b/tests/unit/utils/test_authorized_sqlstore.py @@ -26,7 +26,7 @@ async def test_authorized_fetch_with_where_sql_access_control(mock_get_authentic db_path=tmp_dir + "/" + db_name, ) ) - sqlstore = AuthorizedSqlStore(base_sqlstore) + sqlstore = AuthorizedSqlStore(base_sqlstore, default_policy()) # Create table with access control await sqlstore.create_table( @@ -56,24 +56,24 @@ async def test_authorized_fetch_with_where_sql_access_control(mock_get_authentic mock_get_authenticated_user.return_value = admin_user # Admin should see both documents - result = await sqlstore.fetch_all("documents", policy=default_policy(), where={"id": 1}) + result = await sqlstore.fetch_all("documents", where={"id": 1}) assert len(result.data) == 1 assert result.data[0]["title"] == "Admin Document" # User should only see their document mock_get_authenticated_user.return_value = regular_user - result = await sqlstore.fetch_all("documents", policy=default_policy(), where={"id": 1}) + result = await sqlstore.fetch_all("documents", where={"id": 1}) assert len(result.data) == 0 - result = await sqlstore.fetch_all("documents", policy=default_policy(), where={"id": 2}) + result = await sqlstore.fetch_all("documents", where={"id": 2}) assert len(result.data) == 1 assert result.data[0]["title"] == "User Document" - row = await sqlstore.fetch_one("documents", policy=default_policy(), where={"id": 1}) + row = await sqlstore.fetch_one("documents", where={"id": 1}) assert row is None - row = await sqlstore.fetch_one("documents", policy=default_policy(), where={"id": 2}) + row = await sqlstore.fetch_one("documents", where={"id": 2}) assert row is not None assert row["title"] == "User Document" @@ -88,7 +88,7 @@ async def test_sql_policy_consistency(mock_get_authenticated_user): db_path=tmp_dir + "/" + db_name, ) ) - sqlstore = AuthorizedSqlStore(base_sqlstore) + sqlstore = AuthorizedSqlStore(base_sqlstore, default_policy()) await sqlstore.create_table( table="resources", @@ -144,7 +144,7 @@ async def test_sql_policy_consistency(mock_get_authenticated_user): user = User(principal=user_data["principal"], attributes=user_data["attributes"]) mock_get_authenticated_user.return_value = user - sql_results = await sqlstore.fetch_all("resources", policy=policy) + sql_results = await sqlstore.fetch_all("resources") sql_ids = {row["id"] for row in sql_results.data} policy_ids = set() for scenario in test_scenarios: @@ -174,7 +174,7 @@ async def test_authorized_store_user_attribute_capture(mock_get_authenticated_us db_path=tmp_dir + "/" + db_name, ) ) - authorized_store = AuthorizedSqlStore(base_sqlstore) + authorized_store = AuthorizedSqlStore(base_sqlstore, default_policy()) await authorized_store.create_table( table="user_data", From 142a38db8b45e76876eb4f143edff11432d165d6 Mon Sep 17 00:00:00 2001 From: Matthew Farrellee Date: Sat, 20 Sep 2025 19:09:27 -0400 Subject: [PATCH 117/150] chore: remove duplicate AnthropicProviderDataValidator (#3512) # What does this PR do? removes the duplicate AnthropicProviderDataValidator the active one is in config.py ## Test Plan ci --- .../providers/remote/inference/anthropic/__init__.py | 6 ------ 1 file changed, 6 deletions(-) diff --git a/llama_stack/providers/remote/inference/anthropic/__init__.py b/llama_stack/providers/remote/inference/anthropic/__init__.py index 8b420a5a0..30d986808 100644 --- a/llama_stack/providers/remote/inference/anthropic/__init__.py +++ b/llama_stack/providers/remote/inference/anthropic/__init__.py @@ -4,15 +4,9 @@ # This source code is licensed under the terms described in the LICENSE file in # the root directory of this source tree. -from pydantic import BaseModel - from .config import AnthropicConfig -class AnthropicProviderDataValidator(BaseModel): - anthropic_api_key: str | None = None - - async def get_adapter_impl(config: AnthropicConfig, _deps): from .anthropic import AnthropicInferenceAdapter From e3f77c10049a46ab44d7a506904bc00b6e4b12be Mon Sep 17 00:00:00 2001 From: Derek Higgins Date: Sun, 21 Sep 2025 14:32:39 +0100 Subject: [PATCH 118/150] fix: Update inference recorder to handle both Ollama and OpenAI model (#3470) - Handle Ollama format where models are nested under response['body']['models'] - Fall back to OpenAI format where models are directly in response['body'] Closes: #3457 Signed-off-by: Derek Higgins --- llama_stack/testing/inference_recorder.py | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/llama_stack/testing/inference_recorder.py b/llama_stack/testing/inference_recorder.py index 674016fb1..1071da13f 100644 --- a/llama_stack/testing/inference_recorder.py +++ b/llama_stack/testing/inference_recorder.py @@ -203,7 +203,12 @@ def _model_identifiers_digest(endpoint: str, response: dict[str, Any]) -> str: - '/v1/models' (OpenAI): response body is: [ { id: ... }, ... ] Returns a list of unique identifiers or None if structure doesn't match. """ - items = response["body"] + if "models" in response["body"]: + # ollama + items = response["body"]["models"] + else: + # openai + items = response["body"] idents = [m.model if endpoint == "/api/tags" else m.id for m in items] return sorted(set(idents)) From 0e43be36e1a0eef00bec19ad3c0c56b46330110f Mon Sep 17 00:00:00 2001 From: Derek Higgins Date: Mon, 22 Sep 2025 12:31:30 +0100 Subject: [PATCH 119/150] fix: handle missing API keys gracefully in model refresh (#3493) - Catch Errors from providers without API keys during model refresh - Log as warning instead of exception to avoid a scary startup Closes: #3492 Error message are now warnings instead of several tracebacks ``` INFO 2025-09-19 16:06:55,228 llama_stack.providers.utils.inference.inference_store:74 inference_store: Write queue disabled for SQLite to avoid concurrency issues WARNING 2025-09-19 16:06:59,362 llama_stack.providers.utils.inference.openai_mixin:327 providers::utils: Failed to list models for anthropic: API key is not set. Please provide a valid API key in the provider data header, e.g. x-llamastack-provider-data: {"anthropic_api_key": ""}, or in the provider config. WARNING 2025-09-19 16:06:59,364 llama_stack.providers.utils.inference.openai_mixin:327 providers::utils: Failed to list models for gemini: API key is not set. Please provide a valid API key in the provider data header, e.g. x-llamastack-provider-data: {"gemini_api_key": ""}, or in the provider config. WARNING 2025-09-19 16:06:59,367 llama_stack.providers.utils.inference.openai_mixin:327 providers::utils: Failed to list models for groq: API key is not set. Please provide a valid API key in the provider data header, e.g. x-llamastack-provider-data: {"groq_api_key": ""}, or in the provider config. WARNING 2025-09-19 16:06:59,372 llama_stack.providers.utils.inference.openai_mixin:327 providers::utils: Failed to list models for sambanova: API key is not set. Please provide a valid API key in the provider data header, e.g. x-llamastack-provider-data: {"sambanova_api_key": ""}, or in the provider config. INFO 2025-09-19 16:06:59,533 llama_stack.core.utils.config_resolution:45 core: Using file path: ``` Signed-off-by: Derek Higgins --- llama_stack/core/routing_tables/models.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/llama_stack/core/routing_tables/models.py b/llama_stack/core/routing_tables/models.py index b6141efa9..641c73c16 100644 --- a/llama_stack/core/routing_tables/models.py +++ b/llama_stack/core/routing_tables/models.py @@ -33,7 +33,7 @@ class ModelsRoutingTable(CommonRoutingTableImpl, Models): try: models = await provider.list_models() except Exception as e: - logger.exception(f"Model refresh failed for provider {provider_id}: {e}") + logger.warning(f"Model refresh failed for provider {provider_id}: {e}") continue self.listed_providers.add(provider_id) From e2e42c8a370e79bf97e11a54280d20f80f2e8108 Mon Sep 17 00:00:00 2001 From: Matthew Farrellee Date: Mon, 22 Sep 2025 07:53:17 -0400 Subject: [PATCH 120/150] chore: remove duplicate OpenAI and Gemini data validators (#3513) # What does this PR do? removes the duplicate OpenAI/GeminiProviderDataValidator the active ones are in config.pys ## Test Plan ci --- llama_stack/providers/remote/inference/gemini/__init__.py | 6 ------ llama_stack/providers/remote/inference/openai/__init__.py | 6 ------ 2 files changed, 12 deletions(-) diff --git a/llama_stack/providers/remote/inference/gemini/__init__.py b/llama_stack/providers/remote/inference/gemini/__init__.py index 9d35da893..bda2f52d4 100644 --- a/llama_stack/providers/remote/inference/gemini/__init__.py +++ b/llama_stack/providers/remote/inference/gemini/__init__.py @@ -4,15 +4,9 @@ # This source code is licensed under the terms described in the LICENSE file in # the root directory of this source tree. -from pydantic import BaseModel - from .config import GeminiConfig -class GeminiProviderDataValidator(BaseModel): - gemini_api_key: str | None = None - - async def get_adapter_impl(config: GeminiConfig, _deps): from .gemini import GeminiInferenceAdapter diff --git a/llama_stack/providers/remote/inference/openai/__init__.py b/llama_stack/providers/remote/inference/openai/__init__.py index c245dbe10..bd3daeb9a 100644 --- a/llama_stack/providers/remote/inference/openai/__init__.py +++ b/llama_stack/providers/remote/inference/openai/__init__.py @@ -4,15 +4,9 @@ # This source code is licensed under the terms described in the LICENSE file in # the root directory of this source tree. -from pydantic import BaseModel - from .config import OpenAIConfig -class OpenAIProviderDataValidator(BaseModel): - openai_api_key: str | None = None - - async def get_adapter_impl(config: OpenAIConfig, _deps): from .openai import OpenAIInferenceAdapter From 6ce2cf3e128ac20a0c2c40fa86b54d1475e77c33 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 22 Sep 2025 13:54:35 +0200 Subject: [PATCH 121/150] chore(github-deps): bump astral-sh/setup-uv from 6.6.1 to 6.7.0 (#3502) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Bumps [astral-sh/setup-uv](https://github.com/astral-sh/setup-uv) from 6.6.1 to 6.7.0.
Release notes

Sourced from astral-sh/setup-uv's releases.

v6.7.0 🌈 New inputs restore-cache and save-cache

Changes

This release adds fine-grained control over the caching steps.

  • The input restore-cache (true by default) can be set to false to skip restoring the cache while still allowing to save the cache.
  • The input save-cache (true by default) can be set to false to skip saving the cache.

Skipping cache saving can be useful if you know, that you will never use this version of the cache again and don't want to waste storage space:

- name: Save cache only on main branch
  uses: astral-sh/setup-uv@v6
  with:
    enable-cache: true
    save-cache: ${{ github.ref == 'refs/heads/main' }}

🚀 Enhancements

🧰 Maintenance

⬆️ Dependency updates

Commits

[![Dependabot compatibility score](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name=astral-sh/setup-uv&package-manager=github_actions&previous-version=6.6.1&new-version=6.7.0)](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores) Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting `@dependabot rebase`. [//]: # (dependabot-automerge-start) [//]: # (dependabot-automerge-end) ---
Dependabot commands and options
You can trigger Dependabot actions by commenting on this PR: - `@dependabot rebase` will rebase this PR - `@dependabot recreate` will recreate this PR, overwriting any edits that have been made to it - `@dependabot merge` will merge this PR after your CI passes on it - `@dependabot squash and merge` will squash and merge this PR after your CI passes on it - `@dependabot cancel merge` will cancel a previously requested merge and block automerging - `@dependabot reopen` will reopen this PR if it is closed - `@dependabot close` will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually - `@dependabot show ignore conditions` will show all of the ignore conditions of the specified dependency - `@dependabot ignore this major version` will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this minor version` will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this dependency` will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)
Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- .github/workflows/python-build-test.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/python-build-test.yml b/.github/workflows/python-build-test.yml index 00f0950c7..ea8e6a66a 100644 --- a/.github/workflows/python-build-test.yml +++ b/.github/workflows/python-build-test.yml @@ -24,7 +24,7 @@ jobs: uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0 - name: Install uv - uses: astral-sh/setup-uv@557e51de59eb14aaaba2ed9621916900a91d50c6 # v6.6.1 + uses: astral-sh/setup-uv@b75a909f75acd358c2196fb9a5f1299a9a8868a4 # v6.7.0 with: python-version: ${{ matrix.python-version }} activate-environment: true From 21f7667bb7661e292f7f2d68f4a0d01c5223a2be Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 22 Sep 2025 13:56:43 +0200 Subject: [PATCH 122/150] chore(ui-deps): bump remeda from 2.30.0 to 2.32.0 in /llama_stack/ui (#3511) Bumps [remeda](https://github.com/remeda/remeda) from 2.30.0 to 2.32.0.
Release notes

Sourced from remeda's releases.

v2.32.0

2.32.0 (2025-09-18)

Features

v2.31.1

2.31.1 (2025-09-09)

This version is identical to 2.31.0. We were experimenting with some modernizations of our release pipelines and needed to generate a release as part of testing those changes.

v2.31.0

2.31.0 (2025-09-08)

Features

Commits
Maintainer changes

This version was pushed to npm by eranhirsch, a new releaser for remeda since your current version.


[![Dependabot compatibility score](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name=remeda&package-manager=npm_and_yarn&previous-version=2.30.0&new-version=2.32.0)](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores) Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting `@dependabot rebase`. [//]: # (dependabot-automerge-start) [//]: # (dependabot-automerge-end) ---
Dependabot commands and options
You can trigger Dependabot actions by commenting on this PR: - `@dependabot rebase` will rebase this PR - `@dependabot recreate` will recreate this PR, overwriting any edits that have been made to it - `@dependabot merge` will merge this PR after your CI passes on it - `@dependabot squash and merge` will squash and merge this PR after your CI passes on it - `@dependabot cancel merge` will cancel a previously requested merge and block automerging - `@dependabot reopen` will reopen this PR if it is closed - `@dependabot close` will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually - `@dependabot show ignore conditions` will show all of the ignore conditions of the specified dependency - `@dependabot ignore this major version` will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this minor version` will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this dependency` will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)
Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- llama_stack/ui/package-lock.json | 8 ++++---- llama_stack/ui/package.json | 2 +- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/llama_stack/ui/package-lock.json b/llama_stack/ui/package-lock.json index 3f22716c6..fc79f5845 100644 --- a/llama_stack/ui/package-lock.json +++ b/llama_stack/ui/package-lock.json @@ -27,7 +27,7 @@ "react-dom": "^19.1.1", "react-markdown": "^10.1.0", "remark-gfm": "^4.0.1", - "remeda": "^2.30.0", + "remeda": "^2.32.0", "shiki": "^1.29.2", "sonner": "^2.0.7", "tailwind-merge": "^3.3.1" @@ -12887,9 +12887,9 @@ } }, "node_modules/remeda": { - "version": "2.30.0", - "resolved": "https://registry.npmjs.org/remeda/-/remeda-2.30.0.tgz", - "integrity": "sha512-TcRpI1ecqnMer3jHhFtMerGvHFCDlCHljUp0/9A4HxHOh5bSY3kP1l8nQDFMnWYJKl3MSarDNY1tb0Bs/bCmvw==", + "version": "2.32.0", + "resolved": "https://registry.npmjs.org/remeda/-/remeda-2.32.0.tgz", + "integrity": "sha512-BZx9DsT4FAgXDTOdgJIc5eY6ECIXMwtlSPQoPglF20ycSWigttDDe88AozEsPPT4OWk5NujroGSBC1phw5uU+w==", "license": "MIT", "dependencies": { "type-fest": "^4.41.0" diff --git a/llama_stack/ui/package.json b/llama_stack/ui/package.json index 2b0322b28..49c1b85e1 100644 --- a/llama_stack/ui/package.json +++ b/llama_stack/ui/package.json @@ -32,7 +32,7 @@ "react-dom": "^19.1.1", "react-markdown": "^10.1.0", "remark-gfm": "^4.0.1", - "remeda": "^2.30.0", + "remeda": "^2.32.0", "shiki": "^1.29.2", "sonner": "^2.0.7", "tailwind-merge": "^3.3.1" From 7c4a740a085b789cd0ee65bed9656d136c814a41 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 22 Sep 2025 13:56:58 +0200 Subject: [PATCH 123/150] chore(ui-deps): bump @radix-ui/react-dialog from 1.1.13 to 1.1.15 in /llama_stack/ui (#3510) Bumps [@radix-ui/react-dialog](https://github.com/radix-ui/primitives) from 1.1.13 to 1.1.15.
Commits

[![Dependabot compatibility score](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name=@radix-ui/react-dialog&package-manager=npm_and_yarn&previous-version=1.1.13&new-version=1.1.15)](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores) Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting `@dependabot rebase`. [//]: # (dependabot-automerge-start) [//]: # (dependabot-automerge-end) ---
Dependabot commands and options
You can trigger Dependabot actions by commenting on this PR: - `@dependabot rebase` will rebase this PR - `@dependabot recreate` will recreate this PR, overwriting any edits that have been made to it - `@dependabot merge` will merge this PR after your CI passes on it - `@dependabot squash and merge` will squash and merge this PR after your CI passes on it - `@dependabot cancel merge` will cancel a previously requested merge and block automerging - `@dependabot reopen` will reopen this PR if it is closed - `@dependabot close` will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually - `@dependabot show ignore conditions` will show all of the ignore conditions of the specified dependency - `@dependabot ignore this major version` will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this minor version` will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this dependency` will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)
Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- llama_stack/ui/package-lock.json | 706 ++----------------------------- llama_stack/ui/package.json | 2 +- 2 files changed, 39 insertions(+), 669 deletions(-) diff --git a/llama_stack/ui/package-lock.json b/llama_stack/ui/package-lock.json index fc79f5845..2734eedb9 100644 --- a/llama_stack/ui/package-lock.json +++ b/llama_stack/ui/package-lock.json @@ -9,7 +9,7 @@ "version": "0.1.0", "dependencies": { "@radix-ui/react-collapsible": "^1.1.12", - "@radix-ui/react-dialog": "^1.1.13", + "@radix-ui/react-dialog": "^1.1.15", "@radix-ui/react-dropdown-menu": "^2.1.16", "@radix-ui/react-select": "^2.2.6", "@radix-ui/react-separator": "^1.1.7", @@ -2110,9 +2110,9 @@ "license": "MIT" }, "node_modules/@radix-ui/primitive": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@radix-ui/primitive/-/primitive-1.1.2.tgz", - "integrity": "sha512-XnbHrrprsNqZKQhStrSwgRUQzoCI1glLzdw79xiZPoofhGICeZRSQ3dIxAKH1gb3OHfNf4d6f+vAv3kil2eggA==", + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/@radix-ui/primitive/-/primitive-1.1.3.tgz", + "integrity": "sha512-JTF99U/6XIjCBo0wqkU5sK10glYe27MRRsfwoiq5zzOEZLHU3A3KCMa5X/azekYRCJ0HlwI0crAXS/5dEHTzDg==", "license": "MIT" }, "node_modules/@radix-ui/react-arrow": { @@ -2138,29 +2138,6 @@ } } }, - "node_modules/@radix-ui/react-arrow/node_modules/@radix-ui/react-primitive": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/@radix-ui/react-primitive/-/react-primitive-2.1.3.tgz", - "integrity": "sha512-m9gTwRkhy2lvCPe6QJp4d3G1TYEUHn/FzJUtq9MjH46an1wJU+GdoGC5VLof8RX8Ft/DlpshApkhswDLZzHIcQ==", - "license": "MIT", - "dependencies": { - "@radix-ui/react-slot": "1.2.3" - }, - "peerDependencies": { - "@types/react": "*", - "@types/react-dom": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", - "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - }, - "@types/react-dom": { - "optional": true - } - } - }, "node_modules/@radix-ui/react-collapsible": { "version": "1.1.12", "resolved": "https://registry.npmjs.org/@radix-ui/react-collapsible/-/react-collapsible-1.1.12.tgz", @@ -2191,59 +2168,6 @@ } } }, - "node_modules/@radix-ui/react-collapsible/node_modules/@radix-ui/primitive": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/@radix-ui/primitive/-/primitive-1.1.3.tgz", - "integrity": "sha512-JTF99U/6XIjCBo0wqkU5sK10glYe27MRRsfwoiq5zzOEZLHU3A3KCMa5X/azekYRCJ0HlwI0crAXS/5dEHTzDg==", - "license": "MIT" - }, - "node_modules/@radix-ui/react-collapsible/node_modules/@radix-ui/react-presence": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/@radix-ui/react-presence/-/react-presence-1.1.5.tgz", - "integrity": "sha512-/jfEwNDdQVBCNvjkGit4h6pMOzq8bHkopq458dPt2lMjx+eBQUohZNG9A7DtO/O5ukSbxuaNGXMjHicgwy6rQQ==", - "license": "MIT", - "dependencies": { - "@radix-ui/react-compose-refs": "1.1.2", - "@radix-ui/react-use-layout-effect": "1.1.1" - }, - "peerDependencies": { - "@types/react": "*", - "@types/react-dom": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", - "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - }, - "@types/react-dom": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-collapsible/node_modules/@radix-ui/react-primitive": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/@radix-ui/react-primitive/-/react-primitive-2.1.3.tgz", - "integrity": "sha512-m9gTwRkhy2lvCPe6QJp4d3G1TYEUHn/FzJUtq9MjH46an1wJU+GdoGC5VLof8RX8Ft/DlpshApkhswDLZzHIcQ==", - "license": "MIT", - "dependencies": { - "@radix-ui/react-slot": "1.2.3" - }, - "peerDependencies": { - "@types/react": "*", - "@types/react-dom": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", - "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - }, - "@types/react-dom": { - "optional": true - } - } - }, "node_modules/@radix-ui/react-collection": { "version": "1.1.7", "resolved": "https://registry.npmjs.org/@radix-ui/react-collection/-/react-collection-1.1.7.tgz", @@ -2270,29 +2194,6 @@ } } }, - "node_modules/@radix-ui/react-collection/node_modules/@radix-ui/react-primitive": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/@radix-ui/react-primitive/-/react-primitive-2.1.3.tgz", - "integrity": "sha512-m9gTwRkhy2lvCPe6QJp4d3G1TYEUHn/FzJUtq9MjH46an1wJU+GdoGC5VLof8RX8Ft/DlpshApkhswDLZzHIcQ==", - "license": "MIT", - "dependencies": { - "@radix-ui/react-slot": "1.2.3" - }, - "peerDependencies": { - "@types/react": "*", - "@types/react-dom": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", - "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - }, - "@types/react-dom": { - "optional": true - } - } - }, "node_modules/@radix-ui/react-compose-refs": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/@radix-ui/react-compose-refs/-/react-compose-refs-1.1.2.tgz", @@ -2324,22 +2225,22 @@ } }, "node_modules/@radix-ui/react-dialog": { - "version": "1.1.13", - "resolved": "https://registry.npmjs.org/@radix-ui/react-dialog/-/react-dialog-1.1.13.tgz", - "integrity": "sha512-ARFmqUyhIVS3+riWzwGTe7JLjqwqgnODBUZdqpWar/z1WFs9z76fuOs/2BOWCR+YboRn4/WN9aoaGVwqNRr8VA==", + "version": "1.1.15", + "resolved": "https://registry.npmjs.org/@radix-ui/react-dialog/-/react-dialog-1.1.15.tgz", + "integrity": "sha512-TCglVRtzlffRNxRMEyR36DGBLJpeusFcgMVD9PZEzAKnUs1lKCgX5u9BmC2Yg+LL9MgZDugFFs1Vl+Jp4t/PGw==", "license": "MIT", "dependencies": { - "@radix-ui/primitive": "1.1.2", + "@radix-ui/primitive": "1.1.3", "@radix-ui/react-compose-refs": "1.1.2", "@radix-ui/react-context": "1.1.2", - "@radix-ui/react-dismissable-layer": "1.1.9", - "@radix-ui/react-focus-guards": "1.1.2", - "@radix-ui/react-focus-scope": "1.1.6", + "@radix-ui/react-dismissable-layer": "1.1.11", + "@radix-ui/react-focus-guards": "1.1.3", + "@radix-ui/react-focus-scope": "1.1.7", "@radix-ui/react-id": "1.1.1", - "@radix-ui/react-portal": "1.1.8", - "@radix-ui/react-presence": "1.1.4", - "@radix-ui/react-primitive": "2.1.2", - "@radix-ui/react-slot": "1.2.2", + "@radix-ui/react-portal": "1.1.9", + "@radix-ui/react-presence": "1.1.5", + "@radix-ui/react-primitive": "2.1.3", + "@radix-ui/react-slot": "1.2.3", "@radix-ui/react-use-controllable-state": "1.2.2", "aria-hidden": "^1.2.4", "react-remove-scroll": "^2.6.3" @@ -2359,24 +2260,6 @@ } } }, - "node_modules/@radix-ui/react-dialog/node_modules/@radix-ui/react-slot": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/@radix-ui/react-slot/-/react-slot-1.2.2.tgz", - "integrity": "sha512-y7TBO4xN4Y94FvcWIOIh18fM4R1A8S4q1jhoz4PNzOoHsFcN8pogcFmZrTYAm4F9VRUrWP/Mw7xSKybIeRI+CQ==", - "license": "MIT", - "dependencies": { - "@radix-ui/react-compose-refs": "1.1.2" - }, - "peerDependencies": { - "@types/react": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } - } - }, "node_modules/@radix-ui/react-direction": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/@radix-ui/react-direction/-/react-direction-1.1.1.tgz", @@ -2393,14 +2276,14 @@ } }, "node_modules/@radix-ui/react-dismissable-layer": { - "version": "1.1.9", - "resolved": "https://registry.npmjs.org/@radix-ui/react-dismissable-layer/-/react-dismissable-layer-1.1.9.tgz", - "integrity": "sha512-way197PiTvNp+WBP7svMJasHl+vibhWGQDb6Mgf5mhEWJkgb85z7Lfl9TUdkqpWsf8GRNmoopx9ZxCyDzmgRMQ==", + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/@radix-ui/react-dismissable-layer/-/react-dismissable-layer-1.1.11.tgz", + "integrity": "sha512-Nqcp+t5cTB8BinFkZgXiMJniQH0PsUt2k51FUhbdfeKvc4ACcG2uQniY/8+h1Yv6Kza4Q7lD7PQV0z0oicE0Mg==", "license": "MIT", "dependencies": { - "@radix-ui/primitive": "1.1.2", + "@radix-ui/primitive": "1.1.3", "@radix-ui/react-compose-refs": "1.1.2", - "@radix-ui/react-primitive": "2.1.2", + "@radix-ui/react-primitive": "2.1.3", "@radix-ui/react-use-callback-ref": "1.1.1", "@radix-ui/react-use-escape-keydown": "1.1.1" }, @@ -2448,39 +2331,10 @@ } } }, - "node_modules/@radix-ui/react-dropdown-menu/node_modules/@radix-ui/primitive": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/@radix-ui/primitive/-/primitive-1.1.3.tgz", - "integrity": "sha512-JTF99U/6XIjCBo0wqkU5sK10glYe27MRRsfwoiq5zzOEZLHU3A3KCMa5X/azekYRCJ0HlwI0crAXS/5dEHTzDg==", - "license": "MIT" - }, - "node_modules/@radix-ui/react-dropdown-menu/node_modules/@radix-ui/react-primitive": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/@radix-ui/react-primitive/-/react-primitive-2.1.3.tgz", - "integrity": "sha512-m9gTwRkhy2lvCPe6QJp4d3G1TYEUHn/FzJUtq9MjH46an1wJU+GdoGC5VLof8RX8Ft/DlpshApkhswDLZzHIcQ==", - "license": "MIT", - "dependencies": { - "@radix-ui/react-slot": "1.2.3" - }, - "peerDependencies": { - "@types/react": "*", - "@types/react-dom": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", - "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - }, - "@types/react-dom": { - "optional": true - } - } - }, "node_modules/@radix-ui/react-focus-guards": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@radix-ui/react-focus-guards/-/react-focus-guards-1.1.2.tgz", - "integrity": "sha512-fyjAACV62oPV925xFCrH8DR5xWhg9KYtJT4s3u54jxp+L/hbpTY2kIeEFFbFe+a/HCE94zGQMZLIpVTPVZDhaA==", + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/@radix-ui/react-focus-guards/-/react-focus-guards-1.1.3.tgz", + "integrity": "sha512-0rFg/Rj2Q62NCm62jZw0QX7a3sz6QCQU0LpZdNrJX8byRGaGVTqbrW9jAoIAHyMQqsNpeZ81YgSizOt5WXq0Pw==", "license": "MIT", "peerDependencies": { "@types/react": "*", @@ -2493,13 +2347,13 @@ } }, "node_modules/@radix-ui/react-focus-scope": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/@radix-ui/react-focus-scope/-/react-focus-scope-1.1.6.tgz", - "integrity": "sha512-r9zpYNUQY+2jWHWZGyddQLL9YHkM/XvSFHVcWs7bdVuxMAnCwTAuy6Pf47Z4nw7dYcUou1vg/VgjjrrH03VeBw==", + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/@radix-ui/react-focus-scope/-/react-focus-scope-1.1.7.tgz", + "integrity": "sha512-t2ODlkXBQyn7jkl6TNaw/MtVEVvIGelJDCG41Okq/KwUsJBwQ4XVZsHAVUkK4mBv3ewiAS3PGuUWuY2BoK4ZUw==", "license": "MIT", "dependencies": { "@radix-ui/react-compose-refs": "1.1.2", - "@radix-ui/react-primitive": "2.1.2", + "@radix-ui/react-primitive": "2.1.3", "@radix-ui/react-use-callback-ref": "1.1.1" }, "peerDependencies": { @@ -2575,150 +2429,6 @@ } } }, - "node_modules/@radix-ui/react-menu/node_modules/@radix-ui/primitive": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/@radix-ui/primitive/-/primitive-1.1.3.tgz", - "integrity": "sha512-JTF99U/6XIjCBo0wqkU5sK10glYe27MRRsfwoiq5zzOEZLHU3A3KCMa5X/azekYRCJ0HlwI0crAXS/5dEHTzDg==", - "license": "MIT" - }, - "node_modules/@radix-ui/react-menu/node_modules/@radix-ui/react-dismissable-layer": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/@radix-ui/react-dismissable-layer/-/react-dismissable-layer-1.1.11.tgz", - "integrity": "sha512-Nqcp+t5cTB8BinFkZgXiMJniQH0PsUt2k51FUhbdfeKvc4ACcG2uQniY/8+h1Yv6Kza4Q7lD7PQV0z0oicE0Mg==", - "license": "MIT", - "dependencies": { - "@radix-ui/primitive": "1.1.3", - "@radix-ui/react-compose-refs": "1.1.2", - "@radix-ui/react-primitive": "2.1.3", - "@radix-ui/react-use-callback-ref": "1.1.1", - "@radix-ui/react-use-escape-keydown": "1.1.1" - }, - "peerDependencies": { - "@types/react": "*", - "@types/react-dom": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", - "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - }, - "@types/react-dom": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-menu/node_modules/@radix-ui/react-focus-guards": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/@radix-ui/react-focus-guards/-/react-focus-guards-1.1.3.tgz", - "integrity": "sha512-0rFg/Rj2Q62NCm62jZw0QX7a3sz6QCQU0LpZdNrJX8byRGaGVTqbrW9jAoIAHyMQqsNpeZ81YgSizOt5WXq0Pw==", - "license": "MIT", - "peerDependencies": { - "@types/react": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-menu/node_modules/@radix-ui/react-focus-scope": { - "version": "1.1.7", - "resolved": "https://registry.npmjs.org/@radix-ui/react-focus-scope/-/react-focus-scope-1.1.7.tgz", - "integrity": "sha512-t2ODlkXBQyn7jkl6TNaw/MtVEVvIGelJDCG41Okq/KwUsJBwQ4XVZsHAVUkK4mBv3ewiAS3PGuUWuY2BoK4ZUw==", - "license": "MIT", - "dependencies": { - "@radix-ui/react-compose-refs": "1.1.2", - "@radix-ui/react-primitive": "2.1.3", - "@radix-ui/react-use-callback-ref": "1.1.1" - }, - "peerDependencies": { - "@types/react": "*", - "@types/react-dom": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", - "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - }, - "@types/react-dom": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-menu/node_modules/@radix-ui/react-portal": { - "version": "1.1.9", - "resolved": "https://registry.npmjs.org/@radix-ui/react-portal/-/react-portal-1.1.9.tgz", - "integrity": "sha512-bpIxvq03if6UNwXZ+HTK71JLh4APvnXntDc6XOX8UVq4XQOVl7lwok0AvIl+b8zgCw3fSaVTZMpAPPagXbKmHQ==", - "license": "MIT", - "dependencies": { - "@radix-ui/react-primitive": "2.1.3", - "@radix-ui/react-use-layout-effect": "1.1.1" - }, - "peerDependencies": { - "@types/react": "*", - "@types/react-dom": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", - "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - }, - "@types/react-dom": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-menu/node_modules/@radix-ui/react-presence": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/@radix-ui/react-presence/-/react-presence-1.1.5.tgz", - "integrity": "sha512-/jfEwNDdQVBCNvjkGit4h6pMOzq8bHkopq458dPt2lMjx+eBQUohZNG9A7DtO/O5ukSbxuaNGXMjHicgwy6rQQ==", - "license": "MIT", - "dependencies": { - "@radix-ui/react-compose-refs": "1.1.2", - "@radix-ui/react-use-layout-effect": "1.1.1" - }, - "peerDependencies": { - "@types/react": "*", - "@types/react-dom": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", - "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - }, - "@types/react-dom": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-menu/node_modules/@radix-ui/react-primitive": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/@radix-ui/react-primitive/-/react-primitive-2.1.3.tgz", - "integrity": "sha512-m9gTwRkhy2lvCPe6QJp4d3G1TYEUHn/FzJUtq9MjH46an1wJU+GdoGC5VLof8RX8Ft/DlpshApkhswDLZzHIcQ==", - "license": "MIT", - "dependencies": { - "@radix-ui/react-slot": "1.2.3" - }, - "peerDependencies": { - "@types/react": "*", - "@types/react-dom": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", - "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - }, - "@types/react-dom": { - "optional": true - } - } - }, "node_modules/@radix-ui/react-popper": { "version": "1.2.8", "resolved": "https://registry.npmjs.org/@radix-ui/react-popper/-/react-popper-1.2.8.tgz", @@ -2751,36 +2461,13 @@ } } }, - "node_modules/@radix-ui/react-popper/node_modules/@radix-ui/react-primitive": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/@radix-ui/react-primitive/-/react-primitive-2.1.3.tgz", - "integrity": "sha512-m9gTwRkhy2lvCPe6QJp4d3G1TYEUHn/FzJUtq9MjH46an1wJU+GdoGC5VLof8RX8Ft/DlpshApkhswDLZzHIcQ==", - "license": "MIT", - "dependencies": { - "@radix-ui/react-slot": "1.2.3" - }, - "peerDependencies": { - "@types/react": "*", - "@types/react-dom": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", - "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - }, - "@types/react-dom": { - "optional": true - } - } - }, "node_modules/@radix-ui/react-portal": { - "version": "1.1.8", - "resolved": "https://registry.npmjs.org/@radix-ui/react-portal/-/react-portal-1.1.8.tgz", - "integrity": "sha512-hQsTUIn7p7fxCPvao/q6wpbxmCwgLrlz+nOrJgC+RwfZqWY/WN+UMqkXzrtKbPrF82P43eCTl3ekeKuyAQbFeg==", + "version": "1.1.9", + "resolved": "https://registry.npmjs.org/@radix-ui/react-portal/-/react-portal-1.1.9.tgz", + "integrity": "sha512-bpIxvq03if6UNwXZ+HTK71JLh4APvnXntDc6XOX8UVq4XQOVl7lwok0AvIl+b8zgCw3fSaVTZMpAPPagXbKmHQ==", "license": "MIT", "dependencies": { - "@radix-ui/react-primitive": "2.1.2", + "@radix-ui/react-primitive": "2.1.3", "@radix-ui/react-use-layout-effect": "1.1.1" }, "peerDependencies": { @@ -2799,9 +2486,9 @@ } }, "node_modules/@radix-ui/react-presence": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/@radix-ui/react-presence/-/react-presence-1.1.4.tgz", - "integrity": "sha512-ueDqRbdc4/bkaQT3GIpLQssRlFgWaL/U2z/S31qRwwLWoxHLgry3SIfCwhxeQNbirEUXFa+lq3RL3oBYXtcmIA==", + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/@radix-ui/react-presence/-/react-presence-1.1.5.tgz", + "integrity": "sha512-/jfEwNDdQVBCNvjkGit4h6pMOzq8bHkopq458dPt2lMjx+eBQUohZNG9A7DtO/O5ukSbxuaNGXMjHicgwy6rQQ==", "license": "MIT", "dependencies": { "@radix-ui/react-compose-refs": "1.1.2", @@ -2823,12 +2510,12 @@ } }, "node_modules/@radix-ui/react-primitive": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/@radix-ui/react-primitive/-/react-primitive-2.1.2.tgz", - "integrity": "sha512-uHa+l/lKfxuDD2zjN/0peM/RhhSmRjr5YWdk/37EnSv1nJ88uvG85DPexSm8HdFQROd2VdERJ6ynXbkCFi+APw==", + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/@radix-ui/react-primitive/-/react-primitive-2.1.3.tgz", + "integrity": "sha512-m9gTwRkhy2lvCPe6QJp4d3G1TYEUHn/FzJUtq9MjH46an1wJU+GdoGC5VLof8RX8Ft/DlpshApkhswDLZzHIcQ==", "license": "MIT", "dependencies": { - "@radix-ui/react-slot": "1.2.2" + "@radix-ui/react-slot": "1.2.3" }, "peerDependencies": { "@types/react": "*", @@ -2845,24 +2532,6 @@ } } }, - "node_modules/@radix-ui/react-primitive/node_modules/@radix-ui/react-slot": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/@radix-ui/react-slot/-/react-slot-1.2.2.tgz", - "integrity": "sha512-y7TBO4xN4Y94FvcWIOIh18fM4R1A8S4q1jhoz4PNzOoHsFcN8pogcFmZrTYAm4F9VRUrWP/Mw7xSKybIeRI+CQ==", - "license": "MIT", - "dependencies": { - "@radix-ui/react-compose-refs": "1.1.2" - }, - "peerDependencies": { - "@types/react": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } - } - }, "node_modules/@radix-ui/react-roving-focus": { "version": "1.1.11", "resolved": "https://registry.npmjs.org/@radix-ui/react-roving-focus/-/react-roving-focus-1.1.11.tgz", @@ -2894,35 +2563,6 @@ } } }, - "node_modules/@radix-ui/react-roving-focus/node_modules/@radix-ui/primitive": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/@radix-ui/primitive/-/primitive-1.1.3.tgz", - "integrity": "sha512-JTF99U/6XIjCBo0wqkU5sK10glYe27MRRsfwoiq5zzOEZLHU3A3KCMa5X/azekYRCJ0HlwI0crAXS/5dEHTzDg==", - "license": "MIT" - }, - "node_modules/@radix-ui/react-roving-focus/node_modules/@radix-ui/react-primitive": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/@radix-ui/react-primitive/-/react-primitive-2.1.3.tgz", - "integrity": "sha512-m9gTwRkhy2lvCPe6QJp4d3G1TYEUHn/FzJUtq9MjH46an1wJU+GdoGC5VLof8RX8Ft/DlpshApkhswDLZzHIcQ==", - "license": "MIT", - "dependencies": { - "@radix-ui/react-slot": "1.2.3" - }, - "peerDependencies": { - "@types/react": "*", - "@types/react-dom": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", - "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - }, - "@types/react-dom": { - "optional": true - } - } - }, "node_modules/@radix-ui/react-select": { "version": "2.2.6", "resolved": "https://registry.npmjs.org/@radix-ui/react-select/-/react-select-2.2.6.tgz", @@ -2966,126 +2606,6 @@ } } }, - "node_modules/@radix-ui/react-select/node_modules/@radix-ui/primitive": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/@radix-ui/primitive/-/primitive-1.1.3.tgz", - "integrity": "sha512-JTF99U/6XIjCBo0wqkU5sK10glYe27MRRsfwoiq5zzOEZLHU3A3KCMa5X/azekYRCJ0HlwI0crAXS/5dEHTzDg==", - "license": "MIT" - }, - "node_modules/@radix-ui/react-select/node_modules/@radix-ui/react-dismissable-layer": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/@radix-ui/react-dismissable-layer/-/react-dismissable-layer-1.1.11.tgz", - "integrity": "sha512-Nqcp+t5cTB8BinFkZgXiMJniQH0PsUt2k51FUhbdfeKvc4ACcG2uQniY/8+h1Yv6Kza4Q7lD7PQV0z0oicE0Mg==", - "license": "MIT", - "dependencies": { - "@radix-ui/primitive": "1.1.3", - "@radix-ui/react-compose-refs": "1.1.2", - "@radix-ui/react-primitive": "2.1.3", - "@radix-ui/react-use-callback-ref": "1.1.1", - "@radix-ui/react-use-escape-keydown": "1.1.1" - }, - "peerDependencies": { - "@types/react": "*", - "@types/react-dom": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", - "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - }, - "@types/react-dom": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-select/node_modules/@radix-ui/react-focus-guards": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/@radix-ui/react-focus-guards/-/react-focus-guards-1.1.3.tgz", - "integrity": "sha512-0rFg/Rj2Q62NCm62jZw0QX7a3sz6QCQU0LpZdNrJX8byRGaGVTqbrW9jAoIAHyMQqsNpeZ81YgSizOt5WXq0Pw==", - "license": "MIT", - "peerDependencies": { - "@types/react": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-select/node_modules/@radix-ui/react-focus-scope": { - "version": "1.1.7", - "resolved": "https://registry.npmjs.org/@radix-ui/react-focus-scope/-/react-focus-scope-1.1.7.tgz", - "integrity": "sha512-t2ODlkXBQyn7jkl6TNaw/MtVEVvIGelJDCG41Okq/KwUsJBwQ4XVZsHAVUkK4mBv3ewiAS3PGuUWuY2BoK4ZUw==", - "license": "MIT", - "dependencies": { - "@radix-ui/react-compose-refs": "1.1.2", - "@radix-ui/react-primitive": "2.1.3", - "@radix-ui/react-use-callback-ref": "1.1.1" - }, - "peerDependencies": { - "@types/react": "*", - "@types/react-dom": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", - "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - }, - "@types/react-dom": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-select/node_modules/@radix-ui/react-portal": { - "version": "1.1.9", - "resolved": "https://registry.npmjs.org/@radix-ui/react-portal/-/react-portal-1.1.9.tgz", - "integrity": "sha512-bpIxvq03if6UNwXZ+HTK71JLh4APvnXntDc6XOX8UVq4XQOVl7lwok0AvIl+b8zgCw3fSaVTZMpAPPagXbKmHQ==", - "license": "MIT", - "dependencies": { - "@radix-ui/react-primitive": "2.1.3", - "@radix-ui/react-use-layout-effect": "1.1.1" - }, - "peerDependencies": { - "@types/react": "*", - "@types/react-dom": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", - "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - }, - "@types/react-dom": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-select/node_modules/@radix-ui/react-primitive": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/@radix-ui/react-primitive/-/react-primitive-2.1.3.tgz", - "integrity": "sha512-m9gTwRkhy2lvCPe6QJp4d3G1TYEUHn/FzJUtq9MjH46an1wJU+GdoGC5VLof8RX8Ft/DlpshApkhswDLZzHIcQ==", - "license": "MIT", - "dependencies": { - "@radix-ui/react-slot": "1.2.3" - }, - "peerDependencies": { - "@types/react": "*", - "@types/react-dom": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", - "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - }, - "@types/react-dom": { - "optional": true - } - } - }, "node_modules/@radix-ui/react-separator": { "version": "1.1.7", "resolved": "https://registry.npmjs.org/@radix-ui/react-separator/-/react-separator-1.1.7.tgz", @@ -3109,29 +2629,6 @@ } } }, - "node_modules/@radix-ui/react-separator/node_modules/@radix-ui/react-primitive": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/@radix-ui/react-primitive/-/react-primitive-2.1.3.tgz", - "integrity": "sha512-m9gTwRkhy2lvCPe6QJp4d3G1TYEUHn/FzJUtq9MjH46an1wJU+GdoGC5VLof8RX8Ft/DlpshApkhswDLZzHIcQ==", - "license": "MIT", - "dependencies": { - "@radix-ui/react-slot": "1.2.3" - }, - "peerDependencies": { - "@types/react": "*", - "@types/react-dom": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", - "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - }, - "@types/react-dom": { - "optional": true - } - } - }, "node_modules/@radix-ui/react-slot": { "version": "1.2.3", "resolved": "https://registry.npmjs.org/@radix-ui/react-slot/-/react-slot-1.2.3.tgz", @@ -3184,110 +2681,6 @@ } } }, - "node_modules/@radix-ui/react-tooltip/node_modules/@radix-ui/primitive": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/@radix-ui/primitive/-/primitive-1.1.3.tgz", - "integrity": "sha512-JTF99U/6XIjCBo0wqkU5sK10glYe27MRRsfwoiq5zzOEZLHU3A3KCMa5X/azekYRCJ0HlwI0crAXS/5dEHTzDg==", - "license": "MIT" - }, - "node_modules/@radix-ui/react-tooltip/node_modules/@radix-ui/react-dismissable-layer": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/@radix-ui/react-dismissable-layer/-/react-dismissable-layer-1.1.11.tgz", - "integrity": "sha512-Nqcp+t5cTB8BinFkZgXiMJniQH0PsUt2k51FUhbdfeKvc4ACcG2uQniY/8+h1Yv6Kza4Q7lD7PQV0z0oicE0Mg==", - "license": "MIT", - "dependencies": { - "@radix-ui/primitive": "1.1.3", - "@radix-ui/react-compose-refs": "1.1.2", - "@radix-ui/react-primitive": "2.1.3", - "@radix-ui/react-use-callback-ref": "1.1.1", - "@radix-ui/react-use-escape-keydown": "1.1.1" - }, - "peerDependencies": { - "@types/react": "*", - "@types/react-dom": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", - "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - }, - "@types/react-dom": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-tooltip/node_modules/@radix-ui/react-portal": { - "version": "1.1.9", - "resolved": "https://registry.npmjs.org/@radix-ui/react-portal/-/react-portal-1.1.9.tgz", - "integrity": "sha512-bpIxvq03if6UNwXZ+HTK71JLh4APvnXntDc6XOX8UVq4XQOVl7lwok0AvIl+b8zgCw3fSaVTZMpAPPagXbKmHQ==", - "license": "MIT", - "dependencies": { - "@radix-ui/react-primitive": "2.1.3", - "@radix-ui/react-use-layout-effect": "1.1.1" - }, - "peerDependencies": { - "@types/react": "*", - "@types/react-dom": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", - "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - }, - "@types/react-dom": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-tooltip/node_modules/@radix-ui/react-presence": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/@radix-ui/react-presence/-/react-presence-1.1.5.tgz", - "integrity": "sha512-/jfEwNDdQVBCNvjkGit4h6pMOzq8bHkopq458dPt2lMjx+eBQUohZNG9A7DtO/O5ukSbxuaNGXMjHicgwy6rQQ==", - "license": "MIT", - "dependencies": { - "@radix-ui/react-compose-refs": "1.1.2", - "@radix-ui/react-use-layout-effect": "1.1.1" - }, - "peerDependencies": { - "@types/react": "*", - "@types/react-dom": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", - "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - }, - "@types/react-dom": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-tooltip/node_modules/@radix-ui/react-primitive": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/@radix-ui/react-primitive/-/react-primitive-2.1.3.tgz", - "integrity": "sha512-m9gTwRkhy2lvCPe6QJp4d3G1TYEUHn/FzJUtq9MjH46an1wJU+GdoGC5VLof8RX8Ft/DlpshApkhswDLZzHIcQ==", - "license": "MIT", - "dependencies": { - "@radix-ui/react-slot": "1.2.3" - }, - "peerDependencies": { - "@types/react": "*", - "@types/react-dom": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", - "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - }, - "@types/react-dom": { - "optional": true - } - } - }, "node_modules/@radix-ui/react-use-callback-ref": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/@radix-ui/react-use-callback-ref/-/react-use-callback-ref-1.1.1.tgz", @@ -3447,29 +2840,6 @@ } } }, - "node_modules/@radix-ui/react-visually-hidden/node_modules/@radix-ui/react-primitive": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/@radix-ui/react-primitive/-/react-primitive-2.1.3.tgz", - "integrity": "sha512-m9gTwRkhy2lvCPe6QJp4d3G1TYEUHn/FzJUtq9MjH46an1wJU+GdoGC5VLof8RX8Ft/DlpshApkhswDLZzHIcQ==", - "license": "MIT", - "dependencies": { - "@radix-ui/react-slot": "1.2.3" - }, - "peerDependencies": { - "@types/react": "*", - "@types/react-dom": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", - "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - }, - "@types/react-dom": { - "optional": true - } - } - }, "node_modules/@radix-ui/rect": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/@radix-ui/rect/-/rect-1.1.1.tgz", diff --git a/llama_stack/ui/package.json b/llama_stack/ui/package.json index 49c1b85e1..ac68dbc07 100644 --- a/llama_stack/ui/package.json +++ b/llama_stack/ui/package.json @@ -14,7 +14,7 @@ }, "dependencies": { "@radix-ui/react-collapsible": "^1.1.12", - "@radix-ui/react-dialog": "^1.1.13", + "@radix-ui/react-dialog": "^1.1.15", "@radix-ui/react-dropdown-menu": "^2.1.16", "@radix-ui/react-select": "^2.2.6", "@radix-ui/react-separator": "^1.1.7", From a1301911e419f5f43cfd9f17fadc67c5002de327 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 22 Sep 2025 13:57:10 +0200 Subject: [PATCH 124/150] chore(ui-deps): bump jest-environment-jsdom from 29.7.0 to 30.1.2 in /llama_stack/ui (#3509) Bumps [jest-environment-jsdom](https://github.com/jestjs/jest/tree/HEAD/packages/jest-environment-jsdom) from 29.7.0 to 30.1.2.
Release notes

Sourced from jest-environment-jsdom's releases.

30.1.2

Fixes

  • [jest-snapshot-utils] Correct snapshot header regexp to work with newline across OSes (#15803)

30.1.1

Fixes

  • [jest-snapshot-utils] Fix deprecated goo.gl snapshot warning not handling Windows end-of-line sequences (#15800)

30.1.0

Features

  • [jest-leak-detector] Configurable GC aggressiveness regarding to V8 heap snapshot generation (#15793)
  • [jest-runtime] Reduce redundant ReferenceError messages
  • [jest-core] Include test modules that failed to load when --onlyFailures is active

Fixes

  • `[jest-snapshot-utils] Fix deprecated goo.gl snapshot guide link not getting replaced with fully canonical URL (#15787)
  • [jest-circus] Fix it.concurrent not working with describe.skip (#15765)
  • [jest-snapshot] Fix mangled inline snapshot updates when used with Prettier 3 and CRLF line endings
  • [jest-runtime] Importing from @jest/globals in more than one file no longer breaks relative paths (#15772)

Chore

  • [expect] Update docblock for toContain() to display info on substring check (#15789)

30.0.2

What's Changed

Fixes

  • [jest-matcher-utils] Make 'deepCyclicCopyObject' safer by setting descriptors to a null-prototype object (#15689)
  • [jest-util] Make garbage collection protection property writable (#15689)

Full Changelog: https://github.com/jestjs/jest/blob/main/CHANGELOG.md

Jest 30.0.1

What's Changed

Features

  • [jest-resolver] Implement the defaultAsyncResolver (#15679)

Fixes

  • [jest-resolver] Resolve builtin modules correctly (#15683)
  • [jest-environment-node, jest-util] Avoid setting globals cleanup protection symbol when feature is off (#15684)

... (truncated)

Changelog

Sourced from jest-environment-jsdom's changelog.

30.1.2

Fixes

  • [jest-snapshot-utils] Correct snapshot header regexp to work with newline across OSes (#15803)

30.1.1

Fixes

  • [jest-snapshot-utils] Fix deprecated goo.gl snapshot warning not handling Windows end-of-line sequences (#15800)

30.1.0

Features

  • [jest-leak-detector] Configurable GC aggressiveness regarding to V8 heap snapshot generation (#15793)
  • [jest-runtime] Reduce redundant ReferenceError messages
  • [jest-core] Include test modules that failed to load when --onlyFailures is active

Fixes

  • [jest-snapshot-utils] Fix deprecated goo.gl snapshot guide link not getting replaced with fully canonical URL (#15787)
  • [jest-circus] Fix it.concurrent not working with describe.skip (#15765)
  • [jest-snapshot] Fix mangled inline snapshot updates when used with Prettier 3 and CRLF line endings
  • [jest-runtime] Importing from @jest/globals in more than one file no longer breaks relative paths (#15772)

Chore

  • [expect] Update docblock for toContain() to display info on substring check (#15789)

30.0.5

Features

  • [jest-config] Allow testMatch to take a string value
  • [jest-worker] Let workerIdleMemoryLimit accept 0 to always restart worker child processes

Fixes

  • [expect] Fix bigint error (#15702)

30.0.4

Features

  • [expect] The Inverse type is now exported (#15714)
  • [expect] feat: support async functions in toBe (#15704)

Fixes

... (truncated)

Commits

[![Dependabot compatibility score](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name=jest-environment-jsdom&package-manager=npm_and_yarn&previous-version=29.7.0&new-version=30.1.2)](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores) Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting `@dependabot rebase`. [//]: # (dependabot-automerge-start) [//]: # (dependabot-automerge-end) ---
Dependabot commands and options
You can trigger Dependabot actions by commenting on this PR: - `@dependabot rebase` will rebase this PR - `@dependabot recreate` will recreate this PR, overwriting any edits that have been made to it - `@dependabot merge` will merge this PR after your CI passes on it - `@dependabot squash and merge` will squash and merge this PR after your CI passes on it - `@dependabot cancel merge` will cancel a previously requested merge and block automerging - `@dependabot reopen` will reopen this PR if it is closed - `@dependabot close` will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually - `@dependabot show ignore conditions` will show all of the ignore conditions of the specified dependency - `@dependabot ignore this major version` will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this minor version` will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this dependency` will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)
Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- llama_stack/ui/package-lock.json | 1010 ++++++++++++++++++++++-------- llama_stack/ui/package.json | 2 +- 2 files changed, 738 insertions(+), 274 deletions(-) diff --git a/llama_stack/ui/package-lock.json b/llama_stack/ui/package-lock.json index 2734eedb9..638655639 100644 --- a/llama_stack/ui/package-lock.json +++ b/llama_stack/ui/package-lock.json @@ -47,7 +47,7 @@ "eslint-config-prettier": "^10.1.8", "eslint-plugin-prettier": "^5.5.4", "jest": "^29.7.0", - "jest-environment-jsdom": "^29.7.0", + "jest-environment-jsdom": "^30.1.2", "prettier": "3.6.2", "tailwindcss": "^4", "ts-node": "^10.9.2", @@ -89,6 +89,27 @@ "node": ">=6.0.0" } }, + "node_modules/@asamuzakjp/css-color": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/@asamuzakjp/css-color/-/css-color-3.2.0.tgz", + "integrity": "sha512-K1A6z8tS3XsmCMM86xoWdn7Fkdn9m6RSVtocUrJYIwZnFVkng/PvkEoWtOWmP+Scc6saYWHWZYbndEEXxl24jw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@csstools/css-calc": "^2.1.3", + "@csstools/css-color-parser": "^3.0.9", + "@csstools/css-parser-algorithms": "^3.0.4", + "@csstools/css-tokenizer": "^3.0.3", + "lru-cache": "^10.4.3" + } + }, + "node_modules/@asamuzakjp/css-color/node_modules/lru-cache": { + "version": "10.4.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz", + "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==", + "dev": true, + "license": "ISC" + }, "node_modules/@babel/code-frame": { "version": "7.27.1", "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.27.1.tgz", @@ -651,6 +672,121 @@ "@jridgewell/sourcemap-codec": "^1.4.10" } }, + "node_modules/@csstools/color-helpers": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/@csstools/color-helpers/-/color-helpers-5.1.0.tgz", + "integrity": "sha512-S11EXWJyy0Mz5SYvRmY8nJYTFFd1LCNV+7cXyAgQtOOuzb4EsgfqDufL+9esx72/eLhsRdGZwaldu/h+E4t4BA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "engines": { + "node": ">=18" + } + }, + "node_modules/@csstools/css-calc": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/@csstools/css-calc/-/css-calc-2.1.4.tgz", + "integrity": "sha512-3N8oaj+0juUw/1H3YwmDDJXCgTB1gKU6Hc/bB502u9zR0q2vd786XJH9QfrKIEgFlZmhZiq6epXl4rHqhzsIgQ==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT", + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@csstools/css-parser-algorithms": "^3.0.5", + "@csstools/css-tokenizer": "^3.0.4" + } + }, + "node_modules/@csstools/css-color-parser": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@csstools/css-color-parser/-/css-color-parser-3.1.0.tgz", + "integrity": "sha512-nbtKwh3a6xNVIp/VRuXV64yTKnb1IjTAEEh3irzS+HkKjAOYLTGNb9pmVNntZ8iVBHcWDA2Dof0QtPgFI1BaTA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT", + "dependencies": { + "@csstools/color-helpers": "^5.1.0", + "@csstools/css-calc": "^2.1.4" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@csstools/css-parser-algorithms": "^3.0.5", + "@csstools/css-tokenizer": "^3.0.4" + } + }, + "node_modules/@csstools/css-parser-algorithms": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/@csstools/css-parser-algorithms/-/css-parser-algorithms-3.0.5.tgz", + "integrity": "sha512-DaDeUkXZKjdGhgYaHNJTV9pV7Y9B3b644jCLs9Upc3VeNGg6LWARAT6O+Q+/COo+2gg/bM5rhpMAtf70WqfBdQ==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT", + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@csstools/css-tokenizer": "^3.0.4" + } + }, + "node_modules/@csstools/css-tokenizer": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@csstools/css-tokenizer/-/css-tokenizer-3.0.4.tgz", + "integrity": "sha512-Vd/9EVDiu6PPJt9yAh6roZP6El1xHrdvIVGjyBsHR0RYwNHgL7FJPyIIW4fANJNG6FtyZfvlRPpFI4ZM/lubvw==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT", + "engines": { + "node": ">=18" + } + }, "node_modules/@emnapi/core": { "version": "1.4.3", "resolved": "https://registry.npmjs.org/@emnapi/core/-/core-1.4.3.tgz", @@ -1591,6 +1727,235 @@ "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, + "node_modules/@jest/environment-jsdom-abstract": { + "version": "30.1.2", + "resolved": "https://registry.npmjs.org/@jest/environment-jsdom-abstract/-/environment-jsdom-abstract-30.1.2.tgz", + "integrity": "sha512-u8kTh/ZBl97GOmnGJLYK/1GuwAruMC4hoP6xuk/kwltmVWsA9u/6fH1/CsPVGt2O+Wn2yEjs8n1B1zZJ62Cx0w==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/environment": "30.1.2", + "@jest/fake-timers": "30.1.2", + "@jest/types": "30.0.5", + "@types/jsdom": "^21.1.7", + "@types/node": "*", + "jest-mock": "30.0.5", + "jest-util": "30.0.5" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + }, + "peerDependencies": { + "canvas": "^3.0.0", + "jsdom": "*" + }, + "peerDependenciesMeta": { + "canvas": { + "optional": true + } + } + }, + "node_modules/@jest/environment-jsdom-abstract/node_modules/@jest/environment": { + "version": "30.1.2", + "resolved": "https://registry.npmjs.org/@jest/environment/-/environment-30.1.2.tgz", + "integrity": "sha512-N8t1Ytw4/mr9uN28OnVf0SYE2dGhaIxOVYcwsf9IInBKjvofAjbFRvedvBBlyTYk2knbJTiEjEJ2PyyDIBnd9w==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/fake-timers": "30.1.2", + "@jest/types": "30.0.5", + "@types/node": "*", + "jest-mock": "30.0.5" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "node_modules/@jest/environment-jsdom-abstract/node_modules/@jest/fake-timers": { + "version": "30.1.2", + "resolved": "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-30.1.2.tgz", + "integrity": "sha512-Beljfv9AYkr9K+ETX9tvV61rJTY706BhBUtiaepQHeEGfe0DbpvUA5Z3fomwc5Xkhns6NWrcFDZn+72fLieUnA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/types": "30.0.5", + "@sinonjs/fake-timers": "^13.0.0", + "@types/node": "*", + "jest-message-util": "30.1.0", + "jest-mock": "30.0.5", + "jest-util": "30.0.5" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "node_modules/@jest/environment-jsdom-abstract/node_modules/@jest/schemas": { + "version": "30.0.5", + "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-30.0.5.tgz", + "integrity": "sha512-DmdYgtezMkh3cpU8/1uyXakv3tJRcmcXxBOcO0tbaozPwpmh4YMsnWrQm9ZmZMfa5ocbxzbFk6O4bDPEc/iAnA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@sinclair/typebox": "^0.34.0" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "node_modules/@jest/environment-jsdom-abstract/node_modules/@jest/types": { + "version": "30.0.5", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-30.0.5.tgz", + "integrity": "sha512-aREYa3aku9SSnea4aX6bhKn4bgv3AXkgijoQgbYV3yvbiGt6z+MQ85+6mIhx9DsKW2BuB/cLR/A+tcMThx+KLQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/pattern": "30.0.1", + "@jest/schemas": "30.0.5", + "@types/istanbul-lib-coverage": "^2.0.6", + "@types/istanbul-reports": "^3.0.4", + "@types/node": "*", + "@types/yargs": "^17.0.33", + "chalk": "^4.1.2" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "node_modules/@jest/environment-jsdom-abstract/node_modules/@sinclair/typebox": { + "version": "0.34.41", + "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.34.41.tgz", + "integrity": "sha512-6gS8pZzSXdyRHTIqoqSVknxolr1kzfy4/CeDnrzsVz8TTIWUbOBr6gnzOmTYJ3eXQNh4IYHIGi5aIL7sOZ2G/g==", + "dev": true, + "license": "MIT" + }, + "node_modules/@jest/environment-jsdom-abstract/node_modules/@sinonjs/fake-timers": { + "version": "13.0.5", + "resolved": "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-13.0.5.tgz", + "integrity": "sha512-36/hTbH2uaWuGVERyC6da9YwGWnzUZXuPro/F2LfsdOsLnCojz/iSH8MxUt/FD2S5XBSVPhmArFUXcpCQ2Hkiw==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "@sinonjs/commons": "^3.0.1" + } + }, + "node_modules/@jest/environment-jsdom-abstract/node_modules/ansi-styles": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", + "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/@jest/environment-jsdom-abstract/node_modules/ci-info": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-4.3.0.tgz", + "integrity": "sha512-l+2bNRMiQgcfILUi33labAZYIWlH1kWDp+ecNo5iisRKrbm0xcRyCww71/YU0Fkw0mAFpz9bJayXPjey6vkmaQ==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/sibiraj-s" + } + ], + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/@jest/environment-jsdom-abstract/node_modules/jest-message-util": { + "version": "30.1.0", + "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-30.1.0.tgz", + "integrity": "sha512-HizKDGG98cYkWmaLUHChq4iN+oCENohQLb7Z5guBPumYs+/etonmNFlg1Ps6yN9LTPyZn+M+b/9BbnHx3WTMDg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.27.1", + "@jest/types": "30.0.5", + "@types/stack-utils": "^2.0.3", + "chalk": "^4.1.2", + "graceful-fs": "^4.2.11", + "micromatch": "^4.0.8", + "pretty-format": "30.0.5", + "slash": "^3.0.0", + "stack-utils": "^2.0.6" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "node_modules/@jest/environment-jsdom-abstract/node_modules/jest-mock": { + "version": "30.0.5", + "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-30.0.5.tgz", + "integrity": "sha512-Od7TyasAAQX/6S+QCbN6vZoWOMwlTtzzGuxJku1GhGanAjz9y+QsQkpScDmETvdc9aSXyJ/Op4rhpMYBWW91wQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/types": "30.0.5", + "@types/node": "*", + "jest-util": "30.0.5" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "node_modules/@jest/environment-jsdom-abstract/node_modules/jest-util": { + "version": "30.0.5", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-30.0.5.tgz", + "integrity": "sha512-pvyPWssDZR0FlfMxCBoc0tvM8iUEskaRFALUtGQYzVEAqisAztmy+R8LnU14KT4XA0H/a5HMVTXat1jLne010g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/types": "30.0.5", + "@types/node": "*", + "chalk": "^4.1.2", + "ci-info": "^4.2.0", + "graceful-fs": "^4.2.11", + "picomatch": "^4.0.2" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "node_modules/@jest/environment-jsdom-abstract/node_modules/picomatch": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz", + "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/@jest/environment-jsdom-abstract/node_modules/pretty-format": { + "version": "30.0.5", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-30.0.5.tgz", + "integrity": "sha512-D1tKtYvByrBkFLe2wHJl2bwMJIiT8rW+XA+TiataH79/FszLQMrpGEvzUVkzPau7OCO0Qnrhpe87PqtOAIB8Yw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/schemas": "30.0.5", + "ansi-styles": "^5.2.0", + "react-is": "^18.3.1" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "node_modules/@jest/environment-jsdom-abstract/node_modules/react-is": { + "version": "18.3.1", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.3.1.tgz", + "integrity": "sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==", + "dev": true, + "license": "MIT" + }, "node_modules/@jest/expect": { "version": "29.7.0", "resolved": "https://registry.npmjs.org/@jest/expect/-/expect-29.7.0.tgz", @@ -1652,6 +2017,30 @@ "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, + "node_modules/@jest/pattern": { + "version": "30.0.1", + "resolved": "https://registry.npmjs.org/@jest/pattern/-/pattern-30.0.1.tgz", + "integrity": "sha512-gWp7NfQW27LaBQz3TITS8L7ZCQ0TLvtmI//4OwlQRx4rnWxcPNIYjxZpDcN4+UlGxgm3jS5QPz8IPTCkb59wZA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/node": "*", + "jest-regex-util": "30.0.1" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "node_modules/@jest/pattern/node_modules/jest-regex-util": { + "version": "30.0.1", + "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-30.0.1.tgz", + "integrity": "sha512-jHEQgBXAgc+Gh4g0p3bCevgRCVRkB4VB70zhoAE48gxeSr1hfUOsM/C2WoJgVL7Eyg//hudYENbm3Ne+/dRVVA==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, "node_modules/@jest/reporters": { "version": "29.7.0", "resolved": "https://registry.npmjs.org/@jest/reporters/-/reporters-29.7.0.tgz", @@ -3340,16 +3729,6 @@ } } }, - "node_modules/@tootallnate/once": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@tootallnate/once/-/once-2.0.0.tgz", - "integrity": "sha512-XCuKFP5PS55gnMVu3dty8KPatLqUoy/ZYzDzAGCQ8JNFCkLXzmI7vNHCR+XpbZaMWQK/vQubr7PkYq8g470J/A==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 10" - } - }, "node_modules/@tsconfig/node10": { "version": "1.0.11", "resolved": "https://registry.npmjs.org/@tsconfig/node10/-/node10-1.0.11.tgz", @@ -3558,9 +3937,9 @@ "license": "MIT" }, "node_modules/@types/jsdom": { - "version": "20.0.1", - "resolved": "https://registry.npmjs.org/@types/jsdom/-/jsdom-20.0.1.tgz", - "integrity": "sha512-d0r18sZPmMQr1eG35u12FZfhIXNrnsPU/g5wvRKCUf/tOGilKKwYMYGqh33BNR6ba+2gkHw1EUiHoN3mn7E5IQ==", + "version": "21.1.7", + "resolved": "https://registry.npmjs.org/@types/jsdom/-/jsdom-21.1.7.tgz", + "integrity": "sha512-yOriVnggzrnQ3a9OKOCxaVuSug3w3/SbOj5i7VwXWZEyUNl3bLF9V3MfxGbZKuwqJOQyRfqXyROBB1CoZLFWzA==", "dev": true, "license": "MIT", "dependencies": { @@ -4208,14 +4587,6 @@ "win32" ] }, - "node_modules/abab": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/abab/-/abab-2.0.6.tgz", - "integrity": "sha512-j2afSsaIENvHZN2B8GOpF566vZ5WVk5opAiMTvWgaQT8DkbOqsTfvNAvHoRGU2zzP8cPoqys+xHTRDWW8L+/BA==", - "deprecated": "Use your platform's native atob() and btoa() methods instead", - "dev": true, - "license": "BSD-3-Clause" - }, "node_modules/abort-controller": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/abort-controller/-/abort-controller-3.0.0.tgz", @@ -4255,17 +4626,6 @@ "node": ">=0.4.0" } }, - "node_modules/acorn-globals": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/acorn-globals/-/acorn-globals-7.0.1.tgz", - "integrity": "sha512-umOSDSDrfHbTNPuNpC2NSnnA3LUrqpevPb4T9jRx4MagXNS0rs+gwiTcAvqCRmsD6utzsrzNt+ebm00SNWiC3Q==", - "dev": true, - "license": "MIT", - "dependencies": { - "acorn": "^8.1.0", - "acorn-walk": "^8.0.2" - } - }, "node_modules/acorn-jsx": { "version": "5.3.2", "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", @@ -4290,16 +4650,13 @@ } }, "node_modules/agent-base": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", - "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", + "version": "7.1.4", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.4.tgz", + "integrity": "sha512-MnA+YT8fwfJPgBx3m60MNqakm30XOkyIoH1y6huTQvC0PwZG7ki8NacLBcrPbNoo8vEZy7Jpuk7+jMO+CUovTQ==", "dev": true, "license": "MIT", - "dependencies": { - "debug": "4" - }, "engines": { - "node": ">= 6.0.0" + "node": ">= 14" } }, "node_modules/agentkeepalive": { @@ -5335,33 +5692,20 @@ "dev": true, "license": "MIT" }, - "node_modules/cssom": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.5.0.tgz", - "integrity": "sha512-iKuQcq+NdHqlAcwUY0o/HL69XQrUaQdMjmStJ8JFmUaiiQErlhrmuigkg/CU4E2J0IyUKUrMAgl36TvN67MqTw==", - "dev": true, - "license": "MIT" - }, "node_modules/cssstyle": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/cssstyle/-/cssstyle-2.3.0.tgz", - "integrity": "sha512-AZL67abkUzIuvcHqk7c09cezpGNcxUxU4Ioi/05xHk4DQeTkWmGYftIE6ctU6AEt+Gn4n1lDStOtj7FKycP71A==", + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/cssstyle/-/cssstyle-4.6.0.tgz", + "integrity": "sha512-2z+rWdzbbSZv6/rhtvzvqeZQHrBaqgogqt85sqFNbabZOuFbCVFb8kPeEtZjiKkbrm395irpNKiYeFeLiQnFPg==", "dev": true, "license": "MIT", "dependencies": { - "cssom": "~0.3.6" + "@asamuzakjp/css-color": "^3.2.0", + "rrweb-cssom": "^0.8.0" }, "engines": { - "node": ">=8" + "node": ">=18" } }, - "node_modules/cssstyle/node_modules/cssom": { - "version": "0.3.8", - "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.3.8.tgz", - "integrity": "sha512-b0tGHbfegbhPJpxpiBPU2sCkigAqtM9O121le6bbOlgyV+NyGyCmVfJ6QW9eRjz8CpNfWEOYBIMIGRYkLwsIYg==", - "dev": true, - "license": "MIT" - }, "node_modules/csstype": { "version": "3.1.3", "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.3.tgz", @@ -5376,31 +5720,30 @@ "license": "BSD-2-Clause" }, "node_modules/data-urls": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/data-urls/-/data-urls-3.0.2.tgz", - "integrity": "sha512-Jy/tj3ldjZJo63sVAvg6LHt2mHvl4V6AgRAmNDtLdm7faqtsx+aJG42rsyCo9JCoRVKwPFzKlIPx3DIibwSIaQ==", + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/data-urls/-/data-urls-5.0.0.tgz", + "integrity": "sha512-ZYP5VBHshaDAiVZxjbRVcFJpc+4xGgT0bK3vzy1HLN8jTO975HEbuYzZJcHoQEY5K1a0z8YayJkyVETa08eNTg==", "dev": true, "license": "MIT", "dependencies": { - "abab": "^2.0.6", - "whatwg-mimetype": "^3.0.0", - "whatwg-url": "^11.0.0" + "whatwg-mimetype": "^4.0.0", + "whatwg-url": "^14.0.0" }, "engines": { - "node": ">=12" + "node": ">=18" } }, "node_modules/data-urls/node_modules/tr46": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/tr46/-/tr46-3.0.0.tgz", - "integrity": "sha512-l7FvfAHlcmulp8kr+flpQZmVwtu7nfRV7NZujtN0OqES8EL4O4e0qqzL0DC5gAvx/ZC/9lk6rhcUwYvkBnBnYA==", + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-5.1.1.tgz", + "integrity": "sha512-hdF5ZgjTqgAntKkklYw0R03MG2x/bSzTtkxmIRw/sTNV8YXsCJ1tfLAX23lhxhHJlEf3CRCOCGGWw3vI3GaSPw==", "dev": true, "license": "MIT", "dependencies": { - "punycode": "^2.1.1" + "punycode": "^2.3.1" }, "engines": { - "node": ">=12" + "node": ">=18" } }, "node_modules/data-urls/node_modules/webidl-conversions": { @@ -5414,17 +5757,17 @@ } }, "node_modules/data-urls/node_modules/whatwg-url": { - "version": "11.0.0", - "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-11.0.0.tgz", - "integrity": "sha512-RKT8HExMpoYx4igMiVMY83lN6UeITKJlBQ+vR/8ZJ8OCdSiN3RwCq+9gH0+Xzj0+5IrM6i4j/6LuvzbZIQgEcQ==", + "version": "14.2.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-14.2.0.tgz", + "integrity": "sha512-De72GdQZzNTUBBChsXueQUnPKDkg/5A5zp7pFDuQAj5UFoENpiACU0wlCvzpAGnTkj++ihpKwKyYewn/XNUbKw==", "dev": true, "license": "MIT", "dependencies": { - "tr46": "^3.0.0", + "tr46": "^5.1.0", "webidl-conversions": "^7.0.0" }, "engines": { - "node": ">=12" + "node": ">=18" } }, "node_modules/data-view-buffer": { @@ -5499,9 +5842,9 @@ } }, "node_modules/decimal.js": { - "version": "10.5.0", - "resolved": "https://registry.npmjs.org/decimal.js/-/decimal.js-10.5.0.tgz", - "integrity": "sha512-8vDa8Qxvr/+d94hSh5P3IJwI5t8/c0KsMp+g8bNw9cY2icONa5aPfvKeieW1WlG0WQYwwhJ7mjui2xtiePQSXw==", + "version": "10.6.0", + "resolved": "https://registry.npmjs.org/decimal.js/-/decimal.js-10.6.0.tgz", + "integrity": "sha512-YpgQiITW3JXGntzdUmyUR1V812Hn8T1YVXhCu+wO3OpS4eU9l4YdD3qjyiKdV6mvV29zapkMeD390UVEf2lkUg==", "dev": true, "license": "MIT" }, @@ -5693,30 +6036,6 @@ "dev": true, "license": "MIT" }, - "node_modules/domexception": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/domexception/-/domexception-4.0.0.tgz", - "integrity": "sha512-A2is4PLG+eeSfoTMA95/s4pvAoSo2mKtiM5jlHkAVewmiO8ISFTFKZjH7UAM1Atli/OT/7JHOrJRJiMKUZKYBw==", - "deprecated": "Use your platform's native DOMException instead", - "dev": true, - "license": "MIT", - "dependencies": { - "webidl-conversions": "^7.0.0" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/domexception/node_modules/webidl-conversions": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-7.0.0.tgz", - "integrity": "sha512-VwddBukDzu71offAQR975unBIGqfKZpM+8ZX6ySk8nYhVoo5CYaZyzt3YBvYtRtO+aoGlqxPg/B87NGVZ/fu6g==", - "dev": true, - "license": "BSD-2-Clause", - "engines": { - "node": ">=12" - } - }, "node_modules/dunder-proto": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz", @@ -5796,9 +6115,9 @@ } }, "node_modules/entities": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/entities/-/entities-6.0.0.tgz", - "integrity": "sha512-aKstq2TDOndCn4diEyp9Uq/Flu2i1GlLkc6XIDQSDMuaFE3OPW5OphLCyQ5SpSJZTb4reN+kTcYru5yIfXoRPw==", + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/entities/-/entities-6.0.1.tgz", + "integrity": "sha512-aN97NXWF6AWBTahfVOIrB/NShkzi5H7F9r1s9mD3cDj4Ko5f2qhhVoYMibXF7GlLveb/D2ioWay8lxI97Ven3g==", "dev": true, "license": "BSD-2-Clause", "engines": { @@ -6025,28 +6344,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/escodegen": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-2.1.0.tgz", - "integrity": "sha512-2NlIDTwUWJN0mRPQOdtQBzbUHvdGY2P1VXSyU83Q3xKxM7WHX2Ql8dKq782Q9TgQUNOLEzEYu9bzLNj1q88I5w==", - "dev": true, - "license": "BSD-2-Clause", - "dependencies": { - "esprima": "^4.0.1", - "estraverse": "^5.2.0", - "esutils": "^2.0.2" - }, - "bin": { - "escodegen": "bin/escodegen.js", - "esgenerate": "bin/esgenerate.js" - }, - "engines": { - "node": ">=6.0" - }, - "optionalDependencies": { - "source-map": "~0.6.1" - } - }, "node_modules/eslint": { "version": "9.26.0", "resolved": "https://registry.npmjs.org/eslint/-/eslint-9.26.0.tgz", @@ -7410,16 +7707,16 @@ } }, "node_modules/html-encoding-sniffer": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/html-encoding-sniffer/-/html-encoding-sniffer-3.0.0.tgz", - "integrity": "sha512-oWv4T4yJ52iKrufjnyZPkrN0CH3QnrUqdB6In1g5Fe1mia8GmF36gnfNySxoZtxD5+NmYw1EElVXiBk93UeskA==", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/html-encoding-sniffer/-/html-encoding-sniffer-4.0.0.tgz", + "integrity": "sha512-Y22oTqIU4uuPgEemfz7NDJz6OeKf12Lsu+QC+s3BVpda64lTiMYCyGwg5ki4vFxkMwQdeZDl2adZoqUgdFuTgQ==", "dev": true, "license": "MIT", "dependencies": { - "whatwg-encoding": "^2.0.0" + "whatwg-encoding": "^3.1.1" }, "engines": { - "node": ">=12" + "node": ">=18" } }, "node_modules/html-escaper": { @@ -7467,32 +7764,31 @@ } }, "node_modules/http-proxy-agent": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-5.0.0.tgz", - "integrity": "sha512-n2hY8YdoRE1i7r6M0w9DIw5GgZN0G25P8zLCRQ8rjXtTU3vsNFBI/vWK/UIeE6g5MUUz6avwAPXmL6Fy9D/90w==", + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-7.0.2.tgz", + "integrity": "sha512-T1gkAiYYDWYx3V5Bmyu7HcfcvL7mUrTWiM6yOfa3PIphViJ/gFPbvidQ+veqSOHci/PxBcDabeUNCzpOODJZig==", "dev": true, "license": "MIT", "dependencies": { - "@tootallnate/once": "2", - "agent-base": "6", - "debug": "4" + "agent-base": "^7.1.0", + "debug": "^4.3.4" }, "engines": { - "node": ">= 6" + "node": ">= 14" } }, "node_modules/https-proxy-agent": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz", - "integrity": "sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==", + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-7.0.6.tgz", + "integrity": "sha512-vK9P5/iUfdl95AI+JVyUuIcVtd4ofvtrOr3HNtM2yxC9bnMbEdp3x01OhQNnjb8IJYi38VlTE3mBXwcfvywuSw==", "dev": true, "license": "MIT", "dependencies": { - "agent-base": "6", + "agent-base": "^7.1.2", "debug": "4" }, "engines": { - "node": ">= 6" + "node": ">= 14" } }, "node_modules/human-signals": { @@ -8586,26 +8882,23 @@ "license": "MIT" }, "node_modules/jest-environment-jsdom": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-environment-jsdom/-/jest-environment-jsdom-29.7.0.tgz", - "integrity": "sha512-k9iQbsf9OyOfdzWH8HDmrRT0gSIcX+FLNW7IQq94tFX0gynPwqDTW0Ho6iMVNjGz/nb+l/vW3dWM2bbLLpkbXA==", + "version": "30.1.2", + "resolved": "https://registry.npmjs.org/jest-environment-jsdom/-/jest-environment-jsdom-30.1.2.tgz", + "integrity": "sha512-LXsfAh5+mDTuXDONGl1ZLYxtJEaS06GOoxJb2arcJTjIfh1adYg8zLD8f6P0df8VmjvCaMrLmc1PgHUI/YUTbg==", "dev": true, "license": "MIT", "dependencies": { - "@jest/environment": "^29.7.0", - "@jest/fake-timers": "^29.7.0", - "@jest/types": "^29.6.3", - "@types/jsdom": "^20.0.0", + "@jest/environment": "30.1.2", + "@jest/environment-jsdom-abstract": "30.1.2", + "@types/jsdom": "^21.1.7", "@types/node": "*", - "jest-mock": "^29.7.0", - "jest-util": "^29.7.0", - "jsdom": "^20.0.0" + "jsdom": "^26.1.0" }, "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" }, "peerDependencies": { - "canvas": "^2.5.0" + "canvas": "^3.0.0" }, "peerDependenciesMeta": { "canvas": { @@ -8613,6 +8906,207 @@ } } }, + "node_modules/jest-environment-jsdom/node_modules/@jest/environment": { + "version": "30.1.2", + "resolved": "https://registry.npmjs.org/@jest/environment/-/environment-30.1.2.tgz", + "integrity": "sha512-N8t1Ytw4/mr9uN28OnVf0SYE2dGhaIxOVYcwsf9IInBKjvofAjbFRvedvBBlyTYk2knbJTiEjEJ2PyyDIBnd9w==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/fake-timers": "30.1.2", + "@jest/types": "30.0.5", + "@types/node": "*", + "jest-mock": "30.0.5" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "node_modules/jest-environment-jsdom/node_modules/@jest/fake-timers": { + "version": "30.1.2", + "resolved": "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-30.1.2.tgz", + "integrity": "sha512-Beljfv9AYkr9K+ETX9tvV61rJTY706BhBUtiaepQHeEGfe0DbpvUA5Z3fomwc5Xkhns6NWrcFDZn+72fLieUnA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/types": "30.0.5", + "@sinonjs/fake-timers": "^13.0.0", + "@types/node": "*", + "jest-message-util": "30.1.0", + "jest-mock": "30.0.5", + "jest-util": "30.0.5" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "node_modules/jest-environment-jsdom/node_modules/@jest/schemas": { + "version": "30.0.5", + "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-30.0.5.tgz", + "integrity": "sha512-DmdYgtezMkh3cpU8/1uyXakv3tJRcmcXxBOcO0tbaozPwpmh4YMsnWrQm9ZmZMfa5ocbxzbFk6O4bDPEc/iAnA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@sinclair/typebox": "^0.34.0" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "node_modules/jest-environment-jsdom/node_modules/@jest/types": { + "version": "30.0.5", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-30.0.5.tgz", + "integrity": "sha512-aREYa3aku9SSnea4aX6bhKn4bgv3AXkgijoQgbYV3yvbiGt6z+MQ85+6mIhx9DsKW2BuB/cLR/A+tcMThx+KLQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/pattern": "30.0.1", + "@jest/schemas": "30.0.5", + "@types/istanbul-lib-coverage": "^2.0.6", + "@types/istanbul-reports": "^3.0.4", + "@types/node": "*", + "@types/yargs": "^17.0.33", + "chalk": "^4.1.2" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "node_modules/jest-environment-jsdom/node_modules/@sinclair/typebox": { + "version": "0.34.41", + "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.34.41.tgz", + "integrity": "sha512-6gS8pZzSXdyRHTIqoqSVknxolr1kzfy4/CeDnrzsVz8TTIWUbOBr6gnzOmTYJ3eXQNh4IYHIGi5aIL7sOZ2G/g==", + "dev": true, + "license": "MIT" + }, + "node_modules/jest-environment-jsdom/node_modules/@sinonjs/fake-timers": { + "version": "13.0.5", + "resolved": "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-13.0.5.tgz", + "integrity": "sha512-36/hTbH2uaWuGVERyC6da9YwGWnzUZXuPro/F2LfsdOsLnCojz/iSH8MxUt/FD2S5XBSVPhmArFUXcpCQ2Hkiw==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "@sinonjs/commons": "^3.0.1" + } + }, + "node_modules/jest-environment-jsdom/node_modules/ansi-styles": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", + "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/jest-environment-jsdom/node_modules/ci-info": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-4.3.0.tgz", + "integrity": "sha512-l+2bNRMiQgcfILUi33labAZYIWlH1kWDp+ecNo5iisRKrbm0xcRyCww71/YU0Fkw0mAFpz9bJayXPjey6vkmaQ==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/sibiraj-s" + } + ], + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-environment-jsdom/node_modules/jest-message-util": { + "version": "30.1.0", + "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-30.1.0.tgz", + "integrity": "sha512-HizKDGG98cYkWmaLUHChq4iN+oCENohQLb7Z5guBPumYs+/etonmNFlg1Ps6yN9LTPyZn+M+b/9BbnHx3WTMDg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.27.1", + "@jest/types": "30.0.5", + "@types/stack-utils": "^2.0.3", + "chalk": "^4.1.2", + "graceful-fs": "^4.2.11", + "micromatch": "^4.0.8", + "pretty-format": "30.0.5", + "slash": "^3.0.0", + "stack-utils": "^2.0.6" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "node_modules/jest-environment-jsdom/node_modules/jest-mock": { + "version": "30.0.5", + "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-30.0.5.tgz", + "integrity": "sha512-Od7TyasAAQX/6S+QCbN6vZoWOMwlTtzzGuxJku1GhGanAjz9y+QsQkpScDmETvdc9aSXyJ/Op4rhpMYBWW91wQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/types": "30.0.5", + "@types/node": "*", + "jest-util": "30.0.5" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "node_modules/jest-environment-jsdom/node_modules/jest-util": { + "version": "30.0.5", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-30.0.5.tgz", + "integrity": "sha512-pvyPWssDZR0FlfMxCBoc0tvM8iUEskaRFALUtGQYzVEAqisAztmy+R8LnU14KT4XA0H/a5HMVTXat1jLne010g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/types": "30.0.5", + "@types/node": "*", + "chalk": "^4.1.2", + "ci-info": "^4.2.0", + "graceful-fs": "^4.2.11", + "picomatch": "^4.0.2" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "node_modules/jest-environment-jsdom/node_modules/picomatch": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz", + "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/jest-environment-jsdom/node_modules/pretty-format": { + "version": "30.0.5", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-30.0.5.tgz", + "integrity": "sha512-D1tKtYvByrBkFLe2wHJl2bwMJIiT8rW+XA+TiataH79/FszLQMrpGEvzUVkzPau7OCO0Qnrhpe87PqtOAIB8Yw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/schemas": "30.0.5", + "ansi-styles": "^5.2.0", + "react-is": "^18.3.1" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "node_modules/jest-environment-jsdom/node_modules/react-is": { + "version": "18.3.1", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.3.1.tgz", + "integrity": "sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==", + "dev": true, + "license": "MIT" + }, "node_modules/jest-environment-node": { "version": "29.7.0", "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-29.7.0.tgz", @@ -9221,44 +9715,38 @@ } }, "node_modules/jsdom": { - "version": "20.0.3", - "resolved": "https://registry.npmjs.org/jsdom/-/jsdom-20.0.3.tgz", - "integrity": "sha512-SYhBvTh89tTfCD/CRdSOm13mOBa42iTaTyfyEWBdKcGdPxPtLFBXuHR8XHb33YNYaP+lLbmSvBTsnoesCNJEsQ==", + "version": "26.1.0", + "resolved": "https://registry.npmjs.org/jsdom/-/jsdom-26.1.0.tgz", + "integrity": "sha512-Cvc9WUhxSMEo4McES3P7oK3QaXldCfNWp7pl2NNeiIFlCoLr3kfq9kb1fxftiwk1FLV7CvpvDfonxtzUDeSOPg==", "dev": true, "license": "MIT", "dependencies": { - "abab": "^2.0.6", - "acorn": "^8.8.1", - "acorn-globals": "^7.0.0", - "cssom": "^0.5.0", - "cssstyle": "^2.3.0", - "data-urls": "^3.0.2", - "decimal.js": "^10.4.2", - "domexception": "^4.0.0", - "escodegen": "^2.0.0", - "form-data": "^4.0.0", - "html-encoding-sniffer": "^3.0.0", - "http-proxy-agent": "^5.0.0", - "https-proxy-agent": "^5.0.1", + "cssstyle": "^4.2.1", + "data-urls": "^5.0.0", + "decimal.js": "^10.5.0", + "html-encoding-sniffer": "^4.0.0", + "http-proxy-agent": "^7.0.2", + "https-proxy-agent": "^7.0.6", "is-potential-custom-element-name": "^1.0.1", - "nwsapi": "^2.2.2", - "parse5": "^7.1.1", + "nwsapi": "^2.2.16", + "parse5": "^7.2.1", + "rrweb-cssom": "^0.8.0", "saxes": "^6.0.0", "symbol-tree": "^3.2.4", - "tough-cookie": "^4.1.2", - "w3c-xmlserializer": "^4.0.0", + "tough-cookie": "^5.1.1", + "w3c-xmlserializer": "^5.0.0", "webidl-conversions": "^7.0.0", - "whatwg-encoding": "^2.0.0", - "whatwg-mimetype": "^3.0.0", - "whatwg-url": "^11.0.0", - "ws": "^8.11.0", - "xml-name-validator": "^4.0.0" + "whatwg-encoding": "^3.1.1", + "whatwg-mimetype": "^4.0.0", + "whatwg-url": "^14.1.1", + "ws": "^8.18.0", + "xml-name-validator": "^5.0.0" }, "engines": { - "node": ">=14" + "node": ">=18" }, "peerDependencies": { - "canvas": "^2.5.0" + "canvas": "^3.0.0" }, "peerDependenciesMeta": { "canvas": { @@ -9267,16 +9755,16 @@ } }, "node_modules/jsdom/node_modules/tr46": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/tr46/-/tr46-3.0.0.tgz", - "integrity": "sha512-l7FvfAHlcmulp8kr+flpQZmVwtu7nfRV7NZujtN0OqES8EL4O4e0qqzL0DC5gAvx/ZC/9lk6rhcUwYvkBnBnYA==", + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-5.1.1.tgz", + "integrity": "sha512-hdF5ZgjTqgAntKkklYw0R03MG2x/bSzTtkxmIRw/sTNV8YXsCJ1tfLAX23lhxhHJlEf3CRCOCGGWw3vI3GaSPw==", "dev": true, "license": "MIT", "dependencies": { - "punycode": "^2.1.1" + "punycode": "^2.3.1" }, "engines": { - "node": ">=12" + "node": ">=18" } }, "node_modules/jsdom/node_modules/webidl-conversions": { @@ -9290,17 +9778,17 @@ } }, "node_modules/jsdom/node_modules/whatwg-url": { - "version": "11.0.0", - "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-11.0.0.tgz", - "integrity": "sha512-RKT8HExMpoYx4igMiVMY83lN6UeITKJlBQ+vR/8ZJ8OCdSiN3RwCq+9gH0+Xzj0+5IrM6i4j/6LuvzbZIQgEcQ==", + "version": "14.2.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-14.2.0.tgz", + "integrity": "sha512-De72GdQZzNTUBBChsXueQUnPKDkg/5A5zp7pFDuQAj5UFoENpiACU0wlCvzpAGnTkj++ihpKwKyYewn/XNUbKw==", "dev": true, "license": "MIT", "dependencies": { - "tr46": "^3.0.0", + "tr46": "^5.1.0", "webidl-conversions": "^7.0.0" }, "engines": { - "node": ">=12" + "node": ">=18" } }, "node_modules/jsesc": { @@ -11133,9 +11621,9 @@ } }, "node_modules/nwsapi": { - "version": "2.2.20", - "resolved": "https://registry.npmjs.org/nwsapi/-/nwsapi-2.2.20.tgz", - "integrity": "sha512-/ieB+mDe4MrrKMT8z+mQL8klXydZWGR5Dowt4RAGKbJ3kIGEx3X4ljUo+6V73IXtUPWgfOlU5B9MlGxFO5T+cA==", + "version": "2.2.22", + "resolved": "https://registry.npmjs.org/nwsapi/-/nwsapi-2.2.22.tgz", + "integrity": "sha512-ujSMe1OWVn55euT1ihwCI1ZcAaAU3nxUiDwfDQldc51ZXaB9m2AyOn6/jh1BLe2t/G8xd6uKG1UBF2aZJeg2SQ==", "dev": true, "license": "MIT" }, @@ -11873,19 +12361,6 @@ "node": ">= 0.10" } }, - "node_modules/psl": { - "version": "1.15.0", - "resolved": "https://registry.npmjs.org/psl/-/psl-1.15.0.tgz", - "integrity": "sha512-JZd3gMVBAVQkSs6HdNZo9Sdo0LNcQeMNP3CozBJb3JYC/QUYZTnKxP+f8oWRX4rHP5EurWxqAHTSwUCjlNKa1w==", - "dev": true, - "license": "MIT", - "dependencies": { - "punycode": "^2.3.1" - }, - "funding": { - "url": "https://github.com/sponsors/lupomontero" - } - }, "node_modules/punycode": { "version": "2.3.1", "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", @@ -11929,13 +12404,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/querystringify": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/querystringify/-/querystringify-2.2.0.tgz", - "integrity": "sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ==", - "dev": true, - "license": "MIT" - }, "node_modules/queue-microtask": { "version": "1.2.3", "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", @@ -12287,13 +12755,6 @@ "node": ">=0.10.0" } }, - "node_modules/requires-port": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz", - "integrity": "sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==", - "dev": true, - "license": "MIT" - }, "node_modules/resolve": { "version": "1.22.10", "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.10.tgz", @@ -12396,6 +12857,13 @@ "node": ">= 18" } }, + "node_modules/rrweb-cssom": { + "version": "0.8.0", + "resolved": "https://registry.npmjs.org/rrweb-cssom/-/rrweb-cssom-0.8.0.tgz", + "integrity": "sha512-guoltQEx+9aMf2gDZ0s62EcV8lsXR+0w8915TC3ITdn2YueuNjdAYh/levpU9nFaoChh9RUS5ZdQMrKfVEN9tw==", + "dev": true, + "license": "MIT" + }, "node_modules/run-parallel": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", @@ -13336,6 +13804,26 @@ "url": "https://github.com/sponsors/jonschlinkert" } }, + "node_modules/tldts": { + "version": "6.1.86", + "resolved": "https://registry.npmjs.org/tldts/-/tldts-6.1.86.tgz", + "integrity": "sha512-WMi/OQ2axVTf/ykqCQgXiIct+mSQDFdH2fkwhPwgEwvJ1kSzZRiinb0zF2Xb8u4+OqPChmyI6MEu4EezNJz+FQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "tldts-core": "^6.1.86" + }, + "bin": { + "tldts": "bin/cli.js" + } + }, + "node_modules/tldts-core": { + "version": "6.1.86", + "resolved": "https://registry.npmjs.org/tldts-core/-/tldts-core-6.1.86.tgz", + "integrity": "sha512-Je6p7pkk+KMzMv2XXKmAE3McmolOQFdxkKw0R8EYNr7sELW46JqnNeTX8ybPiQgvg1ymCoF8LXs5fzFaZvJPTA==", + "dev": true, + "license": "MIT" + }, "node_modules/tmpl": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/tmpl/-/tmpl-1.0.5.tgz", @@ -13367,19 +13855,16 @@ } }, "node_modules/tough-cookie": { - "version": "4.1.4", - "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-4.1.4.tgz", - "integrity": "sha512-Loo5UUvLD9ScZ6jh8beX1T6sO1w2/MpCRpEP7V280GKMVUQ0Jzar2U3UJPsrdbziLEMMhu3Ujnq//rhiFuIeag==", + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-5.1.2.tgz", + "integrity": "sha512-FVDYdxtnj0G6Qm/DhNPSb8Ju59ULcup3tuJxkFb5K8Bv2pUXILbf0xZWU8PX8Ov19OXljbUyveOFwRMwkXzO+A==", "dev": true, "license": "BSD-3-Clause", "dependencies": { - "psl": "^1.1.33", - "punycode": "^2.1.1", - "universalify": "^0.2.0", - "url-parse": "^1.5.3" + "tldts": "^6.1.32" }, "engines": { - "node": ">=6" + "node": ">=16" } }, "node_modules/tr46": { @@ -13749,16 +14234,6 @@ "url": "https://opencollective.com/unified" } }, - "node_modules/universalify": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.2.0.tgz", - "integrity": "sha512-CJ1QgKmNg3CwvAv/kOFmtnEN05f0D/cn9QntgNOQlQF9dgvVTHj3t+8JPdjqawCHk7V/KA+fbUqzZ9XWhcqPUg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 4.0.0" - } - }, "node_modules/unpipe": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", @@ -13843,17 +14318,6 @@ "punycode": "^2.1.0" } }, - "node_modules/url-parse": { - "version": "1.5.10", - "resolved": "https://registry.npmjs.org/url-parse/-/url-parse-1.5.10.tgz", - "integrity": "sha512-WypcfiRhfeUP9vvF0j6rw0J3hrWrw6iZv3+22h6iRMJ/8z1Tj6XfLP4DsUix5MhMPnXpiHDoKyoZ/bdCkwBCiQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "querystringify": "^2.1.1", - "requires-port": "^1.0.0" - } - }, "node_modules/use-callback-ref": { "version": "1.3.3", "resolved": "https://registry.npmjs.org/use-callback-ref/-/use-callback-ref-1.3.3.tgz", @@ -13967,16 +14431,16 @@ } }, "node_modules/w3c-xmlserializer": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/w3c-xmlserializer/-/w3c-xmlserializer-4.0.0.tgz", - "integrity": "sha512-d+BFHzbiCx6zGfz0HyQ6Rg69w9k19nviJspaj4yNscGjrHu94sVP+aRm75yEbCh+r2/yR+7q6hux9LVtbuTGBw==", + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/w3c-xmlserializer/-/w3c-xmlserializer-5.0.0.tgz", + "integrity": "sha512-o8qghlI8NZHU1lLPrpi2+Uq7abh4GGPpYANlalzWxyWteJOCsr/P+oPBA49TOLu5FTZO4d3F9MnWJfiMo4BkmA==", "dev": true, "license": "MIT", "dependencies": { - "xml-name-validator": "^4.0.0" + "xml-name-validator": "^5.0.0" }, "engines": { - "node": ">=14" + "node": ">=18" } }, "node_modules/walker": { @@ -14005,26 +14469,26 @@ "license": "BSD-2-Clause" }, "node_modules/whatwg-encoding": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/whatwg-encoding/-/whatwg-encoding-2.0.0.tgz", - "integrity": "sha512-p41ogyeMUrw3jWclHWTQg1k05DSVXPLcVxRTYsXUk+ZooOCZLcoYgPZ/HL/D/N+uQPOtcp1me1WhBEaX02mhWg==", + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/whatwg-encoding/-/whatwg-encoding-3.1.1.tgz", + "integrity": "sha512-6qN4hJdMwfYBtE3YBTTHhoeuUrDBPZmbQaxWAqSALV/MeEnR5z1xd8UKud2RAkFoPkmB+hli1TZSnyi84xz1vQ==", "dev": true, "license": "MIT", "dependencies": { "iconv-lite": "0.6.3" }, "engines": { - "node": ">=12" + "node": ">=18" } }, "node_modules/whatwg-mimetype": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/whatwg-mimetype/-/whatwg-mimetype-3.0.0.tgz", - "integrity": "sha512-nt+N2dzIutVRxARx1nghPKGv1xHikU7HKdfafKkLNLindmPU/ch3U31NOCGGA/dmPcmb1VlofO0vnKAcsm0o/Q==", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/whatwg-mimetype/-/whatwg-mimetype-4.0.0.tgz", + "integrity": "sha512-QaKxh0eNIi2mE9p2vEdzfagOKHCcj1pJ56EEHGQOVxp8r9/iszLUUV7v89x9O1p/T+NlTM5W7jW6+cz4Fq1YVg==", "dev": true, "license": "MIT", "engines": { - "node": ">=12" + "node": ">=18" } }, "node_modules/whatwg-url": { @@ -14192,9 +14656,9 @@ } }, "node_modules/ws": { - "version": "8.18.2", - "resolved": "https://registry.npmjs.org/ws/-/ws-8.18.2.tgz", - "integrity": "sha512-DMricUmwGZUVr++AEAe2uiVM7UoO9MAVZMDu05UQOaUII0lp+zOzLLU4Xqh/JvTqklB1T4uELaaPBKyjE1r4fQ==", + "version": "8.18.3", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.18.3.tgz", + "integrity": "sha512-PEIGCY5tSlUt50cqyMXfCzX+oOPqN0vuGqWzbcJ2xvnkzkq46oOpz7dQaTDBdfICb4N14+GARUDw2XV2N4tvzg==", "dev": true, "license": "MIT", "engines": { @@ -14214,13 +14678,13 @@ } }, "node_modules/xml-name-validator": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/xml-name-validator/-/xml-name-validator-4.0.0.tgz", - "integrity": "sha512-ICP2e+jsHvAj2E2lIHxa5tjXRlKDJo4IdvPvCXbXQGdzSfmSpNVyIKMvoZHjDY9DP0zV17iI85o90vRFXNccRw==", + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/xml-name-validator/-/xml-name-validator-5.0.0.tgz", + "integrity": "sha512-EvGK8EJ3DhaHfbRlETOWAS5pO9MZITeauHKJyb8wyajUfQUenkIg2MvLDTZ4T/TgIcm3HU0TFBgWWboAZ30UHg==", "dev": true, "license": "Apache-2.0", "engines": { - "node": ">=12" + "node": ">=18" } }, "node_modules/xmlchars": { diff --git a/llama_stack/ui/package.json b/llama_stack/ui/package.json index ac68dbc07..2ba81ea84 100644 --- a/llama_stack/ui/package.json +++ b/llama_stack/ui/package.json @@ -52,7 +52,7 @@ "eslint-config-prettier": "^10.1.8", "eslint-plugin-prettier": "^5.5.4", "jest": "^29.7.0", - "jest-environment-jsdom": "^29.7.0", + "jest-environment-jsdom": "^30.1.2", "prettier": "3.6.2", "tailwindcss": "^4", "ts-node": "^10.9.2", From e3fd70c321270d1a191eb79f3550a5df201538f2 Mon Sep 17 00:00:00 2001 From: Kai Wu Date: Mon, 22 Sep 2025 09:55:32 -0700 Subject: [PATCH 125/150] fix: change ModelRegistryHelper to use ProviderModelEntry instead of hardcoded ModelType.llm (#3451) # What does this PR do? change ModelRegistryHelper to use ProviderModelEntry instead of hardcoded ModelType.llm which fixed issue #3330. ## Test Plan 1. open llama-stack server ``` uv sync --python 3.12 source .venv/bin/activate uv run llama stack build --distro starter --image-type venv --run ``` 2.Used following script to test ``` from llama_stack_client import LlamaStackClient import os def test_openai_embedding_type(): client = LlamaStackClient( base_url=os.environ.get("LLAMA_STACK_ENDPOINT", "http://localhost:8321"), provider_data={ "openai_api_key": os.environ.get("OPENAI_API_KEY", ""), }, ) model = client.models.retrieve("openai/text-embedding-3-small") print(model) assert model.identifier == "openai/text-embedding-3-small" assert model.model_type == "embedding" test_openai_embedding_type() ``` logs: ``` python test_openai.py INFO:httpx:HTTP Request: GET http://localhost:8321/v1/models/openai/text-embedding-3-small "HTTP/1.1 200 OK" Model(identifier='openai/text-embedding-3-small', metadata={'embedding_dimension': 1536.0, 'context_length': 8192.0}, api_model_type='embedding', provider_id='openai', type='model', provider_resource_id='text-embedding-3-small', owner=None, source='listed_from_provider', model_type='embedding') ``` --- llama_stack/providers/utils/inference/model_registry.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/llama_stack/providers/utils/inference/model_registry.py b/llama_stack/providers/utils/inference/model_registry.py index 44add8f9e..b6b06c0b6 100644 --- a/llama_stack/providers/utils/inference/model_registry.py +++ b/llama_stack/providers/utils/inference/model_registry.py @@ -103,7 +103,7 @@ class ModelRegistryHelper(ModelsProtocolPrivate): Model( identifier=id, provider_resource_id=entry.provider_model_id, - model_type=ModelType.llm, + model_type=entry.model_type, metadata=entry.metadata, provider_id=self.__provider_id__, ) From 8d8261961e7e0615a207010bf52a7980b7abb3e3 Mon Sep 17 00:00:00 2001 From: slekkala1 Date: Mon, 22 Sep 2025 10:19:36 -0700 Subject: [PATCH 126/150] chore: Refactor fireworks to use OpenAIMixin (#3480) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit # What does this PR do? Refactor Fireworks to use OpenAIMixin Closes https://github.com/llamastack/llama-stack/issues/3391 Related to https://github.com/llamastack/llama-stack/issues/3387 ## Test Plan ``` (llama-stack) (base) swapna942@swapna942-mac llama-stack % FIREWORKS_API_KEY=**** ./scripts/integration-tests.sh --stack-config server:ci-tests --setup fireworks --subdirs inference --pattern openai tests/integration/inference/test_openai_embeddings.py::test_openai_embeddings_single_string[openai_client-emb=nomic-ai/nomic-embed-text-v1.5] instantiating llama_stack_client Port 8321 is already in use, assuming server is already running... llama_stack_client instantiated in 0.031s PASSED [ 2%] tests/integration/inference/test_openai_embeddings.py::test_openai_embeddings_multiple_strings[openai_client-emb=nomic-ai/nomic-embed-text-v1.5] PASSED [ 4%] tests/integration/inference/test_openai_embeddings.py::test_openai_embeddings_with_encoding_format_float[openai_client-emb=nomic-ai/nomic-embed-text-v1.5] PASSED [ 6%] tests/integration/inference/test_openai_embeddings.py::test_openai_embeddings_with_dimensions[openai_client-emb=nomic-ai/nomic-embed-text-v1.5] PASSED [ 8%] tests/integration/inference/test_openai_embeddings.py::test_openai_embeddings_with_user_parameter[openai_client-emb=nomic-ai/nomic-embed-text-v1.5] SKIPPED [ 10%] tests/integration/inference/test_openai_embeddings.py::test_openai_embeddings_empty_list_error[openai_client-emb=nomic-ai/nomic-embed-text-v1.5] PASSED [ 12%] tests/integration/inference/test_openai_embeddings.py::test_openai_embeddings_invalid_model_error[openai_client-emb=nomic-ai/nomic-embed-text-v1.5] PASSED [ 14%] tests/integration/inference/test_openai_embeddings.py::test_openai_embeddings_different_inputs_different_outputs[openai_client-emb=nomic-ai/nomic-embed-text-v1.5] PASSED [ 17%] tests/integration/inference/test_openai_embeddings.py::test_openai_embeddings_with_encoding_format_base64[openai_client-emb=nomic-ai/nomic-embed-text-v1.5] SKIPPED [ 19%] tests/integration/inference/test_openai_embeddings.py::test_openai_embeddings_base64_batch_processing[openai_client-emb=nomic-ai/nomic-embed-text-v1.5] SKIPPED [ 21%] tests/integration/inference/test_openai_completion.py::test_openai_completion_non_streaming[txt=accounts/fireworks/models/llama-v3p1-8b-instruct-inference:completion:sanity] PASSED [ 23%] tests/integration/inference/test_openai_completion.py::test_openai_completion_non_streaming_suffix[txt=accounts/fireworks/models/llama-v3p1-8b-instruct-inference:completion:suffix] SKIPPED [ 25%] tests/integration/inference/test_openai_completion.py::test_openai_completion_streaming[txt=accounts/fireworks/models/llama-v3p1-8b-instruct-inference:completion:sanity] PASSED [ 27%] tests/integration/inference/test_openai_completion.py::test_openai_completion_prompt_logprobs[txt=accounts/fireworks/models/llama-v3p1-8b-instruct-1] SKIPPED [ 29%] tests/integration/inference/test_openai_completion.py::test_openai_completion_guided_choice[txt=accounts/fireworks/models/llama-v3p1-8b-instruct] SKIPPED [ 31%] tests/integration/inference/test_openai_completion.py::test_openai_chat_completion_non_streaming[openai_client-txt=accounts/fireworks/models/llama-v3p1-8b-instruct-inference:chat_completion:non_streaming_01] PASSED [ 34%] tests/integration/inference/test_openai_completion.py::test_openai_chat_completion_streaming[openai_client-txt=accounts/fireworks/models/llama-v3p1-8b-instruct-inference:chat_completion:streaming_01] PASSED [ 36%] tests/integration/inference/test_openai_completion.py::test_openai_chat_completion_streaming_with_n[openai_client-txt=accounts/fireworks/models/llama-v3p1-8b-instruct-inference:chat_completion:streaming_01] PASSED [ 38%] tests/integration/inference/test_openai_completion.py::test_inference_store[openai_client-txt=accounts/fireworks/models/llama-v3p1-8b-instruct-True] PASSED [ 40%] tests/integration/inference/test_openai_completion.py::test_inference_store_tool_calls[openai_client-txt=accounts/fireworks/models/llama-v3p1-8b-instruct-True] PASSED [ 42%] tests/integration/inference/test_openai_completion.py::test_openai_chat_completion_non_streaming_with_file[txt=accounts/fireworks/models/llama-v3p1-8b-instruct] SKIPPED [ 44%] tests/integration/inference/test_openai_embeddings.py::test_openai_embeddings_single_string[llama_stack_client-emb=nomic-ai/nomic-embed-text-v1.5] PASSED [ 46%] tests/integration/inference/test_openai_embeddings.py::test_openai_embeddings_multiple_strings[llama_stack_client-emb=nomic-ai/nomic-embed-text-v1.5] PASSED [ 48%] tests/integration/inference/test_openai_embeddings.py::test_openai_embeddings_with_encoding_format_float[llama_stack_client-emb=nomic-ai/nomic-embed-text-v1.5] PASSED [ 51%] tests/integration/inference/test_openai_embeddings.py::test_openai_embeddings_with_dimensions[llama_stack_client-emb=nomic-ai/nomic-embed-text-v1.5] PASSED [ 53%] tests/integration/inference/test_openai_embeddings.py::test_openai_embeddings_with_user_parameter[llama_stack_client-emb=nomic-ai/nomic-embed-text-v1.5] SKIPPED [ 55%] tests/integration/inference/test_openai_embeddings.py::test_openai_embeddings_empty_list_error[llama_stack_client-emb=nomic-ai/nomic-embed-text-v1.5] PASSED [ 57%] tests/integration/inference/test_openai_embeddings.py::test_openai_embeddings_invalid_model_error[llama_stack_client-emb=nomic-ai/nomic-embed-text-v1.5] PASSED [ 59%] tests/integration/inference/test_openai_embeddings.py::test_openai_embeddings_different_inputs_different_outputs[llama_stack_client-emb=nomic-ai/nomic-embed-text-v1.5] PASSED [ 61%] tests/integration/inference/test_openai_embeddings.py::test_openai_embeddings_with_encoding_format_base64[llama_stack_client-emb=nomic-ai/nomic-embed-text-v1.5] SKIPPED [ 63%] tests/integration/inference/test_openai_embeddings.py::test_openai_embeddings_base64_batch_processing[llama_stack_client-emb=nomic-ai/nomic-embed-text-v1.5] SKIPPED [ 65%] tests/integration/inference/test_openai_completion.py::test_openai_completion_prompt_logprobs[txt=accounts/fireworks/models/llama-v3p1-8b-instruct-0] SKIPPED [ 68%] tests/integration/inference/test_openai_completion.py::test_openai_chat_completion_non_streaming[openai_client-txt=accounts/fireworks/models/llama-v3p1-8b-instruct-inference:chat_completion:non_streaming_02] PASSED [ 70%] tests/integration/inference/test_openai_completion.py::test_openai_chat_completion_streaming[openai_client-txt=accounts/fireworks/models/llama-v3p1-8b-instruct-inference:chat_completion:streaming_02] PASSED [ 72%] tests/integration/inference/test_openai_completion.py::test_openai_chat_completion_streaming_with_n[openai_client-txt=accounts/fireworks/models/llama-v3p1-8b-instruct-inference:chat_completion:streaming_02] PASSED [ 74%] tests/integration/inference/test_openai_completion.py::test_inference_store[openai_client-txt=accounts/fireworks/models/llama-v3p1-8b-instruct-False] PASSED [ 76%] tests/integration/inference/test_openai_completion.py::test_inference_store_tool_calls[openai_client-txt=accounts/fireworks/models/llama-v3p1-8b-instruct-False] PASSED [ 78%] tests/integration/inference/test_openai_completion.py::test_openai_chat_completion_non_streaming[client_with_models-txt=accounts/fireworks/models/llama-v3p1-8b-instruct-inference:chat_completion:non_streaming_01] PASSED [ 80%] tests/integration/inference/test_openai_completion.py::test_openai_chat_completion_streaming[client_with_models-txt=accounts/fireworks/models/llama-v3p1-8b-instruct-inference:chat_completion:streaming_01] PASSED [ 82%] tests/integration/inference/test_openai_completion.py::test_openai_chat_completion_streaming_with_n[client_with_models-txt=accounts/fireworks/models/llama-v3p1-8b-instruct-inference:chat_completion:streaming_01] PASSED [ 85%] tests/integration/inference/test_openai_completion.py::test_inference_store[client_with_models-txt=accounts/fireworks/models/llama-v3p1-8b-instruct-True] PASSED [ 87%] tests/integration/inference/test_openai_completion.py::test_inference_store_tool_calls[client_with_models-txt=accounts/fireworks/models/llama-v3p1-8b-instruct-True] PASSED [ 89%] tests/integration/inference/test_openai_completion.py::test_openai_chat_completion_non_streaming[client_with_models-txt=accounts/fireworks/models/llama-v3p1-8b-instruct-inference:chat_completion:non_streaming_02] PASSED [ 91%] tests/integration/inference/test_openai_completion.py::test_openai_chat_completion_streaming[client_with_models-txt=accounts/fireworks/models/llama-v3p1-8b-instruct-inference:chat_completion:streaming_02] PASSED [ 93%] tests/integration/inference/test_openai_completion.py::test_openai_chat_completion_streaming_with_n[client_with_models-txt=accounts/fireworks/models/llama-v3p1-8b-instruct-inference:chat_completion:streaming_02] PASSED [ 95%] tests/integration/inference/test_openai_completion.py::test_inference_store[client_with_models-txt=accounts/fireworks/models/llama-v3p1-8b-instruct-False] PASSED [ 97%] tests/integration/inference/test_openai_completion.py::test_inference_store_tool_calls[client_with_models-txt=accounts/fireworks/models/llama-v3p1-8b-instruct-False] PASSED [100%] ========================================== slowest 10 durations ========================================== 30.01s teardown tests/integration/inference/test_openai_embeddings.py::test_openai_embeddings_multiple_strings[llama_stack_client-emb=nomic-ai/nomic-embed-text-v1.5] 30.01s teardown tests/integration/inference/test_openai_completion.py::test_inference_store_tool_calls[client_with_models-txt=accounts/fireworks/models/llama-v3p1-8b-instruct-False] 30.01s teardown tests/integration/inference/test_openai_embeddings.py::test_openai_embeddings_different_inputs_different_outputs[openai_client-emb=nomic-ai/nomic-embed-text-v1.5] 30.01s teardown tests/integration/inference/test_openai_embeddings.py::test_openai_embeddings_with_user_parameter[openai_client-emb=nomic-ai/nomic-embed-text-v1.5] 30.01s teardown tests/integration/inference/test_openai_completion.py::test_inference_store_tool_calls[openai_client-txt=accounts/fireworks/models/llama-v3p1-8b-instruct-True] 30.01s teardown tests/integration/inference/test_openai_embeddings.py::test_openai_embeddings_different_inputs_different_outputs[llama_stack_client-emb=nomic-ai/nomic-embed-text-v1.5] 30.01s teardown tests/integration/inference/test_openai_completion.py::test_openai_chat_completion_non_streaming[openai_client-txt=accounts/fireworks/models/llama-v3p1-8b-instruct-inference:chat_completion:non_streaming_02] 30.01s teardown tests/integration/inference/test_openai_embeddings.py::test_openai_embeddings_single_string[llama_stack_client-emb=nomic-ai/nomic-embed-text-v1.5] 30.01s teardown tests/integration/inference/test_openai_embeddings.py::test_openai_embeddings_base64_batch_processing[openai_client-emb=nomic-ai/nomic-embed-text-v1.5] 30.01s teardown tests/integration/inference/test_openai_embeddings.py::test_openai_embeddings_invalid_model_error[openai_client-emb=nomic-ai/nomic-embed-text-v1.5] ================= 36 passed, 11 skipped, 50 deselected, 4 warnings in 1429.05s (0:23:49) ================= + exit_code=0 + set +x ✅ All tests completed successfully ``` --- .../remote/inference/fireworks/fireworks.py | 178 ++---------------- .../inference/test_openai_embeddings.py | 3 +- tests/integration/suites.py | 9 + 3 files changed, 22 insertions(+), 168 deletions(-) diff --git a/llama_stack/providers/remote/inference/fireworks/fireworks.py b/llama_stack/providers/remote/inference/fireworks/fireworks.py index e907e8ec6..2fcf1be2e 100644 --- a/llama_stack/providers/remote/inference/fireworks/fireworks.py +++ b/llama_stack/providers/remote/inference/fireworks/fireworks.py @@ -4,11 +4,9 @@ # This source code is licensed under the terms described in the LICENSE file in # the root directory of this source tree. -from collections.abc import AsyncGenerator, AsyncIterator -from typing import Any +from collections.abc import AsyncGenerator from fireworks.client import Fireworks -from openai import AsyncOpenAI from llama_stack.apis.common.content_types import ( InterleavedContent, @@ -24,12 +22,6 @@ from llama_stack.apis.inference import ( Inference, LogProbConfig, Message, - OpenAIChatCompletion, - OpenAIChatCompletionChunk, - OpenAICompletion, - OpenAIEmbeddingsResponse, - OpenAIMessageParam, - OpenAIResponseFormatParam, ResponseFormat, ResponseFormatType, SamplingParams, @@ -45,15 +37,14 @@ from llama_stack.providers.utils.inference.model_registry import ( ModelRegistryHelper, ) from llama_stack.providers.utils.inference.openai_compat import ( - OpenAIChatCompletionToLlamaStackMixin, convert_message_to_openai_dict, get_sampling_options, - prepare_openai_completion_params, process_chat_completion_response, process_chat_completion_stream_response, process_completion_response, process_completion_stream_response, ) +from llama_stack.providers.utils.inference.openai_mixin import OpenAIMixin from llama_stack.providers.utils.inference.prompt_adapter import ( chat_completion_request_to_prompt, completion_request_to_prompt, @@ -68,7 +59,7 @@ from .models import MODEL_ENTRIES logger = get_logger(name=__name__, category="inference::fireworks") -class FireworksInferenceAdapter(ModelRegistryHelper, Inference, NeedsRequestProviderData): +class FireworksInferenceAdapter(OpenAIMixin, ModelRegistryHelper, Inference, NeedsRequestProviderData): def __init__(self, config: FireworksImplConfig) -> None: ModelRegistryHelper.__init__(self, MODEL_ENTRIES, config.allowed_models) self.config = config @@ -79,7 +70,7 @@ class FireworksInferenceAdapter(ModelRegistryHelper, Inference, NeedsRequestProv async def shutdown(self) -> None: pass - def _get_api_key(self) -> str: + def get_api_key(self) -> str: config_api_key = self.config.api_key.get_secret_value() if self.config.api_key else None if config_api_key: return config_api_key @@ -91,15 +82,18 @@ class FireworksInferenceAdapter(ModelRegistryHelper, Inference, NeedsRequestProv ) return provider_data.fireworks_api_key - def _get_base_url(self) -> str: + def get_base_url(self) -> str: return "https://api.fireworks.ai/inference/v1" def _get_client(self) -> Fireworks: - fireworks_api_key = self._get_api_key() + fireworks_api_key = self.get_api_key() return Fireworks(api_key=fireworks_api_key) - def _get_openai_client(self) -> AsyncOpenAI: - return AsyncOpenAI(base_url=self._get_base_url(), api_key=self._get_api_key()) + def _preprocess_prompt_for_fireworks(self, prompt: str) -> str: + """Remove BOS token as Fireworks automatically prepends it""" + if prompt.startswith("<|begin_of_text|>"): + return prompt[len("<|begin_of_text|>") :] + return prompt async def completion( self, @@ -285,153 +279,3 @@ class FireworksInferenceAdapter(ModelRegistryHelper, Inference, NeedsRequestProv embeddings = [data.embedding for data in response.data] return EmbeddingsResponse(embeddings=embeddings) - - async def openai_embeddings( - self, - model: str, - input: str | list[str], - encoding_format: str | None = "float", - dimensions: int | None = None, - user: str | None = None, - ) -> OpenAIEmbeddingsResponse: - raise NotImplementedError() - - async def openai_completion( - self, - model: str, - prompt: str | list[str] | list[int] | list[list[int]], - best_of: int | None = None, - echo: bool | None = None, - frequency_penalty: float | None = None, - logit_bias: dict[str, float] | None = None, - logprobs: bool | None = None, - max_tokens: int | None = None, - n: int | None = None, - presence_penalty: float | None = None, - seed: int | None = None, - stop: str | list[str] | None = None, - stream: bool | None = None, - stream_options: dict[str, Any] | None = None, - temperature: float | None = None, - top_p: float | None = None, - user: str | None = None, - guided_choice: list[str] | None = None, - prompt_logprobs: int | None = None, - suffix: str | None = None, - ) -> OpenAICompletion: - model_obj = await self.model_store.get_model(model) - - # Fireworks always prepends with BOS - if isinstance(prompt, str) and prompt.startswith("<|begin_of_text|>"): - prompt = prompt[len("<|begin_of_text|>") :] - - params = await prepare_openai_completion_params( - model=model_obj.provider_resource_id, - prompt=prompt, - best_of=best_of, - echo=echo, - frequency_penalty=frequency_penalty, - logit_bias=logit_bias, - logprobs=logprobs, - max_tokens=max_tokens, - n=n, - presence_penalty=presence_penalty, - seed=seed, - stop=stop, - stream=stream, - stream_options=stream_options, - temperature=temperature, - top_p=top_p, - user=user, - ) - - return await self._get_openai_client().completions.create(**params) - - async def openai_chat_completion( - self, - model: str, - messages: list[OpenAIMessageParam], - frequency_penalty: float | None = None, - function_call: str | dict[str, Any] | None = None, - functions: list[dict[str, Any]] | None = None, - logit_bias: dict[str, float] | None = None, - logprobs: bool | None = None, - max_completion_tokens: int | None = None, - max_tokens: int | None = None, - n: int | None = None, - parallel_tool_calls: bool | None = None, - presence_penalty: float | None = None, - response_format: OpenAIResponseFormatParam | None = None, - seed: int | None = None, - stop: str | list[str] | None = None, - stream: bool | None = None, - stream_options: dict[str, Any] | None = None, - temperature: float | None = None, - tool_choice: str | dict[str, Any] | None = None, - tools: list[dict[str, Any]] | None = None, - top_logprobs: int | None = None, - top_p: float | None = None, - user: str | None = None, - ) -> OpenAIChatCompletion | AsyncIterator[OpenAIChatCompletionChunk]: - model_obj = await self.model_store.get_model(model) - - # Divert Llama Models through Llama Stack inference APIs because - # Fireworks chat completions OpenAI-compatible API does not support - # tool calls properly. - llama_model = self.get_llama_model(model_obj.provider_resource_id) - - if llama_model: - return await OpenAIChatCompletionToLlamaStackMixin.openai_chat_completion( - self, - model=model, - messages=messages, - frequency_penalty=frequency_penalty, - function_call=function_call, - functions=functions, - logit_bias=logit_bias, - logprobs=logprobs, - max_completion_tokens=max_completion_tokens, - max_tokens=max_tokens, - n=n, - parallel_tool_calls=parallel_tool_calls, - presence_penalty=presence_penalty, - response_format=response_format, - seed=seed, - stop=stop, - stream=stream, - stream_options=stream_options, - temperature=temperature, - tool_choice=tool_choice, - tools=tools, - top_logprobs=top_logprobs, - top_p=top_p, - user=user, - ) - - params = await prepare_openai_completion_params( - messages=messages, - frequency_penalty=frequency_penalty, - function_call=function_call, - functions=functions, - logit_bias=logit_bias, - logprobs=logprobs, - max_completion_tokens=max_completion_tokens, - max_tokens=max_tokens, - n=n, - parallel_tool_calls=parallel_tool_calls, - presence_penalty=presence_penalty, - response_format=response_format, - seed=seed, - stop=stop, - stream=stream, - stream_options=stream_options, - temperature=temperature, - tool_choice=tool_choice, - tools=tools, - top_logprobs=top_logprobs, - top_p=top_p, - user=user, - ) - - logger.debug(f"fireworks params: {params}") - return await self._get_openai_client().chat.completions.create(model=model_obj.provider_resource_id, **params) diff --git a/tests/integration/inference/test_openai_embeddings.py b/tests/integration/inference/test_openai_embeddings.py index 622b97287..ce3d2a8ea 100644 --- a/tests/integration/inference/test_openai_embeddings.py +++ b/tests/integration/inference/test_openai_embeddings.py @@ -33,6 +33,7 @@ def skip_if_model_doesnt_support_user_param(client, model_id): provider = provider_from_model(client, model_id) if provider.provider_type in ( "remote::together", # service returns 400 + "remote::fireworks", # service returns 400 malformed input ): pytest.skip(f"Model {model_id} hosted by {provider.provider_type} does not support user param.") @@ -41,6 +42,7 @@ def skip_if_model_doesnt_support_encoding_format_base64(client, model_id): provider = provider_from_model(client, model_id) if provider.provider_type in ( "remote::together", # param silently ignored, always returns floats + "remote::fireworks", # param silently ignored, always returns list of floats ): pytest.skip(f"Model {model_id} hosted by {provider.provider_type} does not support encoding_format='base64'.") @@ -287,7 +289,6 @@ def test_openai_embeddings_base64_batch_processing(compat_client, client_with_mo input=input_texts, encoding_format="base64", ) - # Validate response structure assert response.object == "list" assert response.model == embedding_model_id diff --git a/tests/integration/suites.py b/tests/integration/suites.py index 231480447..fb2c44308 100644 --- a/tests/integration/suites.py +++ b/tests/integration/suites.py @@ -108,6 +108,15 @@ SETUP_DEFINITIONS: dict[str, Setup] = { "embedding_model": "together/togethercomputer/m2-bert-80M-32k-retrieval", }, ), + "fireworks": Setup( + name="fireworks", + description="Fireworks provider with a text model", + defaults={ + "text_model": "accounts/fireworks/models/llama-v3p1-8b-instruct", + "vision_model": "accounts/fireworks/models/llama-v3p2-90b-vision-instruct", + "embedding_model": "nomic-ai/nomic-embed-text-v1.5", + }, + ), } From a7f9ce9a3a9e6d80c428ebf995462cb6e57d36bc Mon Sep 17 00:00:00 2001 From: ehhuang Date: Mon, 22 Sep 2025 22:53:48 -0700 Subject: [PATCH 127/150] chore: fix build (#3522) # What does this PR do? error: https://github.com/llamastack/llama-stack-ops/actions/runs/17932015232/job/50990948479 ## Test Plan GITHUB_ACTIONS=true BUILD_PLATFORM=linux/amd64 USE_COPY_NOT_MOUNT=true LLAMA_STACK_DIR=. uv run --with llama-stack llama stack build --distro starter --image-type container --image-name ehhuang/distribution-starter succeeds --- llama_stack/core/build_container.sh | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/llama_stack/core/build_container.sh b/llama_stack/core/build_container.sh index 424b40a9d..8e47fc592 100755 --- a/llama_stack/core/build_container.sh +++ b/llama_stack/core/build_container.sh @@ -147,7 +147,7 @@ WORKDIR /app RUN dnf -y update && dnf install -y iputils git net-tools wget \ vim-minimal python3.12 python3.12-pip python3.12-wheel \ - python3.12-setuptools python3.12-devel gcc make && \ + python3.12-setuptools python3.12-devel gcc gcc-c++ make && \ ln -s /bin/pip3.12 /bin/pip && ln -s /bin/python3.12 /bin/python && dnf clean all ENV UV_SYSTEM_PYTHON=1 @@ -164,7 +164,7 @@ RUN apt-get update && apt-get install -y \ procps psmisc lsof \ traceroute \ bubblewrap \ - gcc \ + gcc g++ \ && rm -rf /var/lib/apt/lists/* ENV UV_SYSTEM_PYTHON=1 From 62e0aef7bc3ba08dd7aca31f08f1033f217b40aa Mon Sep 17 00:00:00 2001 From: Matthew Farrellee Date: Tue, 23 Sep 2025 12:30:00 -0400 Subject: [PATCH 128/150] fix: return llama stack model id from embeddings (#3525) # What does this PR do? the openai_embeddings method on OpenAIMixin was returning the provider's model id instead of the llama stack name ## Test Plan before - ``` $ ./scripts/integration-tests.sh --stack-config server:ci-tests --setup gpt --subdirs inference --inference-mode live --pattern test_openai_embeddings_single_string ... FAILED tests/integration/inference/test_openai_embeddings.py::test_openai_embeddings_single_string[openai_client-emb=openai/text-embedding-3-small] - AssertionError: assert 'text-embedding-3-small' == 'openai/text-...dding-3-small' FAILED tests/integration/inference/test_openai_embeddings.py::test_openai_embeddings_single_string[llama_stack_client-emb=openai/text-embedding-3-small] - AssertionError: assert 'text-embedding-3-small' == 'openai/text-...dding-3-small' ========================================== 2 failed, 95 deselected, 4 warnings in 3.87s =========================================== ``` after - ``` $ ./scripts/integration-tests.sh --stack-config server:ci-tests --setup gpt --subdirs inference --inference-mode live --pattern test_openai_embeddings_single_string ... ========================================== 2 passed, 95 deselected, 4 warnings in 2.12s =========================================== ``` --- llama_stack/providers/utils/inference/openai_mixin.py | 2 +- tests/integration/suites.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/llama_stack/providers/utils/inference/openai_mixin.py b/llama_stack/providers/utils/inference/openai_mixin.py index c57f65bca..2fe343f63 100644 --- a/llama_stack/providers/utils/inference/openai_mixin.py +++ b/llama_stack/providers/utils/inference/openai_mixin.py @@ -296,7 +296,7 @@ class OpenAIMixin(ABC): return OpenAIEmbeddingsResponse( data=data, - model=response.model, + model=model, usage=usage, ) diff --git a/tests/integration/suites.py b/tests/integration/suites.py index fb2c44308..354dc1f4c 100644 --- a/tests/integration/suites.py +++ b/tests/integration/suites.py @@ -87,7 +87,7 @@ SETUP_DEFINITIONS: dict[str, Setup] = { description="OpenAI GPT models for high-quality responses and tool calling", defaults={ "text_model": "openai/gpt-4o", - "embedding_model": "sentence-transformers/all-MiniLM-L6-v2", + "embedding_model": "openai/text-embedding-3-small", }, ), "tgi": Setup( From 2be869b3effb772eda516251163261302c605199 Mon Sep 17 00:00:00 2001 From: Matthew Farrellee Date: Tue, 23 Sep 2025 12:56:33 -0400 Subject: [PATCH 129/150] fix(dev): fix vllm inference recording (await models.list) (#3524) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit # What does this PR do? fix inference recording for vLLM closes #3523 ## Test Plan ``` $ ./scripts/integration-tests.sh --stack-config server:ci-tests --setup vllm --subdirs inference --inference-mode record --pattern test_text_chat_completion_non_streaming === Llama Stack Integration Test Runner === Stack Config: server:ci-tests Setup: vllm Inference Mode: record Test Suite: base Test Subdirs: inference Test Pattern: test_text_chat_completion_non_streaming ... === Applying Setup Environment Variables === Setting up environment variables: export VLLM_URL='http://localhost:8000/v1' === Starting Llama Stack Server === Waiting for Llama Stack Server to start... ✅ Llama Stack Server started successfully === Running Integration Tests === Test subdirs to run: inference Added test files from inference: 6 files === Running all collected tests in a single pytest command === Total test files: 6 + pytest -s -v tests/integration/inference/test_openai_completion.py tests/integration/inference/test_batch_inference.py tests/integration/inference/test_openai_embeddings.py tests/integration/inference/test_text_inference.py tests/integration/inference/test_vision_inference.py tests/integration/inference/test_embedding.py --stack-config=server:ci-tests --inference-mode=record -k 'not( builtin_tool or safety_with_image or code_interpreter or test_rag or test_inference_store_tool_calls ) and test_text_chat_completion_non_streaming' --setup=vllm --color=yes --capture=tee-sys INFO 2025-09-23 10:35:36,662 tests.integration.conftest:86 tests: Applying setup 'vllm' ======================================================= test session starts ======================================================= platform linux -- Python 3.12.11, pytest-8.4.2, pluggy-1.6.0 -- .../.venv/bin/python3 cachedir: .pytest_cache metadata: {'Python': '3.12.11', 'Platform': 'Linux-6.16.7-200.fc42.x86_64-x86_64-with-glibc2.41', 'Packages': {'pytest': '8.4.2', 'pluggy': '1.6.0'}, 'Plugins': {'html': '4.1.1', 'anyio': '4.9.0', 'timeout': '2.4.0', 'cov': '6.2.1', 'asyncio': '1.1.0', 'nbval': '0.11.0', 'socket': '0.7.0', 'json-report': '1.5.0', 'metadata': '3.1.1'}} rootdir: ... configfile: pyproject.toml plugins: html-4.1.1, anyio-4.9.0, timeout-2.4.0, cov-6.2.1, asyncio-1.1.0, nbval-0.11.0, socket-0.7.0, json-report-1.5.0, metadata-3.1.1 asyncio: mode=Mode.AUTO, asyncio_default_fixture_loop_scope=None, asyncio_default_test_loop_scope=function collected 97 items / 95 deselected / 2 selected tests/integration/inference/test_text_inference.py::test_text_chat_completion_non_streaming[txt=vllm/Qwen/Qwen3-0.6B-inference:chat_completion:non_streaming_01] instantiating llama_stack_client Port 8321 is already in use, assuming server is already running... llama_stack_client instantiated in 0.044s PASSED [ 50%] tests/integration/inference/test_text_inference.py::test_text_chat_completion_non_streaming[txt=vllm/Qwen/Qwen3-0.6B-inference:chat_completion:non_streaming_02] PASSED [100%] ====================================================== slowest 10 durations ======================================================= 1.62s call tests/integration/inference/test_text_inference.py::test_text_chat_completion_non_streaming[txt=vllm/Qwen/Qwen3-0.6B-inference:chat_completion:non_streaming_02] 0.93s call tests/integration/inference/test_text_inference.py::test_text_chat_completion_non_streaming[txt=vllm/Qwen/Qwen3-0.6B-inference:chat_completion:non_streaming_01] 0.62s setup tests/integration/inference/test_text_inference.py::test_text_chat_completion_non_streaming[txt=vllm/Qwen/Qwen3-0.6B-inference:chat_completion:non_streaming_01] (3 durations < 0.005s hidden. Use -vv to show these durations.) ========================================== 2 passed, 95 deselected, 6 warnings in 3.26s =========================================== + exit_code=0 + set +x ✅ All tests completed successfully ``` ``` $ git status ... Untracked files: (use "git add ..." to include in what will be committed) tests/integration/recordings/responses/032f8c5a1289.json tests/integration/recordings/responses/c42baf6a3700.json tests/integration/recordings/responses/models-bd032f995f2a-fb68f5a6.json ... ``` --- llama_stack/providers/remote/inference/vllm/vllm.py | 2 +- tests/unit/providers/inference/test_remote_vllm.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/llama_stack/providers/remote/inference/vllm/vllm.py b/llama_stack/providers/remote/inference/vllm/vllm.py index b4079c39f..15f807846 100644 --- a/llama_stack/providers/remote/inference/vllm/vllm.py +++ b/llama_stack/providers/remote/inference/vllm/vllm.py @@ -504,7 +504,7 @@ class VLLMInferenceAdapter(OpenAIMixin, LiteLLMOpenAIMixin, Inference, ModelsPro except ValueError: pass # Ignore statically unknown model, will check live listing try: - res = await self.client.models.list() + res = self.client.models.list() except APIConnectionError as e: raise ValueError( f"Failed to connect to vLLM at {self.config.url}. Please check if vLLM is running and accessible at that URL." diff --git a/tests/unit/providers/inference/test_remote_vllm.py b/tests/unit/providers/inference/test_remote_vllm.py index 9545e0cf6..4dc2e0c16 100644 --- a/tests/unit/providers/inference/test_remote_vllm.py +++ b/tests/unit/providers/inference/test_remote_vllm.py @@ -62,7 +62,7 @@ from llama_stack.providers.remote.inference.vllm.vllm import ( @pytest.fixture(scope="module") def mock_openai_models_list(): - with patch("openai.resources.models.AsyncModels.list", new_callable=AsyncMock) as mock_list: + with patch("openai.resources.models.AsyncModels.list") as mock_list: yield mock_list From 9406a998b967552977c7c8d514bb48a7d1c31be0 Mon Sep 17 00:00:00 2001 From: ehhuang Date: Tue, 23 Sep 2025 10:14:41 -0700 Subject: [PATCH 130/150] chore: refactor tracingmiddelware (#3520) # What does this PR do? Just moving TracingMiddleware to a new file ## Test Plan CI --- llama_stack/core/server/server.py | 71 ++--------------------------- llama_stack/core/server/tracing.py | 72 ++++++++++++++++++++++++++++++ 2 files changed, 75 insertions(+), 68 deletions(-) create mode 100644 llama_stack/core/server/tracing.py diff --git a/llama_stack/core/server/server.py b/llama_stack/core/server/server.py index 9cca42268..7d119c139 100644 --- a/llama_stack/core/server/server.py +++ b/llama_stack/core/server/server.py @@ -25,7 +25,6 @@ from typing import Annotated, Any, get_origin import httpx import rich.pretty import yaml -from aiohttp import hdrs from fastapi import Body, FastAPI, HTTPException, Request, Response from fastapi import Path as FastapiPath from fastapi.exceptions import RequestValidationError @@ -45,17 +44,13 @@ from llama_stack.core.datatypes import ( process_cors_config, ) from llama_stack.core.distribution import builtin_automatically_routed_apis -from llama_stack.core.external import ExternalApiSpec, load_external_apis +from llama_stack.core.external import load_external_apis from llama_stack.core.request_headers import ( PROVIDER_DATA_VAR, request_provider_data_context, user_from_scope, ) -from llama_stack.core.server.routes import ( - find_matching_route, - get_all_api_routes, - initialize_route_impls, -) +from llama_stack.core.server.routes import get_all_api_routes from llama_stack.core.stack import ( Stack, cast_image_name_to_string, @@ -73,13 +68,12 @@ from llama_stack.providers.inline.telemetry.meta_reference.telemetry import ( ) from llama_stack.providers.utils.telemetry.tracing import ( CURRENT_TRACE_CONTEXT, - end_trace, setup_logger, - start_trace, ) from .auth import AuthenticationMiddleware from .quota import QuotaMiddleware +from .tracing import TracingMiddleware REPO_ROOT = Path(__file__).parent.parent.parent.parent @@ -299,65 +293,6 @@ def create_dynamic_typed_route(func: Any, method: str, route: str) -> Callable: return route_handler -class TracingMiddleware: - def __init__(self, app, impls, external_apis: dict[str, ExternalApiSpec]): - self.app = app - self.impls = impls - self.external_apis = external_apis - # FastAPI built-in paths that should bypass custom routing - self.fastapi_paths = ("/docs", "/redoc", "/openapi.json", "/favicon.ico", "/static") - - async def __call__(self, scope, receive, send): - if scope.get("type") == "lifespan": - return await self.app(scope, receive, send) - - path = scope.get("path", "") - - # Check if the path is a FastAPI built-in path - if path.startswith(self.fastapi_paths): - # Pass through to FastAPI's built-in handlers - logger.debug(f"Bypassing custom routing for FastAPI built-in path: {path}") - return await self.app(scope, receive, send) - - if not hasattr(self, "route_impls"): - self.route_impls = initialize_route_impls(self.impls, self.external_apis) - - try: - _, _, route_path, webmethod = find_matching_route( - scope.get("method", hdrs.METH_GET), path, self.route_impls - ) - except ValueError: - # If no matching endpoint is found, pass through to FastAPI - logger.debug(f"No matching route found for path: {path}, falling back to FastAPI") - return await self.app(scope, receive, send) - - trace_attributes = {"__location__": "server", "raw_path": path} - - # Extract W3C trace context headers and store as trace attributes - headers = dict(scope.get("headers", [])) - traceparent = headers.get(b"traceparent", b"").decode() - if traceparent: - trace_attributes["traceparent"] = traceparent - tracestate = headers.get(b"tracestate", b"").decode() - if tracestate: - trace_attributes["tracestate"] = tracestate - - trace_path = webmethod.descriptive_name or route_path - trace_context = await start_trace(trace_path, trace_attributes) - - async def send_with_trace_id(message): - if message["type"] == "http.response.start": - headers = message.get("headers", []) - headers.append([b"x-trace-id", str(trace_context.trace_id).encode()]) - message["headers"] = headers - await send(message) - - try: - return await self.app(scope, receive, send_with_trace_id) - finally: - await end_trace() - - class ClientVersionMiddleware: def __init__(self, app): self.app = app diff --git a/llama_stack/core/server/tracing.py b/llama_stack/core/server/tracing.py new file mode 100644 index 000000000..c48fc4d33 --- /dev/null +++ b/llama_stack/core/server/tracing.py @@ -0,0 +1,72 @@ +# Copyright (c) Meta Platforms, Inc. and affiliates. +# All rights reserved. +# +# This source code is licensed under the terms described in the LICENSE file in +# the root directory of this source tree. +from aiohttp import hdrs + +from llama_stack.core.external import ExternalApiSpec +from llama_stack.core.server.routes import find_matching_route, initialize_route_impls +from llama_stack.log import get_logger +from llama_stack.providers.utils.telemetry.tracing import end_trace, start_trace + +logger = get_logger(name=__name__, category="core::server") + + +class TracingMiddleware: + def __init__(self, app, impls, external_apis: dict[str, ExternalApiSpec]): + self.app = app + self.impls = impls + self.external_apis = external_apis + # FastAPI built-in paths that should bypass custom routing + self.fastapi_paths = ("/docs", "/redoc", "/openapi.json", "/favicon.ico", "/static") + + async def __call__(self, scope, receive, send): + if scope.get("type") == "lifespan": + return await self.app(scope, receive, send) + + path = scope.get("path", "") + + # Check if the path is a FastAPI built-in path + if path.startswith(self.fastapi_paths): + # Pass through to FastAPI's built-in handlers + logger.debug(f"Bypassing custom routing for FastAPI built-in path: {path}") + return await self.app(scope, receive, send) + + if not hasattr(self, "route_impls"): + self.route_impls = initialize_route_impls(self.impls, self.external_apis) + + try: + _, _, route_path, webmethod = find_matching_route( + scope.get("method", hdrs.METH_GET), path, self.route_impls + ) + except ValueError: + # If no matching endpoint is found, pass through to FastAPI + logger.debug(f"No matching route found for path: {path}, falling back to FastAPI") + return await self.app(scope, receive, send) + + trace_attributes = {"__location__": "server", "raw_path": path} + + # Extract W3C trace context headers and store as trace attributes + headers = dict(scope.get("headers", [])) + traceparent = headers.get(b"traceparent", b"").decode() + if traceparent: + trace_attributes["traceparent"] = traceparent + tracestate = headers.get(b"tracestate", b"").decode() + if tracestate: + trace_attributes["tracestate"] = tracestate + + trace_path = webmethod.descriptive_name or route_path + trace_context = await start_trace(trace_path, trace_attributes) + + async def send_with_trace_id(message): + if message["type"] == "http.response.start": + headers = message.get("headers", []) + headers.append([b"x-trace-id", str(trace_context.trace_id).encode()]) + message["headers"] = headers + await send(message) + + try: + return await self.app(scope, receive, send_with_trace_id) + finally: + await end_trace() From d07ebce4d9cb742c5b04e2a1c888ba36f1d11058 Mon Sep 17 00:00:00 2001 From: Matthew Farrellee Date: Tue, 23 Sep 2025 15:37:23 -0400 Subject: [PATCH 131/150] feat: (re-)enable Databricks inference adapter (#3500) # What does this PR do? add/enable the Databricks inference adapter Databricks inference adapter was broken, closes #3486 - remove deprecated completion / chat_completion endpoints - enable dynamic model listing w/o refresh, listing is not async - use SecretStr instead of str for token - backward incompatible change: for consistency with databricks docs, env DATABRICKS_URL -> DATABRICKS_HOST and DATABRICKS_API_TOKEN -> DATABRICKS_TOKEN - databricks urls are custom per user/org, add special recorder handling for databricks urls - add integration test --setup databricks - enable chat completions tests - enable embeddings tests - disable n > 1 tests - disable embeddings base64 tests - disable embeddings dimensions tests note: reasoning models, e.g. gpt oss, fail because databricks has a custom, incompatible response format ## Test Plan ci and ``` ./scripts/integration-tests.sh --stack-config server:ci-tests --setup databricks --subdirs inference --pattern openai ``` note: databricks needs to be manually added to the ci-tests distro for replay testing --- .../providers/inference/remote_databricks.md | 6 +- llama_stack/providers/registry/inference.py | 2 +- .../remote/inference/databricks/__init__.py | 3 +- .../remote/inference/databricks/config.py | 10 +- .../remote/inference/databricks/databricks.py | 191 +- llama_stack/testing/inference_recorder.py | 4 + .../inference/test_openai_completion.py | 2 +- .../inference/test_openai_embeddings.py | 4 +- .../recordings/responses/121a72d1c4cf.json | 728 ++++ .../recordings/responses/249b7f0ddde6.json | 56 + .../recordings/responses/28648cf8d421.json | 56 + .../recordings/responses/29585e055e6f.json | 56 + .../recordings/responses/3ef0f9aab128.json | 344 ++ .../recordings/responses/441e2832387f.json | 1061 ++++++ .../recordings/responses/5fa0e98f3d84.json | 1061 ++++++ .../recordings/responses/6d937e5e9233.json | 1061 ++++++ .../recordings/responses/7f53b458dad9.json | 83 + .../recordings/responses/875323ed9913.json | 3125 +++++++++++++++++ .../recordings/responses/9b9e8cf39b15.json | 1062 ++++++ .../recordings/responses/d64ffaa0de6f.json | 1062 ++++++ .../recordings/responses/e509387fc329.json | 168 + .../recordings/responses/ecf6f0c51485.json | 536 +++ .../recordings/responses/ffd7b58fded8.json | 1061 ++++++ tests/integration/suites.py | 8 + 24 files changed, 11649 insertions(+), 101 deletions(-) create mode 100644 tests/integration/recordings/responses/121a72d1c4cf.json create mode 100644 tests/integration/recordings/responses/249b7f0ddde6.json create mode 100644 tests/integration/recordings/responses/28648cf8d421.json create mode 100644 tests/integration/recordings/responses/29585e055e6f.json create mode 100644 tests/integration/recordings/responses/3ef0f9aab128.json create mode 100644 tests/integration/recordings/responses/441e2832387f.json create mode 100644 tests/integration/recordings/responses/5fa0e98f3d84.json create mode 100644 tests/integration/recordings/responses/6d937e5e9233.json create mode 100644 tests/integration/recordings/responses/7f53b458dad9.json create mode 100644 tests/integration/recordings/responses/875323ed9913.json create mode 100644 tests/integration/recordings/responses/9b9e8cf39b15.json create mode 100644 tests/integration/recordings/responses/d64ffaa0de6f.json create mode 100644 tests/integration/recordings/responses/e509387fc329.json create mode 100644 tests/integration/recordings/responses/ecf6f0c51485.json create mode 100644 tests/integration/recordings/responses/ffd7b58fded8.json diff --git a/docs/source/providers/inference/remote_databricks.md b/docs/source/providers/inference/remote_databricks.md index d0ac89055..3b418f7d4 100644 --- a/docs/source/providers/inference/remote_databricks.md +++ b/docs/source/providers/inference/remote_databricks.md @@ -9,13 +9,13 @@ Databricks inference provider for running models on Databricks' unified analytic | Field | Type | Required | Default | Description | |-------|------|----------|---------|-------------| | `url` | `` | No | | The URL for the Databricks model serving endpoint | -| `api_token` | `` | No | | The Databricks API token | +| `api_token` | `` | No | | The Databricks API token | ## Sample Configuration ```yaml -url: ${env.DATABRICKS_URL:=} -api_token: ${env.DATABRICKS_API_TOKEN:=} +url: ${env.DATABRICKS_HOST:=} +api_token: ${env.DATABRICKS_TOKEN:=} ``` diff --git a/llama_stack/providers/registry/inference.py b/llama_stack/providers/registry/inference.py index 658611698..89d7f55e8 100644 --- a/llama_stack/providers/registry/inference.py +++ b/llama_stack/providers/registry/inference.py @@ -142,7 +142,7 @@ def available_providers() -> list[ProviderSpec]: api=Api.inference, adapter_type="databricks", provider_type="remote::databricks", - pip_packages=[], + pip_packages=["databricks-sdk"], module="llama_stack.providers.remote.inference.databricks", config_class="llama_stack.providers.remote.inference.databricks.DatabricksImplConfig", description="Databricks inference provider for running models on Databricks' unified analytics platform.", diff --git a/llama_stack/providers/remote/inference/databricks/__init__.py b/llama_stack/providers/remote/inference/databricks/__init__.py index 89da31130..24f658a2b 100644 --- a/llama_stack/providers/remote/inference/databricks/__init__.py +++ b/llama_stack/providers/remote/inference/databricks/__init__.py @@ -5,10 +5,11 @@ # the root directory of this source tree. from .config import DatabricksImplConfig -from .databricks import DatabricksInferenceAdapter async def get_adapter_impl(config: DatabricksImplConfig, _deps): + from .databricks import DatabricksInferenceAdapter + assert isinstance(config, DatabricksImplConfig), f"Unexpected config type: {type(config)}" impl = DatabricksInferenceAdapter(config) await impl.initialize() diff --git a/llama_stack/providers/remote/inference/databricks/config.py b/llama_stack/providers/remote/inference/databricks/config.py index cc2a2c302..67cd0480c 100644 --- a/llama_stack/providers/remote/inference/databricks/config.py +++ b/llama_stack/providers/remote/inference/databricks/config.py @@ -6,7 +6,7 @@ from typing import Any -from pydantic import BaseModel, Field +from pydantic import BaseModel, Field, SecretStr from llama_stack.schema_utils import json_schema_type @@ -17,16 +17,16 @@ class DatabricksImplConfig(BaseModel): default=None, description="The URL for the Databricks model serving endpoint", ) - api_token: str = Field( - default=None, + api_token: SecretStr = Field( + default=SecretStr(None), description="The Databricks API token", ) @classmethod def sample_run_config( cls, - url: str = "${env.DATABRICKS_URL:=}", - api_token: str = "${env.DATABRICKS_API_TOKEN:=}", + url: str = "${env.DATABRICKS_HOST:=}", + api_token: str = "${env.DATABRICKS_TOKEN:=}", **kwargs: Any, ) -> dict[str, Any]: return { diff --git a/llama_stack/providers/remote/inference/databricks/databricks.py b/llama_stack/providers/remote/inference/databricks/databricks.py index 34ee59212..f2dc302e0 100644 --- a/llama_stack/providers/remote/inference/databricks/databricks.py +++ b/llama_stack/providers/remote/inference/databricks/databricks.py @@ -4,23 +4,26 @@ # This source code is licensed under the terms described in the LICENSE file in # the root directory of this source tree. -from collections.abc import AsyncGenerator +from collections.abc import AsyncIterator +from typing import Any -from openai import OpenAI +from databricks.sdk import WorkspaceClient from llama_stack.apis.common.content_types import ( InterleavedContent, InterleavedContentItem, ) from llama_stack.apis.inference import ( - ChatCompletionRequest, ChatCompletionResponse, + ChatCompletionResponseStreamChunk, + CompletionResponse, + CompletionResponseStreamChunk, EmbeddingsResponse, EmbeddingTaskType, Inference, LogProbConfig, Message, - OpenAIEmbeddingsResponse, + OpenAICompletion, ResponseFormat, SamplingParams, TextTruncation, @@ -29,49 +32,50 @@ from llama_stack.apis.inference import ( ToolDefinition, ToolPromptFormat, ) -from llama_stack.models.llama.sku_types import CoreModelId +from llama_stack.apis.models import Model, ModelType +from llama_stack.log import get_logger from llama_stack.providers.utils.inference.model_registry import ( - ModelRegistryHelper, - build_hf_repo_model_entry, -) -from llama_stack.providers.utils.inference.openai_compat import ( - OpenAIChatCompletionToLlamaStackMixin, - OpenAICompletionToLlamaStackMixin, - get_sampling_options, - process_chat_completion_response, - process_chat_completion_stream_response, -) -from llama_stack.providers.utils.inference.prompt_adapter import ( - chat_completion_request_to_prompt, + ProviderModelEntry, ) +from llama_stack.providers.utils.inference.openai_mixin import OpenAIMixin from .config import DatabricksImplConfig -SAFETY_MODELS_ENTRIES = [] +logger = get_logger(name=__name__, category="inference::databricks") -# https://docs.databricks.com/aws/en/machine-learning/model-serving/foundation-model-overview -MODEL_ENTRIES = [ - build_hf_repo_model_entry( - "databricks-meta-llama-3-1-70b-instruct", - CoreModelId.llama3_1_70b_instruct.value, + +# source: https://docs.databricks.com/aws/en/machine-learning/foundation-model-apis/supported-models +EMBEDDING_MODEL_ENTRIES = { + "databricks-gte-large-en": ProviderModelEntry( + provider_model_id="databricks-gte-large-en", + metadata={ + "embedding_dimension": 1024, + "context_length": 8192, + }, ), - build_hf_repo_model_entry( - "databricks-meta-llama-3-1-405b-instruct", - CoreModelId.llama3_1_405b_instruct.value, + "databricks-bge-large-en": ProviderModelEntry( + provider_model_id="databricks-bge-large-en", + metadata={ + "embedding_dimension": 1024, + "context_length": 512, + }, ), -] + SAFETY_MODELS_ENTRIES +} class DatabricksInferenceAdapter( - ModelRegistryHelper, + OpenAIMixin, Inference, - OpenAIChatCompletionToLlamaStackMixin, - OpenAICompletionToLlamaStackMixin, ): def __init__(self, config: DatabricksImplConfig) -> None: - ModelRegistryHelper.__init__(self, model_entries=MODEL_ENTRIES) self.config = config + def get_api_key(self) -> str: + return self.config.api_token.get_secret_value() + + def get_base_url(self) -> str: + return f"{self.config.url}/serving-endpoints" + async def initialize(self) -> None: return @@ -80,72 +84,54 @@ class DatabricksInferenceAdapter( async def completion( self, - model: str, + model_id: str, content: InterleavedContent, sampling_params: SamplingParams | None = None, response_format: ResponseFormat | None = None, stream: bool | None = False, logprobs: LogProbConfig | None = None, - ) -> AsyncGenerator: + ) -> CompletionResponse | AsyncIterator[CompletionResponseStreamChunk]: + raise NotImplementedError() + + async def openai_completion( + self, + model: str, + prompt: str | list[str] | list[int] | list[list[int]], + best_of: int | None = None, + echo: bool | None = None, + frequency_penalty: float | None = None, + logit_bias: dict[str, float] | None = None, + logprobs: bool | None = None, + max_tokens: int | None = None, + n: int | None = None, + presence_penalty: float | None = None, + seed: int | None = None, + stop: str | list[str] | None = None, + stream: bool | None = None, + stream_options: dict[str, Any] | None = None, + temperature: float | None = None, + top_p: float | None = None, + user: str | None = None, + guided_choice: list[str] | None = None, + prompt_logprobs: int | None = None, + suffix: str | None = None, + ) -> OpenAICompletion: raise NotImplementedError() async def chat_completion( self, - model: str, + model_id: str, messages: list[Message], sampling_params: SamplingParams | None = None, - response_format: ResponseFormat | None = None, tools: list[ToolDefinition] | None = None, tool_choice: ToolChoice | None = ToolChoice.auto, tool_prompt_format: ToolPromptFormat | None = None, + response_format: ResponseFormat | None = None, stream: bool | None = False, logprobs: LogProbConfig | None = None, tool_config: ToolConfig | None = None, - ) -> AsyncGenerator: - if sampling_params is None: - sampling_params = SamplingParams() - request = ChatCompletionRequest( - model=model, - messages=messages, - sampling_params=sampling_params, - tools=tools or [], - stream=stream, - logprobs=logprobs, - tool_config=tool_config, - ) - - client = OpenAI(base_url=self.config.url, api_key=self.config.api_token) - if stream: - return self._stream_chat_completion(request, client) - else: - return await self._nonstream_chat_completion(request, client) - - async def _nonstream_chat_completion( - self, request: ChatCompletionRequest, client: OpenAI - ) -> ChatCompletionResponse: - params = self._get_params(request) - r = client.completions.create(**params) - return process_chat_completion_response(r, request) - - async def _stream_chat_completion(self, request: ChatCompletionRequest, client: OpenAI) -> AsyncGenerator: - params = self._get_params(request) - - async def _to_async_generator(): - s = client.completions.create(**params) - for chunk in s: - yield chunk - - stream = _to_async_generator() - async for chunk in process_chat_completion_stream_response(stream, request): - yield chunk - - def _get_params(self, request: ChatCompletionRequest) -> dict: - return { - "model": request.model, - "prompt": chat_completion_request_to_prompt(request, self.get_llama_model(request.model)), - "stream": request.stream, - **get_sampling_options(request.sampling_params), - } + ) -> ChatCompletionResponse | AsyncIterator[ChatCompletionResponseStreamChunk]: + raise NotImplementedError() async def embeddings( self, @@ -157,12 +143,39 @@ class DatabricksInferenceAdapter( ) -> EmbeddingsResponse: raise NotImplementedError() - async def openai_embeddings( - self, - model: str, - input: str | list[str], - encoding_format: str | None = "float", - dimensions: int | None = None, - user: str | None = None, - ) -> OpenAIEmbeddingsResponse: - raise NotImplementedError() + async def list_models(self) -> list[Model] | None: + self._model_cache = {} # from OpenAIMixin + ws_client = WorkspaceClient(host=self.config.url, token=self.get_api_key()) # TODO: this is not async + endpoints = ws_client.serving_endpoints.list() + for endpoint in endpoints: + model = Model( + provider_id=self.__provider_id__, + provider_resource_id=endpoint.name, + identifier=endpoint.name, + ) + if endpoint.task == "llm/v1/chat": + model.model_type = ModelType.llm # this is redundant, but informative + elif endpoint.task == "llm/v1/embeddings": + if endpoint.name not in EMBEDDING_MODEL_ENTRIES: + logger.warning(f"No metadata information available for embedding model {endpoint.name}, skipping.") + continue + model.model_type = ModelType.embedding + model.metadata = EMBEDDING_MODEL_ENTRIES[endpoint.name].metadata + else: + logger.warning(f"Unknown model type, skipping: {endpoint}") + continue + + self._model_cache[endpoint.name] = model + + return list(self._model_cache.values()) + + async def register_model(self, model: Model) -> Model: + if not await self.check_model_availability(model.provider_resource_id): + raise ValueError(f"Model {model.provider_resource_id} is not available in Databricks workspace.") + return model + + async def unregister_model(self, model_id: str) -> None: + pass + + async def should_refresh_models(self) -> bool: + return False diff --git a/llama_stack/testing/inference_recorder.py b/llama_stack/testing/inference_recorder.py index 1071da13f..dacf69606 100644 --- a/llama_stack/testing/inference_recorder.py +++ b/llama_stack/testing/inference_recorder.py @@ -267,6 +267,10 @@ async def _patched_inference_method(original_method, self, client_type, endpoint raise ValueError(f"Unknown client type: {client_type}") url = base_url.rstrip("/") + endpoint + # Special handling for Databricks URLs to avoid leaking workspace info + # e.g. https://adb-1234567890123456.7.cloud.databricks.com -> https://...cloud.databricks.com + if "cloud.databricks.com" in url: + url = "__databricks__" + url.split("cloud.databricks.com")[-1] method = "POST" headers = {} body = kwargs diff --git a/tests/integration/inference/test_openai_completion.py b/tests/integration/inference/test_openai_completion.py index b232f8658..8ca3860c3 100644 --- a/tests/integration/inference/test_openai_completion.py +++ b/tests/integration/inference/test_openai_completion.py @@ -98,6 +98,7 @@ def skip_if_doesnt_support_n(client_with_models, model_id): # the entered value was 2. Update the candidateCount value and try again.', 'status': 'INVALID_ARGUMENT'} "remote::tgi", # TGI ignores n param silently "remote::together", # `n` > 1 is not supported when streaming tokens. Please disable `stream` + "remote::databricks", # Bad request: parameter "n" must be equal to 1 for streaming mode ): pytest.skip(f"Model {model_id} hosted by {provider.provider_type} doesn't support n param.") @@ -110,7 +111,6 @@ def skip_if_model_doesnt_support_openai_chat_completion(client_with_models, mode "inline::vllm", "remote::bedrock", "remote::cerebras", - "remote::databricks", "remote::runpod", "remote::watsonx", # watsonx returns 404 when hitting the /openai/v1 endpoint ): diff --git a/tests/integration/inference/test_openai_embeddings.py b/tests/integration/inference/test_openai_embeddings.py index ce3d2a8ea..ff18c0418 100644 --- a/tests/integration/inference/test_openai_embeddings.py +++ b/tests/integration/inference/test_openai_embeddings.py @@ -42,6 +42,7 @@ def skip_if_model_doesnt_support_encoding_format_base64(client, model_id): provider = provider_from_model(client, model_id) if provider.provider_type in ( "remote::together", # param silently ignored, always returns floats + "remote::databricks", # param silently ignored, always returns floats "remote::fireworks", # param silently ignored, always returns list of floats ): pytest.skip(f"Model {model_id} hosted by {provider.provider_type} does not support encoding_format='base64'.") @@ -52,6 +53,8 @@ def skip_if_model_doesnt_support_variable_dimensions(client_with_models, model_i if provider.provider_type in ( "remote::together", # returns 400 "inline::sentence-transformers", + # Error code: 400 - {'error_code': 'BAD_REQUEST', 'message': 'Bad request: json: unknown field "dimensions"\n'} + "remote::databricks", ): pytest.skip( f"Model {model_id} hosted by {provider.provider_type} does not support variable output embedding dimensions." @@ -75,7 +78,6 @@ def skip_if_model_doesnt_support_openai_embeddings(client, model_id): "inline::meta-reference", "remote::bedrock", "remote::cerebras", - "remote::databricks", "remote::runpod", "remote::sambanova", "remote::tgi", diff --git a/tests/integration/recordings/responses/121a72d1c4cf.json b/tests/integration/recordings/responses/121a72d1c4cf.json new file mode 100644 index 000000000..2f4bd7dce --- /dev/null +++ b/tests/integration/recordings/responses/121a72d1c4cf.json @@ -0,0 +1,728 @@ +{ + "request": { + "method": "POST", + "url": "__databricks__/serving-endpoints/v1/chat/completions", + "headers": {}, + "body": { + "model": "databricks-meta-llama-3-3-70b-instruct", + "messages": [ + { + "role": "user", + "content": "Hello, world!" + } + ], + "stream": true + }, + "endpoint": "/v1/chat/completions", + "model": "databricks-meta-llama-3-3-70b-instruct" + }, + "response": { + "body": [ + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "chatcmpl_7268e4ee-3b8e-461e-80dc-608e76f3801d", + "choices": [ + { + "delta": { + "content": "", + "function_call": null, + "refusal": null, + "role": "assistant", + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null + } + ], + "created": 1758326500, + "model": "meta-llama-3.3-70b-instruct-121024", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": null, + "usage": { + "completion_tokens": 3, + "prompt_tokens": 14, + "total_tokens": 17, + "completion_tokens_details": null, + "prompt_tokens_details": null + } + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "chatcmpl_7268e4ee-3b8e-461e-80dc-608e76f3801d", + "choices": [ + { + "delta": { + "content": "Hello! ", + "function_call": null, + "refusal": null, + "role": null, + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null + } + ], + "created": 1758326500, + "model": "meta-llama-3.3-70b-instruct-121024", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": null, + "usage": { + "completion_tokens": 3, + "prompt_tokens": 14, + "total_tokens": 17, + "completion_tokens_details": null, + "prompt_tokens_details": null + } + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "chatcmpl_7268e4ee-3b8e-461e-80dc-608e76f3801d", + "choices": [ + { + "delta": { + "content": "It's ", + "function_call": null, + "refusal": null, + "role": null, + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null + } + ], + "created": 1758326500, + "model": "meta-llama-3.3-70b-instruct-121024", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": null, + "usage": { + "completion_tokens": 5, + "prompt_tokens": 14, + "total_tokens": 19, + "completion_tokens_details": null, + "prompt_tokens_details": null + } + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "chatcmpl_7268e4ee-3b8e-461e-80dc-608e76f3801d", + "choices": [ + { + "delta": { + "content": "nice ", + "function_call": null, + "refusal": null, + "role": null, + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null + } + ], + "created": 1758326500, + "model": "meta-llama-3.3-70b-instruct-121024", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": null, + "usage": { + "completion_tokens": 6, + "prompt_tokens": 14, + "total_tokens": 20, + "completion_tokens_details": null, + "prompt_tokens_details": null + } + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "chatcmpl_7268e4ee-3b8e-461e-80dc-608e76f3801d", + "choices": [ + { + "delta": { + "content": "to ", + "function_call": null, + "refusal": null, + "role": null, + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null + } + ], + "created": 1758326500, + "model": "meta-llama-3.3-70b-instruct-121024", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": null, + "usage": { + "completion_tokens": 7, + "prompt_tokens": 14, + "total_tokens": 21, + "completion_tokens_details": null, + "prompt_tokens_details": null + } + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "chatcmpl_7268e4ee-3b8e-461e-80dc-608e76f3801d", + "choices": [ + { + "delta": { + "content": "meet ", + "function_call": null, + "refusal": null, + "role": null, + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null + } + ], + "created": 1758326500, + "model": "meta-llama-3.3-70b-instruct-121024", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": null, + "usage": { + "completion_tokens": 8, + "prompt_tokens": 14, + "total_tokens": 22, + "completion_tokens_details": null, + "prompt_tokens_details": null + } + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "chatcmpl_7268e4ee-3b8e-461e-80dc-608e76f3801d", + "choices": [ + { + "delta": { + "content": "you. ", + "function_call": null, + "refusal": null, + "role": null, + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null + } + ], + "created": 1758326500, + "model": "meta-llama-3.3-70b-instruct-121024", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": null, + "usage": { + "completion_tokens": 10, + "prompt_tokens": 14, + "total_tokens": 24, + "completion_tokens_details": null, + "prompt_tokens_details": null + } + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "chatcmpl_7268e4ee-3b8e-461e-80dc-608e76f3801d", + "choices": [ + { + "delta": { + "content": "Is ", + "function_call": null, + "refusal": null, + "role": null, + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null + } + ], + "created": 1758326500, + "model": "meta-llama-3.3-70b-instruct-121024", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": null, + "usage": { + "completion_tokens": 11, + "prompt_tokens": 14, + "total_tokens": 25, + "completion_tokens_details": null, + "prompt_tokens_details": null + } + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "chatcmpl_7268e4ee-3b8e-461e-80dc-608e76f3801d", + "choices": [ + { + "delta": { + "content": "there ", + "function_call": null, + "refusal": null, + "role": null, + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null + } + ], + "created": 1758326500, + "model": "meta-llama-3.3-70b-instruct-121024", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": null, + "usage": { + "completion_tokens": 12, + "prompt_tokens": 14, + "total_tokens": 26, + "completion_tokens_details": null, + "prompt_tokens_details": null + } + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "chatcmpl_7268e4ee-3b8e-461e-80dc-608e76f3801d", + "choices": [ + { + "delta": { + "content": "something ", + "function_call": null, + "refusal": null, + "role": null, + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null + } + ], + "created": 1758326500, + "model": "meta-llama-3.3-70b-instruct-121024", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": null, + "usage": { + "completion_tokens": 13, + "prompt_tokens": 14, + "total_tokens": 27, + "completion_tokens_details": null, + "prompt_tokens_details": null + } + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "chatcmpl_7268e4ee-3b8e-461e-80dc-608e76f3801d", + "choices": [ + { + "delta": { + "content": "I ", + "function_call": null, + "refusal": null, + "role": null, + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null + } + ], + "created": 1758326500, + "model": "meta-llama-3.3-70b-instruct-121024", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": null, + "usage": { + "completion_tokens": 14, + "prompt_tokens": 14, + "total_tokens": 28, + "completion_tokens_details": null, + "prompt_tokens_details": null + } + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "chatcmpl_7268e4ee-3b8e-461e-80dc-608e76f3801d", + "choices": [ + { + "delta": { + "content": "can ", + "function_call": null, + "refusal": null, + "role": null, + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null + } + ], + "created": 1758326500, + "model": "meta-llama-3.3-70b-instruct-121024", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": null, + "usage": { + "completion_tokens": 15, + "prompt_tokens": 14, + "total_tokens": 29, + "completion_tokens_details": null, + "prompt_tokens_details": null + } + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "chatcmpl_7268e4ee-3b8e-461e-80dc-608e76f3801d", + "choices": [ + { + "delta": { + "content": "help ", + "function_call": null, + "refusal": null, + "role": null, + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null + } + ], + "created": 1758326500, + "model": "meta-llama-3.3-70b-instruct-121024", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": null, + "usage": { + "completion_tokens": 16, + "prompt_tokens": 14, + "total_tokens": 30, + "completion_tokens_details": null, + "prompt_tokens_details": null + } + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "chatcmpl_7268e4ee-3b8e-461e-80dc-608e76f3801d", + "choices": [ + { + "delta": { + "content": "you ", + "function_call": null, + "refusal": null, + "role": null, + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null + } + ], + "created": 1758326500, + "model": "meta-llama-3.3-70b-instruct-121024", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": null, + "usage": { + "completion_tokens": 17, + "prompt_tokens": 14, + "total_tokens": 31, + "completion_tokens_details": null, + "prompt_tokens_details": null + } + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "chatcmpl_7268e4ee-3b8e-461e-80dc-608e76f3801d", + "choices": [ + { + "delta": { + "content": "with ", + "function_call": null, + "refusal": null, + "role": null, + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null + } + ], + "created": 1758326500, + "model": "meta-llama-3.3-70b-instruct-121024", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": null, + "usage": { + "completion_tokens": 18, + "prompt_tokens": 14, + "total_tokens": 32, + "completion_tokens_details": null, + "prompt_tokens_details": null + } + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "chatcmpl_7268e4ee-3b8e-461e-80dc-608e76f3801d", + "choices": [ + { + "delta": { + "content": "or ", + "function_call": null, + "refusal": null, + "role": null, + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null + } + ], + "created": 1758326500, + "model": "meta-llama-3.3-70b-instruct-121024", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": null, + "usage": { + "completion_tokens": 19, + "prompt_tokens": 14, + "total_tokens": 33, + "completion_tokens_details": null, + "prompt_tokens_details": null + } + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "chatcmpl_7268e4ee-3b8e-461e-80dc-608e76f3801d", + "choices": [ + { + "delta": { + "content": "would ", + "function_call": null, + "refusal": null, + "role": null, + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null + } + ], + "created": 1758326500, + "model": "meta-llama-3.3-70b-instruct-121024", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": null, + "usage": { + "completion_tokens": 20, + "prompt_tokens": 14, + "total_tokens": 34, + "completion_tokens_details": null, + "prompt_tokens_details": null + } + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "chatcmpl_7268e4ee-3b8e-461e-80dc-608e76f3801d", + "choices": [ + { + "delta": { + "content": "you ", + "function_call": null, + "refusal": null, + "role": null, + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null + } + ], + "created": 1758326500, + "model": "meta-llama-3.3-70b-instruct-121024", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": null, + "usage": { + "completion_tokens": 21, + "prompt_tokens": 14, + "total_tokens": 35, + "completion_tokens_details": null, + "prompt_tokens_details": null + } + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "chatcmpl_7268e4ee-3b8e-461e-80dc-608e76f3801d", + "choices": [ + { + "delta": { + "content": "like ", + "function_call": null, + "refusal": null, + "role": null, + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null + } + ], + "created": 1758326500, + "model": "meta-llama-3.3-70b-instruct-121024", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": null, + "usage": { + "completion_tokens": 22, + "prompt_tokens": 14, + "total_tokens": 36, + "completion_tokens_details": null, + "prompt_tokens_details": null + } + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "chatcmpl_7268e4ee-3b8e-461e-80dc-608e76f3801d", + "choices": [ + { + "delta": { + "content": "to ", + "function_call": null, + "refusal": null, + "role": null, + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null + } + ], + "created": 1758326500, + "model": "meta-llama-3.3-70b-instruct-121024", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": null, + "usage": { + "completion_tokens": 23, + "prompt_tokens": 14, + "total_tokens": 37, + "completion_tokens_details": null, + "prompt_tokens_details": null + } + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "chatcmpl_7268e4ee-3b8e-461e-80dc-608e76f3801d", + "choices": [ + { + "delta": { + "content": "chat?", + "function_call": null, + "refusal": null, + "role": null, + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null + } + ], + "created": 1758326500, + "model": "meta-llama-3.3-70b-instruct-121024", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": null, + "usage": { + "completion_tokens": 25, + "prompt_tokens": 14, + "total_tokens": 39, + "completion_tokens_details": null, + "prompt_tokens_details": null + } + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "chatcmpl_7268e4ee-3b8e-461e-80dc-608e76f3801d", + "choices": [ + { + "delta": { + "content": "", + "function_call": null, + "refusal": null, + "role": null, + "tool_calls": null + }, + "finish_reason": "stop", + "index": 0, + "logprobs": null + } + ], + "created": 1758326500, + "model": "meta-llama-3.3-70b-instruct-121024", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": null, + "usage": { + "completion_tokens": 25, + "prompt_tokens": 14, + "total_tokens": 39, + "completion_tokens_details": null, + "prompt_tokens_details": null + } + } + } + ], + "is_streaming": true + } +} diff --git a/tests/integration/recordings/responses/249b7f0ddde6.json b/tests/integration/recordings/responses/249b7f0ddde6.json new file mode 100644 index 000000000..7bb5a221c --- /dev/null +++ b/tests/integration/recordings/responses/249b7f0ddde6.json @@ -0,0 +1,56 @@ +{ + "request": { + "method": "POST", + "url": "__databricks__/serving-endpoints/v1/chat/completions", + "headers": {}, + "body": { + "model": "databricks-meta-llama-3-3-70b-instruct", + "messages": [ + { + "role": "user", + "content": "Hello, world!" + } + ], + "stream": false + }, + "endpoint": "/v1/chat/completions", + "model": "databricks-meta-llama-3-3-70b-instruct" + }, + "response": { + "body": { + "__type__": "openai.types.chat.chat_completion.ChatCompletion", + "__data__": { + "id": "chatcmpl_52eec823-4235-473d-b25a-f0af4ebd4837", + "choices": [ + { + "finish_reason": "stop", + "index": 0, + "logprobs": null, + "message": { + "content": "Hello! It's great to meet you. Is there something I can help you with, or would you like to chat?", + "refusal": null, + "role": "assistant", + "annotations": null, + "audio": null, + "function_call": null, + "tool_calls": null + } + } + ], + "created": 1758326506, + "model": "meta-llama-3.3-70b-instruct-121024", + "object": "chat.completion", + "service_tier": null, + "system_fingerprint": null, + "usage": { + "completion_tokens": 26, + "prompt_tokens": 14, + "total_tokens": 40, + "completion_tokens_details": null, + "prompt_tokens_details": null + } + } + }, + "is_streaming": false + } +} diff --git a/tests/integration/recordings/responses/28648cf8d421.json b/tests/integration/recordings/responses/28648cf8d421.json new file mode 100644 index 000000000..65b1fd216 --- /dev/null +++ b/tests/integration/recordings/responses/28648cf8d421.json @@ -0,0 +1,56 @@ +{ + "request": { + "method": "POST", + "url": "__databricks__/serving-endpoints/v1/chat/completions", + "headers": {}, + "body": { + "model": "databricks-meta-llama-3-3-70b-instruct", + "messages": [ + { + "role": "user", + "content": "Which planet do humans live on?" + } + ], + "stream": false + }, + "endpoint": "/v1/chat/completions", + "model": "databricks-meta-llama-3-3-70b-instruct" + }, + "response": { + "body": { + "__type__": "openai.types.chat.chat_completion.ChatCompletion", + "__data__": { + "id": "chatcmpl_e846ea96-9636-4eb4-bde4-84510478617b", + "choices": [ + { + "finish_reason": "stop", + "index": 0, + "logprobs": null, + "message": { + "content": "Humans live on the planet Earth.", + "refusal": null, + "role": "assistant", + "annotations": null, + "audio": null, + "function_call": null, + "tool_calls": null + } + } + ], + "created": 1758326497, + "model": "meta-llama-3.3-70b-instruct-121024", + "object": "chat.completion", + "service_tier": null, + "system_fingerprint": null, + "usage": { + "completion_tokens": 8, + "prompt_tokens": 17, + "total_tokens": 25, + "completion_tokens_details": null, + "prompt_tokens_details": null + } + } + }, + "is_streaming": false + } +} diff --git a/tests/integration/recordings/responses/29585e055e6f.json b/tests/integration/recordings/responses/29585e055e6f.json new file mode 100644 index 000000000..a65292935 --- /dev/null +++ b/tests/integration/recordings/responses/29585e055e6f.json @@ -0,0 +1,56 @@ +{ + "request": { + "method": "POST", + "url": "__databricks__/serving-endpoints/v1/chat/completions", + "headers": {}, + "body": { + "model": "databricks-meta-llama-3-3-70b-instruct", + "messages": [ + { + "role": "user", + "content": "Which planet has rings around it with a name starting with letter S?" + } + ], + "stream": false + }, + "endpoint": "/v1/chat/completions", + "model": "databricks-meta-llama-3-3-70b-instruct" + }, + "response": { + "body": { + "__type__": "openai.types.chat.chat_completion.ChatCompletion", + "__data__": { + "id": "chatcmpl_094a74d8-2e39-45ce-8eb9-64d505bd24e9", + "choices": [ + { + "finish_reason": "stop", + "index": 0, + "logprobs": null, + "message": { + "content": "The answer is Saturn! Saturn is a planet in our solar system that is known for its stunning ring system. The rings of Saturn are made up of ice and rock particles that range in size from tiny dust grains to massive boulders. They are a beautiful sight to behold, and astronomers and space enthusiasts alike have been fascinated by them for centuries.\n\nSo, the planet with rings around it with a name starting with the letter S is indeed Saturn!", + "refusal": null, + "role": "assistant", + "annotations": null, + "audio": null, + "function_call": null, + "tool_calls": null + } + } + ], + "created": 1758326504, + "model": "meta-llama-3.3-70b-instruct-121024", + "object": "chat.completion", + "service_tier": null, + "system_fingerprint": null, + "usage": { + "completion_tokens": 91, + "prompt_tokens": 24, + "total_tokens": 115, + "completion_tokens_details": null, + "prompt_tokens_details": null + } + } + }, + "is_streaming": false + } +} diff --git a/tests/integration/recordings/responses/3ef0f9aab128.json b/tests/integration/recordings/responses/3ef0f9aab128.json new file mode 100644 index 000000000..622707090 --- /dev/null +++ b/tests/integration/recordings/responses/3ef0f9aab128.json @@ -0,0 +1,344 @@ +{ + "request": { + "method": "POST", + "url": "__databricks__/serving-endpoints/v1/chat/completions", + "headers": {}, + "body": { + "model": "databricks-meta-llama-3-3-70b-instruct", + "messages": [ + { + "role": "user", + "content": "What's the name of the Sun in latin?" + } + ], + "stream": true + }, + "endpoint": "/v1/chat/completions", + "model": "databricks-meta-llama-3-3-70b-instruct" + }, + "response": { + "body": [ + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "chatcmpl_2c653de2-afd4-4075-bc8d-8200562a191b", + "choices": [ + { + "delta": { + "content": "", + "function_call": null, + "refusal": null, + "role": "assistant", + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null + } + ], + "created": 1758326497, + "model": "meta-llama-3.3-70b-instruct-121024", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": null, + "usage": { + "completion_tokens": 2, + "prompt_tokens": 20, + "total_tokens": 22, + "completion_tokens_details": null, + "prompt_tokens_details": null + } + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "chatcmpl_2c653de2-afd4-4075-bc8d-8200562a191b", + "choices": [ + { + "delta": { + "content": "The ", + "function_call": null, + "refusal": null, + "role": null, + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null + } + ], + "created": 1758326497, + "model": "meta-llama-3.3-70b-instruct-121024", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": null, + "usage": { + "completion_tokens": 2, + "prompt_tokens": 20, + "total_tokens": 22, + "completion_tokens_details": null, + "prompt_tokens_details": null + } + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "chatcmpl_2c653de2-afd4-4075-bc8d-8200562a191b", + "choices": [ + { + "delta": { + "content": "Latin ", + "function_call": null, + "refusal": null, + "role": null, + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null + } + ], + "created": 1758326497, + "model": "meta-llama-3.3-70b-instruct-121024", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": null, + "usage": { + "completion_tokens": 3, + "prompt_tokens": 20, + "total_tokens": 23, + "completion_tokens_details": null, + "prompt_tokens_details": null + } + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "chatcmpl_2c653de2-afd4-4075-bc8d-8200562a191b", + "choices": [ + { + "delta": { + "content": "name ", + "function_call": null, + "refusal": null, + "role": null, + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null + } + ], + "created": 1758326497, + "model": "meta-llama-3.3-70b-instruct-121024", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": null, + "usage": { + "completion_tokens": 4, + "prompt_tokens": 20, + "total_tokens": 24, + "completion_tokens_details": null, + "prompt_tokens_details": null + } + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "chatcmpl_2c653de2-afd4-4075-bc8d-8200562a191b", + "choices": [ + { + "delta": { + "content": "for ", + "function_call": null, + "refusal": null, + "role": null, + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null + } + ], + "created": 1758326497, + "model": "meta-llama-3.3-70b-instruct-121024", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": null, + "usage": { + "completion_tokens": 5, + "prompt_tokens": 20, + "total_tokens": 25, + "completion_tokens_details": null, + "prompt_tokens_details": null + } + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "chatcmpl_2c653de2-afd4-4075-bc8d-8200562a191b", + "choices": [ + { + "delta": { + "content": "the ", + "function_call": null, + "refusal": null, + "role": null, + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null + } + ], + "created": 1758326497, + "model": "meta-llama-3.3-70b-instruct-121024", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": null, + "usage": { + "completion_tokens": 6, + "prompt_tokens": 20, + "total_tokens": 26, + "completion_tokens_details": null, + "prompt_tokens_details": null + } + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "chatcmpl_2c653de2-afd4-4075-bc8d-8200562a191b", + "choices": [ + { + "delta": { + "content": "Sun ", + "function_call": null, + "refusal": null, + "role": null, + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null + } + ], + "created": 1758326497, + "model": "meta-llama-3.3-70b-instruct-121024", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": null, + "usage": { + "completion_tokens": 7, + "prompt_tokens": 20, + "total_tokens": 27, + "completion_tokens_details": null, + "prompt_tokens_details": null + } + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "chatcmpl_2c653de2-afd4-4075-bc8d-8200562a191b", + "choices": [ + { + "delta": { + "content": "is ", + "function_call": null, + "refusal": null, + "role": null, + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null + } + ], + "created": 1758326497, + "model": "meta-llama-3.3-70b-instruct-121024", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": null, + "usage": { + "completion_tokens": 8, + "prompt_tokens": 20, + "total_tokens": 28, + "completion_tokens_details": null, + "prompt_tokens_details": null + } + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "chatcmpl_2c653de2-afd4-4075-bc8d-8200562a191b", + "choices": [ + { + "delta": { + "content": "\"Sol\".", + "function_call": null, + "refusal": null, + "role": null, + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null + } + ], + "created": 1758326498, + "model": "meta-llama-3.3-70b-instruct-121024", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": null, + "usage": { + "completion_tokens": 11, + "prompt_tokens": 20, + "total_tokens": 31, + "completion_tokens_details": null, + "prompt_tokens_details": null + } + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "chatcmpl_2c653de2-afd4-4075-bc8d-8200562a191b", + "choices": [ + { + "delta": { + "content": "", + "function_call": null, + "refusal": null, + "role": null, + "tool_calls": null + }, + "finish_reason": "stop", + "index": 0, + "logprobs": null + } + ], + "created": 1758326498, + "model": "meta-llama-3.3-70b-instruct-121024", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": null, + "usage": { + "completion_tokens": 11, + "prompt_tokens": 20, + "total_tokens": 31, + "completion_tokens_details": null, + "prompt_tokens_details": null + } + } + } + ], + "is_streaming": true + } +} diff --git a/tests/integration/recordings/responses/441e2832387f.json b/tests/integration/recordings/responses/441e2832387f.json new file mode 100644 index 000000000..f61876dff --- /dev/null +++ b/tests/integration/recordings/responses/441e2832387f.json @@ -0,0 +1,1061 @@ +{ + "request": { + "method": "POST", + "url": "__databricks__/serving-endpoints/v1/embeddings", + "headers": {}, + "body": { + "model": "databricks-bge-large-en", + "input": "This is completely different content", + "encoding_format": "float" + }, + "endpoint": "/v1/embeddings", + "model": "databricks-bge-large-en" + }, + "response": { + "body": { + "__type__": "openai.types.create_embedding_response.CreateEmbeddingResponse", + "__data__": { + "data": [ + { + "embedding": [ + 0.005889892578125, + 0.03662109375, + 0.00455474853515625, + -0.01403045654296875, + -0.0139312744140625, + -0.044647216796875, + -0.033111572265625, + 0.006198883056640625, + 0.009521484375, + 0.02587890625, + 0.0250396728515625, + 0.0076904296875, + 0.02386474609375, + -0.07257080078125, + -0.033843994140625, + -0.04425048828125, + -0.0298004150390625, + -0.005153656005859375, + -0.06475830078125, + 0.01128387451171875, + -0.0176849365234375, + 0.0234527587890625, + -0.052398681640625, + -0.029266357421875, + 0.006107330322265625, + 0.006404876708984375, + -0.00574493408203125, + 0.029296875, + 0.05401611328125, + 0.077392578125, + 0.026885986328125, + 0.0233612060546875, + -0.040985107421875, + -0.057281494140625, + 0.02801513671875, + 0.01204681396484375, + 0.0341796875, + -0.0088348388671875, + -0.037322998046875, + -0.01293182373046875, + -0.00850677490234375, + -0.0379638671875, + 0.061737060546875, + -0.002628326416015625, + -0.0726318359375, + 0.005680084228515625, + -0.024383544921875, + 0.0057830810546875, + 0.004962921142578125, + -0.0211029052734375, + -0.0009322166442871094, + -0.01172637939453125, + 0.03814697265625, + 0.031829833984375, + 0.00893402099609375, + -0.0103912353515625, + -0.0096435546875, + 0.0013179779052734375, + -0.0169525146484375, + 0.029388427734375, + -0.0293426513671875, + 0.0229949951171875, + 0.032196044921875, + -0.041656494140625, + 0.03936767578125, + -0.002346038818359375, + -0.06414794921875, + -0.030029296875, + 0.0117340087890625, + -0.0699462890625, + -0.0187530517578125, + 0.029632568359375, + 0.006427764892578125, + -0.00824737548828125, + -0.0279541015625, + -0.00687408447265625, + -0.04034423828125, + 0.0058746337890625, + 0.0391845703125, + 0.0206451416015625, + 0.013397216796875, + 0.03936767578125, + -0.0264892578125, + -0.01320648193359375, + -0.07244873046875, + -0.01422119140625, + 0.017425537109375, + 0.0238189697265625, + 0.0158233642578125, + 0.00638580322265625, + 0.0133056640625, + 0.034637451171875, + -0.044891357421875, + -0.035552978515625, + 0.0017194747924804688, + 0.032135009765625, + -0.00498199462890625, + 0.038116455078125, + -0.004489898681640625, + -0.0201263427734375, + 0.03704833984375, + -0.0044097900390625, + 0.04345703125, + 0.0657958984375, + -0.0523681640625, + 0.0046539306640625, + 0.0281982421875, + -0.019073486328125, + -0.04541015625, + -0.0288238525390625, + -0.01512908935546875, + -0.029205322265625, + 0.0159759521484375, + -0.0270233154296875, + 0.016571044921875, + 0.06243896484375, + -0.00286865234375, + 0.0225982666015625, + -0.0308074951171875, + -0.054168701171875, + 0.03265380859375, + -0.004390716552734375, + -0.038909912109375, + 0.0028820037841796875, + 0.03350830078125, + -0.04388427734375, + 0.018646240234375, + 0.047607421875, + -0.00824737548828125, + 0.0076446533203125, + 0.0247344970703125, + -0.0589599609375, + 0.0035724639892578125, + 0.0273895263671875, + 0.01824951171875, + 9.298324584960938e-06, + 0.005329132080078125, + 0.027801513671875, + -0.038055419921875, + -0.001285552978515625, + -0.0036182403564453125, + 0.0230712890625, + -0.01540374755859375, + 0.053314208984375, + 0.00814056396484375, + -0.0184783935546875, + 0.0399169921875, + -0.0167083740234375, + -0.033477783203125, + 0.0292510986328125, + 0.0068359375, + -0.0259552001953125, + 0.00730133056640625, + 0.0019626617431640625, + -0.05096435546875, + -0.011810302734375, + 0.019317626953125, + 0.0090484619140625, + -0.024871826171875, + 0.00749969482421875, + -0.0242767333984375, + 0.034912109375, + -0.01163482666015625, + 0.060455322265625, + -0.0188140869140625, + 0.0308074951171875, + -0.03948974609375, + -0.0166473388671875, + -0.022308349609375, + -0.0123138427734375, + 0.004344940185546875, + 0.01180267333984375, + -0.035980224609375, + 0.0021114349365234375, + 0.0272369384765625, + 0.05224609375, + 0.02679443359375, + 0.0104217529296875, + 0.05029296875, + 0.0626220703125, + -0.0276031494140625, + 0.034088134765625, + 0.01763916015625, + 0.0384521484375, + 0.0278472900390625, + -0.050537109375, + 0.0304107666015625, + -0.0770263671875, + -0.03240966796875, + -0.0172882080078125, + 0.0028133392333984375, + 0.04296875, + -0.02532958984375, + 0.0228424072265625, + 0.0517578125, + 0.0209197998046875, + -0.043914794921875, + -0.0236663818359375, + 0.007259368896484375, + -0.09613037109375, + -0.03155517578125, + 0.024169921875, + -0.038299560546875, + 0.067138671875, + 0.02850341796875, + 0.006702423095703125, + 0.04388427734375, + 0.06329345703125, + -0.01103973388671875, + -0.0004940032958984375, + -0.004425048828125, + 0.007343292236328125, + -0.0135040283203125, + 0.00536346435546875, + 0.019561767578125, + -0.022186279296875, + -0.07403564453125, + 0.0162353515625, + -0.0423583984375, + -0.007659912109375, + 0.0005707740783691406, + 0.0404052734375, + 0.052520751953125, + 0.027801513671875, + 0.0155487060546875, + 0.0110015869140625, + 0.01172637939453125, + 0.030670166015625, + -0.009979248046875, + -0.033538818359375, + -0.00862884521484375, + 0.0263671875, + -0.022705078125, + 0.0166473388671875, + 0.017486572265625, + 0.0033206939697265625, + 0.03814697265625, + 0.021026611328125, + -0.031524658203125, + 0.005008697509765625, + 0.0229644775390625, + 0.0211029052734375, + 0.09307861328125, + 0.035888671875, + 0.0220794677734375, + -0.0092315673828125, + 0.0141754150390625, + 0.00789642333984375, + 0.004543304443359375, + 0.0177154541015625, + 0.0209808349609375, + 0.0008139610290527344, + 0.047149658203125, + -0.0045166015625, + -0.014984130859375, + 0.01751708984375, + 0.01311492919921875, + 0.048004150390625, + -0.037384033203125, + -0.00403594970703125, + -0.01155853271484375, + 0.014434814453125, + -0.0121002197265625, + -0.00244903564453125, + -0.0005030632019042969, + -0.047027587890625, + -0.02947998046875, + -0.02691650390625, + -0.01200103759765625, + -0.031494140625, + -0.0599365234375, + -0.08416748046875, + -0.0511474609375, + 0.00531768798828125, + -0.013641357421875, + -0.0012845993041992188, + 0.057708740234375, + -0.00951385498046875, + 0.07830810546875, + -0.022613525390625, + -0.0171661376953125, + 0.004962921142578125, + -0.020904541015625, + 0.021728515625, + 0.0118255615234375, + -0.009674072265625, + -0.046630859375, + 0.01224517822265625, + 0.01244354248046875, + -0.01189422607421875, + -0.00862884521484375, + 0.04400634765625, + 0.003513336181640625, + 0.022186279296875, + 0.0045013427734375, + 0.038818359375, + 0.006313323974609375, + -0.0112762451171875, + 0.0013637542724609375, + -0.032440185546875, + -0.022216796875, + 0.003993988037109375, + -0.0113372802734375, + 0.00848388671875, + -0.00128173828125, + 0.0343017578125, + 0.06561279296875, + -0.032684326171875, + 0.054901123046875, + 0.02728271484375, + -0.01209259033203125, + 0.0179901123046875, + 0.0156097412109375, + 0.06671142578125, + -0.02117919921875, + 0.0224456787109375, + 0.01959228515625, + 0.04803466796875, + 0.01491546630859375, + -0.02593994140625, + 0.004741668701171875, + -0.04034423828125, + 0.03582763671875, + -0.01186370849609375, + -0.01049041748046875, + 0.0102996826171875, + 0.01235198974609375, + -0.0833740234375, + 0.0124053955078125, + -0.040924072265625, + -0.0230255126953125, + -0.0316162109375, + -0.038848876953125, + -0.0401611328125, + 0.017669677734375, + -0.0217132568359375, + -0.0073699951171875, + -0.01194000244140625, + -0.0012226104736328125, + -0.0044403076171875, + -0.0087127685546875, + -0.010833740234375, + -0.0004792213439941406, + 0.04132080078125, + 0.02874755859375, + 0.012542724609375, + -0.043060302734375, + -0.00215911865234375, + 0.015594482421875, + 0.02294921875, + -0.004100799560546875, + -0.01419830322265625, + -0.0084686279296875, + 0.025665283203125, + 0.01108551025390625, + 0.0179290771484375, + -0.014129638671875, + 0.033477783203125, + 0.01270294189453125, + -0.030670166015625, + 0.0099945068359375, + 0.0003094673156738281, + 0.0244140625, + -0.07879638671875, + -0.030120849609375, + -0.020416259765625, + -0.01873779296875, + 0.051361083984375, + 0.0293121337890625, + -0.042633056640625, + 0.059783935546875, + -0.002498626708984375, + -0.04345703125, + 0.0031948089599609375, + -0.0242156982421875, + -0.0129852294921875, + 0.047149658203125, + -0.01375579833984375, + 0.04638671875, + -0.06341552734375, + -0.027496337890625, + -0.008331298828125, + 0.03338623046875, + 0.021453857421875, + 0.0252685546875, + 0.0159149169921875, + -0.030548095703125, + -0.060394287109375, + 0.030059814453125, + -0.01552581787109375, + -0.017608642578125, + -0.00232696533203125, + 0.0185394287109375, + -0.00392913818359375, + -0.023773193359375, + -0.0206298828125, + 0.0286712646484375, + 0.0280609130859375, + 0.07501220703125, + 0.044281005859375, + 0.044677734375, + 0.01454925537109375, + 0.00276947021484375, + 0.026947021484375, + -0.07177734375, + -0.00011664628982543945, + 0.013458251953125, + 0.032073974609375, + -0.03179931640625, + 0.021484375, + -0.040069580078125, + -0.00019931793212890625, + -0.03131103515625, + 0.045379638671875, + -0.00018787384033203125, + 0.0045013427734375, + -0.0202178955078125, + -0.022247314453125, + 0.01322174072265625, + 0.0283660888671875, + -0.02520751953125, + 0.006397247314453125, + -0.01971435546875, + 0.00017535686492919922, + -0.0210418701171875, + -0.047149658203125, + -0.01512908935546875, + -0.04083251953125, + 0.04595947265625, + -0.034149169921875, + 0.004978179931640625, + -0.0341796875, + 0.0064544677734375, + -0.0814208984375, + -0.030120849609375, + 0.00618743896484375, + 0.0210113525390625, + 0.009124755859375, + 0.01287841796875, + -0.0167999267578125, + 0.0189666748046875, + 0.052490234375, + -0.030181884765625, + -0.00571441650390625, + 0.0006885528564453125, + -0.00867462158203125, + 0.03314208984375, + 0.032012939453125, + -0.02362060546875, + 0.00484466552734375, + -0.0283966064453125, + -0.04296875, + 0.0222320556640625, + -0.033355712890625, + 0.0308685302734375, + -0.01480865478515625, + -0.02447509765625, + 0.06158447265625, + 0.010894775390625, + -0.00445556640625, + 0.009613037109375, + 0.0086212158203125, + -0.00328826904296875, + -0.04718017578125, + -0.0202484130859375, + 0.048492431640625, + -0.0139923095703125, + 0.0059814453125, + 0.01212310791015625, + -0.0123748779296875, + -0.0006394386291503906, + 0.009002685546875, + -0.00732421875, + -0.03265380859375, + 0.024688720703125, + -0.025848388671875, + -0.000652313232421875, + 0.0202484130859375, + 0.00806427001953125, + -0.031707763671875, + -0.018218994140625, + 0.022369384765625, + 0.00391387939453125, + 0.0027618408203125, + -0.042877197265625, + -0.031158447265625, + -0.04754638671875, + -0.0161285400390625, + 0.0235137939453125, + 0.004619598388671875, + -0.01904296875, + -0.0128326416015625, + 0.0182952880859375, + -0.017578125, + 0.01351165771484375, + -0.01287078857421875, + -0.019073486328125, + -0.006992340087890625, + 0.0102996826171875, + 0.0202789306640625, + 0.034637451171875, + -0.0435791015625, + -0.0469970703125, + 0.01523590087890625, + -0.0235748291015625, + 0.0009484291076660156, + -0.028106689453125, + -0.00466156005859375, + 0.03240966796875, + -0.01348114013671875, + -0.00836181640625, + 0.00905609130859375, + -0.006557464599609375, + 0.0305023193359375, + 0.0045318603515625, + 0.0341796875, + -0.018096923828125, + -0.029205322265625, + 0.00849151611328125, + 0.021484375, + 0.01548004150390625, + 0.0013208389282226562, + -0.03790283203125, + -0.0008292198181152344, + 0.01470947265625, + 0.0080413818359375, + 0.01593017578125, + -0.047454833984375, + -0.0290679931640625, + -0.039337158203125, + 0.0169525146484375, + -0.02227783203125, + 0.00890350341796875, + -0.049346923828125, + -0.007007598876953125, + -0.0034503936767578125, + 0.06231689453125, + -0.0172119140625, + -0.0377197265625, + 0.019775390625, + -0.0225982666015625, + -0.029571533203125, + -0.049560546875, + -0.01462554931640625, + -0.006298065185546875, + -0.01104736328125, + -0.046722412109375, + 0.09295654296875, + -0.01861572265625, + 0.0007691383361816406, + -0.0166015625, + -0.007537841796875, + -0.0026874542236328125, + 0.00222015380859375, + -0.04345703125, + -0.05328369140625, + 0.01209259033203125, + 0.006122589111328125, + -0.00672149658203125, + 0.05181884765625, + -0.044708251953125, + 0.060760498046875, + -0.053802490234375, + 0.004150390625, + 0.025238037109375, + 0.031585693359375, + -0.0145263671875, + 0.0059967041015625, + 0.03497314453125, + -0.049530029296875, + -0.001049041748046875, + 0.006557464599609375, + -0.002605438232421875, + 0.0203094482421875, + -0.03387451171875, + -0.0124053955078125, + 0.0227508544921875, + -0.0116424560546875, + -0.02105712890625, + 0.011383056640625, + -0.00797271728515625, + -0.0277557373046875, + -0.0438232421875, + 0.007556915283203125, + 0.0302581787109375, + -0.05389404296875, + 0.030029296875, + 0.04803466796875, + 0.00606536865234375, + -0.03179931640625, + -0.062744140625, + 0.01119232177734375, + 0.009796142578125, + 0.03515625, + 0.0295257568359375, + -0.022247314453125, + -0.00946807861328125, + -0.01390838623046875, + -0.0202178955078125, + 0.0163421630859375, + -0.04443359375, + -0.02691650390625, + 0.060882568359375, + -0.04241943359375, + -0.006923675537109375, + 0.003765106201171875, + -0.058441162109375, + -0.0232086181640625, + 0.0264129638671875, + 0.06494140625, + 0.05230712890625, + 0.05859375, + 0.0176849365234375, + 0.0270233154296875, + -0.017730712890625, + -0.01433563232421875, + 0.007747650146484375, + -0.0239410400390625, + 0.06805419921875, + -0.0028285980224609375, + -0.052734375, + 0.040802001953125, + 0.0261077880859375, + -0.07470703125, + -0.0298309326171875, + -0.0452880859375, + 0.00824737548828125, + -0.010650634765625, + -0.0192108154296875, + 0.01433563232421875, + -0.047698974609375, + 0.0180511474609375, + 0.028564453125, + 0.015869140625, + -0.0207366943359375, + 0.027191162109375, + 0.027618408203125, + -0.039306640625, + 0.00316619873046875, + 0.01094818115234375, + 0.0018987655639648438, + -0.039306640625, + -0.01837158203125, + -0.0157012939453125, + -0.00572967529296875, + 0.0391845703125, + 0.0233917236328125, + 0.0238189697265625, + -0.041107177734375, + -0.004375457763671875, + -0.0171051025390625, + -0.0135498046875, + -0.0026378631591796875, + 0.00885009765625, + 0.00708770751953125, + 0.0175628662109375, + -0.044097900390625, + -0.0238494873046875, + -0.00856781005859375, + -0.01554107666015625, + 0.0017499923706054688, + 0.0264434814453125, + -0.04473876953125, + 0.0244293212890625, + 0.045867919921875, + -0.0013370513916015625, + -0.01371002197265625, + 0.006992340087890625, + -0.060882568359375, + -0.0357666015625, + -0.0117950439453125, + -0.0157012939453125, + -0.0185089111328125, + -0.0108489990234375, + 0.026336669921875, + 0.0172271728515625, + -0.0096435546875, + 0.0005636215209960938, + 0.07177734375, + -0.01287078857421875, + 0.0176544189453125, + -0.0161895751953125, + 0.028533935546875, + -0.0262603759765625, + -0.044769287109375, + 0.0121612548828125, + -0.0675048828125, + 0.0328369140625, + -0.04119873046875, + -0.032073974609375, + 0.0220794677734375, + -0.0207061767578125, + 0.03759765625, + 0.023345947265625, + 0.039520263671875, + -0.0273590087890625, + -0.041229248046875, + 0.0235137939453125, + 0.0162200927734375, + 0.0101776123046875, + 0.003505706787109375, + 0.0025691986083984375, + -0.010986328125, + -0.006969451904296875, + -0.001949310302734375, + -0.0650634765625, + -0.021270751953125, + -0.0020580291748046875, + -0.0175323486328125, + 0.007450103759765625, + -0.05426025390625, + -0.0309600830078125, + 0.004131317138671875, + -0.0135345458984375, + 0.01113128662109375, + -0.01435089111328125, + -0.01458740234375, + 0.03460693359375, + -0.040496826171875, + -0.0430908203125, + 0.042724609375, + -0.029632568359375, + 0.0760498046875, + -0.0113067626953125, + 0.0239715576171875, + -0.01203155517578125, + -0.0170135498046875, + 0.035003662109375, + 0.044158935546875, + 0.00901031494140625, + 0.004322052001953125, + -0.0270843505859375, + 0.021087646484375, + -0.015838623046875, + 0.00946044921875, + -0.0081787109375, + -0.0225067138671875, + 0.0008111000061035156, + 0.0120849609375, + 0.056854248046875, + 0.03277587890625, + -0.00989532470703125, + -0.0304107666015625, + -0.0126800537109375, + -0.01305389404296875, + -0.0086212158203125, + 0.031341552734375, + 0.0038909912109375, + -0.0179595947265625, + 0.037567138671875, + -0.023773193359375, + 0.02117919921875, + -0.016571044921875, + -0.0264129638671875, + 0.007450103759765625, + 0.0221710205078125, + 0.0094451904296875, + -0.02569580078125, + -0.009979248046875, + -0.0186004638671875, + 0.00505828857421875, + -0.0160980224609375, + 0.013275146484375, + 0.01322174072265625, + 0.0350341796875, + -0.0035552978515625, + -0.06317138671875, + 0.0192108154296875, + 0.01110076904296875, + -0.01422119140625, + 0.0176239013671875, + -0.024658203125, + 0.0133514404296875, + 0.00501251220703125, + -0.00806427001953125, + 0.0150604248046875, + 0.00988006591796875, + -0.0296478271484375, + 0.0207366943359375, + 0.004566192626953125, + -0.007236480712890625, + -0.029022216796875, + 0.035797119140625, + 0.05859375, + -0.0169677734375, + -0.027191162109375, + 0.049591064453125, + 0.00817108154296875, + 0.003818511962890625, + -0.01067352294921875, + 0.007610321044921875, + 0.00888824462890625, + -0.0102691650390625, + 0.00792694091796875, + 0.002132415771484375, + 0.048675537109375, + 0.058013916015625, + -0.0027027130126953125, + -0.0032215118408203125, + 0.0228118896484375, + 0.04052734375, + -0.00669097900390625, + 0.0035495758056640625, + -0.03070068359375, + -0.015350341796875, + -0.03668212890625, + -0.04974365234375, + -0.01354217529296875, + 0.005977630615234375, + 0.013641357421875, + -0.004852294921875, + 0.00846099853515625, + -0.02398681640625, + -0.0153350830078125, + -0.04718017578125, + 0.00800323486328125, + 0.033660888671875, + -0.045684814453125, + 0.0175323486328125, + -0.0186614990234375, + -0.0014123916625976562, + -0.03472900390625, + 0.039459228515625, + -0.0204315185546875, + 0.0143890380859375, + 0.033203125, + 0.0093994140625, + 0.013824462890625, + 0.07568359375, + 0.0186920166015625, + 0.018035888671875, + -0.0015544891357421875, + -0.004608154296875, + 0.019744873046875, + 0.018310546875, + -0.00574493408203125, + -0.03265380859375, + -0.0565185546875, + -0.01178741455078125, + 0.0019626617431640625, + -0.00908660888671875, + -0.015869140625, + 0.0146484375, + 0.0153350830078125, + -0.04595947265625, + 0.0166473388671875, + -0.0185699462890625, + 0.01082611083984375, + 0.016998291015625, + 0.0123443603515625, + -0.061614990234375, + -0.0255279541015625, + 2.6702880859375e-05, + 0.01285552978515625, + 0.007755279541015625, + 0.0384521484375, + -0.03338623046875, + 0.09210205078125, + 0.0340576171875, + -0.04547119140625, + 0.0037212371826171875, + 0.016693115234375, + 0.0276336669921875, + -0.0491943359375, + 0.0108795166015625, + -0.032745361328125, + 0.0026111602783203125, + 0.033050537109375, + -0.0260772705078125, + 0.025360107421875, + 0.0216522216796875, + -0.0181884765625, + -0.02813720703125, + 0.006916046142578125, + 0.0438232421875, + -0.0208587646484375, + 0.006694793701171875, + 0.042510986328125, + 0.0310821533203125, + 0.018646240234375, + 0.006679534912109375, + -0.0242462158203125, + -0.024627685546875, + -0.017852783203125, + -0.03997802734375, + 0.01947021484375, + -0.04144287109375, + -0.01554107666015625, + -0.03564453125, + -0.03253173828125, + 0.00821685791015625, + -0.00682830810546875, + -0.00689697265625, + -0.05438232421875, + 0.032684326171875, + -0.01352691650390625, + 0.0199127197265625, + 0.0220794677734375, + -0.043670654296875, + -0.0447998046875, + 0.033355712890625, + 0.03863525390625, + 0.03863525390625, + 0.05340576171875, + 0.0552978515625, + 0.01355743408203125, + 0.0294952392578125, + -0.03680419921875, + 0.040557861328125, + -0.006328582763671875, + -0.0758056640625, + -0.04296875, + 0.0003204345703125, + 0.00783538818359375, + -0.00736236572265625, + 0.06103515625, + 0.07342529296875, + -0.035247802734375, + -0.018585205078125, + -0.08740234375, + 0.01611328125, + -0.027191162109375, + -0.02789306640625, + -0.058929443359375, + 0.037994384765625, + 0.0032634735107421875, + 0.000904083251953125, + 0.00237274169921875, + -0.053314208984375, + 0.252197265625, + 0.0201416015625, + 0.020294189453125, + -0.039764404296875, + 0.031219482421875, + 0.0716552734375, + -0.00881195068359375, + -0.042633056640625, + 0.033721923828125, + -0.0186614990234375, + 0.0408935546875, + -0.04510498046875, + 0.0010547637939453125, + 0.039459228515625, + -0.003971099853515625, + 0.046173095703125, + -0.01324462890625, + 0.01239776611328125, + 0.01861572265625, + -0.02569580078125, + -0.029937744140625, + 0.004360198974609375, + -0.01396942138671875, + 0.053070068359375, + -0.006992340087890625, + -0.00678253173828125, + -0.00962066650390625, + -0.0280914306640625, + 0.0233154296875, + -2.8192996978759766e-05, + 0.035247802734375, + -0.01180267333984375, + 0.017913818359375, + -0.0217132568359375, + -0.07159423828125, + 0.032684326171875, + -0.0134429931640625, + -2.8014183044433594e-06, + 0.0214691162109375, + 0.00933074951171875, + -0.0262298583984375, + 0.01715087890625, + 0.05853271484375, + 0.0016260147094726562, + 0.0115203857421875, + 0.0285186767578125, + -0.01525115966796875, + 0.01490020751953125, + 0.008758544921875, + -0.03143310546875, + 0.01473236083984375, + -0.0310821533203125, + 0.052490234375, + -0.04559326171875, + -0.028228759765625, + -0.0306396484375, + 0.053314208984375, + -0.02252197265625, + 0.01259613037109375, + -0.041351318359375, + 0.050689697265625, + 0.029510498046875, + -0.0048370361328125, + 0.0228729248046875, + -0.07598876953125, + 0.002864837646484375, + 0.025634765625, + 0.037841796875, + 0.0079345703125, + -0.01256561279296875, + -0.0172271728515625, + 0.014862060546875, + 0.01177978515625, + -0.01216888427734375, + 0.032257080078125, + 0.0227813720703125, + -0.0308990478515625, + 0.01556396484375, + 0.037628173828125, + 0.004791259765625, + -0.05010986328125, + -0.030029296875, + -0.0085601806640625, + 0.0182952880859375, + 0.0045623779296875, + 0.0187835693359375, + -0.0009293556213378906, + 0.017181396484375, + -0.0096435546875, + 0.0160064697265625, + 0.003387451171875, + 0.019317626953125, + 0.0026836395263671875, + 0.0135040283203125, + 0.01096343994140625 + ], + "index": 0, + "object": "embedding" + } + ], + "model": "bge-large-en-v1.5", + "object": "list", + "usage": { + "prompt_tokens": 7, + "total_tokens": 7 + }, + "id": "99bb4102-70b2-4de8-b079-11ceba9e2356" + } + }, + "is_streaming": false + } +} diff --git a/tests/integration/recordings/responses/5fa0e98f3d84.json b/tests/integration/recordings/responses/5fa0e98f3d84.json new file mode 100644 index 000000000..6d1934db3 --- /dev/null +++ b/tests/integration/recordings/responses/5fa0e98f3d84.json @@ -0,0 +1,1061 @@ +{ + "request": { + "method": "POST", + "url": "__databricks__/serving-endpoints/v1/embeddings", + "headers": {}, + "body": { + "model": "databricks-bge-large-en", + "input": "This is the first text", + "encoding_format": "float" + }, + "endpoint": "/v1/embeddings", + "model": "databricks-bge-large-en" + }, + "response": { + "body": { + "__type__": "openai.types.create_embedding_response.CreateEmbeddingResponse", + "__data__": { + "data": [ + { + "embedding": [ + -0.01300048828125, + -0.0307769775390625, + 0.0278472900390625, + 0.0173797607421875, + -0.004108428955078125, + -0.019775390625, + -0.005260467529296875, + -0.01538848876953125, + 0.0567626953125, + 0.003536224365234375, + -0.0169219970703125, + 0.0191802978515625, + 0.0301971435546875, + 0.021575927734375, + -0.036102294921875, + -0.0178375244140625, + -0.03515625, + -0.005229949951171875, + -0.05975341796875, + 0.015533447265625, + -0.03729248046875, + 0.0310516357421875, + -0.11224365234375, + -0.0496826171875, + -0.0016756057739257812, + 0.0186614990234375, + -0.01056671142578125, + 0.0153350830078125, + 0.0567626953125, + 0.058746337890625, + 0.00414276123046875, + 0.0159149169921875, + 0.0209808349609375, + -0.0246429443359375, + -0.01021575927734375, + -0.01007080078125, + 0.0307464599609375, + -0.036590576171875, + -0.0290374755859375, + -0.04132080078125, + 0.0186614990234375, + 0.02069091796875, + 0.0469970703125, + 0.01215362548828125, + -0.07952880859375, + -0.0269317626953125, + -0.01092529296875, + -0.03765869140625, + 0.0024623870849609375, + -0.05084228515625, + -0.00670623779296875, + -0.0273895263671875, + 0.028656005859375, + 0.00414276123046875, + 0.014923095703125, + 0.00577545166015625, + -0.0271759033203125, + -0.01259613037109375, + -0.024932861328125, + 0.019287109375, + 0.027099609375, + 0.01190948486328125, + 0.020782470703125, + -0.0271148681640625, + -0.01309967041015625, + 0.0008511543273925781, + -0.0255126953125, + -0.01064300537109375, + 0.0301361083984375, + -0.0207672119140625, + -0.0238494873046875, + 0.039703369140625, + -0.004852294921875, + -0.035675048828125, + -0.031646728515625, + 0.0097503662109375, + -0.0361328125, + -0.01041412353515625, + -0.0258026123046875, + 0.04144287109375, + -0.003757476806640625, + 0.0242156982421875, + 0.01155853271484375, + -0.006023406982421875, + -0.055084228515625, + -0.033355712890625, + -0.02618408203125, + 0.002880096435546875, + -0.007568359375, + 0.0033969879150390625, + 0.031341552734375, + 0.040679931640625, + -0.009735107421875, + 0.036346435546875, + 0.032470703125, + 0.034210205078125, + -0.02166748046875, + 0.0291290283203125, + 0.012969970703125, + 0.022979736328125, + 0.0246429443359375, + 0.0496826171875, + -0.0250091552734375, + 0.0611572265625, + -0.04180908203125, + 0.0034999847412109375, + -0.00743865966796875, + 0.004436492919921875, + -0.0298309326171875, + -0.0201873779296875, + 0.0005083084106445312, + -0.004283905029296875, + 0.033447265625, + 0.0010995864868164062, + -0.037261962890625, + 0.032806396484375, + 0.017181396484375, + 0.0028533935546875, + -0.0164794921875, + 0.02081298828125, + 0.005153656005859375, + 0.042724609375, + -0.002956390380859375, + -0.0309600830078125, + -0.0206298828125, + -0.01181793212890625, + -0.0019388198852539062, + 0.064697265625, + -0.029296875, + 0.0205078125, + 0.0117950439453125, + -0.04632568359375, + 0.03485107421875, + 0.046478271484375, + -0.01471710205078125, + 0.00803375244140625, + 0.003437042236328125, + 0.00856781005859375, + 0.01177215576171875, + -0.0487060546875, + -0.011383056640625, + -0.0186767578125, + -0.01123046875, + 0.080810546875, + 0.0056304931640625, + 0.0104522705078125, + -0.033203125, + 0.0024662017822265625, + -0.054962158203125, + 0.0694580078125, + -0.024749755859375, + 0.03118896484375, + -0.0007967948913574219, + 0.01020050048828125, + -0.01641845703125, + -0.00728607177734375, + -0.00225067138671875, + -0.01412200927734375, + -0.0150146484375, + -0.0005183219909667969, + -0.00033545494079589844, + 0.0165252685546875, + -0.036773681640625, + 0.0170135498046875, + -0.0225830078125, + 0.0224609375, + -0.006313323974609375, + 0.0167083740234375, + 0.0267791748046875, + -0.0062103271484375, + -0.0037822723388671875, + 0.0220947265625, + 0.006069183349609375, + 0.03631591796875, + 0.0121917724609375, + 0.00653839111328125, + -0.00872802734375, + 0.00353240966796875, + 0.05755615234375, + 0.0115509033203125, + 0.0150146484375, + 0.004638671875, + 0.033233642578125, + 0.034759521484375, + 0.00016629695892333984, + 0.00634002685546875, + -0.004199981689453125, + -0.03656005859375, + -0.01055145263671875, + 0.01349639892578125, + -0.0182952880859375, + 0.0107879638671875, + -0.01959228515625, + 0.0286865234375, + 0.037109375, + 0.00951385498046875, + -0.022186279296875, + -0.00518798828125, + -0.012237548828125, + -0.0760498046875, + -0.04241943359375, + 0.032318115234375, + -0.0208892822265625, + 0.04150390625, + -0.027008056640625, + -0.0102691650390625, + 0.0223388671875, + 0.069091796875, + -0.0174713134765625, + 0.00495147705078125, + 0.018218994140625, + -0.0037670135498046875, + -0.05859375, + 0.036346435546875, + 0.0281982421875, + -0.0225830078125, + -0.059722900390625, + 0.02783203125, + -0.004913330078125, + -0.005916595458984375, + -0.01027679443359375, + 0.0146636962890625, + 0.039276123046875, + 0.03839111328125, + -7.092952728271484e-06, + 0.0035457611083984375, + -0.017578125, + 0.060516357421875, + -0.027496337890625, + -0.0276641845703125, + 0.00525665283203125, + 0.0220794677734375, + -0.01255035400390625, + 0.054840087890625, + 0.01885986328125, + 0.0275421142578125, + 0.0751953125, + 0.06365966796875, + -0.0019741058349609375, + 0.007007598876953125, + -0.00962066650390625, + 0.00543975830078125, + 0.050201416015625, + 0.0099639892578125, + 0.014495849609375, + 0.0225677490234375, + 0.03277587890625, + 0.0185089111328125, + -0.01261138916015625, + 0.035675048828125, + -0.002635955810546875, + 0.025177001953125, + 0.051025390625, + -0.002857208251953125, + -0.035980224609375, + -0.0233612060546875, + 0.0259246826171875, + 0.043731689453125, + -0.03631591796875, + -0.0205535888671875, + 0.0258331298828125, + 0.007709503173828125, + 0.0019741058349609375, + 0.0112457275390625, + -0.00962066650390625, + 0.003932952880859375, + -0.0183868408203125, + -0.01013946533203125, + -0.0245208740234375, + -0.059600830078125, + -0.0197296142578125, + -0.042022705078125, + -0.06231689453125, + 0.00949859619140625, + -0.050384521484375, + 0.0228118896484375, + 0.035614013671875, + -0.02691650390625, + 0.043426513671875, + -0.035858154296875, + -0.00539398193359375, + -0.021697998046875, + -0.045928955078125, + 0.043548583984375, + 0.019989013671875, + -0.004436492919921875, + 0.014373779296875, + -0.00946807861328125, + -0.02752685546875, + 0.029510498046875, + -0.0313720703125, + -0.019500732421875, + 0.0028400421142578125, + -0.02923583984375, + 0.01177978515625, + -0.01392364501953125, + 0.0087738037109375, + 0.00730133056640625, + -0.0221405029296875, + -0.034271240234375, + 0.0168914794921875, + -0.0263824462890625, + 0.01641845703125, + -0.0372314453125, + -0.035736083984375, + 0.0180206298828125, + 0.0290069580078125, + -0.0531005859375, + 0.004638671875, + 0.01534271240234375, + -0.01064300537109375, + 0.047882080078125, + -0.0401611328125, + 0.003963470458984375, + -0.039459228515625, + 0.0111541748046875, + -0.00875091552734375, + 0.02001953125, + -0.0019073486328125, + -0.02301025390625, + -0.007709503173828125, + -0.00791168212890625, + -0.0266265869140625, + -0.042510986328125, + -0.00812530517578125, + -0.00514984130859375, + 0.032073974609375, + -0.05523681640625, + 0.0565185546875, + -0.07373046875, + -0.060150146484375, + -0.031951904296875, + -0.00015366077423095703, + 0.053466796875, + 0.01171875, + 0.01244354248046875, + -0.0310211181640625, + -0.01078033447265625, + 0.026458740234375, + -0.0183258056640625, + 0.0382080078125, + -0.061920166015625, + 0.006927490234375, + 0.053131103515625, + -0.03759765625, + 0.00118255615234375, + -0.005329132080078125, + 0.022491455078125, + 0.01111602783203125, + 0.036956787109375, + 0.006259918212890625, + 0.0269317626953125, + 0.02313232421875, + 0.0269012451171875, + 0.0251922607421875, + 0.01297760009765625, + -0.041473388671875, + 0.00983428955078125, + 0.0380859375, + 0.014739990234375, + -0.0020618438720703125, + 0.029052734375, + 0.0095062255859375, + -0.03717041015625, + 0.005931854248046875, + -0.0296173095703125, + -0.0215301513671875, + 0.0200042724609375, + 0.01776123046875, + -0.07244873046875, + 0.0662841796875, + -0.0185546875, + -0.04071044921875, + 1.6093254089355469e-06, + -0.0360107421875, + 0.01258087158203125, + 0.0638427734375, + -0.042633056640625, + 0.053375244140625, + -0.0606689453125, + 0.00624847412109375, + -0.0152740478515625, + 0.013214111328125, + 0.06646728515625, + 0.0623779296875, + 0.0245513916015625, + 0.032501220703125, + -0.0294952392578125, + 0.005298614501953125, + -0.018280029296875, + 0.0007944107055664062, + -0.0029621124267578125, + 0.040069580078125, + -0.01544952392578125, + -0.04461669921875, + -0.08184814453125, + 0.022918701171875, + 0.0177001953125, + 0.0225372314453125, + 0.0205078125, + 0.0163116455078125, + 0.01546478271484375, + 0.0248565673828125, + 0.0229644775390625, + -0.030426025390625, + 0.00832366943359375, + -0.0206451416015625, + 0.041656494140625, + -0.0162353515625, + 0.0013532638549804688, + -0.03948974609375, + -0.03436279296875, + -0.020599365234375, + -0.006168365478515625, + 0.011962890625, + 0.004177093505859375, + -0.01540374755859375, + 0.0323486328125, + 0.03680419921875, + 0.0252532958984375, + -0.04962158203125, + -0.0222015380859375, + -0.006427764892578125, + 0.0165863037109375, + 0.0418701171875, + -0.01125335693359375, + 0.0044708251953125, + -0.02197265625, + 0.0261077880859375, + 0.052337646484375, + -0.0202789306640625, + -0.0123138427734375, + -0.0027790069580078125, + -0.00917816162109375, + -0.039154052734375, + 0.0104522705078125, + 0.006923675537109375, + -0.03033447265625, + 0.042083740234375, + -0.05230712890625, + 0.03900146484375, + 0.036956787109375, + -0.01467132568359375, + -0.01357269287109375, + -0.0272369384765625, + -0.0266265869140625, + 0.032806396484375, + 0.032196044921875, + -0.0152130126953125, + -0.035003662109375, + 0.0011014938354492188, + -0.049346923828125, + 0.03424072265625, + -0.04925537109375, + 0.02288818359375, + 0.019134521484375, + 0.00014913082122802734, + 0.0132293701171875, + 0.013916015625, + -0.04022216796875, + 0.017547607421875, + -0.01541900634765625, + -0.004467010498046875, + -0.0162200927734375, + -0.04736328125, + 0.061553955078125, + -0.0025634765625, + -0.031524658203125, + 0.016204833984375, + 0.03558349609375, + -0.035308837890625, + 0.0007781982421875, + 0.0413818359375, + 0.0041046142578125, + 0.009521484375, + -0.0184173583984375, + 0.04437255859375, + -0.0377197265625, + -0.0347900390625, + -0.001834869384765625, + -0.029510498046875, + -0.004055023193359375, + -0.039306640625, + -0.0249481201171875, + -0.0295562744140625, + -0.0596923828125, + -0.00229644775390625, + -0.052734375, + 0.00623321533203125, + -0.0234527587890625, + 0.0171356201171875, + 0.0438232421875, + -0.048370361328125, + -0.043365478515625, + -0.0185546875, + -0.02874755859375, + -0.0655517578125, + -0.006557464599609375, + -0.021728515625, + -0.010772705078125, + 0.031951904296875, + -0.006317138671875, + -0.022125244140625, + 0.04705810546875, + -0.0033588409423828125, + 0.01386260986328125, + -0.0256805419921875, + -0.01126861572265625, + -0.01068115234375, + -0.004871368408203125, + 0.0174713134765625, + -0.00893402099609375, + 0.0021152496337890625, + 0.03240966796875, + 0.032806396484375, + 0.0278472900390625, + -0.0092620849609375, + -0.00623321533203125, + -0.0200347900390625, + 0.06085205078125, + 0.0181732177734375, + -0.036346435546875, + -0.030364990234375, + 0.0007157325744628906, + -0.0192718505859375, + 0.035552978515625, + 0.058197021484375, + -0.005950927734375, + -0.022705078125, + -0.027557373046875, + -0.01226806640625, + -0.023284912109375, + 0.00394439697265625, + -0.04779052734375, + 0.00958251953125, + 0.0025482177734375, + 0.0156402587890625, + 0.0207366943359375, + -0.0278472900390625, + -0.0187835693359375, + -0.05572509765625, + 0.0070037841796875, + -0.016998291015625, + 0.00757598876953125, + -0.020904541015625, + 0.01358795166015625, + -0.04718017578125, + 0.0810546875, + 0.0008759498596191406, + 0.0289459228515625, + 0.004367828369140625, + 0.001079559326171875, + -0.0044403076171875, + 0.051605224609375, + -0.022491455078125, + -0.004711151123046875, + 0.0279083251953125, + 0.00826263427734375, + 0.024444580078125, + 0.05169677734375, + -0.00017201900482177734, + 0.060546875, + -0.00821685791015625, + -0.01861572265625, + -0.02703857421875, + -0.03253173828125, + 0.0009636878967285156, + 0.0299835205078125, + 0.0295562744140625, + -0.030670166015625, + -0.0186767578125, + -0.024017333984375, + 0.04669189453125, + 0.032318115234375, + -0.03192138671875, + -0.04388427734375, + -0.0238494873046875, + -0.034759521484375, + -0.0391845703125, + 0.01192474365234375, + -0.0025539398193359375, + -0.031524658203125, + -0.040069580078125, + 0.004673004150390625, + 0.0281219482421875, + -0.0498046875, + 0.00946044921875, + 0.0887451171875, + -0.0245361328125, + -0.040252685546875, + -0.07769775390625, + 0.0345458984375, + 0.0028324127197265625, + -0.004245758056640625, + -0.0168914794921875, + -0.015716552734375, + -0.00974273681640625, + -0.00637054443359375, + -0.0257568359375, + -0.060516357421875, + -0.046112060546875, + -0.01220703125, + 0.06451416015625, + 0.003177642822265625, + 0.054473876953125, + 0.00506591796875, + -0.037841796875, + -0.05377197265625, + 0.02008056640625, + 0.056396484375, + -0.0255126953125, + 0.00876617431640625, + 0.02618408203125, + 0.009918212890625, + -0.0024261474609375, + -0.019561767578125, + -0.01163482666015625, + -0.010711669921875, + 0.06396484375, + 0.00426483154296875, + -0.00417327880859375, + 0.0269317626953125, + 0.0628662109375, + -0.0367431640625, + -0.019073486328125, + 0.00896453857421875, + -0.0185089111328125, + -0.0350341796875, + -0.072265625, + 0.00481414794921875, + -0.0237579345703125, + -0.0294647216796875, + 0.00992584228515625, + 0.0103302001953125, + 0.012115478515625, + 0.0276336669921875, + 0.0048675537109375, + 0.0126495361328125, + 0.015899658203125, + -0.01947021484375, + 0.06011962890625, + -0.03350830078125, + 0.0025196075439453125, + -0.0099029541015625, + -0.0080108642578125, + -0.022674560546875, + -0.0100555419921875, + 0.046875, + 0.00885009765625, + 0.01506805419921875, + 0.0294952392578125, + -0.0172119140625, + 0.03167724609375, + -0.036651611328125, + -0.032012939453125, + 0.044921875, + -0.031982421875, + -0.04046630859375, + -0.037078857421875, + 0.0192718505859375, + 0.021820068359375, + 0.01058197021484375, + -0.0278167724609375, + 0.0057373046875, + 0.022979736328125, + -0.0251617431640625, + -0.0224456787109375, + -0.03369140625, + -0.05419921875, + -0.0496826171875, + -0.03472900390625, + -0.01401519775390625, + -0.00966644287109375, + 0.00826263427734375, + 0.04705810546875, + 0.0037441253662109375, + 0.011077880859375, + 0.00984954833984375, + 0.07171630859375, + -0.022125244140625, + 0.034027099609375, + 0.01471710205078125, + 0.0287933349609375, + -0.021148681640625, + -0.07513427734375, + -0.00858306884765625, + -0.0228271484375, + -0.01434326171875, + -0.0197906494140625, + -0.039398193359375, + -0.007152557373046875, + -0.0267181396484375, + 0.03558349609375, + 0.036468505859375, + -0.0016937255859375, + -0.01549530029296875, + -0.0126953125, + 0.01396942138671875, + 0.03045654296875, + 0.0002930164337158203, + 0.0008139610290527344, + 0.01012420654296875, + -0.04638671875, + -0.0022907257080078125, + -0.00420379638671875, + -0.04547119140625, + -0.0306854248046875, + 0.018341064453125, + 0.06475830078125, + 0.002140045166015625, + -4.756450653076172e-05, + -0.0159454345703125, + -0.01983642578125, + -0.06646728515625, + -0.02008056640625, + 0.0162353515625, + -0.00949859619140625, + -0.00934600830078125, + -0.0035190582275390625, + 0.00396728515625, + 0.045013427734375, + 0.0211944580078125, + 0.037811279296875, + 0.002819061279296875, + -0.0117034912109375, + 0.0125274658203125, + -0.035369873046875, + 0.020111083984375, + -0.002223968505859375, + 0.0081024169921875, + -0.0119476318359375, + -0.03033447265625, + 0.018402099609375, + -0.0010623931884765625, + 0.0165863037109375, + -0.039581298828125, + -0.0192413330078125, + -0.0153350830078125, + 0.027130126953125, + 0.027374267578125, + 0.0033359527587890625, + 0.0098114013671875, + -0.03350830078125, + 0.0060577392578125, + -0.0258026123046875, + -0.03790283203125, + 0.00394439697265625, + -0.0261077880859375, + -0.039459228515625, + 0.0438232421875, + 0.0051422119140625, + -0.037200927734375, + 0.02203369140625, + -0.0216522216796875, + 0.038818359375, + 0.01024627685546875, + 0.002735137939453125, + -0.0335693359375, + 0.03863525390625, + -0.016571044921875, + 0.019073486328125, + -0.01971435546875, + 0.00658416748046875, + -0.0250091552734375, + 0.04095458984375, + -0.026611328125, + -0.01708984375, + 0.037994384765625, + 0.01073455810546875, + 0.0078887939453125, + 0.0240325927734375, + -0.039276123046875, + -0.01390838623046875, + -0.007671356201171875, + -0.0081787109375, + -0.0006136894226074219, + 0.04876708984375, + -0.042327880859375, + -0.01160430908203125, + -0.00730133056640625, + -0.0035247802734375, + -0.01708984375, + 0.01404571533203125, + 0.0172271728515625, + 0.016448974609375, + 0.01128387451171875, + 0.05499267578125, + 0.046661376953125, + -0.01551055908203125, + 0.030517578125, + -0.0007624626159667969, + 0.0347900390625, + 0.007526397705078125, + -0.029571533203125, + -0.0261383056640625, + 0.049102783203125, + 0.05126953125, + 0.0007534027099609375, + -0.03955078125, + 0.0159149169921875, + 0.0281524658203125, + -0.00868988037109375, + 0.01261138916015625, + -0.01190948486328125, + -0.0142364501953125, + 0.011505126953125, + -0.00649261474609375, + -0.0223541259765625, + -0.0269622802734375, + -0.0017566680908203125, + -0.00547027587890625, + 0.0247039794921875, + -0.0201568603515625, + -0.0095062255859375, + -0.032470703125, + -0.026947021484375, + 0.0423583984375, + -0.049957275390625, + 0.0188751220703125, + -0.039154052734375, + -0.040130615234375, + 0.0133819580078125, + 0.043914794921875, + 0.00439453125, + 0.0254669189453125, + 0.0156097412109375, + 0.015777587890625, + 0.03839111328125, + 0.0185546875, + 0.01479339599609375, + 0.037872314453125, + -0.049072265625, + -0.0086669921875, + 0.0309906005859375, + -0.005401611328125, + -0.0011138916015625, + -0.0181732177734375, + -0.0670166015625, + 0.055145263671875, + 0.0015096664428710938, + -0.0135650634765625, + 0.0190277099609375, + -0.0017004013061523438, + -0.0185546875, + -0.0277557373046875, + -0.0106201171875, + -0.019134521484375, + 0.041961669921875, + 0.053802490234375, + -0.046600341796875, + -0.055511474609375, + 0.04498291015625, + 0.0082550048828125, + 0.05096435546875, + 0.0008788108825683594, + 0.061279296875, + -0.012451171875, + 0.06805419921875, + 0.0135955810546875, + -0.058380126953125, + -0.0175323486328125, + -0.002735137939453125, + -0.004039764404296875, + -0.022735595703125, + 0.0015687942504882812, + -0.0675048828125, + -0.00839996337890625, + -0.00408172607421875, + -0.0199737548828125, + -0.035369873046875, + 0.038665771484375, + -0.0268402099609375, + -0.0230865478515625, + -0.00982666015625, + 0.01318359375, + -0.045013427734375, + 0.015777587890625, + 0.0023441314697265625, + 0.036407470703125, + 0.01319122314453125, + -0.0235443115234375, + -0.058990478515625, + 0.007480621337890625, + 0.01372528076171875, + -0.03118896484375, + 0.042266845703125, + -0.0242767333984375, + -0.01161956787109375, + -0.0242767333984375, + -0.060455322265625, + 0.016571044921875, + 0.002826690673828125, + -0.0040130615234375, + -0.060272216796875, + -0.01224517822265625, + 0.0211944580078125, + 0.0114288330078125, + 0.006984710693359375, + -0.029083251953125, + 0.0023708343505859375, + 0.025665283203125, + 0.06109619140625, + 0.007843017578125, + 0.06585693359375, + 0.0233917236328125, + -0.0027370452880859375, + 0.0167388916015625, + 0.00818634033203125, + 0.07269287109375, + -0.016357421875, + -0.0025577545166015625, + -0.037750244140625, + -0.004741668701171875, + -0.0252227783203125, + -0.03570556640625, + 0.036865234375, + 0.09661865234375, + 0.0114288330078125, + 0.01126861572265625, + -0.061981201171875, + -0.0028972625732421875, + -0.0164337158203125, + -0.002788543701171875, + -0.015167236328125, + 0.0302581787109375, + 0.0008015632629394531, + 0.02532958984375, + 0.0169677734375, + -0.07049560546875, + 0.2607421875, + 0.070556640625, + 0.01314544677734375, + -0.02349853515625, + 0.000370025634765625, + 0.0196075439453125, + 0.052337646484375, + -0.0251922607421875, + 0.031524658203125, + -0.0300750732421875, + 0.03631591796875, + -0.008056640625, + 0.00844573974609375, + 0.0284576416015625, + 0.00574493408203125, + 0.04852294921875, + -0.051116943359375, + -0.0020885467529296875, + 0.0004630088806152344, + -0.0206298828125, + -0.042022705078125, + 0.0276031494140625, + -0.0037784576416015625, + 0.0335693359375, + -0.0273284912109375, + 0.01387786865234375, + 0.052978515625, + -0.053009033203125, + -0.024200439453125, + -0.0283050537109375, + 0.0178375244140625, + -0.0246124267578125, + 0.0180816650390625, + -0.0277252197265625, + -0.056549072265625, + -0.0095672607421875, + -0.015655517578125, + -0.01212310791015625, + -0.0002384185791015625, + 0.028900146484375, + -0.0172576904296875, + -0.0163726806640625, + 0.06292724609375, + -0.0174407958984375, + 0.00988006591796875, + -0.006946563720703125, + -0.0006666183471679688, + 0.03765869140625, + 0.0059967041015625, + -0.034454345703125, + 0.04132080078125, + -0.0143890380859375, + 0.03216552734375, + -0.043487548828125, + -0.045562744140625, + -0.007755279541015625, + 0.05303955078125, + -0.0157318115234375, + -0.00830078125, + 0.0087127685546875, + 0.004756927490234375, + 0.0110015869140625, + -0.007556915283203125, + 0.0087738037109375, + -0.053955078125, + 0.0213470458984375, + 0.026641845703125, + 0.0550537109375, + 0.01244354248046875, + 0.011383056640625, + -0.00438690185546875, + -0.040313720703125, + 0.008148193359375, + -0.064208984375, + 0.0172119140625, + 0.05621337890625, + -0.01290130615234375, + 0.030609130859375, + 0.00180816650390625, + -0.00966644287109375, + -0.01045989990234375, + -0.005466461181640625, + 0.004817962646484375, + -0.005615234375, + -0.0028095245361328125, + 0.042724609375, + -0.019683837890625, + -0.0187835693359375, + -0.027923583984375, + 0.0271148681640625, + 0.050384521484375, + 0.028228759765625, + 0.00827789306640625, + 0.023284912109375, + -0.0209197998046875 + ], + "index": 0, + "object": "embedding" + } + ], + "model": "bge-large-en-v1.5", + "object": "list", + "usage": { + "prompt_tokens": 7, + "total_tokens": 7 + }, + "id": "ebf0740c-96e5-4350-83ea-2844cf0395ab" + } + }, + "is_streaming": false + } +} diff --git a/tests/integration/recordings/responses/6d937e5e9233.json b/tests/integration/recordings/responses/6d937e5e9233.json new file mode 100644 index 000000000..e22290402 --- /dev/null +++ b/tests/integration/recordings/responses/6d937e5e9233.json @@ -0,0 +1,1061 @@ +{ + "request": { + "method": "POST", + "url": "__databricks__/serving-endpoints/v1/embeddings", + "headers": {}, + "body": { + "model": "databricks-bge-large-en", + "input": "Hello, world!", + "encoding_format": "float" + }, + "endpoint": "/v1/embeddings", + "model": "databricks-bge-large-en" + }, + "response": { + "body": { + "__type__": "openai.types.create_embedding_response.CreateEmbeddingResponse", + "__data__": { + "data": [ + { + "embedding": [ + 0.0243682861328125, + 0.0479736328125, + 0.007320404052734375, + -0.007663726806640625, + -0.0391845703125, + 0.0010662078857421875, + 0.060638427734375, + 0.047119140625, + 0.048858642578125, + 0.0029773712158203125, + 0.01132965087890625, + 0.0019140243530273438, + -0.00670623779296875, + -0.0010347366333007812, + -0.0482177734375, + 0.002079010009765625, + -0.0033283233642578125, + -0.03924560546875, + -0.04217529296875, + 0.001712799072265625, + -0.0150909423828125, + 0.0198211669921875, + -0.06884765625, + -0.0138092041015625, + 0.0121612548828125, + 0.025177001953125, + 0.048248291015625, + -0.0016126632690429688, + 0.04901123046875, + 0.049224853515625, + -0.016845703125, + 0.00646209716796875, + -0.0130767822265625, + -0.05352783203125, + -0.0234832763671875, + -0.015594482421875, + 0.024658203125, + -0.018310546875, + -0.03765869140625, + -0.033782958984375, + 0.031951904296875, + 0.01262664794921875, + 0.05194091796875, + -0.0309295654296875, + -0.0728759765625, + 0.0146942138671875, + 0.0018930435180664062, + 0.011932373046875, + 0.047637939453125, + -0.03485107421875, + 0.0034923553466796875, + 0.0225982666015625, + -0.01311492919921875, + -0.01568603515625, + -0.00933837890625, + 0.01116180419921875, + -0.047332763671875, + 0.030975341796875, + -0.0184173583984375, + 0.0289306640625, + 0.0161590576171875, + 0.036956787109375, + 0.043121337890625, + -0.07110595703125, + -0.005107879638671875, + 0.03271484375, + -0.017303466796875, + -0.028717041015625, + 0.03729248046875, + -2.0623207092285156e-05, + -0.040008544921875, + 0.02294921875, + 0.0014362335205078125, + -0.00107574462890625, + -0.044647216796875, + 0.038604736328125, + -0.0067138671875, + 0.0249176025390625, + -0.022857666015625, + 0.01739501953125, + -0.005096435546875, + 0.024871826171875, + -0.00920867919921875, + -7.003545761108398e-05, + -0.032562255859375, + -0.023773193359375, + 0.0253143310546875, + 0.0243988037109375, + -0.00439453125, + -0.0207672119140625, + 0.057159423828125, + 0.03338623046875, + -0.004795074462890625, + -0.002796173095703125, + 0.067626953125, + 0.01195526123046875, + -0.0282745361328125, + 0.004787445068359375, + -0.001255035400390625, + 0.031005859375, + 0.032684326171875, + 0.042144775390625, + -0.044281005859375, + 0.0017604827880859375, + -0.0316162109375, + -0.01284027099609375, + -0.0007252693176269531, + -0.025054931640625, + -0.0179595947265625, + -0.0215911865234375, + -0.02642822265625, + 0.0166168212890625, + 0.0232391357421875, + 0.0304107666015625, + -0.004180908203125, + 0.049163818359375, + 0.0036373138427734375, + 0.030517578125, + -0.009368896484375, + -0.0110321044921875, + 0.017578125, + 0.03570556640625, + 0.007595062255859375, + -0.0289764404296875, + -0.020111083984375, + -0.048828125, + -0.0297698974609375, + 0.0643310546875, + 0.0033664703369140625, + 0.005657196044921875, + 0.0011434555053710938, + -0.019561767578125, + 0.04833984375, + 0.026123046875, + 0.0166778564453125, + -0.006191253662109375, + -0.012725830078125, + 0.05255126953125, + 0.02337646484375, + -0.04766845703125, + 0.007572174072265625, + -0.016082763671875, + -0.024993896484375, + 0.0716552734375, + 0.0211639404296875, + 0.047271728515625, + -0.0005006790161132812, + 0.02728271484375, + -0.0146942138671875, + 0.006595611572265625, + -0.01763916015625, + 0.0258331298828125, + 0.0009965896606445312, + 0.047943115234375, + -0.0140838623046875, + 0.004795074462890625, + 0.016387939453125, + 0.0284576416015625, + 0.0004839897155761719, + 0.007007598876953125, + 0.01253509521484375, + 0.038116455078125, + -0.0047454833984375, + 0.01114654541015625, + -0.018798828125, + -0.0033206939697265625, + -0.0377197265625, + -0.0242462158203125, + 0.004734039306640625, + -0.0223236083984375, + -0.0184173583984375, + -0.0226287841796875, + -0.02947998046875, + 0.005565643310546875, + 0.02227783203125, + 0.017791748046875, + 0.004779815673828125, + -0.004360198974609375, + 0.03790283203125, + 0.0192108154296875, + -0.0406494140625, + 0.01287078857421875, + -0.0167388916015625, + 0.0208740234375, + -0.0011205673217773438, + 0.007511138916015625, + 0.0105133056640625, + 0.002498626708984375, + -0.0158538818359375, + -0.0284881591796875, + 0.02337646484375, + 0.0155181884765625, + -0.032989501953125, + 0.0212249755859375, + 0.00875091552734375, + 0.018218994140625, + -0.0212860107421875, + 0.019744873046875, + 0.00045418739318847656, + -0.08154296875, + -0.051849365234375, + 0.016021728515625, + 0.0020904541015625, + 0.0062255859375, + -0.0002894401550292969, + -0.02752685546875, + -0.01546478271484375, + 0.035552978515625, + -0.04132080078125, + -0.0205535888671875, + -0.0018558502197265625, + 0.017974853515625, + -0.02044677734375, + 0.0246734619140625, + 0.006023406982421875, + -0.04498291015625, + -0.03277587890625, + 0.02935791015625, + -0.0034332275390625, + 0.0013437271118164062, + 0.0211029052734375, + 0.021453857421875, + 0.032196044921875, + 0.052734375, + 0.007572174072265625, + 0.0148162841796875, + -0.0284881591796875, + 0.039703369140625, + -0.00885009765625, + -0.00823211669921875, + -0.0213165283203125, + 0.04022216796875, + -0.0076904296875, + 0.03790283203125, + 0.03350830078125, + 0.0139617919921875, + 0.047698974609375, + 0.03594970703125, + 0.01540374755859375, + -0.0192413330078125, + -0.043609619140625, + -0.01105499267578125, + 0.0203094482421875, + 0.0216217041015625, + 0.01076507568359375, + -0.0039215087890625, + 0.032745361328125, + -0.036468505859375, + 0.0056304931640625, + 0.0173492431640625, + -0.0246734619140625, + 0.04962158203125, + 0.06695556640625, + 0.008270263671875, + -0.038482666015625, + -0.03350830078125, + 0.01265716552734375, + 0.096435546875, + -0.045440673828125, + -0.0272979736328125, + -0.019866943359375, + 0.0192413330078125, + -0.00597381591796875, + 0.004711151123046875, + 0.003437042236328125, + 0.007965087890625, + 0.01374053955078125, + 0.00811004638671875, + -0.008148193359375, + -0.0648193359375, + -0.0164794921875, + -0.01540374755859375, + -0.037322998046875, + 0.032684326171875, + -0.014862060546875, + -0.0034198760986328125, + 0.0149383544921875, + 0.0007529258728027344, + 0.02630615234375, + -0.0213775634765625, + 0.003299713134765625, + 0.00030112266540527344, + 0.037139892578125, + 0.0167999267578125, + -0.006191253662109375, + -0.01290130615234375, + -0.02490234375, + -0.03173828125, + -0.00937652587890625, + 0.050994873046875, + -0.054473876953125, + -0.0012388229370117188, + 0.009033203125, + 0.023712158203125, + -0.041168212890625, + 0.0338134765625, + -0.033447265625, + 0.021392822265625, + -0.0234832763671875, + -0.032928466796875, + -0.0080413818359375, + 0.004138946533203125, + -0.0240631103515625, + -0.020111083984375, + -0.0230560302734375, + 0.01381683349609375, + -0.0003304481506347656, + -0.03802490234375, + 0.0404052734375, + 0.005603790283203125, + -0.0276947021484375, + 0.06805419921875, + 0.02374267578125, + -0.01119232177734375, + -0.0311737060546875, + 0.027313232421875, + 0.037445068359375, + 0.051055908203125, + -0.0277557373046875, + -0.0142974853515625, + -0.0214385986328125, + -0.0245819091796875, + -0.011077880859375, + -0.0645751953125, + -0.00604248046875, + 0.0298004150390625, + 0.021240234375, + -0.038421630859375, + 0.030792236328125, + -0.050384521484375, + -0.0648193359375, + -0.0531005859375, + -0.042236328125, + 0.0177764892578125, + 0.00933837890625, + -0.0125885009765625, + -0.014984130859375, + -0.008392333984375, + 0.0144805908203125, + -0.0050506591796875, + 0.062347412109375, + -0.05401611328125, + -0.0012826919555664062, + 0.0300750732421875, + -0.022735595703125, + 0.00600433349609375, + -0.005542755126953125, + -0.0218048095703125, + -0.033477783203125, + 0.036895751953125, + 0.0011653900146484375, + -0.01519012451171875, + 0.00815582275390625, + 0.03436279296875, + 0.006931304931640625, + 0.0411376953125, + -0.08392333984375, + -0.0008335113525390625, + 0.052947998046875, + -0.03778076171875, + 0.02288818359375, + 0.03662109375, + 0.01922607421875, + -0.07257080078125, + 0.0016756057739257812, + -0.053466796875, + 0.007511138916015625, + 0.0200653076171875, + 0.02423095703125, + -0.049102783203125, + 0.03399658203125, + -0.032257080078125, + -0.037445068359375, + -0.0171051025390625, + -0.0419921875, + -0.0039825439453125, + 0.0290985107421875, + -0.019439697265625, + 0.0311737060546875, + -0.037353515625, + 0.0143280029296875, + -0.038482666015625, + 0.0158233642578125, + 0.10565185546875, + 0.058624267578125, + 0.00908660888671875, + -0.031005859375, + 0.0009670257568359375, + -0.01027679443359375, + -0.0089874267578125, + -0.0589599609375, + -0.0002715587615966797, + 0.02197265625, + -0.03179931640625, + -0.0462646484375, + -0.06512451171875, + 0.038055419921875, + 0.0237579345703125, + 0.0552978515625, + 0.027008056640625, + -0.032470703125, + -0.00787353515625, + -0.00040912628173828125, + -0.0008325576782226562, + -0.029754638671875, + 0.0034885406494140625, + -0.023101806640625, + 0.045684814453125, + 0.02154541015625, + -0.009765625, + -0.052001953125, + -0.004901885986328125, + -0.0172119140625, + 0.047027587890625, + 0.007537841796875, + 0.0268096923828125, + -0.0257415771484375, + 0.03631591796875, + 0.0024166107177734375, + -0.0122222900390625, + -0.07391357421875, + -0.01837158203125, + -0.054840087890625, + -0.005481719970703125, + 0.0140380859375, + -0.017974853515625, + -0.032318115234375, + -0.0526123046875, + 0.04766845703125, + 0.0280303955078125, + 0.0154876708984375, + -0.04254150390625, + 0.005245208740234375, + -0.0006666183471679688, + -0.0401611328125, + 0.040618896484375, + 0.029937744140625, + -0.0228424072265625, + 0.04779052734375, + -0.07373046875, + 0.042999267578125, + 0.0223846435546875, + -0.0178985595703125, + 0.0134429931640625, + -0.012176513671875, + -0.003997802734375, + 0.003917694091796875, + 0.005260467529296875, + -0.0029735565185546875, + -0.0227203369140625, + 0.01233673095703125, + -0.047515869140625, + -0.007526397705078125, + -0.01702880859375, + 0.0036563873291015625, + -0.01329803466796875, + -0.0197296142578125, + 0.032196044921875, + 0.0310516357421875, + -0.01275634765625, + 0.01366424560546875, + -0.02935791015625, + 0.042755126953125, + -0.008056640625, + -0.016143798828125, + 0.04058837890625, + -0.0185394287109375, + -0.019989013671875, + 0.034881591796875, + -0.00836944580078125, + -0.0103607177734375, + 0.0269012451171875, + 0.00766754150390625, + -0.004276275634765625, + -0.0098114013671875, + -0.005584716796875, + 0.0081939697265625, + 0.0257415771484375, + 0.013580322265625, + 0.005298614501953125, + -0.04595947265625, + -0.0149688720703125, + -0.025177001953125, + -0.022430419921875, + 0.0013055801391601562, + -0.06842041015625, + 0.031494140625, + 0.01027679443359375, + 0.0236968994140625, + 0.0092315673828125, + -0.0010576248168945312, + 0.0303802490234375, + -0.0270538330078125, + -0.06201171875, + -0.033477783203125, + -0.0107574462890625, + -0.038604736328125, + 0.002689361572265625, + -0.01690673828125, + 0.01245880126953125, + 0.039703369140625, + 0.0190887451171875, + -0.0283050537109375, + -0.006378173828125, + -0.0009150505065917969, + -0.00804901123046875, + -0.0223236083984375, + 0.007198333740234375, + -0.0350341796875, + -0.0036983489990234375, + -0.01174163818359375, + 0.02728271484375, + -0.017730712890625, + 0.003070831298828125, + 0.00037789344787597656, + 0.053863525390625, + 0.01947021484375, + 0.0274505615234375, + -0.030731201171875, + 0.033416748046875, + -0.00205230712890625, + -0.050384521484375, + -0.0300750732421875, + 0.03692626953125, + 0.00922393798828125, + 0.027679443359375, + 0.024505615234375, + -0.0200958251953125, + -0.0162353515625, + -0.035614013671875, + -0.0180816650390625, + -0.01378631591796875, + -0.051483154296875, + -0.0247802734375, + -0.047607421875, + -0.0023021697998046875, + 0.0163726806640625, + -0.01210784912109375, + -0.055328369140625, + 0.0200042724609375, + -0.03497314453125, + 0.019439697265625, + -0.0516357421875, + -0.0261077880859375, + -0.0270233154296875, + 0.031890869140625, + -0.0285186767578125, + 0.05194091796875, + -0.05377197265625, + 0.0123748779296875, + -0.00536346435546875, + 0.01293182373046875, + -0.00853729248046875, + 0.048828125, + -0.03656005859375, + -0.019134521484375, + 0.0128173828125, + 0.02239990234375, + 0.00693511962890625, + 0.016143798828125, + 0.0106353759765625, + 0.0193328857421875, + -0.0130462646484375, + -0.0036907196044921875, + -0.0496826171875, + -0.008270263671875, + -0.00862884521484375, + -0.006038665771484375, + 0.012481689453125, + 0.0024471282958984375, + -0.0162506103515625, + -0.0277099609375, + 0.05450439453125, + 0.01306915283203125, + -0.038665771484375, + -0.0211944580078125, + -0.029937744140625, + -0.07232666015625, + -0.01654052734375, + -0.00275421142578125, + -0.006153106689453125, + 0.013336181640625, + -0.07171630859375, + 0.0396728515625, + 0.0193023681640625, + -0.039520263671875, + -0.0004703998565673828, + 0.086181640625, + 0.04376220703125, + 1.0848045349121094e-05, + -0.0850830078125, + 0.019866943359375, + 0.021575927734375, + -0.0094146728515625, + -0.0240936279296875, + 0.005275726318359375, + -0.007709503173828125, + -0.01079559326171875, + -0.0399169921875, + -0.036895751953125, + -0.0626220703125, + 0.0146026611328125, + 0.0478515625, + -0.0107421875, + 0.06195068359375, + -0.01995849609375, + -0.015716552734375, + -0.05828857421875, + 0.0450439453125, + 0.0609130859375, + -0.0169677734375, + 0.04852294921875, + 0.061798095703125, + 0.020782470703125, + 0.0745849609375, + -0.0207672119140625, + -0.006103515625, + -0.005077362060546875, + 0.060546875, + 0.052001953125, + 0.0223236083984375, + 0.039947509765625, + 0.04290771484375, + -0.08245849609375, + -0.05889892578125, + -0.01288604736328125, + -0.01274871826171875, + -0.0205078125, + -0.02252197265625, + 0.01885986328125, + -0.031219482421875, + -0.001827239990234375, + 0.037017822265625, + 0.0251617431640625, + 0.01308441162109375, + 0.009918212890625, + -0.0158233642578125, + 0.0374755859375, + -0.01476287841796875, + 0.0255889892578125, + 0.052734375, + -0.055694580078125, + 0.00720977783203125, + -0.02154541015625, + -0.0135498046875, + -0.059539794921875, + 0.00965118408203125, + 0.0171966552734375, + -0.0018405914306640625, + 0.04217529296875, + 0.0625, + 0.0028438568115234375, + 0.01142120361328125, + -0.0301361083984375, + 0.0011587142944335938, + 0.0281829833984375, + -0.06756591796875, + -0.054046630859375, + -0.032073974609375, + -0.005840301513671875, + -0.012420654296875, + 0.010589599609375, + -0.01111602783203125, + -0.0022716522216796875, + 0.01248931884765625, + 0.007843017578125, + -0.01446533203125, + -0.0340576171875, + -0.0116119384765625, + -0.0863037109375, + -0.06610107421875, + -0.037261962890625, + 0.0012655258178710938, + -0.0133819580078125, + 0.00974273681640625, + 0.0316162109375, + 0.01081085205078125, + 0.00048232078552246094, + 0.02093505859375, + -0.010101318359375, + 0.030487060546875, + -0.02203369140625, + 0.05535888671875, + -0.048095703125, + -0.07977294921875, + -0.0194854736328125, + 0.01558685302734375, + -0.016387939453125, + -0.009063720703125, + -0.01232147216796875, + -0.0062103271484375, + -0.037506103515625, + 0.068359375, + 0.0291748046875, + 0.0236358642578125, + -0.0322265625, + -0.045379638671875, + 0.0196533203125, + 0.0159454345703125, + -0.01800537109375, + 0.00954437255859375, + -0.00803375244140625, + -0.06939697265625, + 0.00830841064453125, + 0.00640106201171875, + -0.0055999755859375, + -0.030517578125, + -0.031524658203125, + 0.037994384765625, + -0.01062774658203125, + -0.02191162109375, + -0.022064208984375, + -0.01910400390625, + -0.02130126953125, + -0.01213836669921875, + 0.005229949951171875, + 0.0032253265380859375, + -0.035552978515625, + 0.024017333984375, + -0.033233642578125, + 0.035003662109375, + -0.0125579833984375, + 0.006519317626953125, + -0.0276641845703125, + 0.00983428955078125, + -0.01611328125, + -0.005413055419921875, + 0.005756378173828125, + -0.002681732177734375, + 0.0206756591796875, + 0.011566162109375, + 0.042449951171875, + 0.0367431640625, + -0.0124053955078125, + 0.016357421875, + -0.041748046875, + -0.01325225830078125, + -0.0445556640625, + 0.005359649658203125, + 0.00762176513671875, + 0.0350341796875, + -0.0133056640625, + -0.0222930908203125, + 0.01392364501953125, + 0.0010623931884765625, + -0.016998291015625, + 0.05047607421875, + -0.0814208984375, + -0.0211029052734375, + 0.0263671875, + -0.032623291015625, + 0.0297698974609375, + -0.014556884765625, + -0.044921875, + 0.048095703125, + -0.002788543701171875, + -0.0197601318359375, + -0.029144287109375, + 0.02972412109375, + 0.0357666015625, + -0.01448822021484375, + -0.041015625, + -0.032623291015625, + 0.0235443115234375, + -0.004947662353515625, + 0.03955078125, + -0.04803466796875, + -0.0026874542236328125, + -0.007442474365234375, + 0.0084686279296875, + -0.03460693359375, + 0.0084075927734375, + 0.0223388671875, + -0.006168365478515625, + 0.008941650390625, + 0.025238037109375, + 0.02325439453125, + -0.061309814453125, + 0.032806396484375, + 0.00958251953125, + 0.020233154296875, + -0.07159423828125, + 0.00543212890625, + 0.0033130645751953125, + 0.0158233642578125, + 0.01070404052734375, + 0.0645751953125, + 0.01120758056640625, + 0.0396728515625, + 0.046356201171875, + 0.021270751953125, + 0.0213165283203125, + 0.0188446044921875, + -0.0170135498046875, + -0.0034465789794921875, + 0.0163421630859375, + 0.04315185546875, + 0.048583984375, + 0.01153564453125, + 0.0272216796875, + 0.023406982421875, + -0.01265716552734375, + 0.023712158203125, + 0.012664794921875, + -0.014862060546875, + 0.0026035308837890625, + 0.0243072509765625, + 0.017791748046875, + -0.024658203125, + 0.023101806640625, + 0.01052093505859375, + -0.0004978179931640625, + 0.0232696533203125, + -0.01464080810546875, + -0.029388427734375, + -0.034393310546875, + 0.055206298828125, + 0.0024013519287109375, + 0.004993438720703125, + -0.007015228271484375, + -0.0167236328125, + -0.0046234130859375, + 0.054718017578125, + -0.01953125, + 0.038665771484375, + 0.01062774658203125, + 0.0281829833984375, + 0.01030731201171875, + 0.0160980224609375, + 0.03961181640625, + 0.0221099853515625, + -0.03533935546875, + -0.018463134765625, + -0.006557464599609375, + -0.00804901123046875, + 0.005634307861328125, + 0.0168304443359375, + -0.053375244140625, + 0.0667724609375, + -0.022674560546875, + -0.018035888671875, + 0.0113983154296875, + -0.0215606689453125, + -0.039794921875, + -0.055908203125, + 0.041290283203125, + -0.01555633544921875, + -0.011627197265625, + 0.032379150390625, + -0.0202178955078125, + -0.0015087127685546875, + 0.0290374755859375, + 0.004978179931640625, + 0.04437255859375, + 0.03375244140625, + 0.02423095703125, + -0.01399993896484375, + 0.037200927734375, + 0.033935546875, + -0.02838134765625, + 0.002597808837890625, + 0.016082763671875, + -0.0019969940185546875, + 0.0058746337890625, + 0.009552001953125, + -0.054779052734375, + -0.01059722900390625, + -0.0202178955078125, + -0.0311431884765625, + 0.0242767333984375, + 0.039337158203125, + -0.01715087890625, + -0.0095062255859375, + 0.019378662109375, + 0.0175323486328125, + -0.037567138671875, + 0.044525146484375, + 0.009613037109375, + 0.0133819580078125, + -0.0284576416015625, + 0.0039215087890625, + -0.03118896484375, + 0.0152130126953125, + -0.0085601806640625, + -0.07598876953125, + -0.0252532958984375, + -0.0245513916015625, + -0.004016876220703125, + -0.0257110595703125, + -0.043426513671875, + 0.00421142578125, + 0.0116424560546875, + 0.0092010498046875, + -0.040283203125, + -0.00799560546875, + 0.00630950927734375, + -0.0121917724609375, + 0.01617431640625, + -0.01107025146484375, + 0.0160064697265625, + 0.003955841064453125, + 0.07904052734375, + 0.0166015625, + 0.06036376953125, + 0.0250701904296875, + 0.0017480850219726562, + 0.0211029052734375, + -0.0021076202392578125, + 0.04669189453125, + 0.00598907470703125, + 0.0146026611328125, + -0.05615234375, + 0.035186767578125, + -0.022308349609375, + -0.00556182861328125, + 0.0125274658203125, + 0.047027587890625, + -0.01129150390625, + -0.017791748046875, + -0.01611328125, + -0.025360107421875, + -0.042724609375, + -0.038055419921875, + -0.043243408203125, + 0.06304931640625, + -0.0006055831909179688, + 0.01317596435546875, + -0.0104522705078125, + -0.058074951171875, + 0.219482421875, + 0.053009033203125, + 0.03497314453125, + 0.04620361328125, + 0.022979736328125, + 0.007904052734375, + 0.0115814208984375, + -0.02972412109375, + -0.00899505615234375, + -0.032257080078125, + 0.01507568359375, + 0.020660400390625, + 0.035369873046875, + 0.06304931640625, + 0.034332275390625, + 0.05010986328125, + -0.035797119140625, + -0.0011224746704101562, + -0.0100860595703125, + -0.0208740234375, + -0.07159423828125, + 0.007293701171875, + 0.0208587646484375, + 0.0219573974609375, + 0.0124359130859375, + 0.0298004150390625, + 0.0124053955078125, + -0.0430908203125, + -0.02056884765625, + -0.0255889892578125, + 0.05975341796875, + 0.0030193328857421875, + 0.0343017578125, + -0.0016508102416992188, + -0.04510498046875, + 0.03271484375, + -0.0237884521484375, + -0.036651611328125, + -0.0244293212890625, + 0.032806396484375, + -0.0238189697265625, + -0.026641845703125, + 0.0220794677734375, + -0.0005793571472167969, + -0.0118865966796875, + 0.031707763671875, + -0.037384033203125, + 0.004970550537109375, + -0.0082855224609375, + -0.0213470458984375, + 0.041259765625, + -0.048492431640625, + 0.0428466796875, + -0.03643798828125, + -0.044036865234375, + -0.01506805419921875, + -0.01001739501953125, + 0.004314422607421875, + -0.0275115966796875, + -0.0032634735107421875, + -0.00293731689453125, + 0.0285797119140625, + -0.0169830322265625, + -0.018463134765625, + -0.05340576171875, + -0.00955963134765625, + 0.024017333984375, + 0.044708251953125, + 0.003948211669921875, + -0.026641845703125, + -0.044708251953125, + -0.0254974365234375, + -0.01161956787109375, + -0.05841064453125, + 0.002246856689453125, + 0.051910400390625, + -0.0134429931640625, + -0.0028285980224609375, + 0.00647735595703125, + 0.00742340087890625, + -9.709596633911133e-05, + 0.027099609375, + 0.01171875, + -0.0048675537109375, + -0.00347900390625, + 0.05621337890625, + -0.0117950439453125, + -0.006793975830078125, + -0.00884246826171875, + 0.01467132568359375, + 0.071044921875, + 0.0311737060546875, + 0.00567626953125, + -0.0268707275390625, + 0.0014009475708007812 + ], + "index": 0, + "object": "embedding" + } + ], + "model": "bge-large-en-v1.5", + "object": "list", + "usage": { + "prompt_tokens": 6, + "total_tokens": 6 + }, + "id": "087ac5ef-08bc-459a-a20e-5aa4502151da" + } + }, + "is_streaming": false + } +} diff --git a/tests/integration/recordings/responses/7f53b458dad9.json b/tests/integration/recordings/responses/7f53b458dad9.json new file mode 100644 index 000000000..a7a98c739 --- /dev/null +++ b/tests/integration/recordings/responses/7f53b458dad9.json @@ -0,0 +1,83 @@ +{ + "request": { + "method": "POST", + "url": "__databricks__/serving-endpoints/v1/chat/completions", + "headers": {}, + "body": { + "model": "databricks-meta-llama-3-3-70b-instruct", + "messages": [ + { + "role": "user", + "content": "What's the weather in Tokyo? Use the get_weather function to get the weather." + } + ], + "stream": false, + "tools": [ + { + "type": "function", + "function": { + "name": "get_weather", + "description": "Get the weather in a given city", + "parameters": { + "type": "object", + "properties": { + "city": { + "type": "string", + "description": "The city to get the weather for" + } + } + } + } + } + ] + }, + "endpoint": "/v1/chat/completions", + "model": "databricks-meta-llama-3-3-70b-instruct" + }, + "response": { + "body": { + "__type__": "openai.types.chat.chat_completion.ChatCompletion", + "__data__": { + "id": "chatcmpl_e54eaa97-ace3-4af6-b3a2-b1627bc77488", + "choices": [ + { + "finish_reason": "tool_calls", + "index": 0, + "logprobs": null, + "message": { + "content": null, + "refusal": null, + "role": "assistant", + "annotations": null, + "audio": null, + "function_call": null, + "tool_calls": [ + { + "id": "call_9c7f9e5f-c6eb-4c3c-a7b3-e9fe0e786b50", + "function": { + "arguments": "{ \"city\": \"Tokyo\" }", + "name": "get_weather" + }, + "type": "function" + } + ] + } + } + ], + "created": 1758326507, + "model": "meta-llama-3.3-70b-instruct-121024", + "object": "chat.completion", + "service_tier": null, + "system_fingerprint": null, + "usage": { + "completion_tokens": 15, + "prompt_tokens": 682, + "total_tokens": 697, + "completion_tokens_details": null, + "prompt_tokens_details": null + } + } + }, + "is_streaming": false + } +} diff --git a/tests/integration/recordings/responses/875323ed9913.json b/tests/integration/recordings/responses/875323ed9913.json new file mode 100644 index 000000000..03b44ee35 --- /dev/null +++ b/tests/integration/recordings/responses/875323ed9913.json @@ -0,0 +1,3125 @@ +{ + "request": { + "method": "POST", + "url": "__databricks__/serving-endpoints/v1/embeddings", + "headers": {}, + "body": { + "model": "databricks-bge-large-en", + "input": [ + "Hello, world!", + "How are you today?", + "This is a test." + ], + "encoding_format": "float" + }, + "endpoint": "/v1/embeddings", + "model": "databricks-bge-large-en" + }, + "response": { + "body": { + "__type__": "openai.types.create_embedding_response.CreateEmbeddingResponse", + "__data__": { + "data": [ + { + "embedding": [ + 0.0243988037109375, + 0.047943115234375, + 0.007335662841796875, + -0.007709503173828125, + -0.0391845703125, + 0.0010442733764648438, + 0.060638427734375, + 0.047119140625, + 0.048828125, + 0.0029754638671875, + 0.01132965087890625, + 0.0018949508666992188, + -0.0067138671875, + -0.0010623931884765625, + -0.0482177734375, + 0.00206756591796875, + -0.00333404541015625, + -0.03924560546875, + -0.042205810546875, + 0.001739501953125, + -0.0150909423828125, + 0.0198516845703125, + -0.06890869140625, + -0.01383209228515625, + 0.01207733154296875, + 0.0251617431640625, + 0.048248291015625, + -0.0016155242919921875, + 0.04901123046875, + 0.049224853515625, + -0.016845703125, + 0.006439208984375, + -0.01308441162109375, + -0.05352783203125, + -0.02349853515625, + -0.0156097412109375, + 0.0246734619140625, + -0.0182952880859375, + -0.03765869140625, + -0.033782958984375, + 0.031982421875, + 0.012603759765625, + 0.05194091796875, + -0.030975341796875, + -0.0728759765625, + 0.014678955078125, + 0.0018672943115234375, + 0.01189422607421875, + 0.047576904296875, + -0.034820556640625, + 0.003490447998046875, + 0.0225830078125, + -0.01312255859375, + -0.015655517578125, + -0.00928497314453125, + 0.01117706298828125, + -0.04730224609375, + 0.03094482421875, + -0.0184173583984375, + 0.0289306640625, + 0.01617431640625, + 0.0369873046875, + 0.043121337890625, + -0.07110595703125, + -0.005035400390625, + 0.032684326171875, + -0.017303466796875, + -0.0286865234375, + 0.037322998046875, + -2.2411346435546875e-05, + -0.0400390625, + 0.0229034423828125, + 0.0014581680297851562, + -0.0011243820190429688, + -0.044647216796875, + 0.03863525390625, + -0.0066986083984375, + 0.0248565673828125, + -0.0228118896484375, + 0.01739501953125, + -0.005123138427734375, + 0.024932861328125, + -0.0092315673828125, + -6.16908073425293e-05, + -0.032623291015625, + -0.023834228515625, + 0.02532958984375, + 0.0243988037109375, + -0.0043792724609375, + -0.0207977294921875, + 0.057159423828125, + 0.03338623046875, + -0.004833221435546875, + -0.0027980804443359375, + 0.067626953125, + 0.0119476318359375, + -0.0282745361328125, + 0.00478363037109375, + -0.0012569427490234375, + 0.031005859375, + 0.03271484375, + 0.042083740234375, + -0.04437255859375, + 0.001743316650390625, + -0.031646728515625, + -0.01284027099609375, + -0.0006976127624511719, + -0.024993896484375, + -0.017974853515625, + -0.0216064453125, + -0.0264434814453125, + 0.0166473388671875, + 0.023223876953125, + 0.030426025390625, + -0.00421142578125, + 0.04913330078125, + 0.00365447998046875, + 0.0305633544921875, + -0.00933837890625, + -0.01103973388671875, + 0.017578125, + 0.035736083984375, + 0.00762176513671875, + -0.0289764404296875, + -0.0201263427734375, + -0.048828125, + -0.0297698974609375, + 0.0643310546875, + 0.0034046173095703125, + 0.005626678466796875, + 0.0011930465698242188, + -0.01959228515625, + 0.04833984375, + 0.0261077880859375, + 0.0166473388671875, + -0.006198883056640625, + -0.0127410888671875, + 0.05255126953125, + 0.023345947265625, + -0.04766845703125, + 0.007568359375, + -0.01605224609375, + -0.0249786376953125, + 0.0716552734375, + 0.021148681640625, + 0.047271728515625, + -0.0004963874816894531, + 0.0272979736328125, + -0.0146942138671875, + 0.006557464599609375, + -0.0176239013671875, + 0.025848388671875, + 0.0009784698486328125, + 0.047943115234375, + -0.0140838623046875, + 0.00478363037109375, + 0.0163726806640625, + 0.0284576416015625, + 0.0004887580871582031, + 0.00702667236328125, + 0.01250457763671875, + 0.03814697265625, + -0.00475311279296875, + 0.01116943359375, + -0.0187835693359375, + -0.003292083740234375, + -0.037750244140625, + -0.024200439453125, + 0.00476837158203125, + -0.0223236083984375, + -0.0184326171875, + -0.0226287841796875, + -0.029449462890625, + 0.00551605224609375, + 0.022247314453125, + 0.0177764892578125, + 0.004779815673828125, + -0.00438690185546875, + 0.03790283203125, + 0.0191650390625, + -0.04058837890625, + 0.01287841796875, + -0.0167694091796875, + 0.020904541015625, + -0.0011262893676757812, + 0.0074920654296875, + 0.010528564453125, + 0.0025463104248046875, + -0.0158843994140625, + -0.0284881591796875, + 0.0233917236328125, + 0.01557159423828125, + -0.033050537109375, + 0.021240234375, + 0.00876617431640625, + 0.0182342529296875, + -0.0213470458984375, + 0.019744873046875, + 0.0004127025604248047, + -0.08154296875, + -0.051849365234375, + 0.0160064697265625, + 0.0020732879638671875, + 0.0062408447265625, + -0.0002663135528564453, + -0.02752685546875, + -0.01544952392578125, + 0.035552978515625, + -0.0413818359375, + -0.0205535888671875, + -0.0018510818481445312, + 0.0179595947265625, + -0.02044677734375, + 0.0246734619140625, + 0.00603485107421875, + -0.04498291015625, + -0.0328369140625, + 0.0293426513671875, + -0.003444671630859375, + 0.0013523101806640625, + 0.021087646484375, + 0.0214996337890625, + 0.0322265625, + 0.052734375, + 0.007595062255859375, + 0.01483154296875, + -0.0285186767578125, + 0.039642333984375, + -0.00885009765625, + -0.008209228515625, + -0.02130126953125, + 0.040191650390625, + -0.007656097412109375, + 0.03790283203125, + 0.033477783203125, + 0.01396942138671875, + 0.0477294921875, + 0.03594970703125, + 0.0153961181640625, + -0.0192108154296875, + -0.043609619140625, + -0.01102447509765625, + 0.0202789306640625, + 0.0216827392578125, + 0.0107421875, + -0.003948211669921875, + 0.032745361328125, + -0.036468505859375, + 0.00565338134765625, + 0.017333984375, + -0.02471923828125, + 0.04962158203125, + 0.06695556640625, + 0.00830841064453125, + -0.038543701171875, + -0.033538818359375, + 0.0126495361328125, + 0.0963134765625, + -0.045501708984375, + -0.0272674560546875, + -0.0198516845703125, + 0.0192108154296875, + -0.005985260009765625, + 0.004718780517578125, + 0.0034332275390625, + 0.00797271728515625, + 0.013763427734375, + 0.00807952880859375, + -0.0081634521484375, + -0.0648193359375, + -0.0164794921875, + -0.0153961181640625, + -0.037322998046875, + 0.032684326171875, + -0.0148773193359375, + -0.0034275054931640625, + 0.01495361328125, + 0.0007452964782714844, + 0.0262908935546875, + -0.0213470458984375, + 0.0033168792724609375, + 0.00027680397033691406, + 0.037139892578125, + 0.01678466796875, + -0.006198883056640625, + -0.0129241943359375, + -0.0249176025390625, + -0.031768798828125, + -0.0093841552734375, + 0.05096435546875, + -0.054473876953125, + -0.0012273788452148438, + 0.0090484619140625, + 0.023712158203125, + -0.041168212890625, + 0.033782958984375, + -0.033447265625, + 0.0213623046875, + -0.023468017578125, + -0.032928466796875, + -0.00803375244140625, + 0.004177093505859375, + -0.0240478515625, + -0.020172119140625, + -0.0230255126953125, + 0.01380157470703125, + -0.00031375885009765625, + -0.03802490234375, + 0.0404052734375, + 0.0055999755859375, + -0.0276947021484375, + 0.0679931640625, + 0.023712158203125, + -0.0112152099609375, + -0.0311431884765625, + 0.0273284912109375, + 0.03741455078125, + 0.051055908203125, + -0.027740478515625, + -0.0143585205078125, + -0.0214691162109375, + -0.0245513916015625, + -0.01110076904296875, + -0.0645751953125, + -0.0060272216796875, + 0.0298614501953125, + 0.0212554931640625, + -0.038421630859375, + 0.0308074951171875, + -0.050384521484375, + -0.0648193359375, + -0.05316162109375, + -0.042205810546875, + 0.017822265625, + 0.00931549072265625, + -0.0125579833984375, + -0.0149688720703125, + -0.00836944580078125, + 0.0144805908203125, + -0.00506591796875, + 0.062347412109375, + -0.054046630859375, + -0.0012969970703125, + 0.0301361083984375, + -0.0227203369140625, + 0.005970001220703125, + -0.005603790283203125, + -0.0218048095703125, + -0.033477783203125, + 0.036895751953125, + 0.0012178421020507812, + -0.01517486572265625, + 0.00815582275390625, + 0.03436279296875, + 0.006923675537109375, + 0.0411376953125, + -0.08392333984375, + -0.0008368492126464844, + 0.052978515625, + -0.03778076171875, + 0.0228729248046875, + 0.03662109375, + 0.01922607421875, + -0.07257080078125, + 0.0016651153564453125, + -0.053466796875, + 0.0074920654296875, + 0.0200958251953125, + 0.024200439453125, + -0.049102783203125, + 0.033966064453125, + -0.032257080078125, + -0.0374755859375, + -0.0171051025390625, + -0.04205322265625, + -0.003955841064453125, + 0.0290985107421875, + -0.0194244384765625, + 0.031219482421875, + -0.037353515625, + 0.0143280029296875, + -0.038482666015625, + 0.0158233642578125, + 0.10565185546875, + 0.058685302734375, + 0.00910186767578125, + -0.031036376953125, + 0.0009794235229492188, + -0.01024627685546875, + -0.00899505615234375, + -0.059051513671875, + -0.0002980232238769531, + 0.0220184326171875, + -0.0318603515625, + -0.046234130859375, + -0.06512451171875, + 0.038055419921875, + 0.0237579345703125, + 0.05535888671875, + 0.0269775390625, + -0.032470703125, + -0.007843017578125, + -0.0004277229309082031, + -0.0008320808410644531, + -0.0297698974609375, + 0.00347900390625, + -0.0231170654296875, + 0.045684814453125, + 0.02154541015625, + -0.0097808837890625, + -0.052001953125, + -0.004913330078125, + -0.0172119140625, + 0.047088623046875, + 0.00754547119140625, + 0.0267791748046875, + -0.0257415771484375, + 0.03631591796875, + 0.0024356842041015625, + -0.0122222900390625, + -0.073974609375, + -0.0183258056640625, + -0.0548095703125, + -0.005504608154296875, + 0.0140838623046875, + -0.01800537109375, + -0.032318115234375, + -0.052703857421875, + 0.047607421875, + 0.0280303955078125, + 0.0155181884765625, + -0.042572021484375, + 0.005260467529296875, + -0.0006623268127441406, + -0.0401611328125, + 0.040618896484375, + 0.029937744140625, + -0.0228424072265625, + 0.04779052734375, + -0.07366943359375, + 0.042877197265625, + 0.022369384765625, + -0.017913818359375, + 0.013458251953125, + -0.0121612548828125, + -0.0040283203125, + 0.003917694091796875, + 0.00525665283203125, + -0.0029850006103515625, + -0.022705078125, + 0.0123443603515625, + -0.047576904296875, + -0.007537841796875, + -0.0170135498046875, + 0.0036563873291015625, + -0.01328277587890625, + -0.0197296142578125, + 0.032257080078125, + 0.0310821533203125, + -0.01271820068359375, + 0.01367950439453125, + -0.0293426513671875, + 0.04278564453125, + -0.0080413818359375, + -0.016143798828125, + 0.040557861328125, + -0.0185546875, + -0.019989013671875, + 0.03485107421875, + -0.00839996337890625, + -0.0103302001953125, + 0.0269317626953125, + 0.007663726806640625, + -0.004302978515625, + -0.00980377197265625, + -0.00559234619140625, + 0.008209228515625, + 0.0257415771484375, + 0.01360321044921875, + 0.005290985107421875, + -0.04595947265625, + -0.0149688720703125, + -0.0251617431640625, + -0.022491455078125, + 0.0013647079467773438, + -0.06842041015625, + 0.03143310546875, + 0.01025390625, + 0.0236968994140625, + 0.0092620849609375, + -0.0010786056518554688, + 0.0303802490234375, + -0.0270233154296875, + -0.06201171875, + -0.033477783203125, + -0.010772705078125, + -0.038604736328125, + 0.0026912689208984375, + -0.016876220703125, + 0.012451171875, + 0.039703369140625, + 0.019073486328125, + -0.0282745361328125, + -0.006443023681640625, + -0.0009312629699707031, + -0.008056640625, + -0.022308349609375, + 0.00717926025390625, + -0.0350341796875, + -0.0036983489990234375, + -0.011749267578125, + 0.02728271484375, + -0.01776123046875, + 0.0030460357666015625, + 0.00038242340087890625, + 0.0538330078125, + 0.019439697265625, + 0.0274505615234375, + -0.03076171875, + 0.033477783203125, + -0.002002716064453125, + -0.05035400390625, + -0.0300750732421875, + 0.036895751953125, + 0.00921630859375, + 0.0276947021484375, + 0.0244598388671875, + -0.0200653076171875, + -0.0162353515625, + -0.03564453125, + -0.0180816650390625, + -0.01381683349609375, + -0.051422119140625, + -0.024810791015625, + -0.047576904296875, + -0.002307891845703125, + 0.016357421875, + -0.01212310791015625, + -0.055328369140625, + 0.0200042724609375, + -0.035003662109375, + 0.01947021484375, + -0.05157470703125, + -0.0261077880859375, + -0.0270233154296875, + 0.031890869140625, + -0.0285491943359375, + 0.05194091796875, + -0.0537109375, + 0.0123443603515625, + -0.00536346435546875, + 0.01294708251953125, + -0.008514404296875, + 0.048797607421875, + -0.03656005859375, + -0.019134521484375, + 0.01282501220703125, + 0.02239990234375, + 0.006916046142578125, + 0.0161895751953125, + 0.0106201171875, + 0.0193023681640625, + -0.0130157470703125, + -0.003704071044921875, + -0.0496826171875, + -0.00824737548828125, + -0.0086212158203125, + -0.005970001220703125, + 0.01248931884765625, + 0.002422332763671875, + -0.0162811279296875, + -0.027679443359375, + 0.05450439453125, + 0.013031005859375, + -0.03863525390625, + -0.02117919921875, + -0.029937744140625, + -0.0723876953125, + -0.0164947509765625, + -0.002712249755859375, + -0.006168365478515625, + 0.013336181640625, + -0.07177734375, + 0.039642333984375, + 0.0193328857421875, + -0.039459228515625, + -0.00047898292541503906, + 0.086181640625, + 0.04376220703125, + 3.540515899658203e-05, + -0.0850830078125, + 0.0198974609375, + 0.02154541015625, + -0.00942230224609375, + -0.02410888671875, + 0.005283355712890625, + -0.007701873779296875, + -0.01079559326171875, + -0.039947509765625, + -0.03692626953125, + -0.0626220703125, + 0.014617919921875, + 0.047882080078125, + -0.01073455810546875, + 0.0618896484375, + -0.0198516845703125, + -0.0157318115234375, + -0.05828857421875, + 0.045013427734375, + 0.0609130859375, + -0.016937255859375, + 0.048553466796875, + 0.061798095703125, + 0.0208740234375, + 0.0745849609375, + -0.020751953125, + -0.00606536865234375, + -0.005092620849609375, + 0.060546875, + 0.052001953125, + 0.0223846435546875, + 0.0399169921875, + 0.042938232421875, + -0.08251953125, + -0.0589599609375, + -0.01287841796875, + -0.0127105712890625, + -0.0205078125, + -0.0225372314453125, + 0.0188446044921875, + -0.03125, + -0.0018014907836914062, + 0.037017822265625, + 0.0251617431640625, + 0.013092041015625, + 0.009918212890625, + -0.015838623046875, + 0.037506103515625, + -0.01477813720703125, + 0.025604248046875, + 0.052734375, + -0.055694580078125, + 0.007232666015625, + -0.02154541015625, + -0.01358795166015625, + -0.059539794921875, + 0.0096282958984375, + 0.0172119140625, + -0.0018491744995117188, + 0.042205810546875, + 0.06243896484375, + 0.002838134765625, + 0.011444091796875, + -0.0301361083984375, + 0.0011997222900390625, + 0.028167724609375, + -0.06756591796875, + -0.05401611328125, + -0.03204345703125, + -0.005840301513671875, + -0.0124359130859375, + 0.01061248779296875, + -0.0111541748046875, + -0.002239227294921875, + 0.01250457763671875, + 0.0078887939453125, + -0.014434814453125, + -0.0340576171875, + -0.0115966796875, + -0.0863037109375, + -0.06610107421875, + -0.0372314453125, + 0.001293182373046875, + -0.01338958740234375, + 0.0097503662109375, + 0.0316162109375, + 0.01081085205078125, + 0.0005192756652832031, + 0.02093505859375, + -0.010101318359375, + 0.0305328369140625, + -0.02203369140625, + 0.05535888671875, + -0.048126220703125, + -0.0797119140625, + -0.0194854736328125, + 0.01557159423828125, + -0.016387939453125, + -0.00905609130859375, + -0.0123138427734375, + -0.00618743896484375, + -0.0374755859375, + 0.068359375, + 0.0291748046875, + 0.023651123046875, + -0.032196044921875, + -0.045379638671875, + 0.0196685791015625, + 0.0159454345703125, + -0.0180206298828125, + 0.0095672607421875, + -0.00803375244140625, + -0.06939697265625, + 0.00830841064453125, + 0.006389617919921875, + -0.0055999755859375, + -0.030487060546875, + -0.031524658203125, + 0.03802490234375, + -0.01064300537109375, + -0.0218963623046875, + -0.0220794677734375, + -0.01910400390625, + -0.0213165283203125, + -0.0121002197265625, + 0.005268096923828125, + 0.0032634735107421875, + -0.035552978515625, + 0.024017333984375, + -0.033203125, + 0.03497314453125, + -0.01259613037109375, + 0.006511688232421875, + -0.0276336669921875, + 0.0098419189453125, + -0.016082763671875, + -0.005413055419921875, + 0.005741119384765625, + -0.0026645660400390625, + 0.020660400390625, + 0.011566162109375, + 0.042510986328125, + 0.036773681640625, + -0.0124053955078125, + 0.016387939453125, + -0.041748046875, + -0.01324462890625, + -0.04461669921875, + 0.005382537841796875, + 0.00766754150390625, + 0.0350341796875, + -0.0133514404296875, + -0.022308349609375, + 0.01395416259765625, + 0.0010786056518554688, + -0.016998291015625, + 0.050445556640625, + -0.08148193359375, + -0.0211181640625, + 0.0263671875, + -0.032684326171875, + 0.0298004150390625, + -0.0145721435546875, + -0.044921875, + 0.048065185546875, + -0.002777099609375, + -0.0197601318359375, + -0.029144287109375, + 0.029693603515625, + 0.0357666015625, + -0.01446533203125, + -0.04107666015625, + -0.032623291015625, + 0.0235443115234375, + -0.004932403564453125, + 0.03948974609375, + -0.04803466796875, + -0.002696990966796875, + -0.00742340087890625, + 0.0084991455078125, + -0.03466796875, + 0.00839996337890625, + 0.02239990234375, + -0.00612640380859375, + 0.00899505615234375, + 0.02520751953125, + 0.0232391357421875, + -0.061309814453125, + 0.032806396484375, + 0.00960540771484375, + 0.020233154296875, + -0.0716552734375, + 0.00543212890625, + 0.0033130645751953125, + 0.0158233642578125, + 0.010711669921875, + 0.0645751953125, + 0.01123046875, + 0.03961181640625, + 0.046295166015625, + 0.021240234375, + 0.02130126953125, + 0.0188446044921875, + -0.016998291015625, + -0.0034503936767578125, + 0.016357421875, + 0.043121337890625, + 0.048583984375, + 0.01155853271484375, + 0.027252197265625, + 0.023406982421875, + -0.0126495361328125, + 0.023712158203125, + 0.0126800537109375, + -0.0148773193359375, + 0.00258636474609375, + 0.024322509765625, + 0.0178070068359375, + -0.024658203125, + 0.0230865478515625, + 0.0105133056640625, + -0.00045037269592285156, + 0.023223876953125, + -0.01464080810546875, + -0.029388427734375, + -0.03436279296875, + 0.05517578125, + 0.0023937225341796875, + 0.0049896240234375, + -0.006999969482421875, + -0.0167083740234375, + -0.00464630126953125, + 0.0546875, + -0.0194854736328125, + 0.0386962890625, + 0.01062774658203125, + 0.028167724609375, + 0.01032257080078125, + 0.0160980224609375, + 0.03955078125, + 0.0221405029296875, + -0.035400390625, + -0.01849365234375, + -0.006534576416015625, + -0.00806427001953125, + 0.005580902099609375, + 0.016815185546875, + -0.053375244140625, + 0.06671142578125, + -0.0226593017578125, + -0.01800537109375, + 0.01136016845703125, + -0.021575927734375, + -0.039794921875, + -0.055908203125, + 0.041290283203125, + -0.0155181884765625, + -0.01160430908203125, + 0.03240966796875, + -0.0201873779296875, + -0.0015039443969726562, + 0.0290374755859375, + 0.004970550537109375, + 0.044342041015625, + 0.033782958984375, + 0.024200439453125, + -0.0140533447265625, + 0.0372314453125, + 0.033966064453125, + -0.02838134765625, + 0.0026264190673828125, + 0.016082763671875, + -0.0020294189453125, + 0.0058746337890625, + 0.00957489013671875, + -0.0548095703125, + -0.0106048583984375, + -0.0201873779296875, + -0.0311126708984375, + 0.0242767333984375, + 0.039337158203125, + -0.0171661376953125, + -0.00949859619140625, + 0.01934814453125, + 0.017608642578125, + -0.037506103515625, + 0.044525146484375, + 0.00963592529296875, + 0.01335906982421875, + -0.0284576416015625, + 0.0039215087890625, + -0.03118896484375, + 0.0152587890625, + -0.0085601806640625, + -0.07598876953125, + -0.0252685546875, + -0.0245819091796875, + -0.00405120849609375, + -0.025726318359375, + -0.04339599609375, + 0.004215240478515625, + 0.01166534423828125, + 0.0092315673828125, + -0.040283203125, + -0.00799560546875, + 0.0063629150390625, + -0.012176513671875, + 0.01617431640625, + -0.01105499267578125, + 0.0160369873046875, + 0.00394439697265625, + 0.07904052734375, + 0.016632080078125, + 0.0604248046875, + 0.0250701904296875, + 0.00177764892578125, + 0.0211181640625, + -0.00211334228515625, + 0.04669189453125, + 0.0059967041015625, + 0.01454925537109375, + -0.056121826171875, + 0.03515625, + -0.0222625732421875, + -0.005580902099609375, + 0.01251983642578125, + 0.0469970703125, + -0.0113067626953125, + -0.0177764892578125, + -0.0161285400390625, + -0.025390625, + -0.042724609375, + -0.03802490234375, + -0.04327392578125, + 0.06304931640625, + -0.0006208419799804688, + 0.01319122314453125, + -0.01045989990234375, + -0.058074951171875, + 0.219482421875, + 0.052978515625, + 0.035003662109375, + 0.046234130859375, + 0.022979736328125, + 0.00791168212890625, + 0.0115509033203125, + -0.02972412109375, + -0.009033203125, + -0.0322265625, + 0.01506805419921875, + 0.0206146240234375, + 0.035369873046875, + 0.0631103515625, + 0.0343017578125, + 0.050079345703125, + -0.035797119140625, + -0.001117706298828125, + -0.010101318359375, + -0.020904541015625, + -0.07159423828125, + 0.0073089599609375, + 0.0208892822265625, + 0.0219573974609375, + 0.012451171875, + 0.0298614501953125, + 0.0124053955078125, + -0.0430908203125, + -0.02056884765625, + -0.025604248046875, + 0.05975341796875, + 0.0030345916748046875, + 0.034271240234375, + -0.0016489028930664062, + -0.0450439453125, + 0.03271484375, + -0.023773193359375, + -0.036651611328125, + -0.0244140625, + 0.0328369140625, + -0.0238189697265625, + -0.0266876220703125, + 0.0220489501953125, + -0.000568389892578125, + -0.011932373046875, + 0.031768798828125, + -0.037384033203125, + 0.00494384765625, + -0.00827789306640625, + -0.0213470458984375, + 0.041259765625, + -0.048492431640625, + 0.042816162109375, + -0.03643798828125, + -0.043975830078125, + -0.0151214599609375, + -0.01001739501953125, + 0.004276275634765625, + -0.0275115966796875, + -0.003204345703125, + -0.0029449462890625, + 0.0285797119140625, + -0.0169677734375, + -0.018463134765625, + -0.05340576171875, + -0.0095367431640625, + 0.024078369140625, + 0.044708251953125, + 0.00394439697265625, + -0.0266876220703125, + -0.044769287109375, + -0.0255279541015625, + -0.0115814208984375, + -0.05841064453125, + 0.0022296905517578125, + 0.051910400390625, + -0.0134429931640625, + -0.0028533935546875, + 0.00644683837890625, + 0.00742340087890625, + -5.5670738220214844e-05, + 0.027099609375, + 0.0117340087890625, + -0.0048370361328125, + -0.003509521484375, + 0.0562744140625, + -0.01180267333984375, + -0.006748199462890625, + -0.00887298583984375, + 0.01462554931640625, + 0.07110595703125, + 0.0311737060546875, + 0.0056610107421875, + -0.026885986328125, + 0.0013914108276367188 + ], + "index": 0, + "object": "embedding" + }, + { + "embedding": [ + 0.05657958984375, + -0.01303863525390625, + -0.07171630859375, + 0.0257110595703125, + -0.04144287109375, + -0.0653076171875, + 0.0290985107421875, + 0.043731689453125, + 0.034576416015625, + 0.00887298583984375, + 0.027496337890625, + 0.01410675048828125, + -0.033477783203125, + 0.0227508544921875, + -0.052825927734375, + -0.048431396484375, + -0.002658843994140625, + -0.0045166015625, + -0.001861572265625, + 0.0042572021484375, + -0.0457763671875, + 0.05926513671875, + -0.07373046875, + 0.059356689453125, + -0.0259246826171875, + 0.0139007568359375, + -0.01395416259765625, + -0.0054779052734375, + 0.0095977783203125, + 0.0606689453125, + -0.045684814453125, + 0.0550537109375, + 0.0120697021484375, + -0.047698974609375, + 0.02215576171875, + -0.053192138671875, + 0.0205841064453125, + -0.027557373046875, + 0.020721435546875, + -0.01107025146484375, + 0.0023365020751953125, + 0.01224517822265625, + 0.065185546875, + -0.0263671875, + -0.057830810546875, + 0.0100860595703125, + -0.0093994140625, + -0.036468505859375, + 0.0039215087890625, + -0.023468017578125, + 0.00843048095703125, + 0.0224761962890625, + -0.026458740234375, + -0.0110321044921875, + 0.0426025390625, + -0.00511932373046875, + -0.01483917236328125, + 0.0163116455078125, + -0.0264129638671875, + -0.004299163818359375, + 0.0227508544921875, + 0.0265350341796875, + 0.0062408447265625, + -0.0718994140625, + -0.017974853515625, + 0.02496337890625, + -0.0202789306640625, + -0.02581787109375, + -0.001132965087890625, + -0.0164337158203125, + -0.043365478515625, + 0.0310211181640625, + -0.03863525390625, + -0.0193023681640625, + -0.0021533966064453125, + 0.020263671875, + 3.993511199951172e-06, + -0.00939178466796875, + 0.024383544921875, + 0.03875732421875, + 0.0219573974609375, + 0.007785797119140625, + -0.00616455078125, + 0.01285552978515625, + -0.029022216796875, + 0.00968170166015625, + 0.003932952880859375, + 0.0259246826171875, + 0.0110321044921875, + -0.029632568359375, + 0.03955078125, + 0.0439453125, + -0.03692626953125, + -0.0249786376953125, + 0.04290771484375, + 0.053436279296875, + -0.013702392578125, + 0.00914764404296875, + -0.0560302734375, + 0.01519775390625, + 0.0716552734375, + 0.0178070068359375, + -0.0181121826171875, + 0.0316162109375, + -0.060577392578125, + -0.007793426513671875, + 0.023406982421875, + -0.038604736328125, + -0.024505615234375, + -0.031524658203125, + -0.02227783203125, + 0.03778076171875, + 0.0150299072265625, + 0.037261962890625, + -0.02490234375, + 0.004779815673828125, + 0.01922607421875, + 0.056060791015625, + -0.007293701171875, + -0.012481689453125, + -0.00988006591796875, + -0.004314422607421875, + 0.01788330078125, + 0.005939483642578125, + -0.006855010986328125, + 0.00307464599609375, + -0.0635986328125, + 0.0673828125, + 0.004398345947265625, + -0.0141448974609375, + -0.01318359375, + 0.015533447265625, + 0.07952880859375, + 0.0267486572265625, + 0.00969696044921875, + -0.0020503997802734375, + -0.0038051605224609375, + 0.02349853515625, + 0.0025577545166015625, + -0.0249481201171875, + 0.0223236083984375, + -0.01531982421875, + -0.006320953369140625, + 0.0640869140625, + 0.023529052734375, + 0.0230255126953125, + 0.00557708740234375, + 0.029205322265625, + -0.017242431640625, + 0.01364898681640625, + 0.005817413330078125, + 0.046142578125, + -0.043548583984375, + 0.00994873046875, + -0.047882080078125, + -0.004795074462890625, + 0.0238494873046875, + -0.0012063980102539062, + -0.0140838623046875, + -0.006195068359375, + -0.0185089111328125, + -0.0006442070007324219, + -0.0261383056640625, + 0.0029087066650390625, + 0.01422882080078125, + 0.035858154296875, + -0.032806396484375, + 0.01500701904296875, + 0.01091766357421875, + -0.017303466796875, + 0.0166015625, + 0.0181732177734375, + -0.013916015625, + 0.009429931640625, + 0.003040313720703125, + 0.01971435546875, + 0.006145477294921875, + -0.005756378173828125, + 0.058135986328125, + 0.0009236335754394531, + -0.005275726318359375, + -0.034759521484375, + -0.022308349609375, + 0.0191650390625, + 0.001628875732421875, + -0.015716552734375, + 0.023468017578125, + -0.0273284912109375, + -0.001552581787109375, + -0.013458251953125, + -0.01551055908203125, + 0.035675048828125, + -0.006793975830078125, + 0.03619384765625, + -0.013916015625, + -0.009613037109375, + 0.035980224609375, + 0.00714874267578125, + 0.005367279052734375, + -0.07659912109375, + -0.041656494140625, + 0.0323486328125, + 0.00923919677734375, + 0.022430419921875, + 0.0010395050048828125, + -0.02783203125, + 0.01495361328125, + -0.0263824462890625, + -0.01824951171875, + -0.0026874542236328125, + 0.0117950439453125, + 0.0224456787109375, + -0.018951416015625, + 0.0019779205322265625, + 0.055145263671875, + -0.0107421875, + 0.0216217041015625, + 0.01361083984375, + -0.04754638671875, + -0.0231170654296875, + -0.00344085693359375, + 0.0433349609375, + 0.0287628173828125, + 0.0438232421875, + 0.00794219970703125, + -0.0042266845703125, + 0.005889892578125, + -0.00487518310546875, + -0.0221405029296875, + -0.03192138671875, + 0.0322265625, + 0.00891876220703125, + 0.03936767578125, + 0.007656097412109375, + 0.01018524169921875, + 0.0110321044921875, + 0.048583984375, + -0.01385498046875, + 0.04608154296875, + -0.023345947265625, + -0.0264434814453125, + 0.01552581787109375, + 0.05108642578125, + -0.026153564453125, + -0.002643585205078125, + 0.0262603759765625, + 0.00043892860412597656, + 0.002208709716796875, + -0.0023670196533203125, + -0.0033054351806640625, + 0.0416259765625, + 0.00308990478515625, + 0.0562744140625, + 0.033538818359375, + -0.053131103515625, + 0.004322052001953125, + 0.0174407958984375, + 0.062286376953125, + -0.028839111328125, + 0.0006632804870605469, + 0.03924560546875, + 0.011138916015625, + 0.002841949462890625, + -0.0038909912109375, + 0.0272674560546875, + -0.007427215576171875, + -0.0015783309936523438, + 0.050079345703125, + -0.0144195556640625, + -0.055145263671875, + 0.004947662353515625, + 0.00231170654296875, + -0.021759033203125, + -0.05413818359375, + -0.04248046875, + -0.040374755859375, + 0.038970947265625, + -0.006610870361328125, + 0.035797119140625, + -0.01306915283203125, + 0.0306243896484375, + -0.049652099609375, + -0.0232391357421875, + 0.0269775390625, + 0.00566864013671875, + 0.0231781005859375, + -0.01318359375, + -0.035369873046875, + 0.042388916015625, + 0.058349609375, + -0.0290679931640625, + -0.01021575927734375, + 0.005229949951171875, + -0.040374755859375, + -0.045623779296875, + -0.039154052734375, + 0.0164031982421875, + 0.047698974609375, + -0.039794921875, + -0.0149383544921875, + 0.061737060546875, + 0.03692626953125, + -0.00058746337890625, + 0.01445770263671875, + -0.016876220703125, + 0.0028228759765625, + 0.037384033203125, + -0.019317626953125, + 0.0175323486328125, + 0.0184173583984375, + -0.032257080078125, + 0.05633544921875, + 0.03033447265625, + -0.0094146728515625, + -0.045196533203125, + 0.0074310302734375, + 0.047088623046875, + 0.0162506103515625, + -0.022613525390625, + -0.0038623809814453125, + -0.05474853515625, + -0.00865936279296875, + -0.0222015380859375, + -0.0132293701171875, + -0.0308685302734375, + 0.0259246826171875, + -0.0088958740234375, + -0.0440673828125, + 0.039093017578125, + -0.0452880859375, + -0.056488037109375, + -0.021240234375, + -0.04376220703125, + 0.003742218017578125, + 0.005710601806640625, + 0.0106964111328125, + 0.06005859375, + -0.010101318359375, + 0.044769287109375, + -0.0096282958984375, + 0.05841064453125, + -0.0225677490234375, + -0.06829833984375, + 0.006496429443359375, + -0.0288238525390625, + 0.0200653076171875, + 0.00909423828125, + -0.0151214599609375, + 0.007610321044921875, + 0.01544952392578125, + -0.0268402099609375, + 0.0175018310546875, + -0.0214385986328125, + -0.0272979736328125, + 0.00273895263671875, + 0.0552978515625, + -0.044036865234375, + 0.0164031982421875, + 0.054046630859375, + 0.001293182373046875, + 0.043487548828125, + 0.0289764404296875, + 0.00934600830078125, + -0.018951416015625, + 0.046783447265625, + -0.012664794921875, + 0.0433349609375, + 0.00730133056640625, + 0.0239715576171875, + -0.0269775390625, + 0.0118865966796875, + -0.07781982421875, + 0.040252685546875, + -0.0161895751953125, + -0.035797119140625, + -0.042083740234375, + 0.0032138824462890625, + -0.0294952392578125, + -0.0014066696166992188, + -0.050140380859375, + 0.043304443359375, + -0.039520263671875, + 0.028900146484375, + 0.041595458984375, + 0.0621337890625, + 0.020477294921875, + -0.056365966796875, + 0.03155517578125, + 0.0011234283447265625, + -0.01244354248046875, + -0.011749267578125, + 0.0233306884765625, + 0.038177490234375, + -0.04364013671875, + -0.01099395751953125, + -0.07708740234375, + 0.030029296875, + -0.0209197998046875, + 0.034332275390625, + 0.0048675537109375, + 0.01065826416015625, + 0.00626373291015625, + 0.035186767578125, + 0.0712890625, + 0.003147125244140625, + -0.0175933837890625, + -0.03662109375, + 0.0096282958984375, + 0.034942626953125, + -0.0138397216796875, + -0.055755615234375, + 0.0197601318359375, + 0.01378631591796875, + 0.036224365234375, + 0.02960205078125, + -0.004787445068359375, + -0.007419586181640625, + 0.0301055908203125, + 0.006622314453125, + 0.00543975830078125, + -0.04498291015625, + -0.07183837890625, + -0.0274200439453125, + -0.0289154052734375, + 0.0168914794921875, + -0.0271453857421875, + 0.01678466796875, + 0.014678955078125, + 0.0408935546875, + 0.04473876953125, + 0.007160186767578125, + -0.00865936279296875, + -0.05511474609375, + -0.0004930496215820312, + -0.046661376953125, + 0.02484130859375, + 0.037139892578125, + -0.04925537109375, + 0.0041961669921875, + -0.0880126953125, + 0.0521240234375, + 0.0391845703125, + -0.0254058837890625, + 0.025543212890625, + 0.0063018798828125, + -0.0228271484375, + -0.02459716796875, + -0.0041961669921875, + -0.024383544921875, + -0.02935791015625, + 0.037750244140625, + -0.0921630859375, + -0.0236968994140625, + -0.0024261474609375, + -0.034210205078125, + 0.005367279052734375, + 0.0009765625, + 0.03192138671875, + 0.025634765625, + 0.0240631103515625, + -0.00328826904296875, + 0.01264190673828125, + 0.030517578125, + 0.0225372314453125, + 0.01378631591796875, + 0.051971435546875, + 0.01006317138671875, + 0.0128936767578125, + 0.03607177734375, + 0.0390625, + -0.021484375, + 0.00800323486328125, + 0.0258331298828125, + 0.0277099609375, + 0.03564453125, + -0.0202789306640625, + 0.01531219482421875, + -0.0152587890625, + 0.00983428955078125, + -0.0051422119140625, + -0.051055908203125, + -0.010101318359375, + 0.00893402099609375, + -0.040252685546875, + -0.05133056640625, + -0.05291748046875, + 0.0220184326171875, + 0.029296875, + 0.0041046142578125, + 0.032379150390625, + -0.037261962890625, + -0.0113677978515625, + -0.062347412109375, + -0.01439666748046875, + -0.0291290283203125, + -0.0126495361328125, + -0.054229736328125, + -0.00743865966796875, + 0.0105438232421875, + 0.007312774658203125, + -0.016448974609375, + -0.0113372802734375, + -0.041229248046875, + -0.006427764892578125, + 0.0282135009765625, + -0.038909912109375, + -0.0243377685546875, + -0.0161895751953125, + -0.0231781005859375, + 0.001476287841796875, + -0.0256805419921875, + 0.030242919921875, + -0.0211639404296875, + 0.0236968994140625, + 0.01119232177734375, + 0.0018024444580078125, + 0.0289764404296875, + 0.028411865234375, + -0.046783447265625, + -0.0002586841583251953, + 0.026611328125, + -0.037200927734375, + 0.00283050537109375, + 0.00838470458984375, + 0.03741455078125, + 0.032928466796875, + -0.00173187255859375, + -0.0199432373046875, + -0.0278778076171875, + -0.0684814453125, + 0.00913238525390625, + -0.03924560546875, + -0.048797607421875, + -0.041595458984375, + -0.0273284912109375, + -0.0194549560546875, + 0.01515960693359375, + -0.030364990234375, + -0.0034732818603515625, + -0.0144500732421875, + 0.0029468536376953125, + 0.026458740234375, + -0.0204925537109375, + -0.04376220703125, + -0.01318359375, + -0.0034465789794921875, + 0.035614013671875, + 0.026519775390625, + -0.031463623046875, + -0.00624847412109375, + 0.0032501220703125, + -0.0084991455078125, + -0.0202178955078125, + 0.01122283935546875, + -0.00534820556640625, + -0.00848388671875, + 0.01519775390625, + 0.006572723388671875, + -0.01027679443359375, + 0.04296875, + -0.01453399658203125, + 0.007167816162109375, + -0.032135009765625, + -0.0160369873046875, + -0.052978515625, + -0.00881195068359375, + -0.052154541015625, + 0.010955810546875, + -0.01491546630859375, + -0.033233642578125, + -0.027557373046875, + 0.00043892860412597656, + 0.04730224609375, + 0.051422119140625, + -0.016571044921875, + -0.044525146484375, + -0.0333251953125, + -0.045989990234375, + -0.003017425537109375, + -0.0039520263671875, + 0.0023212432861328125, + 0.00994873046875, + -0.040130615234375, + 0.051116943359375, + 0.0125732421875, + -0.0266876220703125, + 0.004421234130859375, + 0.06134033203125, + -0.00547027587890625, + 0.00766754150390625, + -0.07373046875, + 0.003940582275390625, + 0.032012939453125, + -0.0016727447509765625, + -0.043914794921875, + -0.0321044921875, + 0.004913330078125, + -0.024444580078125, + -0.0177154541015625, + -0.010955810546875, + -0.059051513671875, + 0.0171051025390625, + 0.043426513671875, + 0.00754547119140625, + 0.0634765625, + 0.03753662109375, + -0.0050201416015625, + -0.056060791015625, + 0.04998779296875, + 0.046478271484375, + 0.0140533447265625, + 0.042236328125, + -0.00408935546875, + -0.06103515625, + -0.007503509521484375, + -0.0390625, + -0.005077362060546875, + 0.0172271728515625, + 0.041778564453125, + 0.0175628662109375, + -0.013763427734375, + 0.052154541015625, + 0.05096435546875, + -0.041595458984375, + -0.03985595703125, + -0.0322265625, + 0.0138397216796875, + 0.003604888916015625, + -0.01244354248046875, + 0.00519561767578125, + -0.00344085693359375, + 0.004962921142578125, + 0.033905029296875, + 0.0231781005859375, + -0.01432037353515625, + 0.01763916015625, + -0.032073974609375, + 0.0306243896484375, + -0.047393798828125, + 0.009124755859375, + 0.006534576416015625, + -0.06036376953125, + 0.055511474609375, + -0.023223876953125, + 0.01806640625, + -0.027496337890625, + 0.016937255859375, + 0.02020263671875, + -0.0216217041015625, + 0.010589599609375, + 0.04296875, + 0.013763427734375, + 0.016998291015625, + 0.0238037109375, + 0.0183868408203125, + 0.0265350341796875, + -0.0494384765625, + -0.006572723388671875, + -0.030975341796875, + 0.00220489501953125, + -0.0153961181640625, + -0.00907135009765625, + -0.0175628662109375, + -0.002471923828125, + 0.037353515625, + 0.053131103515625, + -0.024139404296875, + 0.0004608631134033203, + -0.032135009765625, + -0.07452392578125, + -0.0621337890625, + 0.005794525146484375, + -0.020721435546875, + -0.0404052734375, + 0.039276123046875, + -0.01512908935546875, + -0.0162353515625, + -0.019134521484375, + 0.0122222900390625, + 0.0099639892578125, + 0.0093841552734375, + -0.045196533203125, + 0.055267333984375, + -0.048431396484375, + -0.052978515625, + -0.0182647705078125, + 0.03399658203125, + -0.0295562744140625, + 0.01239013671875, + -0.02276611328125, + 0.0007886886596679688, + -0.0469970703125, + 0.06591796875, + -0.0081329345703125, + 0.0038356781005859375, + -0.029937744140625, + -0.03875732421875, + -0.0027446746826171875, + 0.01214599609375, + 0.016693115234375, + -0.006130218505859375, + 0.0550537109375, + 0.0037059783935546875, + -0.0098419189453125, + -0.0009174346923828125, + -0.00543975830078125, + -0.00853729248046875, + -0.0019588470458984375, + 0.0157318115234375, + -0.0235748291015625, + -0.01067352294921875, + -0.057586669921875, + -0.005489349365234375, + -0.0250396728515625, + 0.0177459716796875, + -0.036834716796875, + 0.01010894775390625, + -0.046051025390625, + 0.02447509765625, + 0.0250091552734375, + 0.036376953125, + 0.0482177734375, + -0.006557464599609375, + 0.0006661415100097656, + 0.039794921875, + 0.0218658447265625, + 0.02783203125, + -0.01424407958984375, + -0.006687164306640625, + -0.01116180419921875, + 0.022003173828125, + 0.01508331298828125, + 0.04046630859375, + -0.0249176025390625, + 0.046783447265625, + -0.032135009765625, + -0.0565185546875, + -0.0406494140625, + 0.0010471343994140625, + -0.004970550537109375, + 0.03912353515625, + 0.044677734375, + -0.0322265625, + -0.005466461181640625, + -0.0177154541015625, + -0.0343017578125, + 0.0233917236328125, + -0.0283660888671875, + 0.003353118896484375, + 0.007205963134765625, + -0.002902984619140625, + 0.0174713134765625, + -0.02508544921875, + -0.049102783203125, + 0.00870513916015625, + -0.021240234375, + -0.0304107666015625, + -0.046112060546875, + 0.006832122802734375, + 0.040252685546875, + 0.0244140625, + -0.0260009765625, + 0.0204925537109375, + 0.01305389404296875, + 0.0183868408203125, + 0.004917144775390625, + -0.06298828125, + -0.00020122528076171875, + -0.04583740234375, + 0.01218414306640625, + -0.0316162109375, + -0.0008444786071777344, + 0.06903076171875, + 0.00920867919921875, + -0.0006356239318847656, + 0.01439666748046875, + 0.0228118896484375, + -0.0230255126953125, + -0.001232147216796875, + 0.0260772705078125, + 0.044342041015625, + -0.040863037109375, + 0.0046234130859375, + -0.0004677772521972656, + 0.00399017333984375, + 0.005584716796875, + 0.06134033203125, + -0.00959014892578125, + 0.03985595703125, + 0.040130615234375, + -0.0007066726684570312, + 0.02435302734375, + -0.01268768310546875, + -0.059356689453125, + -0.03997802734375, + 0.020355224609375, + 0.038787841796875, + 0.0007376670837402344, + -0.003978729248046875, + 0.002613067626953125, + 0.015533447265625, + -0.00855255126953125, + 0.044525146484375, + 0.0190887451171875, + 0.00556182861328125, + -0.02294921875, + 0.0037250518798828125, + -0.0091552734375, + -0.00839996337890625, + 0.033935546875, + -0.00464630126953125, + -0.0188140869140625, + -0.0259246826171875, + -0.03778076171875, + -0.01251983642578125, + -0.04986572265625, + -0.003742218017578125, + 0.01345062255859375, + 0.01047515869140625, + 0.009429931640625, + -0.0016651153564453125, + -0.016357421875, + 0.06134033203125, + 0.032501220703125, + 0.01666259765625, + 0.00809478759765625, + 0.003185272216796875, + 0.0292510986328125, + 0.042816162109375, + 0.0323486328125, + -0.00855255126953125, + -0.042022705078125, + -0.00937652587890625, + 0.0304718017578125, + -0.0455322265625, + -0.018035888671875, + 0.0179290771484375, + -0.011474609375, + 0.04498291015625, + 0.04486083984375, + -0.0221405029296875, + 0.0200653076171875, + -0.07171630859375, + 0.0217742919921875, + -0.032073974609375, + -0.0026874542236328125, + -0.0194854736328125, + -0.034698486328125, + -0.0017251968383789062, + -0.032073974609375, + 0.0181732177734375, + 0.040863037109375, + 0.0178985595703125, + 0.02886962890625, + -0.0292816162109375, + 0.03448486328125, + 0.00787353515625, + 0.02154541015625, + 0.0653076171875, + 0.01049041748046875, + -0.06597900390625, + 0.03143310546875, + -0.03228759765625, + -0.00637054443359375, + 0.0239410400390625, + -0.03369140625, + 0.023193359375, + -0.01158905029296875, + -0.04644775390625, + 0.01280975341796875, + 0.0382080078125, + 0.0002512931823730469, + -0.0440673828125, + 0.00988006591796875, + -0.006145477294921875, + -0.0296478271484375, + 0.048431396484375, + -0.01551055908203125, + 0.0196380615234375, + -0.00615692138671875, + 0.0144500732421875, + -0.0185699462890625, + 0.00763702392578125, + 0.0097503662109375, + -0.037017822265625, + 0.0013332366943359375, + -0.030914306640625, + -0.060516357421875, + -0.0116729736328125, + -0.0361328125, + 0.014129638671875, + 0.0267486572265625, + -0.0182037353515625, + -0.050750732421875, + -0.01531982421875, + 0.0465087890625, + -0.0296783447265625, + 0.016998291015625, + -0.00252532958984375, + 0.0134124755859375, + 0.022125244140625, + 0.025726318359375, + -0.012481689453125, + 0.061798095703125, + 0.0129241943359375, + -0.005947113037109375, + 0.01849365234375, + -0.051177978515625, + 0.055450439453125, + -0.0019464492797851562, + 0.0128936767578125, + -0.03411865234375, + 0.032989501953125, + -0.016021728515625, + -0.01294708251953125, + 0.037811279296875, + 0.056671142578125, + -0.000545501708984375, + -0.0296478271484375, + -0.0638427734375, + -0.06390380859375, + -0.0244140625, + 0.053436279296875, + -0.0296783447265625, + 0.08489990234375, + -0.007610321044921875, + 0.01091766357421875, + 0.0369873046875, + -0.0587158203125, + 0.1727294921875, + 0.0172119140625, + 0.05718994140625, + -0.00472259521484375, + -0.01422882080078125, + 0.00644683837890625, + -0.0230712890625, + 0.038665771484375, + -0.00897216796875, + -0.0172882080078125, + 0.048065185546875, + 0.0261077880859375, + 0.0165863037109375, + 0.045623779296875, + 0.01290130615234375, + 0.0220794677734375, + -0.0174713134765625, + -0.0084075927734375, + 0.00569915771484375, + -0.01153564453125, + -0.0225067138671875, + 0.015838623046875, + 0.032867431640625, + 0.0245208740234375, + -0.00766754150390625, + -0.006465911865234375, + 0.038055419921875, + -0.03900146484375, + -0.039764404296875, + -0.027496337890625, + 0.056915283203125, + -0.01226043701171875, + 0.0323486328125, + -0.006572723388671875, + -0.0374755859375, + -0.0006594657897949219, + -0.04071044921875, + -0.035797119140625, + -0.025543212890625, + 0.027679443359375, + -0.053985595703125, + -0.0218963623046875, + 6.031990051269531e-05, + -0.00080108642578125, + -0.01027679443359375, + 0.02191162109375, + -0.051116943359375, + 0.019073486328125, + -0.035125732421875, + 0.00820159912109375, + 0.06439208984375, + -0.059967041015625, + 0.030487060546875, + -0.033905029296875, + 0.011474609375, + 0.034423828125, + -0.01224517822265625, + 0.0301666259765625, + -0.0313720703125, + 0.0235595703125, + 0.01110076904296875, + -0.01364898681640625, + 0.007190704345703125, + -0.040191650390625, + -0.0015039443969726562, + 0.0287933349609375, + 0.093017578125, + 0.0226287841796875, + 0.00458526611328125, + -0.01953125, + -0.055145263671875, + 0.02874755859375, + -0.0242462158203125, + -0.0273284912109375, + 0.02313232421875, + 0.0120849609375, + -0.0274200439453125, + 0.00518798828125, + -0.0140838623046875, + -0.00997161865234375, + 0.0233917236328125, + 0.00920867919921875, + -0.005859375, + -0.027099609375, + 0.0267486572265625, + 0.041290283203125, + -0.029144287109375, + -0.0164794921875, + -0.049102783203125, + 0.036468505859375, + 0.04705810546875, + 0.0013570785522460938, + -0.014373779296875, + -0.049652099609375, + -0.0160369873046875 + ], + "index": 1, + "object": "embedding" + }, + { + "embedding": [ + 0.0028533935546875, + 0.02496337890625, + 0.00098419189453125, + 0.0380859375, + -0.03375244140625, + -0.00803375244140625, + -0.0254669189453125, + -0.0029392242431640625, + 0.0299072265625, + 0.043731689453125, + 0.022796630859375, + 0.00970458984375, + 0.0225677490234375, + -0.021209716796875, + -0.0238494873046875, + -0.00841522216796875, + -0.0259246826171875, + 0.022979736328125, + -0.044219970703125, + -0.0238494873046875, + -0.0286712646484375, + 0.02337646484375, + -0.023284912109375, + -0.0244903564453125, + -0.0252838134765625, + 0.0313720703125, + -0.0010843276977539062, + 0.01325225830078125, + 0.03387451171875, + 0.046142578125, + -0.010101318359375, + -0.0043182373046875, + -0.01149749755859375, + -0.0604248046875, + 0.01678466796875, + -0.042816162109375, + 0.0616455078125, + -0.034698486328125, + 0.00019788742065429688, + -0.036712646484375, + -0.007843017578125, + 0.016937255859375, + 0.029632568359375, + -0.0049285888671875, + -0.048858642578125, + -0.055816650390625, + -0.00350189208984375, + -0.0274505615234375, + 0.010040283203125, + 0.0028533935546875, + 0.00870513916015625, + 0.0067596435546875, + 0.0012569427490234375, + -0.006557464599609375, + 0.007381439208984375, + -0.01251220703125, + -0.0390625, + -0.00992584228515625, + -0.0498046875, + 0.06707763671875, + 0.038604736328125, + 0.00032448768615722656, + 0.024383544921875, + -0.06683349609375, + 0.002410888671875, + -0.024200439453125, + -0.0006031990051269531, + -0.00710296630859375, + 0.0101470947265625, + -0.041961669921875, + -0.0186920166015625, + 0.0282440185546875, + -0.008392333984375, + -0.01416778564453125, + -0.0110015869140625, + 0.01509857177734375, + -0.0017576217651367188, + 0.0268707275390625, + -0.0183258056640625, + 0.0440673828125, + 0.026214599609375, + 0.016387939453125, + -0.005741119384765625, + -0.0196533203125, + -0.06500244140625, + -0.007236480712890625, + 0.0125885009765625, + 0.0400390625, + 0.0238800048828125, + -0.0263214111328125, + 0.02227783203125, + 0.04522705078125, + -0.05224609375, + 0.0027523040771484375, + -0.0146026611328125, + 0.0017995834350585938, + 0.01849365234375, + 0.005207061767578125, + 0.0394287109375, + 0.01087188720703125, + 0.040008544921875, + 0.03131103515625, + 0.00656890869140625, + 0.05877685546875, + -0.07757568359375, + 0.03546142578125, + 0.008056640625, + -0.0090789794921875, + -0.045501708984375, + -0.031951904296875, + 0.0126495361328125, + -0.00858306884765625, + 0.024505615234375, + 0.01235198974609375, + -0.049591064453125, + 0.03826904296875, + -0.0131378173828125, + 0.03631591796875, + -0.029693603515625, + -0.002655029296875, + 0.0129241943359375, + 0.0269927978515625, + -0.0104217529296875, + -0.0224151611328125, + -0.01285552978515625, + 0.0112152099609375, + -0.017425537109375, + 0.0191497802734375, + -0.030609130859375, + -0.0268096923828125, + 0.017669677734375, + 0.01079559326171875, + 0.0235137939453125, + 0.047515869140625, + -0.00949859619140625, + 0.002231597900390625, + 0.037811279296875, + 0.0284271240234375, + 0.00551605224609375, + -0.02197265625, + -0.005588531494140625, + 0.0684814453125, + -0.002193450927734375, + 0.07635498046875, + 0.01107025146484375, + 0.01050567626953125, + -0.002208709716796875, + -0.007274627685546875, + -0.0303497314453125, + 0.0178070068359375, + -0.04315185546875, + -0.0292205810546875, + 0.00946044921875, + 0.004009246826171875, + -0.041259765625, + -0.00887298583984375, + -0.014129638671875, + -0.01032257080078125, + -0.02191162109375, + 0.006694793701171875, + -0.047821044921875, + 0.03973388671875, + -0.013885498046875, + 0.0097198486328125, + -0.0279541015625, + 0.005039215087890625, + -0.033660888671875, + -0.01033782958984375, + -0.00981903076171875, + -0.0179901123046875, + 0.034454345703125, + 0.0288238525390625, + -0.0196685791015625, + -0.0012006759643554688, + 0.02606201171875, + 0.0310211181640625, + 0.05682373046875, + -0.0088958740234375, + 0.01050567626953125, + 0.031707763671875, + -0.033416748046875, + 0.000152587890625, + 0.00464630126953125, + 0.0697021484375, + -0.0028858184814453125, + 0.026580810546875, + -0.00957489013671875, + -0.020294189453125, + -0.0098114013671875, + -0.0210113525390625, + -0.01849365234375, + 0.005054473876953125, + -0.011627197265625, + 0.041717529296875, + 0.01108551025390625, + 0.02947998046875, + -0.0241546630859375, + 0.0180816650390625, + -0.0029144287109375, + -0.103271484375, + -0.038787841796875, + 0.037109375, + -0.011444091796875, + 0.0167388916015625, + -0.0110015869140625, + -0.04638671875, + 0.013824462890625, + 0.032257080078125, + -0.012481689453125, + -0.0028228759765625, + 0.0280914306640625, + 0.038116455078125, + -0.0037441253662109375, + 0.01323699951171875, + 0.0157012939453125, + -0.00931549072265625, + -0.01065826416015625, + 0.033111572265625, + 0.007282257080078125, + -0.00421142578125, + -0.006046295166015625, + -0.006420135498046875, + 0.03985595703125, + 0.0202178955078125, + 0.0479736328125, + -0.028717041015625, + -0.01039886474609375, + 0.061492919921875, + -0.00939178466796875, + -0.013092041015625, + -0.0003349781036376953, + 0.061920166015625, + -0.0008783340454101562, + 0.0653076171875, + 0.034881591796875, + 0.004192352294921875, + 0.04278564453125, + 0.01557159423828125, + 0.01171112060546875, + 0.0247344970703125, + 0.03118896484375, + 0.0504150390625, + 0.06793212890625, + 0.0278472900390625, + -0.01226806640625, + 0.0115814208984375, + -0.0194549560546875, + -0.01053619384765625, + -0.0079498291015625, + 0.0195770263671875, + 0.039093017578125, + 0.0311737060546875, + 0.054351806640625, + 0.025787353515625, + -0.01593017578125, + -0.006805419921875, + 0.0295867919921875, + 0.053924560546875, + -0.005535125732421875, + -0.02777099609375, + -0.0176544189453125, + 0.0003268718719482422, + -0.0194854736328125, + -0.040924072265625, + 0.005893707275390625, + -0.00978851318359375, + -0.0055389404296875, + -0.0126495361328125, + 0.01079559326171875, + -0.042572021484375, + -0.049652099609375, + -0.027923583984375, + -0.08026123046875, + -0.0325927734375, + 0.0057830810546875, + -0.005401611328125, + 0.0245361328125, + -0.058197021484375, + 0.0106353759765625, + -0.05560302734375, + -0.0450439453125, + -0.018524169921875, + -0.0423583984375, + 0.0391845703125, + -0.012542724609375, + 0.03759765625, + -0.04400634765625, + 0.005687713623046875, + 0.0003685951232910156, + 0.023712158203125, + -0.020416259765625, + -0.027496337890625, + -0.0169219970703125, + -0.037567138671875, + 0.035308837890625, + -0.03118896484375, + 0.00336456298828125, + 0.0162811279296875, + 0.015838623046875, + -0.049346923828125, + 0.018707275390625, + 0.0260009765625, + -0.036529541015625, + 0.0028324127197265625, + -0.039093017578125, + 0.019256591796875, + 0.043731689453125, + -0.015045166015625, + 0.0043792724609375, + 0.035858154296875, + -0.01148223876953125, + 0.0191802978515625, + 0.00318145751953125, + -0.0009226799011230469, + -0.03143310546875, + 0.0611572265625, + 0.0283966064453125, + -0.004512786865234375, + 0.0258026123046875, + 0.0186920166015625, + -0.01161956787109375, + -0.044952392578125, + -0.017303466796875, + -0.0318603515625, + 6.258487701416016e-06, + 0.020233154296875, + 0.011444091796875, + -0.07904052734375, + 0.0169525146484375, + -0.0203094482421875, + -0.04840087890625, + -0.005283355712890625, + -0.0233001708984375, + 0.05218505859375, + 0.00774383544921875, + -0.0299072265625, + -0.0176544189453125, + 0.0186920166015625, + -0.0042724609375, + 0.00876617431640625, + 0.055389404296875, + -0.030120849609375, + -0.037628173828125, + 0.069091796875, + 0.0246124267578125, + 0.016082763671875, + -0.032135009765625, + -0.0210113525390625, + -0.00750732421875, + -0.02972412109375, + 0.0028018951416015625, + 0.020538330078125, + -0.0244140625, + 0.029083251953125, + 0.01149749755859375, + 0.016693115234375, + -0.0250244140625, + -0.0147552490234375, + 0.031890869140625, + -0.017242431640625, + -0.00396728515625, + 0.0094451904296875, + 0.0266571044921875, + 0.0151824951171875, + -0.03253173828125, + -0.07122802734375, + -0.03448486328125, + 0.004581451416015625, + 0.01221466064453125, + -0.076171875, + 0.03271484375, + -0.04571533203125, + 0.01430511474609375, + -0.01267242431640625, + -0.002696990966796875, + -0.037750244140625, + 0.036224365234375, + -0.0265045166015625, + 0.07373046875, + -0.0927734375, + -0.0274810791015625, + -0.0011959075927734375, + -0.016265869140625, + 0.054931640625, + 0.0022792816162109375, + 0.01229095458984375, + 0.0133514404296875, + -0.01800537109375, + -0.038818359375, + -0.0260467529296875, + 0.0190277099609375, + 0.0006594657897949219, + 0.01500701904296875, + 0.00787353515625, + -0.0662841796875, + -0.05706787109375, + 0.034393310546875, + 0.025909423828125, + 0.0283966064453125, + 0.00506591796875, + 0.00981903076171875, + -0.0289459228515625, + 0.0173492431640625, + 0.031982421875, + -0.07647705078125, + 0.012237548828125, + -0.023712158203125, + 0.0248870849609375, + 0.001804351806640625, + -0.0014505386352539062, + -0.05419921875, + 0.018707275390625, + -0.04119873046875, + -0.014678955078125, + 0.04071044921875, + 0.0184326171875, + 0.0024318695068359375, + 0.05633544921875, + -0.007747650146484375, + -0.01032257080078125, + -0.045928955078125, + -0.034515380859375, + -0.0265655517578125, + 0.0301971435546875, + 0.03021240234375, + -0.039825439453125, + 0.007434844970703125, + -0.034210205078125, + 0.050567626953125, + 0.0401611328125, + -0.0171051025390625, + -0.03240966796875, + -0.017822265625, + -0.0291748046875, + -0.05645751953125, + -0.004207611083984375, + 0.0504150390625, + -0.0006399154663085938, + 0.00363922119140625, + -0.03228759765625, + 0.022003173828125, + -0.00894927978515625, + -0.0189666748046875, + -0.026031494140625, + 0.01210784912109375, + 0.006107330322265625, + 0.0474853515625, + 0.029541015625, + -0.025634765625, + -0.0308837890625, + 0.0020122528076171875, + -0.08343505859375, + 0.039703369140625, + -0.0362548828125, + -0.002788543701171875, + -0.00844573974609375, + 0.0010480880737304688, + 0.004741668701171875, + 0.03240966796875, + -0.037811279296875, + -0.030364990234375, + 0.002361297607421875, + 0.02630615234375, + -0.035430908203125, + -0.024078369140625, + 0.048919677734375, + -0.00832366943359375, + -0.01076507568359375, + 0.034698486328125, + -0.01922607421875, + -1.901388168334961e-05, + -0.0005183219909667969, + -0.0005555152893066406, + -4.571676254272461e-05, + 0.0438232421875, + -0.03289794921875, + 0.00780487060546875, + -0.00637054443359375, + -0.01263427734375, + -0.0252227783203125, + -0.030120849609375, + 0.02496337890625, + -0.01317596435546875, + -0.028411865234375, + -0.0689697265625, + -0.02032470703125, + -0.024322509765625, + -0.0142974853515625, + 0.0015325546264648438, + 0.031585693359375, + 0.042694091796875, + 0.0172882080078125, + -0.011993408203125, + -0.018463134765625, + -0.0254058837890625, + -2.6404857635498047e-05, + -0.03558349609375, + -0.0082855224609375, + -0.0108795166015625, + 0.040283203125, + -0.01096343994140625, + -0.0256195068359375, + -0.028472900390625, + -0.00384521484375, + -0.0166168212890625, + 0.00010323524475097656, + -0.0338134765625, + 0.01320648193359375, + -0.0277557373046875, + 0.003246307373046875, + -0.00649261474609375, + 0.04364013671875, + -0.0145416259765625, + 0.0309295654296875, + 0.034149169921875, + 0.02587890625, + -0.01043701171875, + 0.0008220672607421875, + -0.051055908203125, + 0.04144287109375, + -0.005359649658203125, + -0.040130615234375, + -0.03564453125, + 0.00826263427734375, + -0.01416015625, + 0.0273895263671875, + 0.0391845703125, + -0.042449951171875, + -0.0247650146484375, + -0.035430908203125, + -0.01422119140625, + -0.00484466552734375, + 0.006114959716796875, + -0.062744140625, + -0.0174407958984375, + 0.0266876220703125, + 0.0295867919921875, + 0.00543975830078125, + 0.016143798828125, + -0.03472900390625, + -0.0523681640625, + 0.0192413330078125, + 0.01383209228515625, + 0.005420684814453125, + -0.0029506683349609375, + 0.01194000244140625, + -0.0204315185546875, + 0.061553955078125, + 0.003551483154296875, + 0.00183868408203125, + 0.0172882080078125, + 0.0061492919921875, + 0.01035308837890625, + 0.0268096923828125, + -0.006237030029296875, + -0.071533203125, + 0.010711669921875, + -0.019683837890625, + 0.004405975341796875, + 0.01056671142578125, + -0.061553955078125, + 0.0138092041015625, + -0.029205322265625, + -0.004718780517578125, + -0.0018320083618164062, + -0.0214996337890625, + -0.04718017578125, + -0.0274200439453125, + 0.03863525390625, + -0.0156097412109375, + -0.0027904510498046875, + -0.015777587890625, + 0.03887939453125, + 0.06292724609375, + 0.0236358642578125, + -0.049285888671875, + -0.01983642578125, + 0.007541656494140625, + -0.06658935546875, + 0.03515625, + 0.0182342529296875, + -0.0258331298828125, + -0.037109375, + -0.0140533447265625, + 0.061370849609375, + -0.01110076904296875, + 0.042724609375, + 0.0775146484375, + 0.017242431640625, + -0.035430908203125, + -0.0163421630859375, + 0.0343017578125, + 0.01534271240234375, + 0.009613037109375, + -0.0031414031982421875, + -0.050567626953125, + -0.03558349609375, + -0.01505279541015625, + -0.036590576171875, + -0.033416748046875, + -0.0310516357421875, + -0.0131683349609375, + 0.03875732421875, + -0.00307464599609375, + 0.043731689453125, + -0.03802490234375, + -0.043548583984375, + -0.056121826171875, + 0.0299835205078125, + 0.056243896484375, + 0.006195068359375, + 0.038726806640625, + 0.01971435546875, + -0.0289306640625, + 0.0075531005859375, + -0.006839752197265625, + -0.0185394287109375, + -0.021484375, + 0.048614501953125, + -0.0007834434509277344, + -0.027984619140625, + 0.054656982421875, + 0.04595947265625, + -0.08251953125, + -0.027984619140625, + -0.01293182373046875, + 0.006610870361328125, + -0.007511138916015625, + -0.0283660888671875, + -0.026153564453125, + -0.0338134765625, + -0.0063323974609375, + -0.006587982177734375, + 0.000370025634765625, + -0.01436614990234375, + 0.016937255859375, + -0.03985595703125, + -0.021331787109375, + -0.022186279296875, + -0.0160369873046875, + 0.036956787109375, + -0.04180908203125, + 0.0271759033203125, + -0.03680419921875, + 0.00010770559310913086, + -0.007709503173828125, + -0.00740814208984375, + 0.0156402587890625, + -0.006561279296875, + -0.01322174072265625, + 0.0223846435546875, + -0.0017213821411132812, + 0.0758056640625, + -0.02264404296875, + -0.0025196075439453125, + 0.06298828125, + -0.022064208984375, + -0.042755126953125, + -0.040496826171875, + 0.01519775390625, + 0.01458740234375, + 0.03399658203125, + -0.0606689453125, + -0.003391265869140625, + 0.05230712890625, + 0.0005717277526855469, + 0.041778564453125, + -0.006641387939453125, + -0.0792236328125, + -0.016815185546875, + -0.020477294921875, + 0.007640838623046875, + -0.0273895263671875, + 0.0014352798461914062, + 0.049530029296875, + 0.00978851318359375, + 0.0228729248046875, + -0.015228271484375, + 0.02557373046875, + -0.00959014892578125, + 0.00461578369140625, + -0.023101806640625, + 0.0157623291015625, + 0.003814697265625, + -0.0230560302734375, + -0.0189971923828125, + -0.0306549072265625, + -0.030670166015625, + 0.014373779296875, + -0.030242919921875, + -0.0098419189453125, + 5.3942203521728516e-05, + 0.036224365234375, + 0.0013380050659179688, + 0.01238250732421875, + -0.0100860595703125, + -0.02386474609375, + 0.0240478515625, + 0.0259246826171875, + -0.028350830078125, + -0.006107330322265625, + 0.01372528076171875, + -0.016693115234375, + -0.01473236083984375, + -0.022064208984375, + -0.007122039794921875, + -0.031494140625, + 0.01922607421875, + 0.04150390625, + -0.002681732177734375, + -0.012420654296875, + -0.04669189453125, + -0.042449951171875, + -0.0298614501953125, + -0.0032787322998046875, + -0.01824951171875, + -0.01308441162109375, + 0.01593017578125, + -0.004863739013671875, + -0.0017852783203125, + 0.04217529296875, + -0.00689697265625, + 0.03900146484375, + -0.0267333984375, + 0.0265655517578125, + 0.0175933837890625, + 0.007904052734375, + 0.048065185546875, + 0.0185699462890625, + 0.0011987686157226562, + 0.0271759033203125, + -0.01515960693359375, + -0.016815185546875, + -0.00913238525390625, + 0.007419586181640625, + -0.0248870849609375, + -0.0038013458251953125, + 0.041412353515625, + 0.0302734375, + -0.00223541259765625, + 0.0290985107421875, + 0.0184173583984375, + -0.01094818115234375, + 0.05517578125, + -0.01263427734375, + -0.06304931640625, + -0.01079559326171875, + -0.059173583984375, + -0.03387451171875, + -0.0166015625, + 0.01354217529296875, + -0.0171966552734375, + 0.041656494140625, + -0.061065673828125, + 6.115436553955078e-05, + 0.035186767578125, + 0.0093536376953125, + -0.01296234130859375, + 0.0036773681640625, + -0.005161285400390625, + 0.0328369140625, + 0.0058135986328125, + -0.010711669921875, + 0.01456451416015625, + 0.05029296875, + -0.05517578125, + -0.047760009765625, + -0.010040283203125, + -0.0162506103515625, + 0.0263824462890625, + 0.03448486328125, + -0.04473876953125, + 0.0030918121337890625, + -0.03662109375, + -0.01180267333984375, + 0.02117919921875, + -0.01097869873046875, + -0.040283203125, + 0.0011434555053710938, + -0.010040283203125, + 0.0229339599609375, + 0.0222015380859375, + 0.0303802490234375, + 0.01192474365234375, + -0.01971435546875, + -0.03607177734375, + 0.0202789306640625, + 0.0163116455078125, + -0.00910186767578125, + 0.0210113525390625, + -0.0048828125, + 0.0168914794921875, + -0.0006508827209472656, + 0.003749847412109375, + 0.0035152435302734375, + 0.058837890625, + 0.0007381439208984375, + 0.042449951171875, + 0.019744873046875, + 0.01123809814453125, + 0.0633544921875, + -0.0266876220703125, + -0.01116943359375, + 0.011444091796875, + -0.00478363037109375, + 0.024017333984375, + 0.014068603515625, + -0.04888916015625, + 0.0294036865234375, + 0.013946533203125, + -0.018157958984375, + 0.002025604248046875, + -0.042083740234375, + -0.005779266357421875, + -0.029205322265625, + -0.01152801513671875, + 0.056671142578125, + -0.0203857421875, + -0.00722503662109375, + -0.028778076171875, + 0.034210205078125, + 0.01528167724609375, + 0.03460693359375, + -0.063720703125, + -0.00913238525390625, + 0.0308990478515625, + 0.00931549072265625, + -0.003475189208984375, + 0.0372314453125, + -0.005645751953125, + 0.0035076141357421875, + -0.03582763671875, + 0.0175323486328125, + 0.035797119140625, + 0.0024662017822265625, + 0.006549835205078125, + -0.0253753662109375, + -0.040771484375, + 0.034912109375, + 0.0230560302734375, + -0.0153961181640625, + 0.04278564453125, + -0.0308990478515625, + 0.0107574462890625, + -0.047637939453125, + 0.044342041015625, + -0.053314208984375, + 0.0078277587890625, + 0.02587890625, + 0.007259368896484375, + -0.024017333984375, + 0.04351806640625, + 0.0088043212890625, + 0.00974273681640625, + 0.016387939453125, + 0.07025146484375, + 0.0384521484375, + 0.08349609375, + 0.040374755859375, + 0.0010919570922851562, + -0.007720947265625, + 0.0005850791931152344, + -0.031982421875, + -0.01873779296875, + -0.0055694580078125, + -0.0263824462890625, + 0.032196044921875, + 0.0005326271057128906, + -0.0243682861328125, + -0.022216796875, + 0.00919342041015625, + -0.01476287841796875, + -0.02642822265625, + -0.002208709716796875, + 0.033111572265625, + -0.0413818359375, + -0.0027637481689453125, + 0.037261962890625, + 0.0665283203125, + 0.069091796875, + -0.0264892578125, + -0.0164031982421875, + 0.037200927734375, + 0.006168365478515625, + -0.00885009765625, + 0.06927490234375, + 0.006622314453125, + -0.02978515625, + -0.038726806640625, + -0.04779052734375, + -0.00482177734375, + 0.0037670135498046875, + 0.0017404556274414062, + -0.03955078125, + 0.0244903564453125, + 0.0247650146484375, + 0.0080413818359375, + 0.0283203125, + -0.059173583984375, + -0.01015472412109375, + 0.0009374618530273438, + 0.0259246826171875, + -0.0095672607421875, + 0.057708740234375, + 0.037811279296875, + -0.002597808837890625, + 0.01207733154296875, + -0.023834228515625, + 0.0103912353515625, + 0.0178070068359375, + -0.0171661376953125, + -0.00450897216796875, + 0.002162933349609375, + -0.0215911865234375, + -0.0012865066528320312, + 0.0330810546875, + 0.033477783203125, + -0.035064697265625, + 0.0021991729736328125, + -0.09210205078125, + -0.039306640625, + -0.0170745849609375, + -0.019927978515625, + -0.032745361328125, + 0.06134033203125, + -0.02001953125, + -0.0026721954345703125, + 0.005886077880859375, + -0.0616455078125, + 0.280517578125, + -0.00572967529296875, + 6.103515625e-05, + -0.0281829833984375, + 0.01407623291015625, + 0.04193115234375, + 0.0369873046875, + -0.03472900390625, + -0.001708984375, + 0.040191650390625, + 0.0144500732421875, + 0.002353668212890625, + 0.01763916015625, + 0.004425048828125, + 0.0263214111328125, + 0.0245361328125, + -0.026031494140625, + 0.00881195068359375, + 0.052734375, + -0.0467529296875, + -0.0114593505859375, + -0.0014352798461914062, + -0.00457000732421875, + 0.029052734375, + 0.00042819976806640625, + 0.0007567405700683594, + 0.02972412109375, + -0.04779052734375, + 0.0103302001953125, + -0.01245880126953125, + 0.05010986328125, + -0.01751708984375, + 0.021514892578125, + -0.003448486328125, + -0.03509521484375, + 0.035736083984375, + 0.020721435546875, + -0.0233001708984375, + -0.02130126953125, + -0.01343536376953125, + 0.0022335052490234375, + 0.030181884765625, + 0.0615234375, + -0.01654052734375, + -0.053009033203125, + 0.041839599609375, + -0.03509521484375, + 0.055511474609375, + 0.0229034423828125, + -0.0289154052734375, + 0.035125732421875, + -0.01512908935546875, + 0.08172607421875, + 0.011749267578125, + -0.06494140625, + 0.00569915771484375, + 0.0238800048828125, + -0.021087646484375, + -0.029266357421875, + 0.0208740234375, + 0.0177154541015625, + -0.0079345703125, + 0.0253143310546875, + 0.01094818115234375, + -0.049102783203125, + 0.0128021240234375, + 0.04736328125, + 0.0009927749633789062, + -0.00463104248046875, + -0.003383636474609375, + 0.010223388671875, + 0.01253509521484375, + -0.0233612060546875, + -0.0190887451171875, + 0.02581787109375, + 0.0223846435546875, + -0.038116455078125, + 0.03155517578125, + 0.0011310577392578125, + -0.040740966796875, + -0.003936767578125, + -0.03936767578125, + 0.00121307373046875, + 0.020233154296875, + 0.027008056640625, + 0.03497314453125, + -0.0142059326171875, + -0.00968170166015625, + -0.0546875, + 0.01849365234375, + 0.01197052001953125, + 0.0102386474609375, + 0.0190277099609375, + 0.009857177734375, + -0.0213623046875 + ], + "index": 2, + "object": "embedding" + } + ], + "model": "bge-large-en-v1.5", + "object": "list", + "usage": { + "prompt_tokens": 20, + "total_tokens": 20 + }, + "id": "b276b935-8541-489d-b9f7-f4d7b2696e8f" + } + }, + "is_streaming": false + } +} diff --git a/tests/integration/recordings/responses/9b9e8cf39b15.json b/tests/integration/recordings/responses/9b9e8cf39b15.json new file mode 100644 index 000000000..9171738b6 --- /dev/null +++ b/tests/integration/recordings/responses/9b9e8cf39b15.json @@ -0,0 +1,1062 @@ +{ + "request": { + "method": "POST", + "url": "__databricks__/serving-endpoints/v1/embeddings", + "headers": {}, + "body": { + "model": "databricks-bge-large-en", + "input": "Test user parameter", + "encoding_format": "base64", + "user": "test-user-123" + }, + "endpoint": "/v1/embeddings", + "model": "databricks-bge-large-en" + }, + "response": { + "body": { + "__type__": "openai.types.create_embedding_response.CreateEmbeddingResponse", + "__data__": { + "data": [ + { + "embedding": [ + 0.038818359375, + -0.0207061767578125, + 0.00783538818359375, + 0.0081939697265625, + -0.041290283203125, + 0.0186920166015625, + 0.00027441978454589844, + 0.027862548828125, + 0.037994384765625, + 0.034454345703125, + 0.050537109375, + -0.0251007080078125, + -0.001983642578125, + -0.01161956787109375, + -0.040252685546875, + -0.01259613037109375, + 0.0064849853515625, + 0.018280029296875, + -0.01287841796875, + -0.00446319580078125, + 0.006011962890625, + 0.0250396728515625, + -0.07098388671875, + -0.0204010009765625, + -0.03741455078125, + -0.042266845703125, + 0.0081939697265625, + -0.01309967041015625, + 0.0323486328125, + 0.036865234375, + -0.038543701171875, + -0.0030841827392578125, + -0.0162200927734375, + -0.03985595703125, + 0.00453948974609375, + -0.0294342041015625, + 0.05145263671875, + -0.0531005859375, + -0.03289794921875, + -0.03399658203125, + 0.0081939697265625, + 0.00921630859375, + -0.01367950439453125, + -0.03607177734375, + -0.03997802734375, + -0.0266876220703125, + -0.056396484375, + -0.002017974853515625, + -0.0230560302734375, + -0.0205535888671875, + -0.0191192626953125, + -0.00901031494140625, + 0.03460693359375, + -0.01090240478515625, + -0.0172576904296875, + -0.03619384765625, + 0.00653076171875, + -0.00341033935546875, + -0.0390625, + 0.0634765625, + -0.0238494873046875, + 0.015960693359375, + -0.003719329833984375, + -0.046142578125, + 0.026123046875, + 0.0024566650390625, + 0.031524658203125, + -0.009185791015625, + 0.00116729736328125, + -0.029571533203125, + 0.00673675537109375, + 0.031524658203125, + -0.0112457275390625, + -0.0257110595703125, + -0.03350830078125, + 0.06622314453125, + 0.0250091552734375, + -0.00572967529296875, + -0.0058746337890625, + 0.0731201171875, + -0.00891876220703125, + 0.0177154541015625, + 0.0096893310546875, + 0.0139923095703125, + -0.07232666015625, + -0.0140228271484375, + 0.025238037109375, + 0.0265655517578125, + 0.0264892578125, + -0.00270843505859375, + -0.006641387939453125, + 0.03668212890625, + 0.00897979736328125, + -0.011505126953125, + 0.00983428955078125, + 0.0172271728515625, + 0.00867462158203125, + 0.00699615478515625, + 0.004863739013671875, + -0.0238494873046875, + 0.050201416015625, + 0.0484619140625, + 0.0288848876953125, + 0.041229248046875, + -0.0111083984375, + 0.0919189453125, + 0.007373809814453125, + 0.0178375244140625, + -0.042877197265625, + -0.0292816162109375, + -0.00487518310546875, + 0.005069732666015625, + 0.0262603759765625, + 0.021881103515625, + -0.055145263671875, + 0.005138397216796875, + 0.01123046875, + 0.006084442138671875, + -0.035675048828125, + -0.0247650146484375, + 0.052459716796875, + -0.0225372314453125, + 0.003650665283203125, + -0.028076171875, + 0.0042724609375, + -0.0269622802734375, + -0.0753173828125, + 0.038909912109375, + -0.00821685791015625, + -0.06915283203125, + -0.00516510009765625, + -0.0139923095703125, + 0.057342529296875, + 0.03759765625, + 0.00557708740234375, + 0.067138671875, + 0.01593017578125, + 0.0084075927734375, + 0.032135009765625, + -0.03582763671875, + 0.033416748046875, + 0.03668212890625, + -0.01407623291015625, + 0.06732177734375, + -0.00951385498046875, + 0.0413818359375, + 0.0012598037719726562, + -0.0021152496337890625, + -0.058624267578125, + 0.040008544921875, + -0.049530029296875, + -0.00897216796875, + -0.03240966796875, + 0.0014820098876953125, + 0.0141143798828125, + -0.0275421142578125, + 0.034515380859375, + 0.0027484893798828125, + 0.006805419921875, + 0.058135986328125, + -0.0285491943359375, + 0.040374755859375, + -0.02764892578125, + 0.030059814453125, + -0.00798797607421875, + 0.00278472900390625, + -0.0138397216796875, + -0.0080718994140625, + 0.03033447265625, + -0.03424072265625, + 0.0126495361328125, + 0.045257568359375, + -0.0020999908447265625, + -0.004810333251953125, + 0.043182373046875, + 0.0267791748046875, + 0.056915283203125, + 0.01361083984375, + 0.0165863037109375, + 0.0194091796875, + -0.0223388671875, + 0.042205810546875, + -0.0230560302734375, + 0.046875, + 0.0207672119140625, + 0.0193023681640625, + 0.018798828125, + -0.003459930419921875, + -0.048828125, + 0.0294342041015625, + 0.009918212890625, + -0.033447265625, + 0.0021953582763671875, + -0.01499176025390625, + -0.041015625, + 0.038543701171875, + 0.00728607177734375, + 0.02557373046875, + -0.0249786376953125, + -0.09344482421875, + -0.0380859375, + 0.01085662841796875, + -0.08184814453125, + 0.0106201171875, + 0.01702880859375, + -0.053070068359375, + 0.0012454986572265625, + 0.0217742919921875, + 0.0013647079467773438, + -0.0301666259765625, + 0.0247955322265625, + 0.028778076171875, + -0.045745849609375, + -0.033050537109375, + 0.00785064697265625, + -0.0193634033203125, + -0.0183258056640625, + 0.05029296875, + 0.005825042724609375, + 0.0258026123046875, + -0.01001739501953125, + 0.0357666015625, + 0.0357666015625, + 0.01294708251953125, + 0.02978515625, + -0.0148468017578125, + -0.0246429443359375, + 0.0797119140625, + -0.0192718505859375, + 0.007568359375, + 0.00833892822265625, + 0.004962921142578125, + -0.01812744140625, + 0.08563232421875, + -0.00814056396484375, + 0.044921875, + 0.05767822265625, + 0.0006213188171386719, + 0.01995849609375, + 0.020782470703125, + 0.021453857421875, + 0.041656494140625, + 0.01131439208984375, + 0.044921875, + -0.06787109375, + -0.01293182373046875, + 0.01103973388671875, + 0.0237274169921875, + -0.006160736083984375, + 0.061187744140625, + -0.01140594482421875, + 0.0545654296875, + 0.0352783203125, + 0.01093292236328125, + -0.03778076171875, + -0.0195770263671875, + 0.0179901123046875, + -0.007785797119140625, + -0.0401611328125, + 0.00499725341796875, + 0.00968170166015625, + 0.003509521484375, + 0.00508880615234375, + -0.0228271484375, + 0.0220184326171875, + -0.053466796875, + 0.041290283203125, + 0.00811767578125, + 0.004108428955078125, + -0.0521240234375, + 0.01568603515625, + -0.0226898193359375, + -0.026458740234375, + -0.04144287109375, + -0.025421142578125, + -0.0283660888671875, + 0.034942626953125, + -0.021636962890625, + -0.006786346435546875, + -0.0263671875, + 0.013641357421875, + -0.0560302734375, + -0.0015535354614257812, + 0.07000732421875, + 0.022308349609375, + 0.022613525390625, + -0.002166748046875, + -0.0254364013671875, + 0.00592803955078125, + 0.040435791015625, + -0.004367828369140625, + -0.028076171875, + 0.0034160614013671875, + -0.046051025390625, + -0.0101318359375, + -0.023345947265625, + 0.0150604248046875, + 0.02899169921875, + -0.0243988037109375, + -0.01531982421875, + -0.006866455078125, + 0.04766845703125, + -0.005859375, + 0.033416748046875, + -0.042633056640625, + -0.004199981689453125, + 0.0799560546875, + -0.020355224609375, + 0.0188140869140625, + 0.033966064453125, + -0.00638580322265625, + 0.040252685546875, + -0.009521484375, + -0.02020263671875, + -0.049072265625, + 0.023406982421875, + 0.04144287109375, + -0.01690673828125, + -0.01177978515625, + 0.003940582275390625, + -0.0205841064453125, + -0.03302001953125, + -0.0158538818359375, + 0.014190673828125, + -0.016326904296875, + 0.031524658203125, + -0.0225677490234375, + -0.0838623046875, + 0.0014591217041015625, + -0.034149169921875, + 0.01538848876953125, + -0.03973388671875, + -0.022003173828125, + 0.03515625, + 0.0123443603515625, + -0.017730712890625, + -0.024993896484375, + -0.00876617431640625, + -0.00799560546875, + -0.01947021484375, + 0.041656494140625, + -0.023223876953125, + 0.00521087646484375, + 0.0127716064453125, + 0.033050537109375, + 0.004669189453125, + 0.01395416259765625, + -0.00946044921875, + -0.03070068359375, + -0.023834228515625, + 0.0014295578002929688, + -0.006221771240234375, + -0.0157470703125, + -0.002391815185546875, + 0.0093536376953125, + 0.03857421875, + -0.00583648681640625, + 0.00028061866760253906, + 0.03826904296875, + 0.0131378173828125, + 0.00801849365234375, + 0.03741455078125, + 0.00445556640625, + 0.0026111602783203125, + -0.0204010009765625, + -0.05938720703125, + -0.060760498046875, + 0.042755126953125, + 0.02325439453125, + -0.058624267578125, + 0.02508544921875, + -0.026763916015625, + 0.017425537109375, + -0.0119171142578125, + -0.0229949951171875, + -0.0201263427734375, + 0.020416259765625, + 0.005756378173828125, + 0.057403564453125, + -0.0121307373046875, + 0.001636505126953125, + -0.00739288330078125, + 0.001750946044921875, + 0.06219482421875, + 0.0491943359375, + 0.00327301025390625, + 0.0086822509765625, + -0.0020580291748046875, + -0.042449951171875, + 0.0162353515625, + -0.0174713134765625, + 0.00701904296875, + 0.0081939697265625, + -0.01861572265625, + -0.047149658203125, + -0.04107666015625, + 0.00457000732421875, + 0.01158905029296875, + 0.044403076171875, + 0.01177978515625, + 0.00873565673828125, + -0.009368896484375, + 0.018707275390625, + 0.04815673828125, + -0.0275726318359375, + 0.023712158203125, + -0.0162353515625, + 0.03375244140625, + 0.01120758056640625, + 0.0257415771484375, + -0.0489501953125, + 0.04254150390625, + -0.01520538330078125, + 0.01178741455078125, + 0.026153564453125, + -0.03277587890625, + -0.01216888427734375, + 0.0277862548828125, + 0.0103912353515625, + 0.005359649658203125, + -0.0307769775390625, + -0.060089111328125, + -0.01239013671875, + 0.00286102294921875, + 0.0290374755859375, + -0.0163421630859375, + -0.0279388427734375, + -0.005245208740234375, + 0.050933837890625, + 0.0496826171875, + -0.01491546630859375, + -0.0714111328125, + -0.00919342041015625, + -0.04046630859375, + -0.05535888671875, + -0.00629425048828125, + 0.059967041015625, + -0.0631103515625, + 0.007266998291015625, + -0.0528564453125, + -0.0033321380615234375, + -0.0009446144104003906, + -0.0210113525390625, + 0.02587890625, + 0.01155853271484375, + -0.026031494140625, + -0.02880859375, + 0.01739501953125, + -0.047760009765625, + -0.0601806640625, + 0.0158538818359375, + -0.06219482421875, + 0.027313232421875, + -0.0179443359375, + 0.000415802001953125, + -0.0361328125, + 0.0208892822265625, + 0.031524658203125, + 0.01708984375, + -0.0189666748046875, + -0.00891876220703125, + 0.03936767578125, + 0.01409912109375, + -0.004058837890625, + 0.01398468017578125, + 0.01555633544921875, + -0.0016756057739257812, + 0.00555419921875, + 0.031707763671875, + -0.005435943603515625, + 0.007686614990234375, + 0.042266845703125, + 0.0037708282470703125, + -0.050079345703125, + -0.004322052001953125, + -0.03546142578125, + 0.016082763671875, + -0.03515625, + -0.018768310546875, + -0.01500701904296875, + -0.043182373046875, + 0.042144775390625, + 0.050018310546875, + -0.049652099609375, + -0.0184173583984375, + -0.055206298828125, + -0.0158843994140625, + -0.0269622802734375, + -0.007541656494140625, + 0.0416259765625, + -0.023101806640625, + -0.0338134765625, + 0.00537872314453125, + -0.018890380859375, + -0.0196533203125, + 0.0284423828125, + -0.04345703125, + -0.01146697998046875, + 0.005596160888671875, + 0.02349853515625, + 0.001796722412109375, + -0.018585205078125, + -0.0413818359375, + 0.040130615234375, + -0.04986572265625, + -0.0106201171875, + -0.0138397216796875, + 0.0102386474609375, + 0.016937255859375, + -0.0044403076171875, + -0.03253173828125, + 0.0236358642578125, + -0.041229248046875, + 0.01373291015625, + -0.01102447509765625, + -0.022247314453125, + 0.0182342529296875, + -0.016693115234375, + -0.0111846923828125, + 0.02691650390625, + 0.033660888671875, + -0.0633544921875, + -0.0211639404296875, + 0.0036525726318359375, + -0.005706787109375, + 0.03643798828125, + 0.0284881591796875, + -0.00835418701171875, + -0.0312042236328125, + 0.006317138671875, + 0.01025390625, + -0.007843017578125, + 0.00213623046875, + -0.0772705078125, + -0.0279693603515625, + -0.06549072265625, + 0.0131683349609375, + 0.033294677734375, + -0.036590576171875, + 0.01375579833984375, + -0.046875, + 0.055511474609375, + -0.019378662109375, + -0.01172637939453125, + -0.01117706298828125, + 0.0234527587890625, + 0.00614166259765625, + 0.053619384765625, + -0.004131317138671875, + 0.028045654296875, + -0.0051727294921875, + 0.01395416259765625, + 0.0289154052734375, + 0.00588226318359375, + -0.04315185546875, + -0.030914306640625, + -0.01071929931640625, + 0.0054931640625, + -0.005695343017578125, + 0.029510498046875, + -0.032135009765625, + -0.007110595703125, + -0.0221099853515625, + 0.041961669921875, + -0.04669189453125, + -0.01526641845703125, + -0.0251007080078125, + 0.002231597900390625, + 0.00835418701171875, + -0.049346923828125, + -0.006175994873046875, + -0.0011625289916992188, + 0.0638427734375, + -0.033050537109375, + 0.0207977294921875, + 0.007640838623046875, + 0.005527496337890625, + -0.035888671875, + 0.0035114288330078125, + 0.04254150390625, + -0.032440185546875, + -0.01025390625, + -0.005802154541015625, + -0.037994384765625, + 0.07293701171875, + -0.037109375, + 0.0309295654296875, + 0.0806884765625, + 0.0208587646484375, + 0.0092926025390625, + -0.0221099853515625, + 0.041900634765625, + 0.03985595703125, + -0.004940032958984375, + 0.0001558065414428711, + 0.0010509490966796875, + -0.0295867919921875, + -0.04095458984375, + 0.00835418701171875, + -0.0499267578125, + -0.059173583984375, + 0.003086090087890625, + 0.042266845703125, + 0.015411376953125, + 0.047607421875, + 0.0098419189453125, + -0.05523681640625, + -0.054840087890625, + 0.026031494140625, + 0.0235137939453125, + 0.0303497314453125, + 0.0616455078125, + 0.035064697265625, + 0.002140045166015625, + 0.038238525390625, + -0.0106658935546875, + -0.00887298583984375, + -0.0594482421875, + 0.02154541015625, + 0.049102783203125, + -0.035003662109375, + 0.045379638671875, + 0.043243408203125, + -0.0849609375, + -0.049072265625, + -0.0207672119140625, + -0.033355712890625, + -0.003459930419921875, + -0.0258331298828125, + -0.07672119140625, + -0.0202789306640625, + -0.07354736328125, + -0.02008056640625, + -0.0282745361328125, + -0.01538848876953125, + 0.049713134765625, + -0.051849365234375, + 0.01007843017578125, + -0.03997802734375, + -0.015045166015625, + 0.045501708984375, + -0.0173797607421875, + 0.0284423828125, + -0.0355224609375, + -0.0199127197265625, + -0.0206146240234375, + 0.0223541259765625, + 0.012481689453125, + 0.00637054443359375, + 0.0032520294189453125, + 0.0179443359375, + 0.01454925537109375, + 0.08642578125, + 0.01959228515625, + 0.0304107666015625, + 0.05035400390625, + -0.07696533203125, + -0.04522705078125, + -0.0205841064453125, + 0.0058441162109375, + 0.0172576904296875, + -0.00305938720703125, + -0.0221099853515625, + 0.039306640625, + 0.06097412109375, + 0.064208984375, + -0.0030345916748046875, + -0.0574951171875, + -0.0170745849609375, + -0.024139404296875, + -0.037353515625, + -0.021575927734375, + -0.01416778564453125, + 0.01001739501953125, + 0.0217742919921875, + -0.0146636962890625, + -0.0311431884765625, + -0.03271484375, + 0.002338409423828125, + 0.0116424560546875, + -0.01043701171875, + -0.036773681640625, + 0.05645751953125, + 0.00579071044921875, + -0.0274200439453125, + -0.01483917236328125, + -0.0523681640625, + -0.03106689453125, + 0.006153106689453125, + -0.0242767333984375, + 0.0011644363403320312, + -0.023101806640625, + 0.050994873046875, + -0.0011348724365234375, + 0.0042724609375, + -0.02203369140625, + -0.01064300537109375, + -0.00403594970703125, + -0.002880096435546875, + -0.00252532958984375, + -0.0090789794921875, + 0.025848388671875, + -0.031890869140625, + 0.013458251953125, + -0.02325439453125, + 0.03985595703125, + -0.038055419921875, + 0.038543701171875, + -0.022552490234375, + 6.0617923736572266e-05, + -0.00537872314453125, + -0.0142822265625, + -0.00839996337890625, + -0.007266998291015625, + 0.012176513671875, + -0.0234375, + 0.0165557861328125, + 0.0034465789794921875, + 0.016510009765625, + 0.0261077880859375, + 0.023895263671875, + 0.01177215576171875, + -0.004302978515625, + -0.005054473876953125, + -0.0024166107177734375, + 0.03900146484375, + 0.006103515625, + 0.037628173828125, + 0.00865936279296875, + 0.0039825439453125, + 0.00817108154296875, + 0.00919342041015625, + 0.00438690185546875, + -0.0186004638671875, + 0.0243377685546875, + -0.01155853271484375, + 0.005313873291015625, + 0.00345611572265625, + 0.0197601318359375, + 0.0184783935546875, + 0.046600341796875, + 0.02471923828125, + 0.01131439208984375, + 0.054443359375, + 0.004425048828125, + -0.00814056396484375, + 0.0172882080078125, + -0.057281494140625, + -0.04962158203125, + 0.04095458984375, + -0.055145263671875, + -0.0192718505859375, + -0.01229095458984375, + -0.0292816162109375, + -0.0104522705078125, + 0.0016574859619140625, + -0.029205322265625, + -0.0003898143768310547, + 0.01690673828125, + 0.044586181640625, + 0.0313720703125, + -0.00354766845703125, + -0.01338958740234375, + -0.01513671875, + 0.020233154296875, + -0.044921875, + -0.01464080810546875, + 0.01531982421875, + 0.01090240478515625, + 0.04315185546875, + 0.0150604248046875, + -0.0184326171875, + 0.01407623291015625, + -0.01386260986328125, + -0.01349639892578125, + 0.03857421875, + 0.003665924072265625, + -0.032135009765625, + 0.02801513671875, + -0.07373046875, + 0.06744384765625, + -0.0194091796875, + 0.00547027587890625, + -0.011199951171875, + -0.0210418701171875, + 0.01198577880859375, + 0.040618896484375, + 0.021392822265625, + -0.045166015625, + 0.01007080078125, + 0.01029205322265625, + 0.024932861328125, + -0.0020008087158203125, + -0.0140380859375, + 0.00568389892578125, + 0.06329345703125, + 0.0506591796875, + 0.04449462890625, + -0.0031795501708984375, + 0.03741455078125, + 0.0367431640625, + -0.0153656005859375, + -0.02349853515625, + 0.052001953125, + 0.038177490234375, + -0.041656494140625, + 0.01091766357421875, + -0.03857421875, + -0.029754638671875, + -0.01287841796875, + 0.01328277587890625, + -0.017974853515625, + -0.058197021484375, + 0.0181427001953125, + -0.05010986328125, + 0.00897979736328125, + 0.0635986328125, + 0.0078125, + 0.00521087646484375, + 0.01580810546875, + -0.00948333740234375, + 0.017669677734375, + 0.0220947265625, + -0.0404052734375, + -0.0219268798828125, + 0.022125244140625, + 0.0362548828125, + -0.01502227783203125, + 0.0272216796875, + 0.01053619384765625, + 0.007904052734375, + -0.0540771484375, + 0.04864501953125, + 0.0296783447265625, + 0.0149688720703125, + -0.0258026123046875, + -0.029693603515625, + -0.05059814453125, + -0.0223846435546875, + 0.01166534423828125, + -0.002532958984375, + 0.0099639892578125, + -0.028045654296875, + 0.03570556640625, + -0.0200958251953125, + 0.0379638671875, + -0.0224151611328125, + -0.0022678375244140625, + 0.0216827392578125, + -0.0012235641479492188, + 0.04730224609375, + 0.0595703125, + -0.0027904510498046875, + 0.0305633544921875, + -0.01100921630859375, + 0.0211639404296875, + 0.036590576171875, + 0.004764556884765625, + 0.040496826171875, + -0.036590576171875, + -0.00864410400390625, + 0.0273590087890625, + -0.0218353271484375, + -0.00821685791015625, + -0.0601806640625, + -0.0244293212890625, + 0.02392578125, + -0.013641357421875, + -0.00039696693420410156, + -0.0209503173828125, + 0.039520263671875, + 0.01526641845703125, + -0.024200439453125, + -0.027679443359375, + 0.02264404296875, + -0.0455322265625, + 0.0057525634765625, + 0.039825439453125, + 0.02203369140625, + 0.01116180419921875, + -0.0531005859375, + 0.00942230224609375, + -0.0010519027709960938, + 0.01265716552734375, + -0.0247802734375, + -0.00292205810546875, + 0.0011491775512695312, + -0.0379638671875, + -0.0256195068359375, + -0.0306243896484375, + -0.0018663406372070312, + -0.006984710693359375, + 0.00447845458984375, + -0.04290771484375, + -0.014984130859375, + -0.00200653076171875, + 0.007274627685546875, + 0.01873779296875, + 0.01107025146484375, + 0.004299163818359375, + 0.003177642822265625, + 0.03155517578125, + 0.0062713623046875, + 0.050933837890625, + -0.00632476806640625, + -0.0455322265625, + -0.0158233642578125, + -0.035491943359375, + -0.0171051025390625, + -0.03662109375, + -0.021728515625, + 0.0268096923828125, + 0.02703857421875, + -0.0193634033203125, + -0.018707275390625, + -0.035308837890625, + 0.00925445556640625, + -0.0016641616821289062, + 0.024444580078125, + -0.044036865234375, + -0.0574951171875, + -0.0709228515625, + -0.01910400390625, + 0.003627777099609375, + 0.01151275634765625, + -0.0304107666015625, + 0.01275634765625, + 0.030914306640625, + -0.07611083984375, + 0.1944580078125, + 0.0160980224609375, + 0.014984130859375, + 0.010772705078125, + 0.01776123046875, + 0.04931640625, + 0.004299163818359375, + 0.005245208740234375, + -0.061981201171875, + -0.042694091796875, + 0.04083251953125, + 0.0007605552673339844, + -0.005481719970703125, + -0.016387939453125, + -0.005054473876953125, + 0.00936126708984375, + -0.007648468017578125, + -0.037567138671875, + 0.0240325927734375, + -0.0123443603515625, + -0.027252197265625, + -0.00286865234375, + 0.0184173583984375, + 0.0286407470703125, + 0.0092010498046875, + 0.022857666015625, + 0.047943115234375, + -0.00893402099609375, + 0.003383636474609375, + -0.019561767578125, + 0.06488037109375, + 0.00029969215393066406, + 0.043060302734375, + 0.0157623291015625, + -0.029327392578125, + 0.037261962890625, + 0.02532958984375, + 0.00390625, + -0.009552001953125, + -0.0235443115234375, + 0.0286407470703125, + -0.019134521484375, + -0.03131103515625, + -0.0004582405090332031, + -0.044586181640625, + 0.0195465087890625, + 0.0005121231079101562, + 0.06744384765625, + 0.0394287109375, + -0.00420379638671875, + 0.05645751953125, + -0.0089874267578125, + 0.0283355712890625, + -0.0273895263671875, + -0.06268310546875, + 0.04541015625, + -0.009674072265625, + 0.03466796875, + -0.038116455078125, + 0.0269927978515625, + -0.0219879150390625, + 0.00738525390625, + 0.00423431396484375, + 0.004169464111328125, + -0.0120086669921875, + 0.009368896484375, + -0.020263671875, + 0.01036834716796875, + -0.03948974609375, + -0.035552978515625, + 0.0036525726318359375, + 0.00521087646484375, + -0.006786346435546875, + -0.03607177734375, + 0.026031494140625, + 0.036163330078125, + -0.0161895751953125, + 0.02630615234375, + 0.00954437255859375, + -0.026458740234375, + 0.028564453125, + -0.01108551025390625, + 0.047760009765625, + -0.0257720947265625, + -0.001068115234375, + 0.01389312744140625, + -0.00641632080078125, + -0.00482940673828125, + -0.056671142578125, + -0.0018491744995117188, + 0.032257080078125, + 0.051788330078125, + -0.0172119140625, + -0.0018167495727539062, + -0.0031604766845703125 + ], + "index": 0, + "object": "embedding" + } + ], + "model": "bge-large-en-v1.5", + "object": "list", + "usage": { + "prompt_tokens": 5, + "total_tokens": 5 + }, + "id": "2b932521-dccc-4a5e-a548-4cc9b6796188" + } + }, + "is_streaming": false + } +} diff --git a/tests/integration/recordings/responses/d64ffaa0de6f.json b/tests/integration/recordings/responses/d64ffaa0de6f.json new file mode 100644 index 000000000..0e7b19d29 --- /dev/null +++ b/tests/integration/recordings/responses/d64ffaa0de6f.json @@ -0,0 +1,1062 @@ +{ + "request": { + "method": "POST", + "url": "__databricks__/serving-endpoints/v1/embeddings", + "headers": {}, + "body": { + "model": "databricks-bge-large-en", + "input": "Test user parameter", + "encoding_format": "float", + "user": "test-user-123" + }, + "endpoint": "/v1/embeddings", + "model": "databricks-bge-large-en" + }, + "response": { + "body": { + "__type__": "openai.types.create_embedding_response.CreateEmbeddingResponse", + "__data__": { + "data": [ + { + "embedding": [ + 0.038818359375, + -0.0207061767578125, + 0.00783538818359375, + 0.0081939697265625, + -0.041290283203125, + 0.0186920166015625, + 0.00027441978454589844, + 0.027862548828125, + 0.037994384765625, + 0.034454345703125, + 0.050537109375, + -0.0251007080078125, + -0.001983642578125, + -0.01161956787109375, + -0.040252685546875, + -0.01259613037109375, + 0.0064849853515625, + 0.018280029296875, + -0.01287841796875, + -0.00446319580078125, + 0.006011962890625, + 0.0250396728515625, + -0.07098388671875, + -0.0204010009765625, + -0.03741455078125, + -0.042266845703125, + 0.0081939697265625, + -0.01309967041015625, + 0.0323486328125, + 0.036865234375, + -0.038543701171875, + -0.0030841827392578125, + -0.0162200927734375, + -0.03985595703125, + 0.00453948974609375, + -0.0294342041015625, + 0.05145263671875, + -0.0531005859375, + -0.03289794921875, + -0.03399658203125, + 0.0081939697265625, + 0.00921630859375, + -0.01367950439453125, + -0.03607177734375, + -0.03997802734375, + -0.0266876220703125, + -0.056396484375, + -0.002017974853515625, + -0.0230560302734375, + -0.0205535888671875, + -0.0191192626953125, + -0.00901031494140625, + 0.03460693359375, + -0.01090240478515625, + -0.0172576904296875, + -0.03619384765625, + 0.00653076171875, + -0.00341033935546875, + -0.0390625, + 0.0634765625, + -0.0238494873046875, + 0.015960693359375, + -0.003719329833984375, + -0.046142578125, + 0.026123046875, + 0.0024566650390625, + 0.031524658203125, + -0.009185791015625, + 0.00116729736328125, + -0.029571533203125, + 0.00673675537109375, + 0.031524658203125, + -0.0112457275390625, + -0.0257110595703125, + -0.03350830078125, + 0.06622314453125, + 0.0250091552734375, + -0.00572967529296875, + -0.0058746337890625, + 0.0731201171875, + -0.00891876220703125, + 0.0177154541015625, + 0.0096893310546875, + 0.0139923095703125, + -0.07232666015625, + -0.0140228271484375, + 0.025238037109375, + 0.0265655517578125, + 0.0264892578125, + -0.00270843505859375, + -0.006641387939453125, + 0.03668212890625, + 0.00897979736328125, + -0.011505126953125, + 0.00983428955078125, + 0.0172271728515625, + 0.00867462158203125, + 0.00699615478515625, + 0.004863739013671875, + -0.0238494873046875, + 0.050201416015625, + 0.0484619140625, + 0.0288848876953125, + 0.041229248046875, + -0.0111083984375, + 0.0919189453125, + 0.007373809814453125, + 0.0178375244140625, + -0.042877197265625, + -0.0292816162109375, + -0.00487518310546875, + 0.005069732666015625, + 0.0262603759765625, + 0.021881103515625, + -0.055145263671875, + 0.005138397216796875, + 0.01123046875, + 0.006084442138671875, + -0.035675048828125, + -0.0247650146484375, + 0.052459716796875, + -0.0225372314453125, + 0.003650665283203125, + -0.028076171875, + 0.0042724609375, + -0.0269622802734375, + -0.0753173828125, + 0.038909912109375, + -0.00821685791015625, + -0.06915283203125, + -0.00516510009765625, + -0.0139923095703125, + 0.057342529296875, + 0.03759765625, + 0.00557708740234375, + 0.067138671875, + 0.01593017578125, + 0.0084075927734375, + 0.032135009765625, + -0.03582763671875, + 0.033416748046875, + 0.03668212890625, + -0.01407623291015625, + 0.06732177734375, + -0.00951385498046875, + 0.0413818359375, + 0.0012598037719726562, + -0.0021152496337890625, + -0.058624267578125, + 0.040008544921875, + -0.049530029296875, + -0.00897216796875, + -0.03240966796875, + 0.0014820098876953125, + 0.0141143798828125, + -0.0275421142578125, + 0.034515380859375, + 0.0027484893798828125, + 0.006805419921875, + 0.058135986328125, + -0.0285491943359375, + 0.040374755859375, + -0.02764892578125, + 0.030059814453125, + -0.00798797607421875, + 0.00278472900390625, + -0.0138397216796875, + -0.0080718994140625, + 0.03033447265625, + -0.03424072265625, + 0.0126495361328125, + 0.045257568359375, + -0.0020999908447265625, + -0.004810333251953125, + 0.043182373046875, + 0.0267791748046875, + 0.056915283203125, + 0.01361083984375, + 0.0165863037109375, + 0.0194091796875, + -0.0223388671875, + 0.042205810546875, + -0.0230560302734375, + 0.046875, + 0.0207672119140625, + 0.0193023681640625, + 0.018798828125, + -0.003459930419921875, + -0.048828125, + 0.0294342041015625, + 0.009918212890625, + -0.033447265625, + 0.0021953582763671875, + -0.01499176025390625, + -0.041015625, + 0.038543701171875, + 0.00728607177734375, + 0.02557373046875, + -0.0249786376953125, + -0.09344482421875, + -0.0380859375, + 0.01085662841796875, + -0.08184814453125, + 0.0106201171875, + 0.01702880859375, + -0.053070068359375, + 0.0012454986572265625, + 0.0217742919921875, + 0.0013647079467773438, + -0.0301666259765625, + 0.0247955322265625, + 0.028778076171875, + -0.045745849609375, + -0.033050537109375, + 0.00785064697265625, + -0.0193634033203125, + -0.0183258056640625, + 0.05029296875, + 0.005825042724609375, + 0.0258026123046875, + -0.01001739501953125, + 0.0357666015625, + 0.0357666015625, + 0.01294708251953125, + 0.02978515625, + -0.0148468017578125, + -0.0246429443359375, + 0.0797119140625, + -0.0192718505859375, + 0.007568359375, + 0.00833892822265625, + 0.004962921142578125, + -0.01812744140625, + 0.08563232421875, + -0.00814056396484375, + 0.044921875, + 0.05767822265625, + 0.0006213188171386719, + 0.01995849609375, + 0.020782470703125, + 0.021453857421875, + 0.041656494140625, + 0.01131439208984375, + 0.044921875, + -0.06787109375, + -0.01293182373046875, + 0.01103973388671875, + 0.0237274169921875, + -0.006160736083984375, + 0.061187744140625, + -0.01140594482421875, + 0.0545654296875, + 0.0352783203125, + 0.01093292236328125, + -0.03778076171875, + -0.0195770263671875, + 0.0179901123046875, + -0.007785797119140625, + -0.0401611328125, + 0.00499725341796875, + 0.00968170166015625, + 0.003509521484375, + 0.00508880615234375, + -0.0228271484375, + 0.0220184326171875, + -0.053466796875, + 0.041290283203125, + 0.00811767578125, + 0.004108428955078125, + -0.0521240234375, + 0.01568603515625, + -0.0226898193359375, + -0.026458740234375, + -0.04144287109375, + -0.025421142578125, + -0.0283660888671875, + 0.034942626953125, + -0.021636962890625, + -0.006786346435546875, + -0.0263671875, + 0.013641357421875, + -0.0560302734375, + -0.0015535354614257812, + 0.07000732421875, + 0.022308349609375, + 0.022613525390625, + -0.002166748046875, + -0.0254364013671875, + 0.00592803955078125, + 0.040435791015625, + -0.004367828369140625, + -0.028076171875, + 0.0034160614013671875, + -0.046051025390625, + -0.0101318359375, + -0.023345947265625, + 0.0150604248046875, + 0.02899169921875, + -0.0243988037109375, + -0.01531982421875, + -0.006866455078125, + 0.04766845703125, + -0.005859375, + 0.033416748046875, + -0.042633056640625, + -0.004199981689453125, + 0.0799560546875, + -0.020355224609375, + 0.0188140869140625, + 0.033966064453125, + -0.00638580322265625, + 0.040252685546875, + -0.009521484375, + -0.02020263671875, + -0.049072265625, + 0.023406982421875, + 0.04144287109375, + -0.01690673828125, + -0.01177978515625, + 0.003940582275390625, + -0.0205841064453125, + -0.03302001953125, + -0.0158538818359375, + 0.014190673828125, + -0.016326904296875, + 0.031524658203125, + -0.0225677490234375, + -0.0838623046875, + 0.0014591217041015625, + -0.034149169921875, + 0.01538848876953125, + -0.03973388671875, + -0.022003173828125, + 0.03515625, + 0.0123443603515625, + -0.017730712890625, + -0.024993896484375, + -0.00876617431640625, + -0.00799560546875, + -0.01947021484375, + 0.041656494140625, + -0.023223876953125, + 0.00521087646484375, + 0.0127716064453125, + 0.033050537109375, + 0.004669189453125, + 0.01395416259765625, + -0.00946044921875, + -0.03070068359375, + -0.023834228515625, + 0.0014295578002929688, + -0.006221771240234375, + -0.0157470703125, + -0.002391815185546875, + 0.0093536376953125, + 0.03857421875, + -0.00583648681640625, + 0.00028061866760253906, + 0.03826904296875, + 0.0131378173828125, + 0.00801849365234375, + 0.03741455078125, + 0.00445556640625, + 0.0026111602783203125, + -0.0204010009765625, + -0.05938720703125, + -0.060760498046875, + 0.042755126953125, + 0.02325439453125, + -0.058624267578125, + 0.02508544921875, + -0.026763916015625, + 0.017425537109375, + -0.0119171142578125, + -0.0229949951171875, + -0.0201263427734375, + 0.020416259765625, + 0.005756378173828125, + 0.057403564453125, + -0.0121307373046875, + 0.001636505126953125, + -0.00739288330078125, + 0.001750946044921875, + 0.06219482421875, + 0.0491943359375, + 0.00327301025390625, + 0.0086822509765625, + -0.0020580291748046875, + -0.042449951171875, + 0.0162353515625, + -0.0174713134765625, + 0.00701904296875, + 0.0081939697265625, + -0.01861572265625, + -0.047149658203125, + -0.04107666015625, + 0.00457000732421875, + 0.01158905029296875, + 0.044403076171875, + 0.01177978515625, + 0.00873565673828125, + -0.009368896484375, + 0.018707275390625, + 0.04815673828125, + -0.0275726318359375, + 0.023712158203125, + -0.0162353515625, + 0.03375244140625, + 0.01120758056640625, + 0.0257415771484375, + -0.0489501953125, + 0.04254150390625, + -0.01520538330078125, + 0.01178741455078125, + 0.026153564453125, + -0.03277587890625, + -0.01216888427734375, + 0.0277862548828125, + 0.0103912353515625, + 0.005359649658203125, + -0.0307769775390625, + -0.060089111328125, + -0.01239013671875, + 0.00286102294921875, + 0.0290374755859375, + -0.0163421630859375, + -0.0279388427734375, + -0.005245208740234375, + 0.050933837890625, + 0.0496826171875, + -0.01491546630859375, + -0.0714111328125, + -0.00919342041015625, + -0.04046630859375, + -0.05535888671875, + -0.00629425048828125, + 0.059967041015625, + -0.0631103515625, + 0.007266998291015625, + -0.0528564453125, + -0.0033321380615234375, + -0.0009446144104003906, + -0.0210113525390625, + 0.02587890625, + 0.01155853271484375, + -0.026031494140625, + -0.02880859375, + 0.01739501953125, + -0.047760009765625, + -0.0601806640625, + 0.0158538818359375, + -0.06219482421875, + 0.027313232421875, + -0.0179443359375, + 0.000415802001953125, + -0.0361328125, + 0.0208892822265625, + 0.031524658203125, + 0.01708984375, + -0.0189666748046875, + -0.00891876220703125, + 0.03936767578125, + 0.01409912109375, + -0.004058837890625, + 0.01398468017578125, + 0.01555633544921875, + -0.0016756057739257812, + 0.00555419921875, + 0.031707763671875, + -0.005435943603515625, + 0.007686614990234375, + 0.042266845703125, + 0.0037708282470703125, + -0.050079345703125, + -0.004322052001953125, + -0.03546142578125, + 0.016082763671875, + -0.03515625, + -0.018768310546875, + -0.01500701904296875, + -0.043182373046875, + 0.042144775390625, + 0.050018310546875, + -0.049652099609375, + -0.0184173583984375, + -0.055206298828125, + -0.0158843994140625, + -0.0269622802734375, + -0.007541656494140625, + 0.0416259765625, + -0.023101806640625, + -0.0338134765625, + 0.00537872314453125, + -0.018890380859375, + -0.0196533203125, + 0.0284423828125, + -0.04345703125, + -0.01146697998046875, + 0.005596160888671875, + 0.02349853515625, + 0.001796722412109375, + -0.018585205078125, + -0.0413818359375, + 0.040130615234375, + -0.04986572265625, + -0.0106201171875, + -0.0138397216796875, + 0.0102386474609375, + 0.016937255859375, + -0.0044403076171875, + -0.03253173828125, + 0.0236358642578125, + -0.041229248046875, + 0.01373291015625, + -0.01102447509765625, + -0.022247314453125, + 0.0182342529296875, + -0.016693115234375, + -0.0111846923828125, + 0.02691650390625, + 0.033660888671875, + -0.0633544921875, + -0.0211639404296875, + 0.0036525726318359375, + -0.005706787109375, + 0.03643798828125, + 0.0284881591796875, + -0.00835418701171875, + -0.0312042236328125, + 0.006317138671875, + 0.01025390625, + -0.007843017578125, + 0.00213623046875, + -0.0772705078125, + -0.0279693603515625, + -0.06549072265625, + 0.0131683349609375, + 0.033294677734375, + -0.036590576171875, + 0.01375579833984375, + -0.046875, + 0.055511474609375, + -0.019378662109375, + -0.01172637939453125, + -0.01117706298828125, + 0.0234527587890625, + 0.00614166259765625, + 0.053619384765625, + -0.004131317138671875, + 0.028045654296875, + -0.0051727294921875, + 0.01395416259765625, + 0.0289154052734375, + 0.00588226318359375, + -0.04315185546875, + -0.030914306640625, + -0.01071929931640625, + 0.0054931640625, + -0.005695343017578125, + 0.029510498046875, + -0.032135009765625, + -0.007110595703125, + -0.0221099853515625, + 0.041961669921875, + -0.04669189453125, + -0.01526641845703125, + -0.0251007080078125, + 0.002231597900390625, + 0.00835418701171875, + -0.049346923828125, + -0.006175994873046875, + -0.0011625289916992188, + 0.0638427734375, + -0.033050537109375, + 0.0207977294921875, + 0.007640838623046875, + 0.005527496337890625, + -0.035888671875, + 0.0035114288330078125, + 0.04254150390625, + -0.032440185546875, + -0.01025390625, + -0.005802154541015625, + -0.037994384765625, + 0.07293701171875, + -0.037109375, + 0.0309295654296875, + 0.0806884765625, + 0.0208587646484375, + 0.0092926025390625, + -0.0221099853515625, + 0.041900634765625, + 0.03985595703125, + -0.004940032958984375, + 0.0001558065414428711, + 0.0010509490966796875, + -0.0295867919921875, + -0.04095458984375, + 0.00835418701171875, + -0.0499267578125, + -0.059173583984375, + 0.003086090087890625, + 0.042266845703125, + 0.015411376953125, + 0.047607421875, + 0.0098419189453125, + -0.05523681640625, + -0.054840087890625, + 0.026031494140625, + 0.0235137939453125, + 0.0303497314453125, + 0.0616455078125, + 0.035064697265625, + 0.002140045166015625, + 0.038238525390625, + -0.0106658935546875, + -0.00887298583984375, + -0.0594482421875, + 0.02154541015625, + 0.049102783203125, + -0.035003662109375, + 0.045379638671875, + 0.043243408203125, + -0.0849609375, + -0.049072265625, + -0.0207672119140625, + -0.033355712890625, + -0.003459930419921875, + -0.0258331298828125, + -0.07672119140625, + -0.0202789306640625, + -0.07354736328125, + -0.02008056640625, + -0.0282745361328125, + -0.01538848876953125, + 0.049713134765625, + -0.051849365234375, + 0.01007843017578125, + -0.03997802734375, + -0.015045166015625, + 0.045501708984375, + -0.0173797607421875, + 0.0284423828125, + -0.0355224609375, + -0.0199127197265625, + -0.0206146240234375, + 0.0223541259765625, + 0.012481689453125, + 0.00637054443359375, + 0.0032520294189453125, + 0.0179443359375, + 0.01454925537109375, + 0.08642578125, + 0.01959228515625, + 0.0304107666015625, + 0.05035400390625, + -0.07696533203125, + -0.04522705078125, + -0.0205841064453125, + 0.0058441162109375, + 0.0172576904296875, + -0.00305938720703125, + -0.0221099853515625, + 0.039306640625, + 0.06097412109375, + 0.064208984375, + -0.0030345916748046875, + -0.0574951171875, + -0.0170745849609375, + -0.024139404296875, + -0.037353515625, + -0.021575927734375, + -0.01416778564453125, + 0.01001739501953125, + 0.0217742919921875, + -0.0146636962890625, + -0.0311431884765625, + -0.03271484375, + 0.002338409423828125, + 0.0116424560546875, + -0.01043701171875, + -0.036773681640625, + 0.05645751953125, + 0.00579071044921875, + -0.0274200439453125, + -0.01483917236328125, + -0.0523681640625, + -0.03106689453125, + 0.006153106689453125, + -0.0242767333984375, + 0.0011644363403320312, + -0.023101806640625, + 0.050994873046875, + -0.0011348724365234375, + 0.0042724609375, + -0.02203369140625, + -0.01064300537109375, + -0.00403594970703125, + -0.002880096435546875, + -0.00252532958984375, + -0.0090789794921875, + 0.025848388671875, + -0.031890869140625, + 0.013458251953125, + -0.02325439453125, + 0.03985595703125, + -0.038055419921875, + 0.038543701171875, + -0.022552490234375, + 6.0617923736572266e-05, + -0.00537872314453125, + -0.0142822265625, + -0.00839996337890625, + -0.007266998291015625, + 0.012176513671875, + -0.0234375, + 0.0165557861328125, + 0.0034465789794921875, + 0.016510009765625, + 0.0261077880859375, + 0.023895263671875, + 0.01177215576171875, + -0.004302978515625, + -0.005054473876953125, + -0.0024166107177734375, + 0.03900146484375, + 0.006103515625, + 0.037628173828125, + 0.00865936279296875, + 0.0039825439453125, + 0.00817108154296875, + 0.00919342041015625, + 0.00438690185546875, + -0.0186004638671875, + 0.0243377685546875, + -0.01155853271484375, + 0.005313873291015625, + 0.00345611572265625, + 0.0197601318359375, + 0.0184783935546875, + 0.046600341796875, + 0.02471923828125, + 0.01131439208984375, + 0.054443359375, + 0.004425048828125, + -0.00814056396484375, + 0.0172882080078125, + -0.057281494140625, + -0.04962158203125, + 0.04095458984375, + -0.055145263671875, + -0.0192718505859375, + -0.01229095458984375, + -0.0292816162109375, + -0.0104522705078125, + 0.0016574859619140625, + -0.029205322265625, + -0.0003898143768310547, + 0.01690673828125, + 0.044586181640625, + 0.0313720703125, + -0.00354766845703125, + -0.01338958740234375, + -0.01513671875, + 0.020233154296875, + -0.044921875, + -0.01464080810546875, + 0.01531982421875, + 0.01090240478515625, + 0.04315185546875, + 0.0150604248046875, + -0.0184326171875, + 0.01407623291015625, + -0.01386260986328125, + -0.01349639892578125, + 0.03857421875, + 0.003665924072265625, + -0.032135009765625, + 0.02801513671875, + -0.07373046875, + 0.06744384765625, + -0.0194091796875, + 0.00547027587890625, + -0.011199951171875, + -0.0210418701171875, + 0.01198577880859375, + 0.040618896484375, + 0.021392822265625, + -0.045166015625, + 0.01007080078125, + 0.01029205322265625, + 0.024932861328125, + -0.0020008087158203125, + -0.0140380859375, + 0.00568389892578125, + 0.06329345703125, + 0.0506591796875, + 0.04449462890625, + -0.0031795501708984375, + 0.03741455078125, + 0.0367431640625, + -0.0153656005859375, + -0.02349853515625, + 0.052001953125, + 0.038177490234375, + -0.041656494140625, + 0.01091766357421875, + -0.03857421875, + -0.029754638671875, + -0.01287841796875, + 0.01328277587890625, + -0.017974853515625, + -0.058197021484375, + 0.0181427001953125, + -0.05010986328125, + 0.00897979736328125, + 0.0635986328125, + 0.0078125, + 0.00521087646484375, + 0.01580810546875, + -0.00948333740234375, + 0.017669677734375, + 0.0220947265625, + -0.0404052734375, + -0.0219268798828125, + 0.022125244140625, + 0.0362548828125, + -0.01502227783203125, + 0.0272216796875, + 0.01053619384765625, + 0.007904052734375, + -0.0540771484375, + 0.04864501953125, + 0.0296783447265625, + 0.0149688720703125, + -0.0258026123046875, + -0.029693603515625, + -0.05059814453125, + -0.0223846435546875, + 0.01166534423828125, + -0.002532958984375, + 0.0099639892578125, + -0.028045654296875, + 0.03570556640625, + -0.0200958251953125, + 0.0379638671875, + -0.0224151611328125, + -0.0022678375244140625, + 0.0216827392578125, + -0.0012235641479492188, + 0.04730224609375, + 0.0595703125, + -0.0027904510498046875, + 0.0305633544921875, + -0.01100921630859375, + 0.0211639404296875, + 0.036590576171875, + 0.004764556884765625, + 0.040496826171875, + -0.036590576171875, + -0.00864410400390625, + 0.0273590087890625, + -0.0218353271484375, + -0.00821685791015625, + -0.0601806640625, + -0.0244293212890625, + 0.02392578125, + -0.013641357421875, + -0.00039696693420410156, + -0.0209503173828125, + 0.039520263671875, + 0.01526641845703125, + -0.024200439453125, + -0.027679443359375, + 0.02264404296875, + -0.0455322265625, + 0.0057525634765625, + 0.039825439453125, + 0.02203369140625, + 0.01116180419921875, + -0.0531005859375, + 0.00942230224609375, + -0.0010519027709960938, + 0.01265716552734375, + -0.0247802734375, + -0.00292205810546875, + 0.0011491775512695312, + -0.0379638671875, + -0.0256195068359375, + -0.0306243896484375, + -0.0018663406372070312, + -0.006984710693359375, + 0.00447845458984375, + -0.04290771484375, + -0.014984130859375, + -0.00200653076171875, + 0.007274627685546875, + 0.01873779296875, + 0.01107025146484375, + 0.004299163818359375, + 0.003177642822265625, + 0.03155517578125, + 0.0062713623046875, + 0.050933837890625, + -0.00632476806640625, + -0.0455322265625, + -0.0158233642578125, + -0.035491943359375, + -0.0171051025390625, + -0.03662109375, + -0.021728515625, + 0.0268096923828125, + 0.02703857421875, + -0.0193634033203125, + -0.018707275390625, + -0.035308837890625, + 0.00925445556640625, + -0.0016641616821289062, + 0.024444580078125, + -0.044036865234375, + -0.0574951171875, + -0.0709228515625, + -0.01910400390625, + 0.003627777099609375, + 0.01151275634765625, + -0.0304107666015625, + 0.01275634765625, + 0.030914306640625, + -0.07611083984375, + 0.1944580078125, + 0.0160980224609375, + 0.014984130859375, + 0.010772705078125, + 0.01776123046875, + 0.04931640625, + 0.004299163818359375, + 0.005245208740234375, + -0.061981201171875, + -0.042694091796875, + 0.04083251953125, + 0.0007605552673339844, + -0.005481719970703125, + -0.016387939453125, + -0.005054473876953125, + 0.00936126708984375, + -0.007648468017578125, + -0.037567138671875, + 0.0240325927734375, + -0.0123443603515625, + -0.027252197265625, + -0.00286865234375, + 0.0184173583984375, + 0.0286407470703125, + 0.0092010498046875, + 0.022857666015625, + 0.047943115234375, + -0.00893402099609375, + 0.003383636474609375, + -0.019561767578125, + 0.06488037109375, + 0.00029969215393066406, + 0.043060302734375, + 0.0157623291015625, + -0.029327392578125, + 0.037261962890625, + 0.02532958984375, + 0.00390625, + -0.009552001953125, + -0.0235443115234375, + 0.0286407470703125, + -0.019134521484375, + -0.03131103515625, + -0.0004582405090332031, + -0.044586181640625, + 0.0195465087890625, + 0.0005121231079101562, + 0.06744384765625, + 0.0394287109375, + -0.00420379638671875, + 0.05645751953125, + -0.0089874267578125, + 0.0283355712890625, + -0.0273895263671875, + -0.06268310546875, + 0.04541015625, + -0.009674072265625, + 0.03466796875, + -0.038116455078125, + 0.0269927978515625, + -0.0219879150390625, + 0.00738525390625, + 0.00423431396484375, + 0.004169464111328125, + -0.0120086669921875, + 0.009368896484375, + -0.020263671875, + 0.01036834716796875, + -0.03948974609375, + -0.035552978515625, + 0.0036525726318359375, + 0.00521087646484375, + -0.006786346435546875, + -0.03607177734375, + 0.026031494140625, + 0.036163330078125, + -0.0161895751953125, + 0.02630615234375, + 0.00954437255859375, + -0.026458740234375, + 0.028564453125, + -0.01108551025390625, + 0.047760009765625, + -0.0257720947265625, + -0.001068115234375, + 0.01389312744140625, + -0.00641632080078125, + -0.00482940673828125, + -0.056671142578125, + -0.0018491744995117188, + 0.032257080078125, + 0.051788330078125, + -0.0172119140625, + -0.0018167495727539062, + -0.0031604766845703125 + ], + "index": 0, + "object": "embedding" + } + ], + "model": "bge-large-en-v1.5", + "object": "list", + "usage": { + "prompt_tokens": 5, + "total_tokens": 5 + }, + "id": "cacd37ef-5f90-4201-91a8-3b7a9eb3564a" + } + }, + "is_streaming": false + } +} diff --git a/tests/integration/recordings/responses/e509387fc329.json b/tests/integration/recordings/responses/e509387fc329.json new file mode 100644 index 000000000..5f1600dab --- /dev/null +++ b/tests/integration/recordings/responses/e509387fc329.json @@ -0,0 +1,168 @@ +{ + "request": { + "method": "POST", + "url": "__databricks__/serving-endpoints/v1/chat/completions", + "headers": {}, + "body": { + "model": "databricks-meta-llama-3-3-70b-instruct", + "messages": [ + { + "role": "user", + "content": "What's the weather in Tokyo? Use the get_weather function to get the weather." + } + ], + "stream": true, + "tools": [ + { + "type": "function", + "function": { + "name": "get_weather", + "description": "Get the weather in a given city", + "parameters": { + "type": "object", + "properties": { + "city": { + "type": "string", + "description": "The city to get the weather for" + } + } + } + } + } + ] + }, + "endpoint": "/v1/chat/completions", + "model": "databricks-meta-llama-3-3-70b-instruct" + }, + "response": { + "body": [ + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "chatcmpl_4c3ae1bf-991d-4266-a12d-b1e97ecbb7a0", + "choices": [ + { + "delta": { + "content": null, + "function_call": null, + "refusal": null, + "role": "assistant", + "tool_calls": [ + { + "index": 0, + "id": "call_87aed80e-f856-468f-9523-52db3018d83d", + "function": { + "arguments": "", + "name": "get_weather" + }, + "type": "function" + } + ] + }, + "finish_reason": null, + "index": 0, + "logprobs": null + } + ], + "created": 1758326502, + "model": "meta-llama-3.3-70b-instruct-121024", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": null, + "usage": { + "completion_tokens": 15, + "prompt_tokens": 682, + "total_tokens": 697, + "completion_tokens_details": null, + "prompt_tokens_details": null + } + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "chatcmpl_4c3ae1bf-991d-4266-a12d-b1e97ecbb7a0", + "choices": [ + { + "delta": { + "content": null, + "function_call": null, + "refusal": null, + "role": null, + "tool_calls": [ + { + "index": 0, + "id": null, + "function": { + "arguments": "{ \"city\": \"Tokyo\" }", + "name": null + }, + "type": null + } + ] + }, + "finish_reason": null, + "index": 0, + "logprobs": null + } + ], + "created": 1758326502, + "model": "meta-llama-3.3-70b-instruct-121024", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": null, + "usage": { + "completion_tokens": 15, + "prompt_tokens": 682, + "total_tokens": 697, + "completion_tokens_details": null, + "prompt_tokens_details": null + } + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "chatcmpl_4c3ae1bf-991d-4266-a12d-b1e97ecbb7a0", + "choices": [ + { + "delta": { + "content": null, + "function_call": null, + "refusal": null, + "role": null, + "tool_calls": [ + { + "index": 0, + "id": null, + "function": { + "arguments": "", + "name": null + }, + "type": null + } + ] + }, + "finish_reason": "tool_calls", + "index": 0, + "logprobs": null + } + ], + "created": 1758326502, + "model": "meta-llama-3.3-70b-instruct-121024", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": null, + "usage": { + "completion_tokens": 15, + "prompt_tokens": 682, + "total_tokens": 697, + "completion_tokens_details": null, + "prompt_tokens_details": null + } + } + } + ], + "is_streaming": true + } +} diff --git a/tests/integration/recordings/responses/ecf6f0c51485.json b/tests/integration/recordings/responses/ecf6f0c51485.json new file mode 100644 index 000000000..bfce388b0 --- /dev/null +++ b/tests/integration/recordings/responses/ecf6f0c51485.json @@ -0,0 +1,536 @@ +{ + "request": { + "method": "POST", + "url": "__databricks__/serving-endpoints/v1/chat/completions", + "headers": {}, + "body": { + "model": "databricks-meta-llama-3-3-70b-instruct", + "messages": [ + { + "role": "user", + "content": "What is the name of the US captial?" + } + ], + "stream": true + }, + "endpoint": "/v1/chat/completions", + "model": "databricks-meta-llama-3-3-70b-instruct" + }, + "response": { + "body": [ + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "chatcmpl_40266680-5422-4e7a-bc40-74eb1efdafbc", + "choices": [ + { + "delta": { + "content": "", + "function_call": null, + "refusal": null, + "role": "assistant", + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null + } + ], + "created": 1758326504, + "model": "meta-llama-3.3-70b-instruct-121024", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": null, + "usage": { + "completion_tokens": 2, + "prompt_tokens": 20, + "total_tokens": 22, + "completion_tokens_details": null, + "prompt_tokens_details": null + } + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "chatcmpl_40266680-5422-4e7a-bc40-74eb1efdafbc", + "choices": [ + { + "delta": { + "content": "The ", + "function_call": null, + "refusal": null, + "role": null, + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null + } + ], + "created": 1758326504, + "model": "meta-llama-3.3-70b-instruct-121024", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": null, + "usage": { + "completion_tokens": 2, + "prompt_tokens": 20, + "total_tokens": 22, + "completion_tokens_details": null, + "prompt_tokens_details": null + } + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "chatcmpl_40266680-5422-4e7a-bc40-74eb1efdafbc", + "choices": [ + { + "delta": { + "content": "capital ", + "function_call": null, + "refusal": null, + "role": null, + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null + } + ], + "created": 1758326504, + "model": "meta-llama-3.3-70b-instruct-121024", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": null, + "usage": { + "completion_tokens": 3, + "prompt_tokens": 20, + "total_tokens": 23, + "completion_tokens_details": null, + "prompt_tokens_details": null + } + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "chatcmpl_40266680-5422-4e7a-bc40-74eb1efdafbc", + "choices": [ + { + "delta": { + "content": "of ", + "function_call": null, + "refusal": null, + "role": null, + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null + } + ], + "created": 1758326504, + "model": "meta-llama-3.3-70b-instruct-121024", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": null, + "usage": { + "completion_tokens": 4, + "prompt_tokens": 20, + "total_tokens": 24, + "completion_tokens_details": null, + "prompt_tokens_details": null + } + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "chatcmpl_40266680-5422-4e7a-bc40-74eb1efdafbc", + "choices": [ + { + "delta": { + "content": "the ", + "function_call": null, + "refusal": null, + "role": null, + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null + } + ], + "created": 1758326504, + "model": "meta-llama-3.3-70b-instruct-121024", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": null, + "usage": { + "completion_tokens": 5, + "prompt_tokens": 20, + "total_tokens": 25, + "completion_tokens_details": null, + "prompt_tokens_details": null + } + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "chatcmpl_40266680-5422-4e7a-bc40-74eb1efdafbc", + "choices": [ + { + "delta": { + "content": "United ", + "function_call": null, + "refusal": null, + "role": null, + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null + } + ], + "created": 1758326504, + "model": "meta-llama-3.3-70b-instruct-121024", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": null, + "usage": { + "completion_tokens": 6, + "prompt_tokens": 20, + "total_tokens": 26, + "completion_tokens_details": null, + "prompt_tokens_details": null + } + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "chatcmpl_40266680-5422-4e7a-bc40-74eb1efdafbc", + "choices": [ + { + "delta": { + "content": "States ", + "function_call": null, + "refusal": null, + "role": null, + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null + } + ], + "created": 1758326504, + "model": "meta-llama-3.3-70b-instruct-121024", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": null, + "usage": { + "completion_tokens": 7, + "prompt_tokens": 20, + "total_tokens": 27, + "completion_tokens_details": null, + "prompt_tokens_details": null + } + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "chatcmpl_40266680-5422-4e7a-bc40-74eb1efdafbc", + "choices": [ + { + "delta": { + "content": "is ", + "function_call": null, + "refusal": null, + "role": null, + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null + } + ], + "created": 1758326504, + "model": "meta-llama-3.3-70b-instruct-121024", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": null, + "usage": { + "completion_tokens": 8, + "prompt_tokens": 20, + "total_tokens": 28, + "completion_tokens_details": null, + "prompt_tokens_details": null + } + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "chatcmpl_40266680-5422-4e7a-bc40-74eb1efdafbc", + "choices": [ + { + "delta": { + "content": "Washington, ", + "function_call": null, + "refusal": null, + "role": null, + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null + } + ], + "created": 1758326504, + "model": "meta-llama-3.3-70b-instruct-121024", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": null, + "usage": { + "completion_tokens": 10, + "prompt_tokens": 20, + "total_tokens": 30, + "completion_tokens_details": null, + "prompt_tokens_details": null + } + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "chatcmpl_40266680-5422-4e7a-bc40-74eb1efdafbc", + "choices": [ + { + "delta": { + "content": "D.C. ", + "function_call": null, + "refusal": null, + "role": null, + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null + } + ], + "created": 1758326504, + "model": "meta-llama-3.3-70b-instruct-121024", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": null, + "usage": { + "completion_tokens": 13, + "prompt_tokens": 20, + "total_tokens": 33, + "completion_tokens_details": null, + "prompt_tokens_details": null + } + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "chatcmpl_40266680-5422-4e7a-bc40-74eb1efdafbc", + "choices": [ + { + "delta": { + "content": "(short ", + "function_call": null, + "refusal": null, + "role": null, + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null + } + ], + "created": 1758326504, + "model": "meta-llama-3.3-70b-instruct-121024", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": null, + "usage": { + "completion_tokens": 15, + "prompt_tokens": 20, + "total_tokens": 35, + "completion_tokens_details": null, + "prompt_tokens_details": null + } + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "chatcmpl_40266680-5422-4e7a-bc40-74eb1efdafbc", + "choices": [ + { + "delta": { + "content": "for ", + "function_call": null, + "refusal": null, + "role": null, + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null + } + ], + "created": 1758326504, + "model": "meta-llama-3.3-70b-instruct-121024", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": null, + "usage": { + "completion_tokens": 16, + "prompt_tokens": 20, + "total_tokens": 36, + "completion_tokens_details": null, + "prompt_tokens_details": null + } + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "chatcmpl_40266680-5422-4e7a-bc40-74eb1efdafbc", + "choices": [ + { + "delta": { + "content": "District ", + "function_call": null, + "refusal": null, + "role": null, + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null + } + ], + "created": 1758326504, + "model": "meta-llama-3.3-70b-instruct-121024", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": null, + "usage": { + "completion_tokens": 17, + "prompt_tokens": 20, + "total_tokens": 37, + "completion_tokens_details": null, + "prompt_tokens_details": null + } + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "chatcmpl_40266680-5422-4e7a-bc40-74eb1efdafbc", + "choices": [ + { + "delta": { + "content": "of ", + "function_call": null, + "refusal": null, + "role": null, + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null + } + ], + "created": 1758326504, + "model": "meta-llama-3.3-70b-instruct-121024", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": null, + "usage": { + "completion_tokens": 18, + "prompt_tokens": 20, + "total_tokens": 38, + "completion_tokens_details": null, + "prompt_tokens_details": null + } + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "chatcmpl_40266680-5422-4e7a-bc40-74eb1efdafbc", + "choices": [ + { + "delta": { + "content": "Columbia).", + "function_call": null, + "refusal": null, + "role": null, + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null + } + ], + "created": 1758326504, + "model": "meta-llama-3.3-70b-instruct-121024", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": null, + "usage": { + "completion_tokens": 20, + "prompt_tokens": 20, + "total_tokens": 40, + "completion_tokens_details": null, + "prompt_tokens_details": null + } + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "chatcmpl_40266680-5422-4e7a-bc40-74eb1efdafbc", + "choices": [ + { + "delta": { + "content": "", + "function_call": null, + "refusal": null, + "role": null, + "tool_calls": null + }, + "finish_reason": "stop", + "index": 0, + "logprobs": null + } + ], + "created": 1758326504, + "model": "meta-llama-3.3-70b-instruct-121024", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": null, + "usage": { + "completion_tokens": 20, + "prompt_tokens": 20, + "total_tokens": 40, + "completion_tokens_details": null, + "prompt_tokens_details": null + } + } + } + ], + "is_streaming": true + } +} diff --git a/tests/integration/recordings/responses/ffd7b58fded8.json b/tests/integration/recordings/responses/ffd7b58fded8.json new file mode 100644 index 000000000..266830307 --- /dev/null +++ b/tests/integration/recordings/responses/ffd7b58fded8.json @@ -0,0 +1,1061 @@ +{ + "request": { + "method": "POST", + "url": "__databricks__/serving-endpoints/v1/embeddings", + "headers": {}, + "body": { + "model": "databricks-bge-large-en", + "input": "Test encoding format", + "encoding_format": "float" + }, + "endpoint": "/v1/embeddings", + "model": "databricks-bge-large-en" + }, + "response": { + "body": { + "__type__": "openai.types.create_embedding_response.CreateEmbeddingResponse", + "__data__": { + "data": [ + { + "embedding": [ + 0.0045623779296875, + 0.005718231201171875, + 0.032257080078125, + 0.0171661376953125, + -0.00754547119140625, + -0.013214111328125, + 0.0330810546875, + -0.016357421875, + 0.017730712890625, + 0.06915283203125, + 0.00887298583984375, + 0.0199432373046875, + 0.01116180419921875, + -0.046417236328125, + -0.0189361572265625, + -0.0311126708984375, + -0.004650115966796875, + -0.025146484375, + -0.021392822265625, + -0.0162200927734375, + -0.00208282470703125, + -0.010833740234375, + -0.0958251953125, + -0.007083892822265625, + -0.023406982421875, + 0.0030002593994140625, + 0.0154266357421875, + 0.004093170166015625, + 0.05731201171875, + 0.0210723876953125, + -0.0110931396484375, + 0.028839111328125, + 0.0003788471221923828, + -0.053924560546875, + 0.0292205810546875, + -0.032012939453125, + 0.041107177734375, + 0.0083465576171875, + -0.03961181640625, + -0.0218658447265625, + -0.007049560546875, + -0.0296173095703125, + 0.0517578125, + -0.03436279296875, + -0.0841064453125, + -0.03570556640625, + 7.337331771850586e-05, + 0.0462646484375, + -0.044097900390625, + -0.0108642578125, + -0.0008502006530761719, + 0.0187225341796875, + 0.019775390625, + 0.028472900390625, + -0.0252685546875, + -0.02337646484375, + 0.00464630126953125, + -0.0022029876708984375, + -0.0548095703125, + 0.042144775390625, + 0.03924560546875, + 0.0107421875, + 0.047821044921875, + -0.0550537109375, + -0.021759033203125, + -0.018035888671875, + -0.016387939453125, + 0.0186614990234375, + 0.00860595703125, + 0.01812744140625, + 0.019317626953125, + 0.043670654296875, + 0.0152130126953125, + -0.00255584716796875, + -0.042694091796875, + 0.00847625732421875, + -0.01114654541015625, + 0.006252288818359375, + -0.0232696533203125, + 0.054168701171875, + -0.024322509765625, + 0.016143798828125, + 0.0294342041015625, + -0.02679443359375, + -0.051727294921875, + -0.06646728515625, + 0.0298004150390625, + -0.00033164024353027344, + 0.047393798828125, + -0.01078033447265625, + -0.03118896484375, + 0.05731201171875, + -0.064453125, + -0.0006422996520996094, + -0.038055419921875, + 0.0127105712890625, + 0.0303192138671875, + -0.010528564453125, + -0.01029205322265625, + 0.01183319091796875, + 0.04827880859375, + 0.05413818359375, + 0.005893707275390625, + 0.049468994140625, + -0.0110931396484375, + 0.029937744140625, + -0.021728515625, + -0.007904052734375, + -0.040008544921875, + 0.0285491943359375, + -0.00038051605224609375, + -0.007091522216796875, + 0.034027099609375, + -0.0097503662109375, + -0.03533935546875, + 0.020660400390625, + 0.01262664794921875, + 0.002063751220703125, + -0.04937744140625, + -0.0301055908203125, + 0.025146484375, + -0.01358795166015625, + -0.00547027587890625, + -0.045196533203125, + -0.0380859375, + -0.007366180419921875, + -0.01308441162109375, + 0.026123046875, + -0.0201416015625, + -0.0130462646484375, + 0.0307464599609375, + 0.01503753662109375, + 0.0250396728515625, + -0.00676727294921875, + -0.0106964111328125, + 0.01372528076171875, + 0.01100921630859375, + -0.0052642822265625, + -0.0034885406494140625, + -0.013427734375, + -0.007450103759765625, + 0.0062713623046875, + -0.038726806640625, + 0.061279296875, + -0.0030994415283203125, + -0.0293731689453125, + 0.0296478271484375, + -0.040130615234375, + -0.0289459228515625, + 0.0172271728515625, + -0.0242767333984375, + -0.00984954833984375, + 0.02734375, + 0.036285400390625, + -0.050445556640625, + -0.0102386474609375, + -0.0005841255187988281, + 0.0013837814331054688, + -0.005401611328125, + 0.04010009765625, + -0.01593017578125, + 0.03472900390625, + -0.0401611328125, + 0.00841522216796875, + -0.02410888671875, + 0.07244873046875, + -0.0196990966796875, + -0.01120758056640625, + 0.01049041748046875, + -0.03643798828125, + 0.01971435546875, + -0.01277923583984375, + 0.01392364501953125, + 0.006435394287109375, + 0.0248870849609375, + 0.0184173583984375, + 0.0633544921875, + -0.014892578125, + 0.01422119140625, + 0.03338623046875, + -0.004886627197265625, + 0.0303955078125, + 0.005817413330078125, + 0.0221710205078125, + 0.00907135009765625, + 0.01255035400390625, + 0.00919342041015625, + -0.038787841796875, + -0.0377197265625, + 0.00921630859375, + 0.0232696533203125, + 0.01026153564453125, + -0.04864501953125, + 0.00725555419921875, + -0.040802001953125, + 0.0010881423950195312, + -0.02532958984375, + 0.01224517822265625, + -0.0156097412109375, + -0.080810546875, + -0.041015625, + 0.0226287841796875, + -0.0206146240234375, + 0.0014286041259765625, + -0.01232147216796875, + -0.047607421875, + 0.0094146728515625, + 0.0447998046875, + 0.0237579345703125, + -0.0027828216552734375, + 0.03643798828125, + -0.0006814002990722656, + -0.02862548828125, + 0.03326416015625, + 0.0236663818359375, + 0.00537109375, + -0.010650634765625, + 0.056182861328125, + -0.0051422119140625, + 0.04248046875, + 0.01482391357421875, + 0.016876220703125, + 0.047760009765625, + 0.0281524658203125, + 0.02252197265625, + -0.0284423828125, + 0.0131683349609375, + 0.044342041015625, + 0.0233306884765625, + -0.01459503173828125, + 0.0181121826171875, + 0.0224456787109375, + 0.01502227783203125, + 0.019500732421875, + 0.034149169921875, + 0.05859375, + 0.066162109375, + 0.06304931640625, + -0.00803375244140625, + 0.0328369140625, + -0.0016307830810546875, + 0.0224151611328125, + 0.0167694091796875, + 0.053070068359375, + 0.0187225341796875, + -0.0283355712890625, + -0.037933349609375, + -0.0215301513671875, + -0.01288604736328125, + 0.01416778564453125, + 0.006793975830078125, + 0.0252227783203125, + 0.072265625, + 0.01428985595703125, + -0.033843994140625, + -0.0274505615234375, + 0.0268096923828125, + 0.056671142578125, + -0.0494384765625, + -0.00928497314453125, + -0.003665924072265625, + -0.033843994140625, + 0.024200439453125, + -0.0146484375, + 0.0013151168823242188, + -0.005157470703125, + 0.007472991943359375, + -0.032867431640625, + 0.029327392578125, + -0.050048828125, + -0.020294189453125, + -0.03271484375, + -0.046783447265625, + -7.486343383789062e-05, + -0.041229248046875, + -0.004116058349609375, + 0.029754638671875, + -0.0709228515625, + -0.02032470703125, + -0.01824951171875, + 0.0032482147216796875, + -0.0091705322265625, + -0.0230255126953125, + 0.0235137939453125, + 0.004863739013671875, + 0.0389404296875, + -0.035491943359375, + -0.00278472900390625, + -0.00879669189453125, + 0.070556640625, + -0.02642822265625, + 0.01132965087890625, + 0.003208160400390625, + -0.02581787109375, + 0.01201629638671875, + -0.024383544921875, + -0.0379638671875, + 0.0225830078125, + 0.0013370513916015625, + -0.019927978515625, + -0.00830841064453125, + 0.00754547119140625, + -0.03985595703125, + -0.011383056640625, + -0.0123291015625, + -0.0054931640625, + 0.04852294921875, + -0.029022216796875, + 0.0283050537109375, + 0.045257568359375, + -0.0316162109375, + 0.025146484375, + 0.0285797119140625, + 0.0135345458984375, + -0.00942230224609375, + 0.057952880859375, + 0.037628173828125, + 3.2067298889160156e-05, + -0.0333251953125, + 0.003559112548828125, + -0.01468658447265625, + -0.0205078125, + 0.0034084320068359375, + -0.0072784423828125, + -0.00235748291015625, + 0.039154052734375, + -0.030426025390625, + -0.05987548828125, + 0.00841522216796875, + -0.03265380859375, + -0.041595458984375, + -0.00830841064453125, + -0.038299560546875, + 0.059814453125, + 0.038360595703125, + 0.0167999267578125, + -0.037628173828125, + 0.01397705078125, + 0.0287628173828125, + 0.031951904296875, + 0.0450439453125, + -0.02288818359375, + -0.01239776611328125, + 0.0302276611328125, + 0.0261993408203125, + 0.01480865478515625, + 0.0168914794921875, + -0.01084136962890625, + -0.0147552490234375, + -0.01104736328125, + 0.0181732177734375, + -0.0027904510498046875, + -0.0005908012390136719, + 0.0006856918334960938, + 0.0017976760864257812, + 0.0231781005859375, + -0.019805908203125, + 0.042388916015625, + 0.04364013671875, + 0.0027675628662109375, + 0.051116943359375, + 0.03814697265625, + 0.0248260498046875, + 0.01023101806640625, + -0.00536346435546875, + -0.0246124267578125, + -0.01381683349609375, + 0.0548095703125, + 0.01177978515625, + -0.045257568359375, + 0.0016565322875976562, + -0.029754638671875, + -0.0070648193359375, + -0.0043792724609375, + -0.004150390625, + -0.015625, + 0.08990478515625, + -0.00554656982421875, + 0.099365234375, + -0.08331298828125, + -0.0361328125, + -0.00835418701171875, + -0.01305389404296875, + 0.04742431640625, + 0.0291595458984375, + 0.025360107421875, + 0.052459716796875, + -0.0218505859375, + -0.03179931640625, + -0.050079345703125, + -0.0108795166015625, + -0.0007262229919433594, + 0.0210113525390625, + -0.01338958740234375, + -0.08001708984375, + -0.03387451171875, + 0.005092620849609375, + 0.024383544921875, + 0.0411376953125, + 0.0234375, + 0.0165252685546875, + -0.0147705078125, + 0.03826904296875, + 0.01358795166015625, + -0.02838134765625, + -0.006862640380859375, + 0.0001767873764038086, + 0.05078125, + -3.612041473388672e-05, + 0.037628173828125, + -0.039794921875, + 0.0001208186149597168, + -0.037353515625, + 0.014190673828125, + 0.0028057098388671875, + 0.01473236083984375, + 0.0026874542236328125, + 0.03466796875, + 0.060577392578125, + 0.038848876953125, + -0.054840087890625, + 0.017333984375, + -0.009033203125, + 0.01354217529296875, + 0.047088623046875, + -0.0484619140625, + -0.04241943359375, + -0.00551605224609375, + 0.01280975341796875, + 0.04815673828125, + 0.0267486572265625, + -0.038848876953125, + -0.02056884765625, + -0.0369873046875, + -0.030181884765625, + 0.0279083251953125, + 0.029510498046875, + -0.0008144378662109375, + -0.002239227294921875, + -0.019287109375, + 0.0287628173828125, + 0.0023288726806640625, + -0.027618408203125, + 0.039215087890625, + 0.0018749237060546875, + -0.0118560791015625, + 0.06396484375, + 0.032135009765625, + -0.0207061767578125, + -0.06610107421875, + 0.0183868408203125, + -0.0731201171875, + 0.0171966552734375, + -0.0289764404296875, + -0.0027141571044921875, + -0.0240936279296875, + -0.0106201171875, + 0.0279388427734375, + 0.04852294921875, + 0.016387939453125, + -0.0041656494140625, + 0.0115509033203125, + -0.0055999755859375, + -0.049957275390625, + -0.0301055908203125, + 0.04046630859375, + 0.01480865478515625, + -0.0251312255859375, + 0.026092529296875, + -0.04248046875, + 0.0012826919555664062, + 0.0021686553955078125, + 0.01482391357421875, + 0.004878997802734375, + 0.0211029052734375, + -0.039276123046875, + 0.01537322998046875, + -0.0216522216796875, + -0.02294921875, + -0.05987548828125, + -0.00550079345703125, + 0.03314208984375, + -0.005123138427734375, + -0.03985595703125, + 0.0122222900390625, + -0.0232391357421875, + -0.0235748291015625, + -0.01403045654296875, + 0.00440216064453125, + 0.0138092041015625, + 0.02685546875, + -0.00202178955078125, + -0.003665924072265625, + -0.0338134765625, + -0.052886962890625, + 0.01947021484375, + -0.0015516281127929688, + -0.028472900390625, + 0.04022216796875, + 0.052886962890625, + -0.0080413818359375, + -0.0281524658203125, + -0.0254364013671875, + 0.0228424072265625, + 0.0091400146484375, + 0.0175018310546875, + -0.034393310546875, + 0.02618408203125, + 0.019256591796875, + -0.0108795166015625, + -0.01514434814453125, + 0.0173187255859375, + -0.04095458984375, + -0.00974273681640625, + 0.005031585693359375, + -0.0024623870849609375, + -0.019256591796875, + -0.04449462890625, + -0.0289764404296875, + 0.029541015625, + -0.00250244140625, + -0.05609130859375, + -0.0467529296875, + 0.006435394287109375, + 0.0203704833984375, + 0.0535888671875, + 0.0172119140625, + -0.03857421875, + -0.0298309326171875, + -0.03564453125, + 0.015716552734375, + -0.0242767333984375, + 0.00946044921875, + -0.0347900390625, + -0.036529541015625, + -0.055450439453125, + 0.0701904296875, + 0.023284912109375, + -0.0300750732421875, + -0.03619384765625, + -0.046905517578125, + 0.0323486328125, + -0.039398193359375, + 0.001804351806640625, + -0.0173187255859375, + 0.03515625, + -0.0179595947265625, + 0.04534912109375, + -0.0157318115234375, + -0.009307861328125, + 0.0285797119140625, + 0.0350341796875, + -0.0025920867919921875, + 0.022308349609375, + -0.038604736328125, + -0.043121337890625, + 0.04620361328125, + -0.0109710693359375, + -0.03363037109375, + -0.060028076171875, + -0.0521240234375, + 0.0216064453125, + -0.053131103515625, + -0.004299163818359375, + -0.0221099853515625, + -0.002719879150390625, + -0.0031280517578125, + 0.0234832763671875, + 0.007503509521484375, + -0.036468505859375, + 0.006206512451171875, + -0.05859375, + 0.060882568359375, + 0.0206756591796875, + 0.03265380859375, + -0.03216552734375, + -0.000324249267578125, + -0.01195526123046875, + -0.0227508544921875, + 0.03997802734375, + -0.032562255859375, + -0.03533935546875, + -0.0016450881958007812, + -0.021759033203125, + 0.0625, + 0.004505157470703125, + 0.01861572265625, + 0.0911865234375, + -0.0258331298828125, + -0.01873779296875, + -0.01904296875, + 0.0251007080078125, + -0.0054779052734375, + -0.05908203125, + 0.0154876708984375, + 0.010986328125, + -0.042999267578125, + -0.00424957275390625, + -0.01611328125, + -0.0228729248046875, + -0.046173095703125, + 0.01299285888671875, + 0.0740966796875, + -0.0253753662109375, + 0.06494140625, + 0.0077056884765625, + -0.056884765625, + -0.0228118896484375, + 0.01288604736328125, + 0.0018978118896484375, + -0.0255584716796875, + 0.02862548828125, + -0.0004138946533203125, + 0.023681640625, + 0.0687255859375, + -0.05438232421875, + -0.0059051513671875, + 0.004825592041015625, + 0.057891845703125, + 0.0231170654296875, + -0.0108795166015625, + 0.01291656494140625, + 0.01824951171875, + -0.0643310546875, + -0.0465087890625, + -0.01512908935546875, + 0.0025043487548828125, + -0.0255584716796875, + -0.0139007568359375, + -0.0004246234893798828, + 0.01033782958984375, + 0.01084136962890625, + 0.00827789306640625, + 0.01337432861328125, + -0.024932861328125, + 0.03436279296875, + -0.00165557861328125, + -0.01009368896484375, + -0.01104736328125, + 0.00923919677734375, + 0.038330078125, + -0.0545654296875, + 0.037841796875, + -0.045654296875, + -0.02166748046875, + -0.04827880859375, + 0.0274505615234375, + 0.019439697265625, + 0.06573486328125, + 0.032562255859375, + 0.03961181640625, + 0.0010061264038085938, + 0.10302734375, + -0.01001739501953125, + 0.008819580078125, + -0.0105438232421875, + -0.041351318359375, + -0.0504150390625, + -0.0278472900390625, + 0.009124755859375, + 0.0023956298828125, + 0.0011882781982421875, + -0.04632568359375, + 0.02911376953125, + 0.0296478271484375, + -0.0016002655029296875, + 0.0670166015625, + -0.033294677734375, + 0.00479888916015625, + -0.02880859375, + -0.0002942085266113281, + 0.0008320808410644531, + -0.01067352294921875, + -0.020965576171875, + 0.019256591796875, + -0.020172119140625, + -0.0709228515625, + -0.01097869873046875, + 0.0233306884765625, + -0.0018224716186523438, + -0.0133209228515625, + -0.0400390625, + 0.0053558349609375, + 0.018035888671875, + -0.0238800048828125, + -0.001575469970703125, + -0.0615234375, + 0.009552001953125, + 0.01849365234375, + 0.0014886856079101562, + -0.0181732177734375, + -0.00417327880859375, + 0.04052734375, + 0.009063720703125, + 0.009796142578125, + -0.01515960693359375, + -0.01507568359375, + 0.0033111572265625, + -0.031036376953125, + 0.016021728515625, + 0.0264892578125, + 0.032135009765625, + 0.0018596649169921875, + -0.022979736328125, + -0.0278472900390625, + -0.00021076202392578125, + -0.044464111328125, + 0.0278778076171875, + 0.05078125, + -0.00783538818359375, + -0.00374603271484375, + -0.0111541748046875, + -0.0110015869140625, + -0.058807373046875, + 0.0151824951171875, + 0.00042319297790527344, + -0.017486572265625, + 0.044952392578125, + -0.0146484375, + -0.0107574462890625, + 0.046539306640625, + -0.0031185150146484375, + 0.0247955322265625, + -0.039520263671875, + -0.01019287109375, + 0.01393890380859375, + -0.0186767578125, + 0.0030517578125, + -0.00572967529296875, + 0.0276641845703125, + 0.0204925537109375, + -0.002101898193359375, + 0.015838623046875, + 0.0147552490234375, + 0.02105712890625, + -0.072509765625, + -0.042205810546875, + 0.0036258697509765625, + 0.005817413330078125, + 0.036529541015625, + 0.009979248046875, + -0.011260986328125, + -0.03179931640625, + -0.00010073184967041016, + 0.01532745361328125, + -0.0222930908203125, + -0.004119873046875, + -0.033447265625, + -0.040679931640625, + 0.0404052734375, + -0.037872314453125, + 0.01169586181640625, + -0.013916015625, + -0.041473388671875, + -0.001163482666015625, + -0.0073699951171875, + 0.0004177093505859375, + 0.0144500732421875, + 0.0229949951171875, + 0.0199127197265625, + 0.04730224609375, + -0.0408935546875, + 0.0009679794311523438, + 0.0197906494140625, + -0.0003771781921386719, + -0.057373046875, + 0.00334930419921875, + 0.009918212890625, + 0.035491943359375, + 0.0261993408203125, + 0.01050567626953125, + -0.052398681640625, + 0.01149749755859375, + -0.047637939453125, + -0.018951416015625, + 0.0206756591796875, + 0.0162811279296875, + -0.020538330078125, + 0.019287109375, + -0.047607421875, + 0.020294189453125, + 0.02783203125, + 0.0042877197265625, + 0.038970947265625, + -0.00925445556640625, + 0.01374053955078125, + 0.034820556640625, + 0.01418304443359375, + -0.019073486328125, + 0.0133514404296875, + -0.0017557144165039062, + 0.0234222412109375, + 0.044464111328125, + -0.020050048828125, + -0.0272979736328125, + 0.0257415771484375, + 0.0452880859375, + 0.033355712890625, + -0.0243377685546875, + 0.05853271484375, + 0.011749267578125, + -0.028839111328125, + -0.032135009765625, + 0.03631591796875, + 0.031219482421875, + 0.00884246826171875, + -0.006389617919921875, + -0.0206146240234375, + -0.025115966796875, + -0.00982666015625, + -0.0279388427734375, + -0.0104217529296875, + -0.03179931640625, + -0.040008544921875, + -0.017669677734375, + -0.0068511962890625, + 0.05462646484375, + -0.031768798828125, + -0.035369873046875, + -0.0163116455078125, + 0.0169830322265625, + 0.028900146484375, + 0.04638671875, + -0.03118896484375, + -0.003936767578125, + -0.0009298324584960938, + 0.0111236572265625, + 0.01134490966796875, + 0.03179931640625, + -0.0256805419921875, + 0.015625, + -0.04705810546875, + 0.033416748046875, + 0.00556182861328125, + -0.0183868408203125, + 0.00826263427734375, + 0.003082275390625, + -0.04827880859375, + 0.00426483154296875, + 0.0035648345947265625, + -0.01548004150390625, + 0.045379638671875, + -0.042205810546875, + 0.00409698486328125, + -0.0662841796875, + 0.005184173583984375, + -0.043487548828125, + 0.02398681640625, + -0.0020046234130859375, + -0.034637451171875, + 0.016632080078125, + 0.034759521484375, + -0.0283050537109375, + -0.0300750732421875, + 0.0186767578125, + 0.057098388671875, + 0.0123748779296875, + 0.072509765625, + -0.00934600830078125, + -0.040130615234375, + 0.00887298583984375, + 0.01251983642578125, + -0.0232696533203125, + -0.005542755126953125, + -0.004871368408203125, + -0.01358795166015625, + 0.0193634033203125, + -0.0301055908203125, + -0.027618408203125, + 0.01788330078125, + 0.019287109375, + -0.01617431640625, + -0.040435791015625, + 0.00432586669921875, + 0.01448822021484375, + -0.04547119140625, + 0.0235137939453125, + 0.03662109375, + 0.0606689453125, + 0.024688720703125, + -0.0204620361328125, + -0.0369873046875, + -0.00920867919921875, + -0.033538818359375, + -0.050567626953125, + 0.0017223358154296875, + -0.0301055908203125, + -0.01139068603515625, + -0.037567138671875, + -0.004940032958984375, + -0.0150909423828125, + -0.04656982421875, + 0.01102447509765625, + -0.0236053466796875, + 0.000415802001953125, + 0.029083251953125, + 0.0030460357666015625, + 0.02117919921875, + -0.0281219482421875, + -0.005443572998046875, + -0.01180267333984375, + 0.073486328125, + 0.001255035400390625, + 0.057891845703125, + 0.04217529296875, + -0.00998687744140625, + 0.015716552734375, + -0.03643798828125, + 0.00765228271484375, + 0.0200347900390625, + -0.020263671875, + 0.0112457275390625, + 0.010528564453125, + -0.02532958984375, + -0.0303955078125, + -0.00418853759765625, + 0.054107666015625, + -0.0703125, + -0.0185546875, + -0.056976318359375, + -0.0245208740234375, + -0.0221710205078125, + -0.0261383056640625, + -0.037628173828125, + 0.038360595703125, + -0.033050537109375, + -0.0007295608520507812, + -0.0044097900390625, + -0.043914794921875, + 0.2049560546875, + 0.0296783447265625, + 0.039825439453125, + -0.006969451904296875, + 0.017364501953125, + 0.0546875, + -0.0163421630859375, + -0.031707763671875, + -0.03057861328125, + -0.005191802978515625, + 0.034820556640625, + -0.0191650390625, + -5.3882598876953125e-05, + 0.033935546875, + -0.0012979507446289062, + 0.02667236328125, + -0.056610107421875, + -0.027801513671875, + 0.01141357421875, + -0.00223541259765625, + -0.049835205078125, + 0.0016870498657226562, + -0.00138092041015625, + 0.03118896484375, + 0.025238037109375, + -0.01535797119140625, + 0.0743408203125, + 0.0242462158203125, + 0.0235137939453125, + -0.041473388671875, + 0.0350341796875, + 0.0013580322265625, + 0.01250457763671875, + 0.0247650146484375, + -0.00829315185546875, + 0.0233154296875, + -0.022735595703125, + -0.039093017578125, + -0.00594329833984375, + -0.016693115234375, + -0.0021724700927734375, + -0.033172607421875, + 0.0234832763671875, + -0.0285797119140625, + -0.034881591796875, + 0.044464111328125, + 0.0047607421875, + 0.036163330078125, + 0.03411865234375, + 0.0023326873779296875, + 0.022796630859375, + -0.01108551025390625, + 0.04705810546875, + -0.0540771484375, + -0.032470703125, + 0.0148773193359375, + -0.035675048828125, + 0.00919342041015625, + 0.040069580078125, + 0.0131988525390625, + -0.048736572265625, + 0.05609130859375, + -0.0157318115234375, + -0.039031982421875, + -0.05462646484375, + 0.0135498046875, + -0.01078033447265625, + 0.05426025390625, + -0.01316070556640625, + -0.0184326171875, + -0.0252227783203125, + 0.02825927734375, + 0.024139404296875, + -0.00836944580078125, + -0.0002372264862060547, + 0.046630859375, + -0.0166473388671875, + 0.01148223876953125, + -0.0114288330078125, + -0.039459228515625, + 0.01456451416015625, + -0.046478271484375, + 0.02886962890625, + 0.00788116455078125, + 0.00789642333984375, + 0.05322265625, + -0.007289886474609375, + 0.01366424560546875, + -0.03369140625, + 0.040069580078125, + 0.044708251953125, + -0.00591278076171875, + -0.016326904296875, + 0.020965576171875, + -0.0248870849609375 + ], + "index": 0, + "object": "embedding" + } + ], + "model": "bge-large-en-v1.5", + "object": "list", + "usage": { + "prompt_tokens": 5, + "total_tokens": 5 + }, + "id": "f6acf878-03d6-4245-a55e-e01b68ddd8c8" + } + }, + "is_streaming": false + } +} diff --git a/tests/integration/suites.py b/tests/integration/suites.py index 354dc1f4c..f526bae51 100644 --- a/tests/integration/suites.py +++ b/tests/integration/suites.py @@ -108,6 +108,14 @@ SETUP_DEFINITIONS: dict[str, Setup] = { "embedding_model": "together/togethercomputer/m2-bert-80M-32k-retrieval", }, ), + "databricks": Setup( + name="databricks", + description="Databricks models", + defaults={ + "text_model": "databricks/databricks-meta-llama-3-3-70b-instruct", + "embedding_model": "databricks/databricks-bge-large-en", + }, + ), "fireworks": Setup( name="fireworks", description="Fireworks provider with a text model", From ce7a3b4dff728322b12a85bc79795b539b3ecbc0 Mon Sep 17 00:00:00 2001 From: Matthew Farrellee Date: Tue, 23 Sep 2025 16:26:00 -0400 Subject: [PATCH 132/150] feat: update Cerebras inference provider to support dynamic model listing (#3481) # What does this PR do? - update Cerebras to use OpenAIMixin - enable openai completions tests - enable openai chat completions tests - disable with n > 1 tests - add recording for --setup cerebras --subdirs inference --pattern openai ## Test Plan `./scripts/integration-tests.sh --stack-config server:ci-tests --setup cerebras --subdirs inference --pattern openai` ``` tests/integration/inference/test_openai_completion.py::test_openai_completion_non_streaming[txt=cerebras/llama-3.3-70b-inference:completion:sanity] instantiating llama_stack_client Port 8321 is already in use, assuming server is already running... llama_stack_client instantiated in 0.053s PASSED [ 2%] tests/integration/inference/test_openai_completion.py::test_openai_completion_non_streaming_suffix[txt=cerebras/llama-3.3-70b-inference:completion:suffix] SKIPPED (Suffix is not supported for the model: cerebras/llama-3.3-70b.) [ 4%] tests/integration/inference/test_openai_completion.py::test_openai_completion_streaming[txt=cerebras/llama-3.3-70b-inference:completion:sanity] PASSED [ 6%] tests/integration/inference/test_openai_completion.py::test_openai_completion_prompt_logprobs[txt=cerebras/llama-3.3-70b-1] SKIPPED (Model cerebras/llama-3.3-70b hosted by remote::cerebras doesn't support vllm extra_body parameters.) [ 8%] tests/integration/inference/test_openai_completion.py::test_openai_completion_guided_choice[txt=cerebras/llama-3.3-70b] SKIPPED (Model cerebras/llama-3.3-70b hosted by remote::cerebras doesn't support vllm extra_body parameters.) [ 10%] tests/integration/inference/test_openai_completion.py::test_openai_chat_completion_non_streaming[openai_client-txt=cerebras/llama-3.3-70b-inference:chat_completion:non_streaming_01] PASSED [ 12%] tests/integration/inference/test_openai_completion.py::test_openai_chat_completion_streaming[openai_client-txt=cerebras/llama-3.3-70b-inference:chat_completion:streaming_01] PASSED [ 14%] tests/integration/inference/test_openai_completion.py::test_openai_chat_completion_streaming_with_n[openai_client-txt=cerebras/llama-3.3-70b-inference:chat_completion:streaming_01] SKIPPED (Model cerebras/llama-3.3-70b hosted by remote::cere...) [ 17%] tests/integration/inference/test_openai_completion.py::test_inference_store[openai_client-txt=cerebras/llama-3.3-70b-True] PASSED [ 19%] tests/integration/inference/test_openai_completion.py::test_inference_store_tool_calls[openai_client-txt=cerebras/llama-3.3-70b-True] PASSED [ 21%] tests/integration/inference/test_openai_completion.py::test_openai_chat_completion_non_streaming_with_file[txt=cerebras/llama-3.3-70b] SKIPPED (Model cerebras/llama-3.3-70b hosted by remote::cerebras doesn't support chat completion calls wit...) [ 23%] tests/integration/inference/test_openai_embeddings.py::test_openai_embeddings_single_string[openai_client-cerebras/llama-3.3-70b-None-None-None-384] SKIPPED (embedding_model_id empty - skipping test) [ 25%] tests/integration/inference/test_openai_embeddings.py::test_openai_embeddings_multiple_strings[openai_client-cerebras/llama-3.3-70b-None-None-None-384] SKIPPED (embedding_model_id empty - skipping test) [ 27%] tests/integration/inference/test_openai_embeddings.py::test_openai_embeddings_with_encoding_format_float[openai_client-cerebras/llama-3.3-70b-None-None-None-384] SKIPPED (embedding_model_id empty - skipping test) [ 29%] tests/integration/inference/test_openai_embeddings.py::test_openai_embeddings_with_dimensions[openai_client-cerebras/llama-3.3-70b-None-None-None-384] SKIPPED (embedding_model_id empty - skipping test) [ 31%] tests/integration/inference/test_openai_embeddings.py::test_openai_embeddings_with_user_parameter[openai_client-cerebras/llama-3.3-70b-None-None-None-384] SKIPPED (embedding_model_id empty - skipping test) [ 34%] tests/integration/inference/test_openai_embeddings.py::test_openai_embeddings_empty_list_error[openai_client-cerebras/llama-3.3-70b-None-None-None-384] SKIPPED (embedding_model_id empty - skipping test) [ 36%] tests/integration/inference/test_openai_embeddings.py::test_openai_embeddings_invalid_model_error[openai_client-cerebras/llama-3.3-70b-None-None-None-384] SKIPPED (embedding_model_id empty - skipping test) [ 38%] tests/integration/inference/test_openai_embeddings.py::test_openai_embeddings_different_inputs_different_outputs[openai_client-cerebras/llama-3.3-70b-None-None-None-384] SKIPPED (embedding_model_id empty - skipping test) [ 40%] tests/integration/inference/test_openai_embeddings.py::test_openai_embeddings_with_encoding_format_base64[openai_client-cerebras/llama-3.3-70b-None-None-None-384] SKIPPED (embedding_model_id empty - skipping test) [ 42%] tests/integration/inference/test_openai_embeddings.py::test_openai_embeddings_base64_batch_processing[openai_client-cerebras/llama-3.3-70b-None-None-None-384] SKIPPED (embedding_model_id empty - skipping test) [ 44%] tests/integration/inference/test_openai_completion.py::test_openai_completion_prompt_logprobs[txt=cerebras/llama-3.3-70b-0] SKIPPED (Model cerebras/llama-3.3-70b hosted by remote::cerebras doesn't support vllm extra_body parameters.) [ 46%] tests/integration/inference/test_openai_completion.py::test_openai_chat_completion_non_streaming[openai_client-txt=cerebras/llama-3.3-70b-inference:chat_completion:non_streaming_02] PASSED [ 48%] tests/integration/inference/test_openai_completion.py::test_openai_chat_completion_streaming[openai_client-txt=cerebras/llama-3.3-70b-inference:chat_completion:streaming_02] PASSED [ 51%] tests/integration/inference/test_openai_completion.py::test_openai_chat_completion_streaming_with_n[openai_client-txt=cerebras/llama-3.3-70b-inference:chat_completion:streaming_02] SKIPPED (Model cerebras/llama-3.3-70b hosted by remote::cere...) [ 53%] tests/integration/inference/test_openai_completion.py::test_inference_store[openai_client-txt=cerebras/llama-3.3-70b-False] PASSED [ 55%] tests/integration/inference/test_openai_completion.py::test_inference_store_tool_calls[openai_client-txt=cerebras/llama-3.3-70b-False] PASSED [ 57%] tests/integration/inference/test_openai_embeddings.py::test_openai_embeddings_single_string[llama_stack_client-cerebras/llama-3.3-70b-None-None-None-384] SKIPPED (embedding_model_id empty - skipping test) [ 59%] tests/integration/inference/test_openai_embeddings.py::test_openai_embeddings_multiple_strings[llama_stack_client-cerebras/llama-3.3-70b-None-None-None-384] SKIPPED (embedding_model_id empty - skipping test) [ 61%] tests/integration/inference/test_openai_embeddings.py::test_openai_embeddings_with_encoding_format_float[llama_stack_client-cerebras/llama-3.3-70b-None-None-None-384] SKIPPED (embedding_model_id empty - skipping test) [ 63%] tests/integration/inference/test_openai_embeddings.py::test_openai_embeddings_with_dimensions[llama_stack_client-cerebras/llama-3.3-70b-None-None-None-384] SKIPPED (embedding_model_id empty - skipping test) [ 65%] tests/integration/inference/test_openai_embeddings.py::test_openai_embeddings_with_user_parameter[llama_stack_client-cerebras/llama-3.3-70b-None-None-None-384] SKIPPED (embedding_model_id empty - skipping test) [ 68%] tests/integration/inference/test_openai_embeddings.py::test_openai_embeddings_empty_list_error[llama_stack_client-cerebras/llama-3.3-70b-None-None-None-384] SKIPPED (embedding_model_id empty - skipping test) [ 70%] tests/integration/inference/test_openai_embeddings.py::test_openai_embeddings_invalid_model_error[llama_stack_client-cerebras/llama-3.3-70b-None-None-None-384] SKIPPED (embedding_model_id empty - skipping test) [ 72%] tests/integration/inference/test_openai_embeddings.py::test_openai_embeddings_different_inputs_different_outputs[llama_stack_client-cerebras/llama-3.3-70b-None-None-None-384] SKIPPED (embedding_model_id empty - skipping test) [ 74%] tests/integration/inference/test_openai_embeddings.py::test_openai_embeddings_with_encoding_format_base64[llama_stack_client-cerebras/llama-3.3-70b-None-None-None-384] SKIPPED (embedding_model_id empty - skipping test) [ 76%] tests/integration/inference/test_openai_embeddings.py::test_openai_embeddings_base64_batch_processing[llama_stack_client-cerebras/llama-3.3-70b-None-None-None-384] SKIPPED (embedding_model_id empty - skipping test) [ 78%] tests/integration/inference/test_openai_completion.py::test_openai_chat_completion_non_streaming[client_with_models-txt=cerebras/llama-3.3-70b-inference:chat_completion:non_streaming_01] PASSED [ 80%] tests/integration/inference/test_openai_completion.py::test_openai_chat_completion_streaming[client_with_models-txt=cerebras/llama-3.3-70b-inference:chat_completion:streaming_01] PASSED [ 82%] tests/integration/inference/test_openai_completion.py::test_openai_chat_completion_streaming_with_n[client_with_models-txt=cerebras/llama-3.3-70b-inference:chat_completion:streaming_01] SKIPPED (Model cerebras/llama-3.3-70b hosted by remote:...) [ 85%] tests/integration/inference/test_openai_completion.py::test_inference_store[client_with_models-txt=cerebras/llama-3.3-70b-True] PASSED [ 87%] tests/integration/inference/test_openai_completion.py::test_inference_store_tool_calls[client_with_models-txt=cerebras/llama-3.3-70b-True] PASSED [ 89%] tests/integration/inference/test_openai_completion.py::test_openai_chat_completion_non_streaming[client_with_models-txt=cerebras/llama-3.3-70b-inference:chat_completion:non_streaming_02] PASSED [ 91%] tests/integration/inference/test_openai_completion.py::test_openai_chat_completion_streaming[client_with_models-txt=cerebras/llama-3.3-70b-inference:chat_completion:streaming_02] PASSED [ 93%] tests/integration/inference/test_openai_completion.py::test_openai_chat_completion_streaming_with_n[client_with_models-txt=cerebras/llama-3.3-70b-inference:chat_completion:streaming_02] SKIPPED (Model cerebras/llama-3.3-70b hosted by remote:...) [ 95%] tests/integration/inference/test_openai_completion.py::test_inference_store[client_with_models-txt=cerebras/llama-3.3-70b-False] PASSED [ 97%] tests/integration/inference/test_openai_completion.py::test_inference_store_tool_calls[client_with_models-txt=cerebras/llama-3.3-70b-False] PASSED [100%] =================================================================================================================== slowest 10 durations ==================================================================================================================== 0.37s call tests/integration/inference/test_openai_completion.py::test_openai_chat_completion_non_streaming[openai_client-txt=cerebras/llama-3.3-70b-inference:chat_completion:non_streaming_01] 0.34s call tests/integration/inference/test_openai_completion.py::test_inference_store[openai_client-txt=cerebras/llama-3.3-70b-False] 0.18s call tests/integration/inference/test_openai_completion.py::test_inference_store[client_with_models-txt=cerebras/llama-3.3-70b-True] 0.17s setup tests/integration/inference/test_openai_completion.py::test_openai_completion_non_streaming[txt=cerebras/llama-3.3-70b-inference:completion:sanity] 0.15s call tests/integration/inference/test_openai_completion.py::test_inference_store_tool_calls[client_with_models-txt=cerebras/llama-3.3-70b-True] 0.13s call tests/integration/inference/test_openai_completion.py::test_inference_store_tool_calls[openai_client-txt=cerebras/llama-3.3-70b-True] 0.12s call tests/integration/inference/test_openai_completion.py::test_inference_store_tool_calls[client_with_models-txt=cerebras/llama-3.3-70b-False] 0.12s call tests/integration/inference/test_openai_completion.py::test_inference_store[openai_client-txt=cerebras/llama-3.3-70b-True] 0.12s call tests/integration/inference/test_openai_completion.py::test_inference_store_tool_calls[openai_client-txt=cerebras/llama-3.3-70b-False] 0.08s call tests/integration/inference/test_openai_completion.py::test_openai_chat_completion_streaming[client_with_models-txt=cerebras/llama-3.3-70b-inference:chat_completion:streaming_02] ================================================================================================================== short test summary info ================================================================================================================== SKIPPED [1] tests/integration/inference/test_openai_completion.py:75: Suffix is not supported for the model: cerebras/llama-3.3-70b. SKIPPED [3] tests/integration/inference/test_openai_completion.py:123: Model cerebras/llama-3.3-70b hosted by remote::cerebras doesn't support vllm extra_body parameters. SKIPPED [4] tests/integration/inference/test_openai_completion.py:103: Model cerebras/llama-3.3-70b hosted by remote::cerebras doesn't support n param. SKIPPED [1] tests/integration/inference/test_openai_completion.py:129: Model cerebras/llama-3.3-70b hosted by remote::cerebras doesn't support chat completion calls with base64 encoded files. SKIPPED [2] tests/integration/inference/test_openai_embeddings.py:90: embedding_model_id empty - skipping test SKIPPED [2] tests/integration/inference/test_openai_embeddings.py:112: embedding_model_id empty - skipping test SKIPPED [2] tests/integration/inference/test_openai_embeddings.py:136: embedding_model_id empty - skipping test SKIPPED [2] tests/integration/inference/test_openai_embeddings.py:154: embedding_model_id empty - skipping test SKIPPED [2] tests/integration/inference/test_openai_embeddings.py:175: embedding_model_id empty - skipping test SKIPPED [2] tests/integration/inference/test_openai_embeddings.py:195: embedding_model_id empty - skipping test SKIPPED [2] tests/integration/inference/test_openai_embeddings.py:206: embedding_model_id empty - skipping test SKIPPED [2] tests/integration/inference/test_openai_embeddings.py:217: embedding_model_id empty - skipping test SKIPPED [2] tests/integration/inference/test_openai_embeddings.py:244: embedding_model_id empty - skipping test SKIPPED [2] tests/integration/inference/test_openai_embeddings.py:278: embedding_model_id empty - skipping test ================================================================================================= 18 passed, 29 skipped, 50 deselected, 4 warnings in 3.02s ================================================================================================= ``` --- .../providers/inference/remote_cerebras.md | 2 +- .../remote/inference/cerebras/cerebras.py | 23 +- .../remote/inference/cerebras/config.py | 4 +- .../inference/test_openai_completion.py | 4 +- .../recordings/responses/0547d0909f24.json | 53 + .../recordings/responses/0648374e43e7.json | 146 +++ .../recordings/responses/0d3290adae1d.json | 93 ++ .../recordings/responses/2983cc1d79f0.json | 742 ++++++++++++ .../recordings/responses/3cdb5cab6ce6.json | 66 ++ .../recordings/responses/50a8dc5b8ece.json | 612 ++++++++++ .../recordings/responses/a1c5bf09ea53.json | 66 ++ .../recordings/responses/af6ca03dcbc3.json | 1025 +++++++++++++++++ .../recordings/responses/b459f403a5ae.json | 66 ++ .../recordings/responses/eefb4206a4a9.json | 378 ++++++ .../models-bd032f995f2a-af43cc69.json | 96 ++ tests/integration/suites.py | 7 + 16 files changed, 3370 insertions(+), 13 deletions(-) create mode 100644 tests/integration/recordings/responses/0547d0909f24.json create mode 100644 tests/integration/recordings/responses/0648374e43e7.json create mode 100644 tests/integration/recordings/responses/0d3290adae1d.json create mode 100644 tests/integration/recordings/responses/2983cc1d79f0.json create mode 100644 tests/integration/recordings/responses/3cdb5cab6ce6.json create mode 100644 tests/integration/recordings/responses/50a8dc5b8ece.json create mode 100644 tests/integration/recordings/responses/a1c5bf09ea53.json create mode 100644 tests/integration/recordings/responses/af6ca03dcbc3.json create mode 100644 tests/integration/recordings/responses/b459f403a5ae.json create mode 100644 tests/integration/recordings/responses/eefb4206a4a9.json create mode 100644 tests/integration/recordings/responses/models-bd032f995f2a-af43cc69.json diff --git a/docs/source/providers/inference/remote_cerebras.md b/docs/source/providers/inference/remote_cerebras.md index 7aa03dd0b..3bd3dda25 100644 --- a/docs/source/providers/inference/remote_cerebras.md +++ b/docs/source/providers/inference/remote_cerebras.md @@ -9,7 +9,7 @@ Cerebras inference provider for running models on Cerebras Cloud platform. | Field | Type | Required | Default | Description | |-------|------|----------|---------|-------------| | `base_url` | `` | No | https://api.cerebras.ai | Base URL for the Cerebras API | -| `api_key` | `pydantic.types.SecretStr \| None` | No | | Cerebras API Key | +| `api_key` | `` | No | | Cerebras API Key | ## Sample Configuration diff --git a/llama_stack/providers/remote/inference/cerebras/cerebras.py b/llama_stack/providers/remote/inference/cerebras/cerebras.py index 5e07c49ee..6947dbc87 100644 --- a/llama_stack/providers/remote/inference/cerebras/cerebras.py +++ b/llama_stack/providers/remote/inference/cerebras/cerebras.py @@ -5,6 +5,7 @@ # the root directory of this source tree. from collections.abc import AsyncGenerator +from urllib.parse import urljoin from cerebras.cloud.sdk import AsyncCerebras @@ -35,14 +36,13 @@ from llama_stack.providers.utils.inference.model_registry import ( ModelRegistryHelper, ) from llama_stack.providers.utils.inference.openai_compat import ( - OpenAIChatCompletionToLlamaStackMixin, - OpenAICompletionToLlamaStackMixin, get_sampling_options, process_chat_completion_response, process_chat_completion_stream_response, process_completion_response, process_completion_stream_response, ) +from llama_stack.providers.utils.inference.openai_mixin import OpenAIMixin from llama_stack.providers.utils.inference.prompt_adapter import ( chat_completion_request_to_prompt, completion_request_to_prompt, @@ -53,10 +53,9 @@ from .models import MODEL_ENTRIES class CerebrasInferenceAdapter( + OpenAIMixin, ModelRegistryHelper, Inference, - OpenAIChatCompletionToLlamaStackMixin, - OpenAICompletionToLlamaStackMixin, ): def __init__(self, config: CerebrasImplConfig) -> None: ModelRegistryHelper.__init__( @@ -66,11 +65,17 @@ class CerebrasInferenceAdapter( self.config = config # TODO: make this use provider data, etc. like other providers - self.client = AsyncCerebras( + self._cerebras_client = AsyncCerebras( base_url=self.config.base_url, api_key=self.config.api_key.get_secret_value(), ) + def get_api_key(self) -> str: + return self.config.api_key.get_secret_value() + + def get_base_url(self) -> str: + return urljoin(self.config.base_url, "v1") + async def initialize(self) -> None: return @@ -107,14 +112,14 @@ class CerebrasInferenceAdapter( async def _nonstream_completion(self, request: CompletionRequest) -> CompletionResponse: params = await self._get_params(request) - r = await self.client.completions.create(**params) + r = await self._cerebras_client.completions.create(**params) return process_completion_response(r) async def _stream_completion(self, request: CompletionRequest) -> AsyncGenerator: params = await self._get_params(request) - stream = await self.client.completions.create(**params) + stream = await self._cerebras_client.completions.create(**params) async for chunk in process_completion_stream_response(stream): yield chunk @@ -156,14 +161,14 @@ class CerebrasInferenceAdapter( async def _nonstream_chat_completion(self, request: CompletionRequest) -> CompletionResponse: params = await self._get_params(request) - r = await self.client.completions.create(**params) + r = await self._cerebras_client.completions.create(**params) return process_chat_completion_response(r, request) async def _stream_chat_completion(self, request: CompletionRequest) -> AsyncGenerator: params = await self._get_params(request) - stream = await self.client.completions.create(**params) + stream = await self._cerebras_client.completions.create(**params) async for chunk in process_chat_completion_stream_response(stream, request): yield chunk diff --git a/llama_stack/providers/remote/inference/cerebras/config.py b/llama_stack/providers/remote/inference/cerebras/config.py index 699f6a1ef..519bd9119 100644 --- a/llama_stack/providers/remote/inference/cerebras/config.py +++ b/llama_stack/providers/remote/inference/cerebras/config.py @@ -20,8 +20,8 @@ class CerebrasImplConfig(BaseModel): default=os.environ.get("CEREBRAS_BASE_URL", DEFAULT_BASE_URL), description="Base URL for the Cerebras API", ) - api_key: SecretStr | None = Field( - default=os.environ.get("CEREBRAS_API_KEY"), + api_key: SecretStr = Field( + default=SecretStr(os.environ.get("CEREBRAS_API_KEY")), description="Cerebras API Key", ) diff --git a/tests/integration/inference/test_openai_completion.py b/tests/integration/inference/test_openai_completion.py index 8ca3860c3..931c144af 100644 --- a/tests/integration/inference/test_openai_completion.py +++ b/tests/integration/inference/test_openai_completion.py @@ -40,7 +40,6 @@ def skip_if_model_doesnt_support_openai_completion(client_with_models, model_id) "inline::sentence-transformers", "inline::vllm", "remote::bedrock", - "remote::cerebras", "remote::databricks", # Technically Nvidia does support OpenAI completions, but none of their hosted models # support both completions and chat completions endpoint and all the Llama models are @@ -98,6 +97,8 @@ def skip_if_doesnt_support_n(client_with_models, model_id): # the entered value was 2. Update the candidateCount value and try again.', 'status': 'INVALID_ARGUMENT'} "remote::tgi", # TGI ignores n param silently "remote::together", # `n` > 1 is not supported when streaming tokens. Please disable `stream` + # Error code 400 - {'message': '"n" > 1 is not currently supported', 'type': 'invalid_request_error', 'param': 'n', 'code': 'wrong_api_format'} + "remote::cerebras", "remote::databricks", # Bad request: parameter "n" must be equal to 1 for streaming mode ): pytest.skip(f"Model {model_id} hosted by {provider.provider_type} doesn't support n param.") @@ -110,6 +111,7 @@ def skip_if_model_doesnt_support_openai_chat_completion(client_with_models, mode "inline::sentence-transformers", "inline::vllm", "remote::bedrock", + "remote::databricks", "remote::cerebras", "remote::runpod", "remote::watsonx", # watsonx returns 404 when hitting the /openai/v1 endpoint diff --git a/tests/integration/recordings/responses/0547d0909f24.json b/tests/integration/recordings/responses/0547d0909f24.json new file mode 100644 index 000000000..a44e2f9dd --- /dev/null +++ b/tests/integration/recordings/responses/0547d0909f24.json @@ -0,0 +1,53 @@ +{ + "request": { + "method": "POST", + "url": "https://api.cerebras.ai/v1/v1/completions", + "headers": {}, + "body": { + "model": "llama-3.3-70b", + "prompt": "Respond to this question and explain your answer. Complete the sentence using one word: Roses are red, violets are ", + "stream": false, + "extra_body": {} + }, + "endpoint": "/v1/completions", + "model": "llama-3.3-70b" + }, + "response": { + "body": { + "__type__": "openai.types.completion.Completion", + "__data__": { + "id": "chatcmpl-6438a448-bbbd-4da1-af88-19390676b0e9", + "choices": [ + { + "finish_reason": "stop", + "index": 0, + "logprobs": null, + "text": " blue, sugar is white, but my heart is ________________________.\nA) black\nB) pink\nC) blank\nD) broken\nMy answer is D) broken. This is because the traditional romantic poem has a positive tone until it comes to the heart, which represents the speaker's emotional state. The word \"broken\" shows that the speaker is hurting, which adds a element of sadness to the poem. This is a typical way to express sorrow or longing in poetry.\nThe best answer is D.<|eot_id|>" + } + ], + "created": 1758191351, + "model": "llama-3.3-70b", + "object": "text_completion", + "system_fingerprint": "fp_c5ec625e72d41732d8fd", + "usage": { + "completion_tokens": 105, + "prompt_tokens": 26, + "total_tokens": 131, + "completion_tokens_details": null, + "prompt_tokens_details": { + "audio_tokens": null, + "cached_tokens": 0 + } + }, + "time_info": { + "queue_time": 0.00016155, + "prompt_time": 0.001595551, + "completion_time": 0.107480394, + "total_time": 0.11038637161254883, + "created": 1758191351 + } + } + }, + "is_streaming": false + } +} diff --git a/tests/integration/recordings/responses/0648374e43e7.json b/tests/integration/recordings/responses/0648374e43e7.json new file mode 100644 index 000000000..96e4966ca --- /dev/null +++ b/tests/integration/recordings/responses/0648374e43e7.json @@ -0,0 +1,146 @@ +{ + "request": { + "method": "POST", + "url": "https://api.cerebras.ai/v1/v1/chat/completions", + "headers": {}, + "body": { + "model": "llama-3.3-70b", + "messages": [ + { + "role": "user", + "content": "What's the weather in Tokyo? Use the get_weather function to get the weather." + } + ], + "stream": true, + "tools": [ + { + "type": "function", + "function": { + "name": "get_weather", + "description": "Get the weather in a given city", + "parameters": { + "type": "object", + "properties": { + "city": { + "type": "string", + "description": "The city to get the weather for" + } + } + } + } + } + ] + }, + "endpoint": "/v1/chat/completions", + "model": "llama-3.3-70b" + }, + "response": { + "body": [ + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "chatcmpl-8b6a9499-1a5f-46dc-96b7-3d2b71eecd99", + "choices": [ + { + "delta": { + "content": null, + "function_call": null, + "refusal": null, + "role": "assistant", + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null + } + ], + "created": 1758191362, + "model": "llama-3.3-70b", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": "fp_c5ec625e72d41732d8fd", + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "chatcmpl-8b6a9499-1a5f-46dc-96b7-3d2b71eecd99", + "choices": [ + { + "delta": { + "content": null, + "function_call": null, + "refusal": null, + "role": null, + "tool_calls": [ + { + "index": 0, + "id": "439c86fe5", + "function": { + "arguments": "{\"city\": \"Tokyo\"}", + "name": "get_weather" + }, + "type": "function" + } + ] + }, + "finish_reason": null, + "index": 0, + "logprobs": null + } + ], + "created": 1758191362, + "model": "llama-3.3-70b", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": "fp_c5ec625e72d41732d8fd", + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "chatcmpl-8b6a9499-1a5f-46dc-96b7-3d2b71eecd99", + "choices": [ + { + "delta": { + "content": null, + "function_call": null, + "refusal": null, + "role": null, + "tool_calls": null + }, + "finish_reason": "tool_calls", + "index": 0, + "logprobs": null + } + ], + "created": 1758191362, + "model": "llama-3.3-70b", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": "fp_c5ec625e72d41732d8fd", + "usage": { + "completion_tokens": 12, + "prompt_tokens": 248, + "total_tokens": 260, + "completion_tokens_details": null, + "prompt_tokens_details": { + "audio_tokens": null, + "cached_tokens": 0 + } + }, + "time_info": { + "queue_time": 0.00016941, + "prompt_time": 0.007276727, + "completion_time": 0.00388514, + "total_time": 0.013146162033081055, + "created": 1758191362 + } + } + } + ], + "is_streaming": true + } +} diff --git a/tests/integration/recordings/responses/0d3290adae1d.json b/tests/integration/recordings/responses/0d3290adae1d.json new file mode 100644 index 000000000..b428c7ec5 --- /dev/null +++ b/tests/integration/recordings/responses/0d3290adae1d.json @@ -0,0 +1,93 @@ +{ + "request": { + "method": "POST", + "url": "https://api.cerebras.ai/v1/v1/chat/completions", + "headers": {}, + "body": { + "model": "llama-3.3-70b", + "messages": [ + { + "role": "user", + "content": "What's the weather in Tokyo? Use the get_weather function to get the weather." + } + ], + "stream": false, + "tools": [ + { + "type": "function", + "function": { + "name": "get_weather", + "description": "Get the weather in a given city", + "parameters": { + "type": "object", + "properties": { + "city": { + "type": "string", + "description": "The city to get the weather for" + } + } + } + } + } + ] + }, + "endpoint": "/v1/chat/completions", + "model": "llama-3.3-70b" + }, + "response": { + "body": { + "__type__": "openai.types.chat.chat_completion.ChatCompletion", + "__data__": { + "id": "chatcmpl-6228def9-c13d-4d7a-9029-e2c638a16f1b", + "choices": [ + { + "finish_reason": "tool_calls", + "index": 0, + "logprobs": null, + "message": { + "content": null, + "refusal": null, + "role": "assistant", + "annotations": null, + "audio": null, + "function_call": null, + "tool_calls": [ + { + "id": "1c40cbc30", + "function": { + "arguments": "{\"city\": \"Tokyo\"}", + "name": "get_weather" + }, + "type": "function" + } + ] + } + } + ], + "created": 1758191364, + "model": "llama-3.3-70b", + "object": "chat.completion", + "service_tier": null, + "system_fingerprint": "fp_c5ec625e72d41732d8fd", + "usage": { + "completion_tokens": 12, + "prompt_tokens": 248, + "total_tokens": 260, + "completion_tokens_details": null, + "prompt_tokens_details": { + "audio_tokens": null, + "cached_tokens": 0 + } + }, + "time_info": { + "queue_time": 0.00041449, + "prompt_time": 0.007237483, + "completion_time": 0.003803105, + "total_time": 0.013348102569580078, + "created": 1758191364 + } + } + }, + "is_streaming": false + } +} diff --git a/tests/integration/recordings/responses/2983cc1d79f0.json b/tests/integration/recordings/responses/2983cc1d79f0.json new file mode 100644 index 000000000..c7a5e90ef --- /dev/null +++ b/tests/integration/recordings/responses/2983cc1d79f0.json @@ -0,0 +1,742 @@ +{ + "request": { + "method": "POST", + "url": "https://api.cerebras.ai/v1/v1/chat/completions", + "headers": {}, + "body": { + "model": "llama-3.3-70b", + "messages": [ + { + "role": "user", + "content": "Hello, world!" + } + ], + "stream": true + }, + "endpoint": "/v1/chat/completions", + "model": "llama-3.3-70b" + }, + "response": { + "body": [ + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "chatcmpl-de2bf7d0-0f5d-4f44-977c-209ab8ffa29d", + "choices": [ + { + "delta": { + "content": null, + "function_call": null, + "refusal": null, + "role": "assistant", + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null + } + ], + "created": 1758191361, + "model": "llama-3.3-70b", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": "fp_c5ec625e72d41732d8fd", + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "chatcmpl-de2bf7d0-0f5d-4f44-977c-209ab8ffa29d", + "choices": [ + { + "delta": { + "content": "Hello", + "function_call": null, + "refusal": null, + "role": null, + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null + } + ], + "created": 1758191361, + "model": "llama-3.3-70b", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": "fp_c5ec625e72d41732d8fd", + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "chatcmpl-de2bf7d0-0f5d-4f44-977c-209ab8ffa29d", + "choices": [ + { + "delta": { + "content": "!", + "function_call": null, + "refusal": null, + "role": null, + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null + } + ], + "created": 1758191361, + "model": "llama-3.3-70b", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": "fp_c5ec625e72d41732d8fd", + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "chatcmpl-de2bf7d0-0f5d-4f44-977c-209ab8ffa29d", + "choices": [ + { + "delta": { + "content": " It", + "function_call": null, + "refusal": null, + "role": null, + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null + } + ], + "created": 1758191361, + "model": "llama-3.3-70b", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": "fp_c5ec625e72d41732d8fd", + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "chatcmpl-de2bf7d0-0f5d-4f44-977c-209ab8ffa29d", + "choices": [ + { + "delta": { + "content": "'s", + "function_call": null, + "refusal": null, + "role": null, + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null + } + ], + "created": 1758191361, + "model": "llama-3.3-70b", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": "fp_c5ec625e72d41732d8fd", + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "chatcmpl-de2bf7d0-0f5d-4f44-977c-209ab8ffa29d", + "choices": [ + { + "delta": { + "content": " nice", + "function_call": null, + "refusal": null, + "role": null, + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null + } + ], + "created": 1758191361, + "model": "llama-3.3-70b", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": "fp_c5ec625e72d41732d8fd", + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "chatcmpl-de2bf7d0-0f5d-4f44-977c-209ab8ffa29d", + "choices": [ + { + "delta": { + "content": " to", + "function_call": null, + "refusal": null, + "role": null, + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null + } + ], + "created": 1758191361, + "model": "llama-3.3-70b", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": "fp_c5ec625e72d41732d8fd", + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "chatcmpl-de2bf7d0-0f5d-4f44-977c-209ab8ffa29d", + "choices": [ + { + "delta": { + "content": " meet", + "function_call": null, + "refusal": null, + "role": null, + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null + } + ], + "created": 1758191361, + "model": "llama-3.3-70b", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": "fp_c5ec625e72d41732d8fd", + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "chatcmpl-de2bf7d0-0f5d-4f44-977c-209ab8ffa29d", + "choices": [ + { + "delta": { + "content": " you", + "function_call": null, + "refusal": null, + "role": null, + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null + } + ], + "created": 1758191361, + "model": "llama-3.3-70b", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": "fp_c5ec625e72d41732d8fd", + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "chatcmpl-de2bf7d0-0f5d-4f44-977c-209ab8ffa29d", + "choices": [ + { + "delta": { + "content": ".", + "function_call": null, + "refusal": null, + "role": null, + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null + } + ], + "created": 1758191361, + "model": "llama-3.3-70b", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": "fp_c5ec625e72d41732d8fd", + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "chatcmpl-de2bf7d0-0f5d-4f44-977c-209ab8ffa29d", + "choices": [ + { + "delta": { + "content": " Is", + "function_call": null, + "refusal": null, + "role": null, + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null + } + ], + "created": 1758191361, + "model": "llama-3.3-70b", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": "fp_c5ec625e72d41732d8fd", + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "chatcmpl-de2bf7d0-0f5d-4f44-977c-209ab8ffa29d", + "choices": [ + { + "delta": { + "content": " there", + "function_call": null, + "refusal": null, + "role": null, + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null + } + ], + "created": 1758191361, + "model": "llama-3.3-70b", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": "fp_c5ec625e72d41732d8fd", + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "chatcmpl-de2bf7d0-0f5d-4f44-977c-209ab8ffa29d", + "choices": [ + { + "delta": { + "content": " something", + "function_call": null, + "refusal": null, + "role": null, + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null + } + ], + "created": 1758191361, + "model": "llama-3.3-70b", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": "fp_c5ec625e72d41732d8fd", + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "chatcmpl-de2bf7d0-0f5d-4f44-977c-209ab8ffa29d", + "choices": [ + { + "delta": { + "content": " I", + "function_call": null, + "refusal": null, + "role": null, + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null + } + ], + "created": 1758191361, + "model": "llama-3.3-70b", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": "fp_c5ec625e72d41732d8fd", + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "chatcmpl-de2bf7d0-0f5d-4f44-977c-209ab8ffa29d", + "choices": [ + { + "delta": { + "content": " can", + "function_call": null, + "refusal": null, + "role": null, + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null + } + ], + "created": 1758191361, + "model": "llama-3.3-70b", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": "fp_c5ec625e72d41732d8fd", + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "chatcmpl-de2bf7d0-0f5d-4f44-977c-209ab8ffa29d", + "choices": [ + { + "delta": { + "content": " help", + "function_call": null, + "refusal": null, + "role": null, + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null + } + ], + "created": 1758191361, + "model": "llama-3.3-70b", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": "fp_c5ec625e72d41732d8fd", + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "chatcmpl-de2bf7d0-0f5d-4f44-977c-209ab8ffa29d", + "choices": [ + { + "delta": { + "content": " you", + "function_call": null, + "refusal": null, + "role": null, + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null + } + ], + "created": 1758191361, + "model": "llama-3.3-70b", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": "fp_c5ec625e72d41732d8fd", + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "chatcmpl-de2bf7d0-0f5d-4f44-977c-209ab8ffa29d", + "choices": [ + { + "delta": { + "content": " with", + "function_call": null, + "refusal": null, + "role": null, + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null + } + ], + "created": 1758191361, + "model": "llama-3.3-70b", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": "fp_c5ec625e72d41732d8fd", + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "chatcmpl-de2bf7d0-0f5d-4f44-977c-209ab8ffa29d", + "choices": [ + { + "delta": { + "content": " or", + "function_call": null, + "refusal": null, + "role": null, + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null + } + ], + "created": 1758191361, + "model": "llama-3.3-70b", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": "fp_c5ec625e72d41732d8fd", + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "chatcmpl-de2bf7d0-0f5d-4f44-977c-209ab8ffa29d", + "choices": [ + { + "delta": { + "content": " would", + "function_call": null, + "refusal": null, + "role": null, + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null + } + ], + "created": 1758191361, + "model": "llama-3.3-70b", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": "fp_c5ec625e72d41732d8fd", + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "chatcmpl-de2bf7d0-0f5d-4f44-977c-209ab8ffa29d", + "choices": [ + { + "delta": { + "content": " you", + "function_call": null, + "refusal": null, + "role": null, + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null + } + ], + "created": 1758191361, + "model": "llama-3.3-70b", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": "fp_c5ec625e72d41732d8fd", + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "chatcmpl-de2bf7d0-0f5d-4f44-977c-209ab8ffa29d", + "choices": [ + { + "delta": { + "content": " like", + "function_call": null, + "refusal": null, + "role": null, + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null + } + ], + "created": 1758191361, + "model": "llama-3.3-70b", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": "fp_c5ec625e72d41732d8fd", + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "chatcmpl-de2bf7d0-0f5d-4f44-977c-209ab8ffa29d", + "choices": [ + { + "delta": { + "content": " to", + "function_call": null, + "refusal": null, + "role": null, + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null + } + ], + "created": 1758191361, + "model": "llama-3.3-70b", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": "fp_c5ec625e72d41732d8fd", + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "chatcmpl-de2bf7d0-0f5d-4f44-977c-209ab8ffa29d", + "choices": [ + { + "delta": { + "content": " chat", + "function_call": null, + "refusal": null, + "role": null, + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null + } + ], + "created": 1758191361, + "model": "llama-3.3-70b", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": "fp_c5ec625e72d41732d8fd", + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "chatcmpl-de2bf7d0-0f5d-4f44-977c-209ab8ffa29d", + "choices": [ + { + "delta": { + "content": "?", + "function_call": null, + "refusal": null, + "role": null, + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null + } + ], + "created": 1758191361, + "model": "llama-3.3-70b", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": "fp_c5ec625e72d41732d8fd", + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "chatcmpl-de2bf7d0-0f5d-4f44-977c-209ab8ffa29d", + "choices": [ + { + "delta": { + "content": null, + "function_call": null, + "refusal": null, + "role": null, + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null + } + ], + "created": 1758191361, + "model": "llama-3.3-70b", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": "fp_c5ec625e72d41732d8fd", + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "chatcmpl-de2bf7d0-0f5d-4f44-977c-209ab8ffa29d", + "choices": [ + { + "delta": { + "content": null, + "function_call": null, + "refusal": null, + "role": null, + "tool_calls": null + }, + "finish_reason": "stop", + "index": 0, + "logprobs": null + } + ], + "created": 1758191361, + "model": "llama-3.3-70b", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": "fp_c5ec625e72d41732d8fd", + "usage": { + "completion_tokens": 25, + "prompt_tokens": 39, + "total_tokens": 64, + "completion_tokens_details": null, + "prompt_tokens_details": { + "audio_tokens": null, + "cached_tokens": 0 + } + }, + "time_info": { + "queue_time": 0.00030481, + "prompt_time": 0.002094315, + "completion_time": 0.011856632, + "total_time": 0.016039371490478516, + "created": 1758191361 + } + } + } + ], + "is_streaming": true + } +} diff --git a/tests/integration/recordings/responses/3cdb5cab6ce6.json b/tests/integration/recordings/responses/3cdb5cab6ce6.json new file mode 100644 index 000000000..1640b256c --- /dev/null +++ b/tests/integration/recordings/responses/3cdb5cab6ce6.json @@ -0,0 +1,66 @@ +{ + "request": { + "method": "POST", + "url": "https://api.cerebras.ai/v1/v1/chat/completions", + "headers": {}, + "body": { + "model": "llama-3.3-70b", + "messages": [ + { + "role": "user", + "content": "Which planet do humans live on?" + } + ], + "stream": false + }, + "endpoint": "/v1/chat/completions", + "model": "llama-3.3-70b" + }, + "response": { + "body": { + "__type__": "openai.types.chat.chat_completion.ChatCompletion", + "__data__": { + "id": "chatcmpl-839aab91-21a7-4ed9-b224-d22e524eda37", + "choices": [ + { + "finish_reason": "stop", + "index": 0, + "logprobs": null, + "message": { + "content": "Humans live on Earth.", + "refusal": null, + "role": "assistant", + "annotations": null, + "audio": null, + "function_call": null, + "tool_calls": null + } + } + ], + "created": 1758191360, + "model": "llama-3.3-70b", + "object": "chat.completion", + "service_tier": null, + "system_fingerprint": "fp_c5ec625e72d41732d8fd", + "usage": { + "completion_tokens": 6, + "prompt_tokens": 42, + "total_tokens": 48, + "completion_tokens_details": null, + "prompt_tokens_details": { + "audio_tokens": null, + "cached_tokens": 0 + } + }, + "time_info": { + "queue_time": 0.00028033, + "prompt_time": 0.001467015, + "completion_time": 0.007069593, + "total_time": 0.010509490966796875, + "created": 1758191360 + } + } + }, + "is_streaming": false + } +} diff --git a/tests/integration/recordings/responses/50a8dc5b8ece.json b/tests/integration/recordings/responses/50a8dc5b8ece.json new file mode 100644 index 000000000..2c3776f0c --- /dev/null +++ b/tests/integration/recordings/responses/50a8dc5b8ece.json @@ -0,0 +1,612 @@ +{ + "request": { + "method": "POST", + "url": "https://api.cerebras.ai/v1/v1/chat/completions", + "headers": {}, + "body": { + "model": "llama-3.3-70b", + "messages": [ + { + "role": "user", + "content": "What is the name of the US captial?" + } + ], + "stream": true + }, + "endpoint": "/v1/chat/completions", + "model": "llama-3.3-70b" + }, + "response": { + "body": [ + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "chatcmpl-adc9cfae-89ba-4938-9137-37a1f46d1596", + "choices": [ + { + "delta": { + "content": null, + "function_call": null, + "refusal": null, + "role": "assistant", + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null + } + ], + "created": 1758191363, + "model": "llama-3.3-70b", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": "fp_c5ec625e72d41732d8fd", + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "chatcmpl-adc9cfae-89ba-4938-9137-37a1f46d1596", + "choices": [ + { + "delta": { + "content": "The", + "function_call": null, + "refusal": null, + "role": null, + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null + } + ], + "created": 1758191363, + "model": "llama-3.3-70b", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": "fp_c5ec625e72d41732d8fd", + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "chatcmpl-adc9cfae-89ba-4938-9137-37a1f46d1596", + "choices": [ + { + "delta": { + "content": " name", + "function_call": null, + "refusal": null, + "role": null, + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null + } + ], + "created": 1758191363, + "model": "llama-3.3-70b", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": "fp_c5ec625e72d41732d8fd", + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "chatcmpl-adc9cfae-89ba-4938-9137-37a1f46d1596", + "choices": [ + { + "delta": { + "content": " of", + "function_call": null, + "refusal": null, + "role": null, + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null + } + ], + "created": 1758191363, + "model": "llama-3.3-70b", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": "fp_c5ec625e72d41732d8fd", + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "chatcmpl-adc9cfae-89ba-4938-9137-37a1f46d1596", + "choices": [ + { + "delta": { + "content": " the", + "function_call": null, + "refusal": null, + "role": null, + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null + } + ], + "created": 1758191363, + "model": "llama-3.3-70b", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": "fp_c5ec625e72d41732d8fd", + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "chatcmpl-adc9cfae-89ba-4938-9137-37a1f46d1596", + "choices": [ + { + "delta": { + "content": " US", + "function_call": null, + "refusal": null, + "role": null, + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null + } + ], + "created": 1758191363, + "model": "llama-3.3-70b", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": "fp_c5ec625e72d41732d8fd", + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "chatcmpl-adc9cfae-89ba-4938-9137-37a1f46d1596", + "choices": [ + { + "delta": { + "content": " capital", + "function_call": null, + "refusal": null, + "role": null, + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null + } + ], + "created": 1758191363, + "model": "llama-3.3-70b", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": "fp_c5ec625e72d41732d8fd", + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "chatcmpl-adc9cfae-89ba-4938-9137-37a1f46d1596", + "choices": [ + { + "delta": { + "content": " is", + "function_call": null, + "refusal": null, + "role": null, + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null + } + ], + "created": 1758191363, + "model": "llama-3.3-70b", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": "fp_c5ec625e72d41732d8fd", + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "chatcmpl-adc9cfae-89ba-4938-9137-37a1f46d1596", + "choices": [ + { + "delta": { + "content": " Washington", + "function_call": null, + "refusal": null, + "role": null, + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null + } + ], + "created": 1758191363, + "model": "llama-3.3-70b", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": "fp_c5ec625e72d41732d8fd", + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "chatcmpl-adc9cfae-89ba-4938-9137-37a1f46d1596", + "choices": [ + { + "delta": { + "content": ",", + "function_call": null, + "refusal": null, + "role": null, + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null + } + ], + "created": 1758191363, + "model": "llama-3.3-70b", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": "fp_c5ec625e72d41732d8fd", + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "chatcmpl-adc9cfae-89ba-4938-9137-37a1f46d1596", + "choices": [ + { + "delta": { + "content": " D", + "function_call": null, + "refusal": null, + "role": null, + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null + } + ], + "created": 1758191363, + "model": "llama-3.3-70b", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": "fp_c5ec625e72d41732d8fd", + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "chatcmpl-adc9cfae-89ba-4938-9137-37a1f46d1596", + "choices": [ + { + "delta": { + "content": ".C", + "function_call": null, + "refusal": null, + "role": null, + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null + } + ], + "created": 1758191363, + "model": "llama-3.3-70b", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": "fp_c5ec625e72d41732d8fd", + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "chatcmpl-adc9cfae-89ba-4938-9137-37a1f46d1596", + "choices": [ + { + "delta": { + "content": ".", + "function_call": null, + "refusal": null, + "role": null, + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null + } + ], + "created": 1758191363, + "model": "llama-3.3-70b", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": "fp_c5ec625e72d41732d8fd", + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "chatcmpl-adc9cfae-89ba-4938-9137-37a1f46d1596", + "choices": [ + { + "delta": { + "content": " (", + "function_call": null, + "refusal": null, + "role": null, + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null + } + ], + "created": 1758191363, + "model": "llama-3.3-70b", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": "fp_c5ec625e72d41732d8fd", + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "chatcmpl-adc9cfae-89ba-4938-9137-37a1f46d1596", + "choices": [ + { + "delta": { + "content": "short", + "function_call": null, + "refusal": null, + "role": null, + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null + } + ], + "created": 1758191363, + "model": "llama-3.3-70b", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": "fp_c5ec625e72d41732d8fd", + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "chatcmpl-adc9cfae-89ba-4938-9137-37a1f46d1596", + "choices": [ + { + "delta": { + "content": " for", + "function_call": null, + "refusal": null, + "role": null, + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null + } + ], + "created": 1758191363, + "model": "llama-3.3-70b", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": "fp_c5ec625e72d41732d8fd", + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "chatcmpl-adc9cfae-89ba-4938-9137-37a1f46d1596", + "choices": [ + { + "delta": { + "content": " District", + "function_call": null, + "refusal": null, + "role": null, + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null + } + ], + "created": 1758191363, + "model": "llama-3.3-70b", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": "fp_c5ec625e72d41732d8fd", + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "chatcmpl-adc9cfae-89ba-4938-9137-37a1f46d1596", + "choices": [ + { + "delta": { + "content": " of", + "function_call": null, + "refusal": null, + "role": null, + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null + } + ], + "created": 1758191363, + "model": "llama-3.3-70b", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": "fp_c5ec625e72d41732d8fd", + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "chatcmpl-adc9cfae-89ba-4938-9137-37a1f46d1596", + "choices": [ + { + "delta": { + "content": " Columbia", + "function_call": null, + "refusal": null, + "role": null, + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null + } + ], + "created": 1758191363, + "model": "llama-3.3-70b", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": "fp_c5ec625e72d41732d8fd", + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "chatcmpl-adc9cfae-89ba-4938-9137-37a1f46d1596", + "choices": [ + { + "delta": { + "content": ").", + "function_call": null, + "refusal": null, + "role": null, + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null + } + ], + "created": 1758191363, + "model": "llama-3.3-70b", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": "fp_c5ec625e72d41732d8fd", + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "chatcmpl-adc9cfae-89ba-4938-9137-37a1f46d1596", + "choices": [ + { + "delta": { + "content": null, + "function_call": null, + "refusal": null, + "role": null, + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null + } + ], + "created": 1758191363, + "model": "llama-3.3-70b", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": "fp_c5ec625e72d41732d8fd", + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "chatcmpl-adc9cfae-89ba-4938-9137-37a1f46d1596", + "choices": [ + { + "delta": { + "content": null, + "function_call": null, + "refusal": null, + "role": null, + "tool_calls": null + }, + "finish_reason": "stop", + "index": 0, + "logprobs": null + } + ], + "created": 1758191363, + "model": "llama-3.3-70b", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": "fp_c5ec625e72d41732d8fd", + "usage": { + "completion_tokens": 20, + "prompt_tokens": 45, + "total_tokens": 65, + "completion_tokens_details": null, + "prompt_tokens_details": { + "audio_tokens": null, + "cached_tokens": 0 + } + }, + "time_info": { + "queue_time": 0.000509825, + "prompt_time": 0.002284829, + "completion_time": 0.008430168, + "total_time": 0.012710094451904297, + "created": 1758191363 + } + } + } + ], + "is_streaming": true + } +} diff --git a/tests/integration/recordings/responses/a1c5bf09ea53.json b/tests/integration/recordings/responses/a1c5bf09ea53.json new file mode 100644 index 000000000..83b1ecfa4 --- /dev/null +++ b/tests/integration/recordings/responses/a1c5bf09ea53.json @@ -0,0 +1,66 @@ +{ + "request": { + "method": "POST", + "url": "https://api.cerebras.ai/v1/v1/chat/completions", + "headers": {}, + "body": { + "model": "llama-3.3-70b", + "messages": [ + { + "role": "user", + "content": "Hello, world!" + } + ], + "stream": false + }, + "endpoint": "/v1/chat/completions", + "model": "llama-3.3-70b" + }, + "response": { + "body": { + "__type__": "openai.types.chat.chat_completion.ChatCompletion", + "__data__": { + "id": "chatcmpl-1dcfef1f-f955-4158-a1fc-0c2643b60e4e", + "choices": [ + { + "finish_reason": "stop", + "index": 0, + "logprobs": null, + "message": { + "content": "Hello! It's nice to meet you. Is there something I can help you with or would you like to chat?", + "refusal": null, + "role": "assistant", + "annotations": null, + "audio": null, + "function_call": null, + "tool_calls": null + } + } + ], + "created": 1758191362, + "model": "llama-3.3-70b", + "object": "chat.completion", + "service_tier": null, + "system_fingerprint": "fp_c5ec625e72d41732d8fd", + "usage": { + "completion_tokens": 25, + "prompt_tokens": 39, + "total_tokens": 64, + "completion_tokens_details": null, + "prompt_tokens_details": { + "audio_tokens": null, + "cached_tokens": 0 + } + }, + "time_info": { + "queue_time": 0.083508803, + "prompt_time": 0.003352167, + "completion_time": 0.011506416, + "total_time": 0.09965348243713379, + "created": 1758191362 + } + } + }, + "is_streaming": false + } +} diff --git a/tests/integration/recordings/responses/af6ca03dcbc3.json b/tests/integration/recordings/responses/af6ca03dcbc3.json new file mode 100644 index 000000000..69b27aa8b --- /dev/null +++ b/tests/integration/recordings/responses/af6ca03dcbc3.json @@ -0,0 +1,1025 @@ +{ + "request": { + "method": "POST", + "url": "https://api.cerebras.ai/v1/v1/completions", + "headers": {}, + "body": { + "model": "llama-3.3-70b", + "prompt": "Respond to this question and explain your answer. Complete the sentence using one word: Roses are red, violets are ", + "max_tokens": 50, + "stream": true, + "extra_body": {} + }, + "endpoint": "/v1/completions", + "model": "llama-3.3-70b" + }, + "response": { + "body": [ + { + "__type__": "openai.types.completion.Completion", + "__data__": { + "id": "chatcmpl-d0c1e731-c48b-4ee7-823c-76c2df419ab2", + "choices": [ + { + "finish_reason": null, + "index": 0, + "logprobs": null, + "text": "" + } + ], + "created": 1758191353, + "model": "llama-3.3-70b", + "object": "text_completion", + "system_fingerprint": "fp_c5ec625e72d41732d8fd", + "usage": null + } + }, + { + "__type__": "openai.types.completion.Completion", + "__data__": { + "id": "chatcmpl-d0c1e731-c48b-4ee7-823c-76c2df419ab2", + "choices": [ + { + "finish_reason": null, + "index": 0, + "logprobs": null, + "text": " __" + } + ], + "created": 1758191353, + "model": "llama-3.3-70b", + "object": "text_completion", + "system_fingerprint": "fp_c5ec625e72d41732d8fd", + "usage": null + } + }, + { + "__type__": "openai.types.completion.Completion", + "__data__": { + "id": "chatcmpl-d0c1e731-c48b-4ee7-823c-76c2df419ab2", + "choices": [ + { + "finish_reason": null, + "index": 0, + "logprobs": null, + "text": "____________" + } + ], + "created": 1758191353, + "model": "llama-3.3-70b", + "object": "text_completion", + "system_fingerprint": "fp_c5ec625e72d41732d8fd", + "usage": null + } + }, + { + "__type__": "openai.types.completion.Completion", + "__data__": { + "id": "chatcmpl-d0c1e731-c48b-4ee7-823c-76c2df419ab2", + "choices": [ + { + "finish_reason": null, + "index": 0, + "logprobs": null, + "text": "_." + } + ], + "created": 1758191353, + "model": "llama-3.3-70b", + "object": "text_completion", + "system_fingerprint": "fp_c5ec625e72d41732d8fd", + "usage": null + } + }, + { + "__type__": "openai.types.completion.Completion", + "__data__": { + "id": "chatcmpl-d0c1e731-c48b-4ee7-823c-76c2df419ab2", + "choices": [ + { + "finish_reason": null, + "index": 0, + "logprobs": null, + "text": "\n\n\n" + } + ], + "created": 1758191353, + "model": "llama-3.3-70b", + "object": "text_completion", + "system_fingerprint": "fp_c5ec625e72d41732d8fd", + "usage": null + } + }, + { + "__type__": "openai.types.completion.Completion", + "__data__": { + "id": "chatcmpl-d0c1e731-c48b-4ee7-823c-76c2df419ab2", + "choices": [ + { + "finish_reason": null, + "index": 0, + "logprobs": null, + "text": "##" + } + ], + "created": 1758191353, + "model": "llama-3.3-70b", + "object": "text_completion", + "system_fingerprint": "fp_c5ec625e72d41732d8fd", + "usage": null + } + }, + { + "__type__": "openai.types.completion.Completion", + "__data__": { + "id": "chatcmpl-d0c1e731-c48b-4ee7-823c-76c2df419ab2", + "choices": [ + { + "finish_reason": null, + "index": 0, + "logprobs": null, + "text": " Step" + } + ], + "created": 1758191353, + "model": "llama-3.3-70b", + "object": "text_completion", + "system_fingerprint": "fp_c5ec625e72d41732d8fd", + "usage": null + } + }, + { + "__type__": "openai.types.completion.Completion", + "__data__": { + "id": "chatcmpl-d0c1e731-c48b-4ee7-823c-76c2df419ab2", + "choices": [ + { + "finish_reason": null, + "index": 0, + "logprobs": null, + "text": " " + } + ], + "created": 1758191353, + "model": "llama-3.3-70b", + "object": "text_completion", + "system_fingerprint": "fp_c5ec625e72d41732d8fd", + "usage": null + } + }, + { + "__type__": "openai.types.completion.Completion", + "__data__": { + "id": "chatcmpl-d0c1e731-c48b-4ee7-823c-76c2df419ab2", + "choices": [ + { + "finish_reason": null, + "index": 0, + "logprobs": null, + "text": "1" + } + ], + "created": 1758191353, + "model": "llama-3.3-70b", + "object": "text_completion", + "system_fingerprint": "fp_c5ec625e72d41732d8fd", + "usage": null + } + }, + { + "__type__": "openai.types.completion.Completion", + "__data__": { + "id": "chatcmpl-d0c1e731-c48b-4ee7-823c-76c2df419ab2", + "choices": [ + { + "finish_reason": null, + "index": 0, + "logprobs": null, + "text": ":" + } + ], + "created": 1758191353, + "model": "llama-3.3-70b", + "object": "text_completion", + "system_fingerprint": "fp_c5ec625e72d41732d8fd", + "usage": null + } + }, + { + "__type__": "openai.types.completion.Completion", + "__data__": { + "id": "chatcmpl-d0c1e731-c48b-4ee7-823c-76c2df419ab2", + "choices": [ + { + "finish_reason": null, + "index": 0, + "logprobs": null, + "text": " Identify" + } + ], + "created": 1758191353, + "model": "llama-3.3-70b", + "object": "text_completion", + "system_fingerprint": "fp_c5ec625e72d41732d8fd", + "usage": null + } + }, + { + "__type__": "openai.types.completion.Completion", + "__data__": { + "id": "chatcmpl-d0c1e731-c48b-4ee7-823c-76c2df419ab2", + "choices": [ + { + "finish_reason": null, + "index": 0, + "logprobs": null, + "text": " the" + } + ], + "created": 1758191353, + "model": "llama-3.3-70b", + "object": "text_completion", + "system_fingerprint": "fp_c5ec625e72d41732d8fd", + "usage": null + } + }, + { + "__type__": "openai.types.completion.Completion", + "__data__": { + "id": "chatcmpl-d0c1e731-c48b-4ee7-823c-76c2df419ab2", + "choices": [ + { + "finish_reason": null, + "index": 0, + "logprobs": null, + "text": " context" + } + ], + "created": 1758191353, + "model": "llama-3.3-70b", + "object": "text_completion", + "system_fingerprint": "fp_c5ec625e72d41732d8fd", + "usage": null + } + }, + { + "__type__": "openai.types.completion.Completion", + "__data__": { + "id": "chatcmpl-d0c1e731-c48b-4ee7-823c-76c2df419ab2", + "choices": [ + { + "finish_reason": null, + "index": 0, + "logprobs": null, + "text": " of" + } + ], + "created": 1758191353, + "model": "llama-3.3-70b", + "object": "text_completion", + "system_fingerprint": "fp_c5ec625e72d41732d8fd", + "usage": null + } + }, + { + "__type__": "openai.types.completion.Completion", + "__data__": { + "id": "chatcmpl-d0c1e731-c48b-4ee7-823c-76c2df419ab2", + "choices": [ + { + "finish_reason": null, + "index": 0, + "logprobs": null, + "text": " the" + } + ], + "created": 1758191353, + "model": "llama-3.3-70b", + "object": "text_completion", + "system_fingerprint": "fp_c5ec625e72d41732d8fd", + "usage": null + } + }, + { + "__type__": "openai.types.completion.Completion", + "__data__": { + "id": "chatcmpl-d0c1e731-c48b-4ee7-823c-76c2df419ab2", + "choices": [ + { + "finish_reason": null, + "index": 0, + "logprobs": null, + "text": " sentence" + } + ], + "created": 1758191353, + "model": "llama-3.3-70b", + "object": "text_completion", + "system_fingerprint": "fp_c5ec625e72d41732d8fd", + "usage": null + } + }, + { + "__type__": "openai.types.completion.Completion", + "__data__": { + "id": "chatcmpl-d0c1e731-c48b-4ee7-823c-76c2df419ab2", + "choices": [ + { + "finish_reason": null, + "index": 0, + "logprobs": null, + "text": "\n" + } + ], + "created": 1758191353, + "model": "llama-3.3-70b", + "object": "text_completion", + "system_fingerprint": "fp_c5ec625e72d41732d8fd", + "usage": null + } + }, + { + "__type__": "openai.types.completion.Completion", + "__data__": { + "id": "chatcmpl-d0c1e731-c48b-4ee7-823c-76c2df419ab2", + "choices": [ + { + "finish_reason": null, + "index": 0, + "logprobs": null, + "text": "The" + } + ], + "created": 1758191353, + "model": "llama-3.3-70b", + "object": "text_completion", + "system_fingerprint": "fp_c5ec625e72d41732d8fd", + "usage": null + } + }, + { + "__type__": "openai.types.completion.Completion", + "__data__": { + "id": "chatcmpl-d0c1e731-c48b-4ee7-823c-76c2df419ab2", + "choices": [ + { + "finish_reason": null, + "index": 0, + "logprobs": null, + "text": " sentence" + } + ], + "created": 1758191353, + "model": "llama-3.3-70b", + "object": "text_completion", + "system_fingerprint": "fp_c5ec625e72d41732d8fd", + "usage": null + } + }, + { + "__type__": "openai.types.completion.Completion", + "__data__": { + "id": "chatcmpl-d0c1e731-c48b-4ee7-823c-76c2df419ab2", + "choices": [ + { + "finish_reason": null, + "index": 0, + "logprobs": null, + "text": " is" + } + ], + "created": 1758191353, + "model": "llama-3.3-70b", + "object": "text_completion", + "system_fingerprint": "fp_c5ec625e72d41732d8fd", + "usage": null + } + }, + { + "__type__": "openai.types.completion.Completion", + "__data__": { + "id": "chatcmpl-d0c1e731-c48b-4ee7-823c-76c2df419ab2", + "choices": [ + { + "finish_reason": null, + "index": 0, + "logprobs": null, + "text": " completing" + } + ], + "created": 1758191353, + "model": "llama-3.3-70b", + "object": "text_completion", + "system_fingerprint": "fp_c5ec625e72d41732d8fd", + "usage": null + } + }, + { + "__type__": "openai.types.completion.Completion", + "__data__": { + "id": "chatcmpl-d0c1e731-c48b-4ee7-823c-76c2df419ab2", + "choices": [ + { + "finish_reason": null, + "index": 0, + "logprobs": null, + "text": " a" + } + ], + "created": 1758191353, + "model": "llama-3.3-70b", + "object": "text_completion", + "system_fingerprint": "fp_c5ec625e72d41732d8fd", + "usage": null + } + }, + { + "__type__": "openai.types.completion.Completion", + "__data__": { + "id": "chatcmpl-d0c1e731-c48b-4ee7-823c-76c2df419ab2", + "choices": [ + { + "finish_reason": null, + "index": 0, + "logprobs": null, + "text": " well" + } + ], + "created": 1758191353, + "model": "llama-3.3-70b", + "object": "text_completion", + "system_fingerprint": "fp_c5ec625e72d41732d8fd", + "usage": null + } + }, + { + "__type__": "openai.types.completion.Completion", + "__data__": { + "id": "chatcmpl-d0c1e731-c48b-4ee7-823c-76c2df419ab2", + "choices": [ + { + "finish_reason": null, + "index": 0, + "logprobs": null, + "text": "-known" + } + ], + "created": 1758191353, + "model": "llama-3.3-70b", + "object": "text_completion", + "system_fingerprint": "fp_c5ec625e72d41732d8fd", + "usage": null + } + }, + { + "__type__": "openai.types.completion.Completion", + "__data__": { + "id": "chatcmpl-d0c1e731-c48b-4ee7-823c-76c2df419ab2", + "choices": [ + { + "finish_reason": null, + "index": 0, + "logprobs": null, + "text": " rhyme" + } + ], + "created": 1758191353, + "model": "llama-3.3-70b", + "object": "text_completion", + "system_fingerprint": "fp_c5ec625e72d41732d8fd", + "usage": null + } + }, + { + "__type__": "openai.types.completion.Completion", + "__data__": { + "id": "chatcmpl-d0c1e731-c48b-4ee7-823c-76c2df419ab2", + "choices": [ + { + "finish_reason": null, + "index": 0, + "logprobs": null, + "text": " that" + } + ], + "created": 1758191353, + "model": "llama-3.3-70b", + "object": "text_completion", + "system_fingerprint": "fp_c5ec625e72d41732d8fd", + "usage": null + } + }, + { + "__type__": "openai.types.completion.Completion", + "__data__": { + "id": "chatcmpl-d0c1e731-c48b-4ee7-823c-76c2df419ab2", + "choices": [ + { + "finish_reason": null, + "index": 0, + "logprobs": null, + "text": " describes" + } + ], + "created": 1758191353, + "model": "llama-3.3-70b", + "object": "text_completion", + "system_fingerprint": "fp_c5ec625e72d41732d8fd", + "usage": null + } + }, + { + "__type__": "openai.types.completion.Completion", + "__data__": { + "id": "chatcmpl-d0c1e731-c48b-4ee7-823c-76c2df419ab2", + "choices": [ + { + "finish_reason": null, + "index": 0, + "logprobs": null, + "text": " the" + } + ], + "created": 1758191353, + "model": "llama-3.3-70b", + "object": "text_completion", + "system_fingerprint": "fp_c5ec625e72d41732d8fd", + "usage": null + } + }, + { + "__type__": "openai.types.completion.Completion", + "__data__": { + "id": "chatcmpl-d0c1e731-c48b-4ee7-823c-76c2df419ab2", + "choices": [ + { + "finish_reason": null, + "index": 0, + "logprobs": null, + "text": " colors" + } + ], + "created": 1758191353, + "model": "llama-3.3-70b", + "object": "text_completion", + "system_fingerprint": "fp_c5ec625e72d41732d8fd", + "usage": null + } + }, + { + "__type__": "openai.types.completion.Completion", + "__data__": { + "id": "chatcmpl-d0c1e731-c48b-4ee7-823c-76c2df419ab2", + "choices": [ + { + "finish_reason": null, + "index": 0, + "logprobs": null, + "text": " associated" + } + ], + "created": 1758191353, + "model": "llama-3.3-70b", + "object": "text_completion", + "system_fingerprint": "fp_c5ec625e72d41732d8fd", + "usage": null + } + }, + { + "__type__": "openai.types.completion.Completion", + "__data__": { + "id": "chatcmpl-d0c1e731-c48b-4ee7-823c-76c2df419ab2", + "choices": [ + { + "finish_reason": null, + "index": 0, + "logprobs": null, + "text": " with" + } + ], + "created": 1758191353, + "model": "llama-3.3-70b", + "object": "text_completion", + "system_fingerprint": "fp_c5ec625e72d41732d8fd", + "usage": null + } + }, + { + "__type__": "openai.types.completion.Completion", + "__data__": { + "id": "chatcmpl-d0c1e731-c48b-4ee7-823c-76c2df419ab2", + "choices": [ + { + "finish_reason": null, + "index": 0, + "logprobs": null, + "text": " flowers" + } + ], + "created": 1758191353, + "model": "llama-3.3-70b", + "object": "text_completion", + "system_fingerprint": "fp_c5ec625e72d41732d8fd", + "usage": null + } + }, + { + "__type__": "openai.types.completion.Completion", + "__data__": { + "id": "chatcmpl-d0c1e731-c48b-4ee7-823c-76c2df419ab2", + "choices": [ + { + "finish_reason": null, + "index": 0, + "logprobs": null, + "text": ".\n\n" + } + ], + "created": 1758191353, + "model": "llama-3.3-70b", + "object": "text_completion", + "system_fingerprint": "fp_c5ec625e72d41732d8fd", + "usage": null + } + }, + { + "__type__": "openai.types.completion.Completion", + "__data__": { + "id": "chatcmpl-d0c1e731-c48b-4ee7-823c-76c2df419ab2", + "choices": [ + { + "finish_reason": null, + "index": 0, + "logprobs": null, + "text": "##" + } + ], + "created": 1758191353, + "model": "llama-3.3-70b", + "object": "text_completion", + "system_fingerprint": "fp_c5ec625e72d41732d8fd", + "usage": null + } + }, + { + "__type__": "openai.types.completion.Completion", + "__data__": { + "id": "chatcmpl-d0c1e731-c48b-4ee7-823c-76c2df419ab2", + "choices": [ + { + "finish_reason": null, + "index": 0, + "logprobs": null, + "text": " Step" + } + ], + "created": 1758191353, + "model": "llama-3.3-70b", + "object": "text_completion", + "system_fingerprint": "fp_c5ec625e72d41732d8fd", + "usage": null + } + }, + { + "__type__": "openai.types.completion.Completion", + "__data__": { + "id": "chatcmpl-d0c1e731-c48b-4ee7-823c-76c2df419ab2", + "choices": [ + { + "finish_reason": null, + "index": 0, + "logprobs": null, + "text": " " + } + ], + "created": 1758191353, + "model": "llama-3.3-70b", + "object": "text_completion", + "system_fingerprint": "fp_c5ec625e72d41732d8fd", + "usage": null + } + }, + { + "__type__": "openai.types.completion.Completion", + "__data__": { + "id": "chatcmpl-d0c1e731-c48b-4ee7-823c-76c2df419ab2", + "choices": [ + { + "finish_reason": null, + "index": 0, + "logprobs": null, + "text": "2" + } + ], + "created": 1758191353, + "model": "llama-3.3-70b", + "object": "text_completion", + "system_fingerprint": "fp_c5ec625e72d41732d8fd", + "usage": null + } + }, + { + "__type__": "openai.types.completion.Completion", + "__data__": { + "id": "chatcmpl-d0c1e731-c48b-4ee7-823c-76c2df419ab2", + "choices": [ + { + "finish_reason": null, + "index": 0, + "logprobs": null, + "text": ":" + } + ], + "created": 1758191353, + "model": "llama-3.3-70b", + "object": "text_completion", + "system_fingerprint": "fp_c5ec625e72d41732d8fd", + "usage": null + } + }, + { + "__type__": "openai.types.completion.Completion", + "__data__": { + "id": "chatcmpl-d0c1e731-c48b-4ee7-823c-76c2df419ab2", + "choices": [ + { + "finish_reason": null, + "index": 0, + "logprobs": null, + "text": " Recall" + } + ], + "created": 1758191353, + "model": "llama-3.3-70b", + "object": "text_completion", + "system_fingerprint": "fp_c5ec625e72d41732d8fd", + "usage": null + } + }, + { + "__type__": "openai.types.completion.Completion", + "__data__": { + "id": "chatcmpl-d0c1e731-c48b-4ee7-823c-76c2df419ab2", + "choices": [ + { + "finish_reason": null, + "index": 0, + "logprobs": null, + "text": " the" + } + ], + "created": 1758191353, + "model": "llama-3.3-70b", + "object": "text_completion", + "system_fingerprint": "fp_c5ec625e72d41732d8fd", + "usage": null + } + }, + { + "__type__": "openai.types.completion.Completion", + "__data__": { + "id": "chatcmpl-d0c1e731-c48b-4ee7-823c-76c2df419ab2", + "choices": [ + { + "finish_reason": null, + "index": 0, + "logprobs": null, + "text": " traditional" + } + ], + "created": 1758191353, + "model": "llama-3.3-70b", + "object": "text_completion", + "system_fingerprint": "fp_c5ec625e72d41732d8fd", + "usage": null + } + }, + { + "__type__": "openai.types.completion.Completion", + "__data__": { + "id": "chatcmpl-d0c1e731-c48b-4ee7-823c-76c2df419ab2", + "choices": [ + { + "finish_reason": null, + "index": 0, + "logprobs": null, + "text": " completion" + } + ], + "created": 1758191353, + "model": "llama-3.3-70b", + "object": "text_completion", + "system_fingerprint": "fp_c5ec625e72d41732d8fd", + "usage": null + } + }, + { + "__type__": "openai.types.completion.Completion", + "__data__": { + "id": "chatcmpl-d0c1e731-c48b-4ee7-823c-76c2df419ab2", + "choices": [ + { + "finish_reason": null, + "index": 0, + "logprobs": null, + "text": " of" + } + ], + "created": 1758191353, + "model": "llama-3.3-70b", + "object": "text_completion", + "system_fingerprint": "fp_c5ec625e72d41732d8fd", + "usage": null + } + }, + { + "__type__": "openai.types.completion.Completion", + "__data__": { + "id": "chatcmpl-d0c1e731-c48b-4ee7-823c-76c2df419ab2", + "choices": [ + { + "finish_reason": null, + "index": 0, + "logprobs": null, + "text": " the" + } + ], + "created": 1758191353, + "model": "llama-3.3-70b", + "object": "text_completion", + "system_fingerprint": "fp_c5ec625e72d41732d8fd", + "usage": null + } + }, + { + "__type__": "openai.types.completion.Completion", + "__data__": { + "id": "chatcmpl-d0c1e731-c48b-4ee7-823c-76c2df419ab2", + "choices": [ + { + "finish_reason": null, + "index": 0, + "logprobs": null, + "text": " rhyme" + } + ], + "created": 1758191353, + "model": "llama-3.3-70b", + "object": "text_completion", + "system_fingerprint": "fp_c5ec625e72d41732d8fd", + "usage": null + } + }, + { + "__type__": "openai.types.completion.Completion", + "__data__": { + "id": "chatcmpl-d0c1e731-c48b-4ee7-823c-76c2df419ab2", + "choices": [ + { + "finish_reason": null, + "index": 0, + "logprobs": null, + "text": "\n" + } + ], + "created": 1758191353, + "model": "llama-3.3-70b", + "object": "text_completion", + "system_fingerprint": "fp_c5ec625e72d41732d8fd", + "usage": null + } + }, + { + "__type__": "openai.types.completion.Completion", + "__data__": { + "id": "chatcmpl-d0c1e731-c48b-4ee7-823c-76c2df419ab2", + "choices": [ + { + "finish_reason": null, + "index": 0, + "logprobs": null, + "text": "The" + } + ], + "created": 1758191353, + "model": "llama-3.3-70b", + "object": "text_completion", + "system_fingerprint": "fp_c5ec625e72d41732d8fd", + "usage": null + } + }, + { + "__type__": "openai.types.completion.Completion", + "__data__": { + "id": "chatcmpl-d0c1e731-c48b-4ee7-823c-76c2df419ab2", + "choices": [ + { + "finish_reason": null, + "index": 0, + "logprobs": null, + "text": " traditional" + } + ], + "created": 1758191353, + "model": "llama-3.3-70b", + "object": "text_completion", + "system_fingerprint": "fp_c5ec625e72d41732d8fd", + "usage": null + } + }, + { + "__type__": "openai.types.completion.Completion", + "__data__": { + "id": "chatcmpl-d0c1e731-c48b-4ee7-823c-76c2df419ab2", + "choices": [ + { + "finish_reason": null, + "index": 0, + "logprobs": null, + "text": " rhyme" + } + ], + "created": 1758191353, + "model": "llama-3.3-70b", + "object": "text_completion", + "system_fingerprint": "fp_c5ec625e72d41732d8fd", + "usage": null + } + }, + { + "__type__": "openai.types.completion.Completion", + "__data__": { + "id": "chatcmpl-d0c1e731-c48b-4ee7-823c-76c2df419ab2", + "choices": [ + { + "finish_reason": null, + "index": 0, + "logprobs": null, + "text": " states" + } + ], + "created": 1758191353, + "model": "llama-3.3-70b", + "object": "text_completion", + "system_fingerprint": "fp_c5ec625e72d41732d8fd", + "usage": null + } + }, + { + "__type__": "openai.types.completion.Completion", + "__data__": { + "id": "chatcmpl-d0c1e731-c48b-4ee7-823c-76c2df419ab2", + "choices": [ + { + "finish_reason": null, + "index": 0, + "logprobs": null, + "text": "," + } + ], + "created": 1758191353, + "model": "llama-3.3-70b", + "object": "text_completion", + "system_fingerprint": "fp_c5ec625e72d41732d8fd", + "usage": null + } + }, + { + "__type__": "openai.types.completion.Completion", + "__data__": { + "id": "chatcmpl-d0c1e731-c48b-4ee7-823c-76c2df419ab2", + "choices": [ + { + "finish_reason": "length", + "index": 0, + "logprobs": null, + "text": "" + } + ], + "created": 1758191353, + "model": "llama-3.3-70b", + "object": "text_completion", + "system_fingerprint": "fp_c5ec625e72d41732d8fd", + "usage": { + "completion_tokens": 50, + "prompt_tokens": 26, + "total_tokens": 76, + "completion_tokens_details": null, + "prompt_tokens_details": { + "audio_tokens": null, + "cached_tokens": 0 + } + }, + "time_info": { + "queue_time": 0.000103421, + "prompt_time": 0.001700221, + "completion_time": 0.050781803, + "total_time": 0.05472397804260254, + "created": 1758191353 + } + } + } + ], + "is_streaming": true + } +} diff --git a/tests/integration/recordings/responses/b459f403a5ae.json b/tests/integration/recordings/responses/b459f403a5ae.json new file mode 100644 index 000000000..8e4791d0e --- /dev/null +++ b/tests/integration/recordings/responses/b459f403a5ae.json @@ -0,0 +1,66 @@ +{ + "request": { + "method": "POST", + "url": "https://api.cerebras.ai/v1/v1/chat/completions", + "headers": {}, + "body": { + "model": "llama-3.3-70b", + "messages": [ + { + "role": "user", + "content": "Which planet has rings around it with a name starting with letter S?" + } + ], + "stream": false + }, + "endpoint": "/v1/chat/completions", + "model": "llama-3.3-70b" + }, + "response": { + "body": { + "__type__": "openai.types.chat.chat_completion.ChatCompletion", + "__data__": { + "id": "chatcmpl-e9e83004-bcd0-47f8-97c3-8e3d789a6573", + "choices": [ + { + "finish_reason": "stop", + "index": 0, + "logprobs": null, + "message": { + "content": "The planet with rings around it that starts with the letter S is Saturn. Saturn's rings are one of the most prominent and well-known ring systems in our solar system.", + "refusal": null, + "role": "assistant", + "annotations": null, + "audio": null, + "function_call": null, + "tool_calls": null + } + } + ], + "created": 1758191362, + "model": "llama-3.3-70b", + "object": "chat.completion", + "service_tier": null, + "system_fingerprint": "fp_c5ec625e72d41732d8fd", + "usage": { + "completion_tokens": 35, + "prompt_tokens": 49, + "total_tokens": 84, + "completion_tokens_details": null, + "prompt_tokens_details": { + "audio_tokens": null, + "cached_tokens": 0 + } + }, + "time_info": { + "queue_time": 0.00091223, + "prompt_time": 0.00239449, + "completion_time": 0.013951346, + "total_time": 0.01872849464416504, + "created": 1758191362 + } + } + }, + "is_streaming": false + } +} diff --git a/tests/integration/recordings/responses/eefb4206a4a9.json b/tests/integration/recordings/responses/eefb4206a4a9.json new file mode 100644 index 000000000..b6fa01c96 --- /dev/null +++ b/tests/integration/recordings/responses/eefb4206a4a9.json @@ -0,0 +1,378 @@ +{ + "request": { + "method": "POST", + "url": "https://api.cerebras.ai/v1/v1/chat/completions", + "headers": {}, + "body": { + "model": "llama-3.3-70b", + "messages": [ + { + "role": "user", + "content": "What's the name of the Sun in latin?" + } + ], + "stream": true + }, + "endpoint": "/v1/chat/completions", + "model": "llama-3.3-70b" + }, + "response": { + "body": [ + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "chatcmpl-9decaa3e-f7e6-4e9b-a7f3-c00fdb748534", + "choices": [ + { + "delta": { + "content": null, + "function_call": null, + "refusal": null, + "role": "assistant", + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null + } + ], + "created": 1758191360, + "model": "llama-3.3-70b", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": "fp_c5ec625e72d41732d8fd", + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "chatcmpl-9decaa3e-f7e6-4e9b-a7f3-c00fdb748534", + "choices": [ + { + "delta": { + "content": "The", + "function_call": null, + "refusal": null, + "role": null, + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null + } + ], + "created": 1758191360, + "model": "llama-3.3-70b", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": "fp_c5ec625e72d41732d8fd", + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "chatcmpl-9decaa3e-f7e6-4e9b-a7f3-c00fdb748534", + "choices": [ + { + "delta": { + "content": " Latin", + "function_call": null, + "refusal": null, + "role": null, + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null + } + ], + "created": 1758191360, + "model": "llama-3.3-70b", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": "fp_c5ec625e72d41732d8fd", + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "chatcmpl-9decaa3e-f7e6-4e9b-a7f3-c00fdb748534", + "choices": [ + { + "delta": { + "content": " name", + "function_call": null, + "refusal": null, + "role": null, + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null + } + ], + "created": 1758191360, + "model": "llama-3.3-70b", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": "fp_c5ec625e72d41732d8fd", + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "chatcmpl-9decaa3e-f7e6-4e9b-a7f3-c00fdb748534", + "choices": [ + { + "delta": { + "content": " for", + "function_call": null, + "refusal": null, + "role": null, + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null + } + ], + "created": 1758191360, + "model": "llama-3.3-70b", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": "fp_c5ec625e72d41732d8fd", + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "chatcmpl-9decaa3e-f7e6-4e9b-a7f3-c00fdb748534", + "choices": [ + { + "delta": { + "content": " the", + "function_call": null, + "refusal": null, + "role": null, + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null + } + ], + "created": 1758191360, + "model": "llama-3.3-70b", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": "fp_c5ec625e72d41732d8fd", + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "chatcmpl-9decaa3e-f7e6-4e9b-a7f3-c00fdb748534", + "choices": [ + { + "delta": { + "content": " Sun", + "function_call": null, + "refusal": null, + "role": null, + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null + } + ], + "created": 1758191360, + "model": "llama-3.3-70b", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": "fp_c5ec625e72d41732d8fd", + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "chatcmpl-9decaa3e-f7e6-4e9b-a7f3-c00fdb748534", + "choices": [ + { + "delta": { + "content": " is", + "function_call": null, + "refusal": null, + "role": null, + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null + } + ], + "created": 1758191360, + "model": "llama-3.3-70b", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": "fp_c5ec625e72d41732d8fd", + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "chatcmpl-9decaa3e-f7e6-4e9b-a7f3-c00fdb748534", + "choices": [ + { + "delta": { + "content": " \"", + "function_call": null, + "refusal": null, + "role": null, + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null + } + ], + "created": 1758191360, + "model": "llama-3.3-70b", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": "fp_c5ec625e72d41732d8fd", + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "chatcmpl-9decaa3e-f7e6-4e9b-a7f3-c00fdb748534", + "choices": [ + { + "delta": { + "content": "Sol", + "function_call": null, + "refusal": null, + "role": null, + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null + } + ], + "created": 1758191360, + "model": "llama-3.3-70b", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": "fp_c5ec625e72d41732d8fd", + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "chatcmpl-9decaa3e-f7e6-4e9b-a7f3-c00fdb748534", + "choices": [ + { + "delta": { + "content": "\".", + "function_call": null, + "refusal": null, + "role": null, + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null + } + ], + "created": 1758191360, + "model": "llama-3.3-70b", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": "fp_c5ec625e72d41732d8fd", + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "chatcmpl-9decaa3e-f7e6-4e9b-a7f3-c00fdb748534", + "choices": [ + { + "delta": { + "content": null, + "function_call": null, + "refusal": null, + "role": null, + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null + } + ], + "created": 1758191360, + "model": "llama-3.3-70b", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": "fp_c5ec625e72d41732d8fd", + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "chatcmpl-9decaa3e-f7e6-4e9b-a7f3-c00fdb748534", + "choices": [ + { + "delta": { + "content": null, + "function_call": null, + "refusal": null, + "role": null, + "tool_calls": null + }, + "finish_reason": "stop", + "index": 0, + "logprobs": null + } + ], + "created": 1758191360, + "model": "llama-3.3-70b", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": "fp_c5ec625e72d41732d8fd", + "usage": { + "completion_tokens": 11, + "prompt_tokens": 45, + "total_tokens": 56, + "completion_tokens_details": null, + "prompt_tokens_details": { + "audio_tokens": null, + "cached_tokens": 0 + } + }, + "time_info": { + "queue_time": 9.281e-05, + "prompt_time": 0.002694912, + "completion_time": 0.003747467, + "total_time": 0.008375167846679688, + "created": 1758191360 + } + } + } + ], + "is_streaming": true + } +} diff --git a/tests/integration/recordings/responses/models-bd032f995f2a-af43cc69.json b/tests/integration/recordings/responses/models-bd032f995f2a-af43cc69.json new file mode 100644 index 000000000..031a676c0 --- /dev/null +++ b/tests/integration/recordings/responses/models-bd032f995f2a-af43cc69.json @@ -0,0 +1,96 @@ +{ + "request": { + "method": "POST", + "url": "https://api.cerebras.ai/v1/v1/models", + "headers": {}, + "body": {}, + "endpoint": "/v1/models", + "model": "" + }, + "response": { + "body": [ + { + "__type__": "openai.types.model.Model", + "__data__": { + "id": "llama-4-maverick-17b-128e-instruct", + "created": 0, + "object": "model", + "owned_by": "Cerebras" + } + }, + { + "__type__": "openai.types.model.Model", + "__data__": { + "id": "llama-4-scout-17b-16e-instruct", + "created": 0, + "object": "model", + "owned_by": "Cerebras" + } + }, + { + "__type__": "openai.types.model.Model", + "__data__": { + "id": "qwen-3-235b-a22b-instruct-2507", + "created": 0, + "object": "model", + "owned_by": "Cerebras" + } + }, + { + "__type__": "openai.types.model.Model", + "__data__": { + "id": "llama3.1-8b", + "created": 0, + "object": "model", + "owned_by": "Cerebras" + } + }, + { + "__type__": "openai.types.model.Model", + "__data__": { + "id": "qwen-3-32b", + "created": 0, + "object": "model", + "owned_by": "Cerebras" + } + }, + { + "__type__": "openai.types.model.Model", + "__data__": { + "id": "gpt-oss-120b", + "created": 0, + "object": "model", + "owned_by": "Cerebras" + } + }, + { + "__type__": "openai.types.model.Model", + "__data__": { + "id": "qwen-3-235b-a22b-thinking-2507", + "created": 0, + "object": "model", + "owned_by": "Cerebras" + } + }, + { + "__type__": "openai.types.model.Model", + "__data__": { + "id": "llama-3.3-70b", + "created": 0, + "object": "model", + "owned_by": "Cerebras" + } + }, + { + "__type__": "openai.types.model.Model", + "__data__": { + "id": "qwen-3-coder-480b", + "created": 0, + "object": "model", + "owned_by": "Cerebras" + } + } + ], + "is_streaming": false + } +} diff --git a/tests/integration/suites.py b/tests/integration/suites.py index f526bae51..649cd1c2e 100644 --- a/tests/integration/suites.py +++ b/tests/integration/suites.py @@ -108,6 +108,13 @@ SETUP_DEFINITIONS: dict[str, Setup] = { "embedding_model": "together/togethercomputer/m2-bert-80M-32k-retrieval", }, ), + "cerebras": Setup( + name="cerebras", + description="Cerebras models", + defaults={ + "text_model": "cerebras/llama-3.3-70b", + }, + ), "databricks": Setup( name="databricks", description="Databricks models", From 2f58d87c22fb1e8d5dd04a90dcb1e6d84111151a Mon Sep 17 00:00:00 2001 From: Nathan Weinberg <31703736+nathan-weinberg@users.noreply.github.com> Date: Tue, 23 Sep 2025 17:30:24 -0400 Subject: [PATCH 133/150] docs: fix typos in RAG docs (#3530) Signed-off-by: Nathan Weinberg --- docs/source/building_applications/rag.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/source/building_applications/rag.md b/docs/source/building_applications/rag.md index 802859e87..9390c0310 100644 --- a/docs/source/building_applications/rag.md +++ b/docs/source/building_applications/rag.md @@ -272,9 +272,9 @@ B64_ENCODED_IMAGE = base64.b64encode( "https://raw.githubusercontent.com/meta-llama/llama-stack/refs/heads/main/docs/_static/llama-stack.png" ).content ) -RAGDocuemnt( +RAGDocument( document_id="num-4", content={"type": "image", "image": {"data": B64_ENCODED_IMAGE}}, ) ``` -for more strongly typed interaction use the typed dicts found [here](https://github.com/meta-llama/llama-stack-client-python/blob/38cd91c9e396f2be0bec1ee96a19771582ba6f17/src/llama_stack_client/types/shared_params/document.py). +For more strongly typed interaction use the typed dicts found [here](https://github.com/meta-llama/llama-stack-client-python/blob/38cd91c9e396f2be0bec1ee96a19771582ba6f17/src/llama_stack_client/types/shared_params/document.py). From 48a551ecbcd8139ebb28b8b222382335311ae87d Mon Sep 17 00:00:00 2001 From: ehhuang Date: Wed, 24 Sep 2025 10:18:33 -0700 Subject: [PATCH 134/150] chore(perf): run guidellm benchmarks (#3421) # What does this PR do? - Mostly AI-generated scripts to run guidellm (https://github.com/vllm-project/guidellm) benchmarks on k8s setup - Stack is using image built from main on 9/11 ## Test Plan See updated README.md --- benchmarking/k8s-benchmark/README.md | 191 ++++++++---- benchmarking/k8s-benchmark/benchmark.py | 265 ---------------- .../k8s-benchmark/profile_running_server.sh | 52 ---- ...chmark-stack-s1-sw1-v1-20250922-103408.txt | 171 ++++++++++ ...chmark-stack-s1-sw2-v1-20250922-104457.txt | 171 ++++++++++ ...chmark-stack-s1-sw4-v1-20250922-105539.txt | 171 ++++++++++ ...ellm-benchmark-vllm-v1-20250922-111127.txt | 170 ++++++++++ .../vllm_replica1_benchmark_results.png | Bin 0 -> 575562 bytes benchmarking/k8s-benchmark/run-benchmark.sh | 148 --------- .../k8s-benchmark/scripts/generate_charts.py | 294 ++++++++++++++++++ .../scripts/run-all-benchmarks.sh | 103 ++++++ .../scripts/run-guidellm-benchmark.sh | 219 +++++++++++++ .../k8s-benchmark/stack-k8s.yaml.template | 6 +- pyproject.toml | 1 + 14 files changed, 1436 insertions(+), 526 deletions(-) delete mode 100644 benchmarking/k8s-benchmark/benchmark.py delete mode 100755 benchmarking/k8s-benchmark/profile_running_server.sh create mode 100644 benchmarking/k8s-benchmark/results/guidellm-benchmark-stack-s1-sw1-v1-20250922-103408.txt create mode 100644 benchmarking/k8s-benchmark/results/guidellm-benchmark-stack-s1-sw2-v1-20250922-104457.txt create mode 100644 benchmarking/k8s-benchmark/results/guidellm-benchmark-stack-s1-sw4-v1-20250922-105539.txt create mode 100644 benchmarking/k8s-benchmark/results/guidellm-benchmark-vllm-v1-20250922-111127.txt create mode 100644 benchmarking/k8s-benchmark/results/vllm_replica1_benchmark_results.png delete mode 100755 benchmarking/k8s-benchmark/run-benchmark.sh create mode 100755 benchmarking/k8s-benchmark/scripts/generate_charts.py create mode 100755 benchmarking/k8s-benchmark/scripts/run-all-benchmarks.sh create mode 100755 benchmarking/k8s-benchmark/scripts/run-guidellm-benchmark.sh diff --git a/benchmarking/k8s-benchmark/README.md b/benchmarking/k8s-benchmark/README.md index 3b0d0c4db..9b5e140f0 100644 --- a/benchmarking/k8s-benchmark/README.md +++ b/benchmarking/k8s-benchmark/README.md @@ -26,6 +26,7 @@ The benchmark suite measures critical performance indicators: - **Throughput**: Requests per second under sustained load - **Latency Distribution**: P50, P95, P99 response times - **Time to First Token (TTFT)**: Critical for streaming applications +- **Inter-Token Latency (ITL)**: Token generation speed for streaming - **Error Rates**: Request failures and timeout analysis This data enables data-driven architectural decisions and performance optimization efforts. @@ -49,49 +50,148 @@ kubectl get pods # Should see: llama-stack-benchmark-server, vllm-server, etc. ``` +## Benchmark Results + +We use [GuideLLM](https://github.com/neuralmagic/guidellm) against our k8s deployment for comprehensive performance testing. + + +### Performance - 1 vLLM Replica + +We vary the number of Llama Stack replicas with 1 vLLM replica and compare performance below. + +![Performance - 1 vLLM Replica](results/vllm_replica1_benchmark_results.png) + + +For full results see the `benchmarking/k8s-benchmark/results/` directory. + + ## Quick Start -### Basic Benchmarks +Follow the instructions below to run benchmarks similar to the ones above. -**Benchmark Llama Stack (default):** +### Comprehensive Benchmark Suite + +**Run all benchmarks with different cluster configurations:** ```bash -./run-benchmark.sh +./scripts/run-all-benchmarks.sh ``` -**Benchmark vLLM direct:** +This script will automatically: +- Scale deployments to different configurations +- Run benchmarks for each setup +- Generate output files with meaningful names that include setup information + +### Individual Benchmarks + +**Benchmark Llama Stack (runs against current cluster setup):** ```bash -./run-benchmark.sh --target vllm +./scripts/run-guidellm-benchmark.sh --target stack ``` -### Custom Configuration - -**Extended benchmark with high concurrency:** +**Benchmark vLLM direct (runs against current cluster setup):** ```bash -./run-benchmark.sh --target vllm --duration 120 --concurrent 20 +./scripts/run-guidellm-benchmark.sh --target vllm ``` -**Short test run:** +**Benchmark with custom parameters:** ```bash -./run-benchmark.sh --target stack --duration 30 --concurrent 5 +./scripts/run-guidellm-benchmark.sh --target stack --max-seconds 120 --prompt-tokens 1024 --output-tokens 512 ``` +**Benchmark with custom output file:** +```bash +./scripts/run-guidellm-benchmark.sh --target stack --output-file results/my-custom-benchmark.txt +``` + +### Generating Charts + +Once the benchmarks are run, you can generate performance charts from benchmark results: + +```bash +uv run ./scripts/generate_charts.py +``` + +This loads runs in the `results/` directory and creates visualizations comparing different configurations and replica counts. + +## Benchmark Workflow + +The benchmark suite is organized into two main scripts with distinct responsibilities: + +### 1. `run-all-benchmarks.sh` - Orchestration & Scaling +- **Purpose**: Manages different cluster configurations and orchestrates benchmark runs +- **Responsibilities**: + - Scales Kubernetes deployments (vLLM replicas, Stack replicas, worker counts) + - Runs benchmarks for each configuration + - Generates meaningful output filenames with setup information +- **Use case**: Running comprehensive performance testing across multiple configurations + +### 2. `run-guidellm-benchmark.sh` - Single Benchmark Execution +- **Purpose**: Executes a single benchmark against the current cluster state +- **Responsibilities**: + - Runs GuideLLM benchmark with configurable parameters + - Accepts custom output file paths + - No cluster scaling - benchmarks current deployment state +- **Use case**: Testing specific configurations or custom scenarios + +### Typical Workflow +1. **Comprehensive Testing**: Use `run-all-benchmarks.sh` to automatically test multiple configurations +2. **Custom Testing**: Use `run-guidellm-benchmark.sh` for specific parameter testing or manual cluster configurations +3. **Analysis**: Use `generate_charts.py` to visualize results from either approach + ## Command Reference -### run-benchmark.sh Options +### run-all-benchmarks.sh + +Orchestrates multiple benchmark runs with different cluster configurations. This script: +- Automatically scales deployments before each benchmark +- Runs benchmarks against the configured cluster setup +- Generates meaningfully named output files ```bash -./run-benchmark.sh [options] +./scripts/run-all-benchmarks.sh +``` + +**Configuration**: Edit the `configs` array in the script to customize benchmark configurations: +```bash +# Each line: (target, stack_replicas, vllm_replicas, stack_workers) +configs=( + "stack 1 1 1" + "stack 1 1 2" + "stack 1 1 4" + "vllm 1 1 -" +) +``` + +**Output files**: Generated with setup information in filename: +- Stack: `guidellm-benchmark-stack-s{replicas}-sw{workers}-v{vllm_replicas}-{timestamp}.txt` +- vLLM: `guidellm-benchmark-vllm-v{vllm_replicas}-{timestamp}.txt` + +### run-guidellm-benchmark.sh Options + +Runs a single benchmark against the current cluster setup (no scaling). + +```bash +./scripts/run-guidellm-benchmark.sh [options] Options: -t, --target Target to benchmark (default: stack) - -d, --duration Duration in seconds (default: 60) - -c, --concurrent Number of concurrent users (default: 10) + -s, --max-seconds Maximum duration in seconds (default: 60) + -p, --prompt-tokens Number of prompt tokens (default: 512) + -o, --output-tokens Number of output tokens (default: 256) + -r, --rate-type Rate type (default: concurrent) + -c, --rate Rate (default: 1,2,4,8,16,32,64,128) + --output-file Output file path (default: auto-generated) + --stack-deployment Name of the stack deployment (default: llama-stack-benchmark-server) + --vllm-deployment Name of the vllm deployment (default: vllm-server) + --stack-url URL of the stack service (default: http://llama-stack-benchmark-service:8323/v1/openai) -h, --help Show help message Examples: - ./run-benchmark.sh --target vllm # Benchmark vLLM direct - ./run-benchmark.sh --target stack # Benchmark Llama Stack - ./run-benchmark.sh -t vllm -d 120 -c 20 # vLLM with 120s, 20 users + ./scripts/run-guidellm-benchmark.sh --target vllm # Benchmark vLLM direct + ./scripts/run-guidellm-benchmark.sh --target stack # Benchmark Llama Stack (default) + ./scripts/run-guidellm-benchmark.sh -t vllm -s 60 -p 512 -o 256 # vLLM with custom parameters + ./scripts/run-guidellm-benchmark.sh --output-file results/my-benchmark.txt # Specify custom output file + ./scripts/run-guidellm-benchmark.sh --stack-deployment my-stack-server # Use custom stack deployment name ``` ## Local Testing @@ -100,55 +200,30 @@ Examples: For local development without Kubernetes: -**1. Start OpenAI mock server:** -```bash -uv run python openai-mock-server.py --port 8080 -``` - -**2. Run benchmark against mock server:** -```bash -uv run python benchmark.py \ - --base-url http://localhost:8080/v1 \ - --model mock-inference \ - --duration 30 \ - --concurrent 5 -``` - -**3. Test against local vLLM server:** -```bash -# If you have vLLM running locally on port 8000 -uv run python benchmark.py \ - --base-url http://localhost:8000/v1 \ - --model meta-llama/Llama-3.2-3B-Instruct \ - --duration 30 \ - --concurrent 5 -``` - -**4. Profile the running server:** -```bash -./profile_running_server.sh -``` - - - -### OpenAI Mock Server +**1. (Optional) Start Mock OpenAI server:** +There is a simple mock OpenAI server if you don't have an inference provider available. The `openai-mock-server.py` provides: - **OpenAI-compatible API** for testing without real models - **Configurable streaming delay** via `STREAM_DELAY_SECONDS` env var - **Consistent responses** for reproducible benchmarks - **Lightweight testing** without GPU requirements -**Mock server usage:** ```bash uv run python openai-mock-server.py --port 8080 ``` -The mock server is also deployed in k8s as `openai-mock-service:8080` and can be used by changing the Llama Stack configuration to use the `mock-vllm-inference` provider. +**2. Start Stack server:** +```bash +LLAMA_STACK_CONFIG=benchmarking/k8s-benchmark/stack_run_config.yaml uv run uvicorn llama_stack.core.server.server:create_app --port 8321 --workers 4 --factory +``` -## Files in this Directory - -- `benchmark.py` - Core benchmark script with async streaming support -- `run-benchmark.sh` - Main script with target selection and configuration -- `openai-mock-server.py` - Mock OpenAI API server for local testing -- `README.md` - This documentation file +**3. Run GuideLLM benchmark:** +```bash +GUIDELLM__PREFERRED_ROUTE="chat_completions" uv run guidellm benchmark run \ + --target "http://localhost:8321/v1/openai/v1" \ + --model "meta-llama/Llama-3.2-3B-Instruct" \ + --rate-type sweep \ + --max-seconds 60 \ + --data "prompt_tokens=256,output_tokens=128" --output-path='output.html' +``` diff --git a/benchmarking/k8s-benchmark/benchmark.py b/benchmarking/k8s-benchmark/benchmark.py deleted file mode 100644 index d5e34aa23..000000000 --- a/benchmarking/k8s-benchmark/benchmark.py +++ /dev/null @@ -1,265 +0,0 @@ -# Copyright (c) Meta Platforms, Inc. and affiliates. -# All rights reserved. -# -# This source code is licensed under the terms described in the LICENSE file in -# the root directory of this source tree. - -""" -Simple benchmark script for Llama Stack with OpenAI API compatibility. -""" - -import argparse -import asyncio -import os -import random -import statistics -import time - -import aiohttp - - -class BenchmarkStats: - def __init__(self): - self.response_times = [] - self.ttft_times = [] - self.chunks_received = [] - self.errors = [] - self.success_count = 0 - self.total_requests = 0 - self.concurrent_users = 0 - self.start_time = None - self.end_time = None - self._lock = asyncio.Lock() - - async def add_result(self, response_time: float, chunks: int, ttft: float = None, error: str = None): - async with self._lock: - self.total_requests += 1 - if error: - self.errors.append(error) - else: - self.success_count += 1 - self.response_times.append(response_time) - self.chunks_received.append(chunks) - if ttft is not None: - self.ttft_times.append(ttft) - - def print_summary(self): - if not self.response_times: - print("No successful requests to report") - if self.errors: - print(f"Total errors: {len(self.errors)}") - print("First 5 errors:") - for error in self.errors[:5]: - print(f" {error}") - return - - total_time = self.end_time - self.start_time - success_rate = (self.success_count / self.total_requests) * 100 - - print(f"\n{'=' * 60}") - print("BENCHMARK RESULTS") - - print("\nResponse Time Statistics:") - print(f" Mean: {statistics.mean(self.response_times):.3f}s") - print(f" Median: {statistics.median(self.response_times):.3f}s") - print(f" Min: {min(self.response_times):.3f}s") - print(f" Max: {max(self.response_times):.3f}s") - - if len(self.response_times) > 1: - print(f" Std Dev: {statistics.stdev(self.response_times):.3f}s") - - percentiles = [50, 90, 95, 99] - sorted_times = sorted(self.response_times) - print("\nPercentiles:") - for p in percentiles: - idx = int(len(sorted_times) * p / 100) - 1 - idx = max(0, min(idx, len(sorted_times) - 1)) - print(f" P{p}: {sorted_times[idx]:.3f}s") - - if self.ttft_times: - print("\nTime to First Token (TTFT) Statistics:") - print(f" Mean: {statistics.mean(self.ttft_times):.3f}s") - print(f" Median: {statistics.median(self.ttft_times):.3f}s") - print(f" Min: {min(self.ttft_times):.3f}s") - print(f" Max: {max(self.ttft_times):.3f}s") - - if len(self.ttft_times) > 1: - print(f" Std Dev: {statistics.stdev(self.ttft_times):.3f}s") - - sorted_ttft = sorted(self.ttft_times) - print("\nTTFT Percentiles:") - for p in percentiles: - idx = int(len(sorted_ttft) * p / 100) - 1 - idx = max(0, min(idx, len(sorted_ttft) - 1)) - print(f" P{p}: {sorted_ttft[idx]:.3f}s") - - if self.chunks_received: - print("\nStreaming Statistics:") - print(f" Mean chunks per response: {statistics.mean(self.chunks_received):.1f}") - print(f" Total chunks received: {sum(self.chunks_received)}") - - print(f"{'=' * 60}") - print(f"Total time: {total_time:.2f}s") - print(f"Concurrent users: {self.concurrent_users}") - print(f"Total requests: {self.total_requests}") - print(f"Successful requests: {self.success_count}") - print(f"Failed requests: {len(self.errors)}") - print(f"Success rate: {success_rate:.1f}%") - print(f"Requests per second: {self.success_count / total_time:.2f}") - - if self.errors: - print("\nErrors (showing first 5):") - for error in self.errors[:5]: - print(f" {error}") - - -class LlamaStackBenchmark: - def __init__(self, base_url: str, model_id: str): - self.base_url = base_url.rstrip("/") - self.model_id = model_id - self.headers = {"Content-Type": "application/json"} - self.test_messages = [ - [{"role": "user", "content": "Hi"}], - [{"role": "user", "content": "What is the capital of France?"}], - [{"role": "user", "content": "Explain quantum physics in simple terms."}], - [{"role": "user", "content": "Write a short story about a robot learning to paint."}], - [ - {"role": "user", "content": "What is machine learning?"}, - {"role": "assistant", "content": "Machine learning is a subset of AI..."}, - {"role": "user", "content": "Can you give me a practical example?"}, - ], - ] - - async def make_async_streaming_request(self) -> tuple[float, int, float | None, str | None]: - """Make a single async streaming chat completion request.""" - messages = random.choice(self.test_messages) - payload = {"model": self.model_id, "messages": messages, "stream": True, "max_tokens": 100} - - start_time = time.time() - chunks_received = 0 - ttft = None - error = None - - session = aiohttp.ClientSession() - - try: - async with session.post( - f"{self.base_url}/chat/completions", - headers=self.headers, - json=payload, - timeout=aiohttp.ClientTimeout(total=30), - ) as response: - if response.status == 200: - async for line in response.content: - if line: - line_str = line.decode("utf-8").strip() - if line_str.startswith("data: "): - chunks_received += 1 - if ttft is None: - ttft = time.time() - start_time - if line_str == "data: [DONE]": - break - - if chunks_received == 0: - error = "No streaming chunks received" - else: - text = await response.text() - error = f"HTTP {response.status}: {text[:100]}" - - except Exception as e: - error = f"Request error: {str(e)}" - finally: - await session.close() - - response_time = time.time() - start_time - return response_time, chunks_received, ttft, error - - async def run_benchmark(self, duration: int, concurrent_users: int) -> BenchmarkStats: - """Run benchmark using async requests for specified duration.""" - stats = BenchmarkStats() - stats.concurrent_users = concurrent_users - stats.start_time = time.time() - - print(f"Starting benchmark: {duration}s duration, {concurrent_users} concurrent users") - print(f"Target URL: {self.base_url}/chat/completions") - print(f"Model: {self.model_id}") - - connector = aiohttp.TCPConnector(limit=concurrent_users) - async with aiohttp.ClientSession(connector=connector): - - async def worker(worker_id: int): - """Worker that sends requests sequentially until canceled.""" - request_count = 0 - while True: - try: - response_time, chunks, ttft, error = await self.make_async_streaming_request() - await stats.add_result(response_time, chunks, ttft, error) - request_count += 1 - - except asyncio.CancelledError: - break - except Exception as e: - await stats.add_result(0, 0, None, f"Worker {worker_id} error: {str(e)}") - - # Progress reporting task - async def progress_reporter(): - last_report_time = time.time() - while True: - try: - await asyncio.sleep(1) # Report every second - if time.time() >= last_report_time + 10: # Report every 10 seconds - elapsed = time.time() - stats.start_time - print( - f"Completed: {stats.total_requests} requests in {elapsed:.1f}s, RPS: {stats.total_requests / elapsed:.1f}" - ) - last_report_time = time.time() - except asyncio.CancelledError: - break - - # Spawn concurrent workers - tasks = [asyncio.create_task(worker(i)) for i in range(concurrent_users)] - progress_task = asyncio.create_task(progress_reporter()) - tasks.append(progress_task) - - # Wait for duration then cancel all tasks - await asyncio.sleep(duration) - - for task in tasks: - task.cancel() - - # Wait for all tasks to complete - await asyncio.gather(*tasks, return_exceptions=True) - - stats.end_time = time.time() - return stats - - -def main(): - parser = argparse.ArgumentParser(description="Llama Stack Benchmark Tool") - parser.add_argument( - "--base-url", - default=os.getenv("BENCHMARK_BASE_URL", "http://localhost:8000/v1/openai/v1"), - help="Base URL for the API (default: http://localhost:8000/v1/openai/v1)", - ) - parser.add_argument( - "--model", default=os.getenv("INFERENCE_MODEL", "test-model"), help="Model ID to use for requests" - ) - parser.add_argument("--duration", type=int, default=60, help="Duration in seconds to run benchmark (default: 60)") - parser.add_argument("--concurrent", type=int, default=10, help="Number of concurrent users (default: 10)") - - args = parser.parse_args() - - benchmark = LlamaStackBenchmark(args.base_url, args.model) - - try: - stats = asyncio.run(benchmark.run_benchmark(args.duration, args.concurrent)) - stats.print_summary() - - except KeyboardInterrupt: - print("\nBenchmark interrupted by user") - except Exception as e: - print(f"Benchmark failed: {e}") - - -if __name__ == "__main__": - main() diff --git a/benchmarking/k8s-benchmark/profile_running_server.sh b/benchmarking/k8s-benchmark/profile_running_server.sh deleted file mode 100755 index 65d620583..000000000 --- a/benchmarking/k8s-benchmark/profile_running_server.sh +++ /dev/null @@ -1,52 +0,0 @@ -#!/bin/bash - -# Copyright (c) Meta Platforms, Inc. and affiliates. -# All rights reserved. -# -# This source code is licensed under the terms described in the LICENSE file in -# the root directory of this source tree. - -# Script to profile an already running Llama Stack server -# Usage: ./profile_running_server.sh [duration_seconds] [output_file] - -DURATION=${1:-60} # Default 60 seconds -OUTPUT_FILE=${2:-"llama_stack_profile"} # Default output file - -echo "Looking for running Llama Stack server..." - -# Find the server PID -SERVER_PID=$(ps aux | grep "llama_stack.core.server.server" | grep -v grep | awk '{print $2}' | head -1) - - -if [ -z "$SERVER_PID" ]; then - echo "Error: No running Llama Stack server found" - echo "Please start your server first with:" - echo "LLAMA_STACK_LOGGING=\"all=ERROR\" MOCK_INFERENCE_URL=http://localhost:8080 SAFETY_MODEL=llama-guard3:1b uv run --with llama-stack python -m llama_stack.core.server.server docs/source/distributions/k8s-benchmark/stack_run_config.yaml" - exit 1 -fi - -echo "Found Llama Stack server with PID: $SERVER_PID" - -# Start py-spy profiling -echo "Starting py-spy profiling for ${DURATION} seconds..." -echo "Output will be saved to: ${OUTPUT_FILE}.svg" -echo "" -echo "You can now run your load test..." -echo "" - -# Get the full path to py-spy -PYSPY_PATH=$(which py-spy) - -# Check if running as root, if not, use sudo -if [ "$EUID" -ne 0 ]; then - echo "py-spy requires root permissions on macOS. Running with sudo..." - sudo "$PYSPY_PATH" record -o "${OUTPUT_FILE}.svg" -d ${DURATION} -p $SERVER_PID -else - "$PYSPY_PATH" record -o "${OUTPUT_FILE}.svg" -d ${DURATION} -p $SERVER_PID -fi - -echo "" -echo "Profiling completed! Results saved to: ${OUTPUT_FILE}.svg" -echo "" -echo "To view the flame graph:" -echo "open ${OUTPUT_FILE}.svg" diff --git a/benchmarking/k8s-benchmark/results/guidellm-benchmark-stack-s1-sw1-v1-20250922-103408.txt b/benchmarking/k8s-benchmark/results/guidellm-benchmark-stack-s1-sw1-v1-20250922-103408.txt new file mode 100644 index 000000000..0f707a968 --- /dev/null +++ b/benchmarking/k8s-benchmark/results/guidellm-benchmark-stack-s1-sw1-v1-20250922-103408.txt @@ -0,0 +1,171 @@ +Collecting uv + Downloading uv-0.8.19-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.metadata (11 kB) +Downloading uv-0.8.19-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (20.9 MB) + ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 20.9/20.9 MB 144.3 MB/s eta 0:00:00 +Installing collected packages: uv +Successfully installed uv-0.8.19 +WARNING: Running pip as the 'root' user can result in broken permissions and conflicting behaviour with the system package manager. It is recommended to use a virtual environment instead: https://pip.pypa.io/warnings/venv + +[notice] A new release of pip is available: 24.0 -> 25.2 +[notice] To update, run: pip install --upgrade pip +Using Python 3.11.13 environment at: /usr/local +Resolved 61 packages in 551ms +Downloading pillow (6.3MiB) +Downloading hf-xet (3.0MiB) +Downloading tokenizers (3.1MiB) +Downloading pygments (1.2MiB) +Downloading pandas (11.8MiB) +Downloading aiohttp (1.7MiB) +Downloading pydantic-core (1.9MiB) +Downloading numpy (16.2MiB) +Downloading transformers (11.1MiB) +Downloading pyarrow (40.8MiB) + Downloading pydantic-core + Downloading aiohttp + Downloading tokenizers + Downloading hf-xet + Downloading pygments + Downloading pillow + Downloading numpy + Downloading pandas + Downloading transformers + Downloading pyarrow +Prepared 61 packages in 1.23s +Installed 61 packages in 114ms + + aiohappyeyeballs==2.6.1 + + aiohttp==3.12.15 + + aiosignal==1.4.0 + + annotated-types==0.7.0 + + anyio==4.10.0 + + attrs==25.3.0 + + certifi==2025.8.3 + + charset-normalizer==3.4.3 + + click==8.1.8 + + datasets==4.1.1 + + dill==0.4.0 + + filelock==3.19.1 + + frozenlist==1.7.0 + + fsspec==2025.9.0 + + ftfy==6.3.1 + + guidellm==0.3.0 + + h11==0.16.0 + + h2==4.3.0 + + hf-xet==1.1.10 + + hpack==4.1.0 + + httpcore==1.0.9 + + httpx==0.28.1 + + huggingface-hub==0.35.0 + + hyperframe==6.1.0 + + idna==3.10 + + loguru==0.7.3 + + markdown-it-py==4.0.0 + + mdurl==0.1.2 + + multidict==6.6.4 + + multiprocess==0.70.16 + + numpy==2.3.3 + + packaging==25.0 + + pandas==2.3.2 + + pillow==11.3.0 + + propcache==0.3.2 + + protobuf==6.32.1 + + pyarrow==21.0.0 + + pydantic==2.11.9 + + pydantic-core==2.33.2 + + pydantic-settings==2.10.1 + + pygments==2.19.2 + + python-dateutil==2.9.0.post0 + + python-dotenv==1.1.1 + + pytz==2025.2 + + pyyaml==6.0.2 + + regex==2025.9.18 + + requests==2.32.5 + + rich==14.1.0 + + safetensors==0.6.2 + + six==1.17.0 + + sniffio==1.3.1 + + tokenizers==0.22.1 + + tqdm==4.67.1 + + transformers==4.56.2 + + typing-extensions==4.15.0 + + typing-inspection==0.4.1 + + tzdata==2025.2 + + urllib3==2.5.0 + + wcwidth==0.2.14 + + xxhash==3.5.0 + + yarl==1.20.1 +Using Python 3.11.13 environment at: /usr/local +Audited 1 package in 3ms +Note: Environment variable`HF_TOKEN` is set and is the current active token independently from the token you've just configured. +Creating backend... +Backend openai_http connected to http://llama-stack-benchmark-service:8323/v1/openai for model meta-llama/Llama-3.2-3B-Instruct. +Creating request loader... +Created loader with 1000 unique requests from prompt_tokens=512,output_tokens=256. + + +╭─ Benchmarks ─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮ +│ [17:34:30] ⠋ 100% concurrent@1 (complete) Req: 0.3 req/s, 3.32s Lat, 1.0 Conc, 18 Comp, 1 Inc, 0 Err │ +│ Tok: 74.0 gen/s, 238.6 tot/s, 40.2ms TTFT, 13.4ms ITL, 546 Prompt, 246 Gen │ +│ [17:35:35] ⠋ 100% concurrent@2 (complete) Req: 0.6 req/s, 3.46s Lat, 2.0 Conc, 34 Comp, 2 Inc, 0 Err │ +│ Tok: 139.6 gen/s, 454.0 tot/s, 48.0ms TTFT, 14.1ms ITL, 546 Prompt, 243 Gen │ +│ [17:36:40] ⠋ 100% concurrent@4 (complete) Req: 1.1 req/s, 3.44s Lat, 3.9 Conc, 68 Comp, 4 Inc, 0 Err │ +│ Tok: 273.2 gen/s, 900.4 tot/s, 50.7ms TTFT, 14.3ms ITL, 546 Prompt, 238 Gen │ +│ [17:37:45] ⠋ 100% concurrent@8 (complete) Req: 2.2 req/s, 3.55s Lat, 7.7 Conc, 129 Comp, 8 Inc, 0 Err │ +│ Tok: 519.1 gen/s, 1699.8 tot/s, 66.0ms TTFT, 14.6ms ITL, 547 Prompt, 240 Gen │ +│ [17:38:50] ⠋ 100% concurrent@16 (complete) Req: 4.1 req/s, 3.76s Lat, 15.5 Conc, 247 Comp, 16 Inc, 0 Err │ +│ Tok: 1005.5 gen/s, 3256.7 tot/s, 101.0ms TTFT, 15.0ms ITL, 547 Prompt, 244 Gen │ +│ [17:39:56] ⠋ 100% concurrent@32 (complete) Req: 8.1 req/s, 3.84s Lat, 30.9 Conc, 483 Comp, 32 Inc, 0 Err │ +│ Tok: 1926.3 gen/s, 6327.2 tot/s, 295.7ms TTFT, 14.8ms ITL, 547 Prompt, 239 Gen │ +│ [17:41:03] ⠋ 100% concurrent@64 (complete) Req: 9.9 req/s, 6.05s Lat, 59.7 Conc, 576 Comp, 58 Inc, 0 Err │ +│ Tok: 2381.0 gen/s, 7774.5 tot/s, 1196.2ms TTFT, 20.2ms ITL, 547 Prompt, 241 Gen │ +│ [17:42:10] ⠋ 100% concurrent@128 (complete) Req: 9.2 req/s, 11.59s Lat, 107.2 Conc, 514 Comp, 117 Inc, 0 Err │ +│ Tok: 2233.4 gen/s, 7286.3 tot/s, 2403.9ms TTFT, 38.2ms ITL, 547 Prompt, 242 Gen │ +╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯ +Generating... ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ (8/8) [ 0:08:41 < 0:00:00 ] + +Benchmarks Metadata: + Run id:511a14fd-ba11-4ffa-92ef-7cc23db4dd38 + Duration:528.5 seconds + Profile:type=concurrent, strategies=['concurrent', 'concurrent', 'concurrent', 'concurrent', 'concurrent', 'concurrent', 'concurrent', 'concurrent'], streams=[1, 2, 4, 8, 16, 32, 64, 128] + Args:max_number=None, max_duration=60.0, warmup_number=None, warmup_duration=3.0, cooldown_number=None, cooldown_duration=None + Worker:type_='generative_requests_worker' backend_type='openai_http' backend_target='http://llama-stack-benchmark-service:8323/v1/openai' backend_model='meta-llama/Llama-3.2-3B-Instruct' + backend_info={'max_output_tokens': 16384, 'timeout': 300, 'http2': True, 'follow_redirects': True, 'headers': {}, 'text_completions_path': '/v1/completions', 'chat_completions_path': + '/v1/chat/completions'} + Request Loader:type_='generative_request_loader' data='prompt_tokens=512,output_tokens=256' data_args=None processor='meta-llama/Llama-3.2-3B-Instruct' processor_args=None + Extras:None + + +Benchmarks Info: +=================================================================================================================================================== +Metadata |||| Requests Made ||| Prompt Tok/Req ||| Output Tok/Req ||| Prompt Tok Total||| Output Tok Total|| + Benchmark| Start Time| End Time| Duration (s)| Comp| Inc| Err| Comp| Inc| Err| Comp| Inc| Err| Comp| Inc| Err| Comp| Inc| Err +--------------|-----------|---------|-------------|------|-----|-----|------|------|----|------|------|----|-------|------|----|-------|------|---- + concurrent@1| 17:34:35| 17:35:35| 60.0| 18| 1| 0| 546.4| 512.0| 0.0| 246.0| 14.0| 0.0| 9835| 512| 0| 4428| 14| 0 + concurrent@2| 17:35:40| 17:36:40| 60.0| 34| 2| 0| 546.4| 512.0| 0.0| 242.7| 80.0| 0.0| 18577| 1024| 0| 8253| 160| 0 + concurrent@4| 17:36:45| 17:37:45| 60.0| 68| 4| 0| 546.4| 512.0| 0.0| 238.1| 103.2| 0.0| 37156| 2048| 0| 16188| 413| 0 + concurrent@8| 17:37:50| 17:38:50| 60.0| 129| 8| 0| 546.7| 512.0| 0.0| 240.3| 180.0| 0.0| 70518| 4096| 0| 31001| 1440| 0 + concurrent@16| 17:38:55| 17:39:55| 60.0| 247| 16| 0| 546.6| 512.0| 0.0| 244.1| 142.6| 0.0| 135002| 8192| 0| 60300| 2281| 0 + concurrent@32| 17:40:01| 17:41:01| 60.0| 483| 32| 0| 546.5| 512.0| 0.0| 239.2| 123.2| 0.0| 263972| 16384| 0| 115540| 3944| 0 + concurrent@64| 17:41:08| 17:42:08| 60.0| 576| 58| 0| 546.6| 512.0| 0.0| 241.3| 13.9| 0.0| 314817| 29696| 0| 138976| 807| 0 +concurrent@128| 17:42:15| 17:43:15| 60.0| 514| 117| 0| 546.5| 512.0| 0.0| 241.6| 143.9| 0.0| 280911| 59904| 0| 124160| 16832| 0 +=================================================================================================================================================== + + +Benchmarks Stats: +======================================================================================================================================================= +Metadata | Request Stats || Out Tok/sec| Tot Tok/sec| Req Latency (sec) ||| TTFT (ms) ||| ITL (ms) ||| TPOT (ms) || + Benchmark| Per Second| Concurrency| mean| mean| mean| median| p99| mean| median| p99| mean| median| p99| mean| median| p99 +--------------|-----------|------------|------------|------------|------|-------|------|-------|-------|-------|-----|-------|-----|-----|-------|----- + concurrent@1| 0.30| 1.00| 74.0| 238.6| 3.32| 3.43| 3.61| 40.2| 39.3| 51.2| 13.4| 13.3| 14.0| 13.3| 13.2| 13.9 + concurrent@2| 0.58| 1.99| 139.6| 454.0| 3.46| 3.64| 3.74| 48.0| 45.8| 72.0| 14.1| 14.1| 14.5| 14.0| 14.0| 14.4 + concurrent@4| 1.15| 3.95| 273.2| 900.4| 3.44| 3.69| 3.74| 50.7| 47.2| 118.6| 14.3| 14.3| 14.4| 14.2| 14.2| 14.4 + concurrent@8| 2.16| 7.67| 519.1| 1699.8| 3.55| 3.76| 3.87| 66.0| 48.8| 208.2| 14.6| 14.5| 14.8| 14.5| 14.5| 14.8 + concurrent@16| 4.12| 15.48| 1005.5| 3256.7| 3.76| 3.90| 4.18| 101.0| 65.6| 396.7| 15.0| 15.0| 15.9| 15.0| 15.0| 15.9 + concurrent@32| 8.05| 30.89| 1926.3| 6327.2| 3.84| 4.04| 4.39| 295.7| 265.6| 720.4| 14.8| 14.9| 15.5| 14.8| 14.8| 15.3 + concurrent@64| 9.87| 59.74| 2381.0| 7774.5| 6.05| 6.18| 9.94| 1196.2| 1122.5| 4295.3| 20.2| 20.0| 25.8| 20.1| 19.9| 25.8 +concurrent@128| 9.25| 107.16| 2233.4| 7286.3| 11.59| 12.04| 14.46| 2403.9| 2322.3| 4001.5| 38.2| 38.5| 53.0| 38.0| 38.3| 52.7 +======================================================================================================================================================= + +Saving benchmarks report... +Benchmarks report saved to /benchmarks.json + +Benchmarking complete. diff --git a/benchmarking/k8s-benchmark/results/guidellm-benchmark-stack-s1-sw2-v1-20250922-104457.txt b/benchmarking/k8s-benchmark/results/guidellm-benchmark-stack-s1-sw2-v1-20250922-104457.txt new file mode 100644 index 000000000..21f1ef425 --- /dev/null +++ b/benchmarking/k8s-benchmark/results/guidellm-benchmark-stack-s1-sw2-v1-20250922-104457.txt @@ -0,0 +1,171 @@ +Collecting uv + Downloading uv-0.8.19-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.metadata (11 kB) +Downloading uv-0.8.19-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (20.9 MB) + ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 20.9/20.9 MB 149.3 MB/s eta 0:00:00 +Installing collected packages: uv +Successfully installed uv-0.8.19 +WARNING: Running pip as the 'root' user can result in broken permissions and conflicting behaviour with the system package manager. It is recommended to use a virtual environment instead: https://pip.pypa.io/warnings/venv + +[notice] A new release of pip is available: 24.0 -> 25.2 +[notice] To update, run: pip install --upgrade pip +Using Python 3.11.13 environment at: /usr/local +Resolved 61 packages in 494ms +Downloading pandas (11.8MiB) +Downloading tokenizers (3.1MiB) +Downloading pygments (1.2MiB) +Downloading aiohttp (1.7MiB) +Downloading transformers (11.1MiB) +Downloading numpy (16.2MiB) +Downloading pillow (6.3MiB) +Downloading pydantic-core (1.9MiB) +Downloading hf-xet (3.0MiB) +Downloading pyarrow (40.8MiB) + Downloading pydantic-core + Downloading aiohttp + Downloading tokenizers + Downloading hf-xet + Downloading pillow + Downloading pygments + Downloading numpy + Downloading pandas + Downloading pyarrow + Downloading transformers +Prepared 61 packages in 1.24s +Installed 61 packages in 126ms + + aiohappyeyeballs==2.6.1 + + aiohttp==3.12.15 + + aiosignal==1.4.0 + + annotated-types==0.7.0 + + anyio==4.10.0 + + attrs==25.3.0 + + certifi==2025.8.3 + + charset-normalizer==3.4.3 + + click==8.1.8 + + datasets==4.1.1 + + dill==0.4.0 + + filelock==3.19.1 + + frozenlist==1.7.0 + + fsspec==2025.9.0 + + ftfy==6.3.1 + + guidellm==0.3.0 + + h11==0.16.0 + + h2==4.3.0 + + hf-xet==1.1.10 + + hpack==4.1.0 + + httpcore==1.0.9 + + httpx==0.28.1 + + huggingface-hub==0.35.0 + + hyperframe==6.1.0 + + idna==3.10 + + loguru==0.7.3 + + markdown-it-py==4.0.0 + + mdurl==0.1.2 + + multidict==6.6.4 + + multiprocess==0.70.16 + + numpy==2.3.3 + + packaging==25.0 + + pandas==2.3.2 + + pillow==11.3.0 + + propcache==0.3.2 + + protobuf==6.32.1 + + pyarrow==21.0.0 + + pydantic==2.11.9 + + pydantic-core==2.33.2 + + pydantic-settings==2.10.1 + + pygments==2.19.2 + + python-dateutil==2.9.0.post0 + + python-dotenv==1.1.1 + + pytz==2025.2 + + pyyaml==6.0.2 + + regex==2025.9.18 + + requests==2.32.5 + + rich==14.1.0 + + safetensors==0.6.2 + + six==1.17.0 + + sniffio==1.3.1 + + tokenizers==0.22.1 + + tqdm==4.67.1 + + transformers==4.56.2 + + typing-extensions==4.15.0 + + typing-inspection==0.4.1 + + tzdata==2025.2 + + urllib3==2.5.0 + + wcwidth==0.2.14 + + xxhash==3.5.0 + + yarl==1.20.1 +Using Python 3.11.13 environment at: /usr/local +Audited 1 package in 3ms +Note: Environment variable`HF_TOKEN` is set and is the current active token independently from the token you've just configured. +Creating backend... +Backend openai_http connected to http://llama-stack-benchmark-service:8323/v1/openai for model meta-llama/Llama-3.2-3B-Instruct. +Creating request loader... +Created loader with 1000 unique requests from prompt_tokens=512,output_tokens=256. + + +╭─ Benchmarks ─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮ +│ [17:45:18] ⠋ 100% concurrent@1 (complete) Req: 0.3 req/s, 3.42s Lat, 1.0 Conc, 17 Comp, 1 Inc, 0 Err │ +│ Tok: 73.9 gen/s, 233.7 tot/s, 50.2ms TTFT, 13.4ms ITL, 547 Prompt, 253 Gen │ +│ [17:46:23] ⠋ 100% concurrent@2 (complete) Req: 0.6 req/s, 3.42s Lat, 2.0 Conc, 34 Comp, 2 Inc, 0 Err │ +│ Tok: 134.7 gen/s, 447.4 tot/s, 50.8ms TTFT, 14.3ms ITL, 546 Prompt, 235 Gen │ +│ [17:47:28] ⠋ 100% concurrent@4 (complete) Req: 1.1 req/s, 3.55s Lat, 3.9 Conc, 66 Comp, 4 Inc, 0 Err │ +│ Tok: 268.7 gen/s, 873.1 tot/s, 54.9ms TTFT, 14.4ms ITL, 547 Prompt, 243 Gen │ +│ [17:48:33] ⠋ 100% concurrent@8 (complete) Req: 2.2 req/s, 3.56s Lat, 7.8 Conc, 130 Comp, 8 Inc, 0 Err │ +│ Tok: 526.1 gen/s, 1728.4 tot/s, 60.6ms TTFT, 14.7ms ITL, 547 Prompt, 239 Gen │ +│ [17:49:38] ⠋ 100% concurrent@16 (complete) Req: 4.1 req/s, 3.79s Lat, 15.7 Conc, 246 Comp, 16 Inc, 0 Err │ +│ Tok: 1006.9 gen/s, 3268.6 tot/s, 74.8ms TTFT, 15.3ms ITL, 547 Prompt, 243 Gen │ +│ [17:50:44] ⠋ 100% concurrent@32 (complete) Req: 7.8 req/s, 3.95s Lat, 30.9 Conc, 467 Comp, 32 Inc, 0 Err │ +│ Tok: 1912.0 gen/s, 6191.6 tot/s, 119.1ms TTFT, 15.7ms ITL, 547 Prompt, 244 Gen │ +│ [17:51:50] ⠋ 100% concurrent@64 (complete) Req: 13.0 req/s, 4.75s Lat, 61.8 Conc, 776 Comp, 64 Inc, 0 Err │ +│ Tok: 3154.3 gen/s, 10273.3 tot/s, 339.1ms TTFT, 18.3ms ITL, 547 Prompt, 242 Gen │ +│ [17:52:58] ⠋ 100% concurrent@128 (complete) Req: 15.1 req/s, 7.82s Lat, 117.7 Conc, 898 Comp, 127 Inc, 0 Err │ +│ Tok: 3617.4 gen/s, 11843.9 tot/s, 1393.8ms TTFT, 26.8ms ITL, 547 Prompt, 240 Gen │ +╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯ +Generating... ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ (8/8) [ 0:08:41 < 0:00:00 ] + +Benchmarks Metadata: + Run id:f73d408e-256a-4c32-aa40-05e8d7098b66 + Duration:529.2 seconds + Profile:type=concurrent, strategies=['concurrent', 'concurrent', 'concurrent', 'concurrent', 'concurrent', 'concurrent', 'concurrent', 'concurrent'], streams=[1, 2, 4, 8, 16, 32, 64, 128] + Args:max_number=None, max_duration=60.0, warmup_number=None, warmup_duration=3.0, cooldown_number=None, cooldown_duration=None + Worker:type_='generative_requests_worker' backend_type='openai_http' backend_target='http://llama-stack-benchmark-service:8323/v1/openai' backend_model='meta-llama/Llama-3.2-3B-Instruct' + backend_info={'max_output_tokens': 16384, 'timeout': 300, 'http2': True, 'follow_redirects': True, 'headers': {}, 'text_completions_path': '/v1/completions', 'chat_completions_path': + '/v1/chat/completions'} + Request Loader:type_='generative_request_loader' data='prompt_tokens=512,output_tokens=256' data_args=None processor='meta-llama/Llama-3.2-3B-Instruct' processor_args=None + Extras:None + + +Benchmarks Info: +===================================================================================================================================================== +Metadata |||| Requests Made ||| Prompt Tok/Req ||| Output Tok/Req ||| Prompt Tok Total||| Output Tok Total || + Benchmark| Start Time| End Time| Duration (s)| Comp| Inc| Err| Comp| Inc| Err| Comp| Inc| Err| Comp| Inc| Err| Comp| Inc| Err +--------------|-----------|---------|-------------|------|-----|-----|------|------|----|------|------|----|-------|------|----|--------|------|----- + concurrent@1| 17:45:23| 17:46:23| 60.0| 17| 1| 0| 546.6| 512.0| 0.0| 252.8| 136.0| 0.0| 9292| 512| 0| 4298| 136| 0 + concurrent@2| 17:46:28| 17:47:28| 60.0| 34| 2| 0| 546.4| 512.0| 0.0| 235.4| 130.0| 0.0| 18577| 1024| 0| 8003| 260| 0 + concurrent@4| 17:47:33| 17:48:33| 60.0| 66| 4| 0| 546.5| 512.0| 0.0| 243.0| 97.5| 0.0| 36072| 2048| 0| 16035| 390| 0 + concurrent@8| 17:48:38| 17:49:38| 60.0| 130| 8| 0| 546.6| 512.0| 0.0| 239.2| 146.0| 0.0| 71052| 4096| 0| 31090| 1168| 0 + concurrent@16| 17:49:43| 17:50:43| 60.0| 246| 16| 0| 546.6| 512.0| 0.0| 243.3| 112.3| 0.0| 134456| 8192| 0| 59862| 1797| 0 + concurrent@32| 17:50:49| 17:51:49| 60.0| 467| 32| 0| 546.6| 512.0| 0.0| 244.2| 147.3| 0.0| 255242| 16384| 0| 114038| 4714| 0 + concurrent@64| 17:51:55| 17:52:55| 60.0| 776| 64| 0| 546.5| 512.0| 0.0| 242.2| 106.1| 0.0| 424115| 32768| 0| 187916| 6788| 0 +concurrent@128| 17:53:03| 17:54:03| 60.0| 898| 127| 0| 546.5| 512.0| 0.0| 240.3| 69.8| 0.0| 490789| 65024| 0| 215810| 8864| 0 +===================================================================================================================================================== + + +Benchmarks Stats: +====================================================================================================================================================== +Metadata | Request Stats || Out Tok/sec| Tot Tok/sec| Req Latency (sec)||| TTFT (ms) ||| ITL (ms) ||| TPOT (ms) || + Benchmark| Per Second| Concurrency| mean| mean| mean| median| p99| mean| median| p99| mean| median| p99| mean| median| p99 +--------------|-----------|------------|------------|------------|-----|-------|------|-------|-------|-------|-----|-------|-----|-----|-------|----- + concurrent@1| 0.29| 1.00| 73.9| 233.7| 3.42| 3.45| 3.50| 50.2| 50.9| 62.5| 13.4| 13.4| 13.5| 13.3| 13.3| 13.5 + concurrent@2| 0.57| 1.96| 134.7| 447.4| 3.42| 3.67| 4.12| 50.8| 49.2| 79.8| 14.3| 14.2| 15.9| 14.3| 14.2| 15.9 + concurrent@4| 1.11| 3.92| 268.7| 873.1| 3.55| 3.72| 3.80| 54.9| 51.7| 101.3| 14.4| 14.4| 14.5| 14.4| 14.4| 14.5 + concurrent@8| 2.20| 7.82| 526.1| 1728.4| 3.56| 3.78| 3.93| 60.6| 49.8| 189.5| 14.7| 14.7| 14.8| 14.6| 14.6| 14.8 + concurrent@16| 4.14| 15.66| 1006.9| 3268.6| 3.79| 3.94| 4.25| 74.8| 54.3| 328.4| 15.3| 15.3| 16.1| 15.2| 15.2| 16.0 + concurrent@32| 7.83| 30.91| 1912.0| 6191.6| 3.95| 4.07| 4.53| 119.1| 80.5| 674.0| 15.7| 15.6| 17.4| 15.7| 15.6| 17.3 + concurrent@64| 13.03| 61.85| 3154.3| 10273.3| 4.75| 4.93| 5.43| 339.1| 321.1| 1146.6| 18.3| 18.4| 19.3| 18.2| 18.3| 19.2 +concurrent@128| 15.05| 117.71| 3617.4| 11843.9| 7.82| 8.58| 13.35| 1393.8| 1453.0| 5232.2| 26.8| 26.7| 36.0| 26.7| 26.6| 35.9 +====================================================================================================================================================== + +Saving benchmarks report... +Benchmarks report saved to /benchmarks.json + +Benchmarking complete. diff --git a/benchmarking/k8s-benchmark/results/guidellm-benchmark-stack-s1-sw4-v1-20250922-105539.txt b/benchmarking/k8s-benchmark/results/guidellm-benchmark-stack-s1-sw4-v1-20250922-105539.txt new file mode 100644 index 000000000..a192f0ba3 --- /dev/null +++ b/benchmarking/k8s-benchmark/results/guidellm-benchmark-stack-s1-sw4-v1-20250922-105539.txt @@ -0,0 +1,171 @@ +Collecting uv + Downloading uv-0.8.19-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.metadata (11 kB) +Downloading uv-0.8.19-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (20.9 MB) + ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 20.9/20.9 MB 156.8 MB/s eta 0:00:00 +Installing collected packages: uv +Successfully installed uv-0.8.19 +WARNING: Running pip as the 'root' user can result in broken permissions and conflicting behaviour with the system package manager. It is recommended to use a virtual environment instead: https://pip.pypa.io/warnings/venv + +[notice] A new release of pip is available: 24.0 -> 25.2 +[notice] To update, run: pip install --upgrade pip +Using Python 3.11.13 environment at: /usr/local +Resolved 61 packages in 480ms +Downloading pillow (6.3MiB) +Downloading pydantic-core (1.9MiB) +Downloading pyarrow (40.8MiB) +Downloading aiohttp (1.7MiB) +Downloading numpy (16.2MiB) +Downloading pygments (1.2MiB) +Downloading transformers (11.1MiB) +Downloading pandas (11.8MiB) +Downloading tokenizers (3.1MiB) +Downloading hf-xet (3.0MiB) + Downloading pydantic-core + Downloading aiohttp + Downloading tokenizers + Downloading hf-xet + Downloading pygments + Downloading pillow + Downloading numpy + Downloading pandas + Downloading pyarrow + Downloading transformers +Prepared 61 packages in 1.25s +Installed 61 packages in 126ms + + aiohappyeyeballs==2.6.1 + + aiohttp==3.12.15 + + aiosignal==1.4.0 + + annotated-types==0.7.0 + + anyio==4.10.0 + + attrs==25.3.0 + + certifi==2025.8.3 + + charset-normalizer==3.4.3 + + click==8.1.8 + + datasets==4.1.1 + + dill==0.4.0 + + filelock==3.19.1 + + frozenlist==1.7.0 + + fsspec==2025.9.0 + + ftfy==6.3.1 + + guidellm==0.3.0 + + h11==0.16.0 + + h2==4.3.0 + + hf-xet==1.1.10 + + hpack==4.1.0 + + httpcore==1.0.9 + + httpx==0.28.1 + + huggingface-hub==0.35.0 + + hyperframe==6.1.0 + + idna==3.10 + + loguru==0.7.3 + + markdown-it-py==4.0.0 + + mdurl==0.1.2 + + multidict==6.6.4 + + multiprocess==0.70.16 + + numpy==2.3.3 + + packaging==25.0 + + pandas==2.3.2 + + pillow==11.3.0 + + propcache==0.3.2 + + protobuf==6.32.1 + + pyarrow==21.0.0 + + pydantic==2.11.9 + + pydantic-core==2.33.2 + + pydantic-settings==2.10.1 + + pygments==2.19.2 + + python-dateutil==2.9.0.post0 + + python-dotenv==1.1.1 + + pytz==2025.2 + + pyyaml==6.0.2 + + regex==2025.9.18 + + requests==2.32.5 + + rich==14.1.0 + + safetensors==0.6.2 + + six==1.17.0 + + sniffio==1.3.1 + + tokenizers==0.22.1 + + tqdm==4.67.1 + + transformers==4.56.2 + + typing-extensions==4.15.0 + + typing-inspection==0.4.1 + + tzdata==2025.2 + + urllib3==2.5.0 + + wcwidth==0.2.14 + + xxhash==3.5.0 + + yarl==1.20.1 +Using Python 3.11.13 environment at: /usr/local +Audited 1 package in 4ms +Note: Environment variable`HF_TOKEN` is set and is the current active token independently from the token you've just configured. +Creating backend... +Backend openai_http connected to http://llama-stack-benchmark-service:8323/v1/openai for model meta-llama/Llama-3.2-3B-Instruct. +Creating request loader... +Created loader with 1000 unique requests from prompt_tokens=512,output_tokens=256. + + +╭─ Benchmarks ─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮ +│ [17:55:59] ⠋ 100% concurrent@1 (complete) Req: 0.3 req/s, 3.33s Lat, 1.0 Conc, 18 Comp, 1 Inc, 0 Err │ +│ Tok: 74.0 gen/s, 238.0 tot/s, 49.6ms TTFT, 13.4ms ITL, 546 Prompt, 246 Gen │ +│ [17:57:04] ⠋ 100% concurrent@2 (complete) Req: 0.6 req/s, 3.32s Lat, 1.9 Conc, 35 Comp, 2 Inc, 0 Err │ +│ Tok: 137.1 gen/s, 457.5 tot/s, 50.6ms TTFT, 14.0ms ITL, 546 Prompt, 234 Gen │ +│ [17:58:09] ⠋ 100% concurrent@4 (complete) Req: 1.2 req/s, 3.42s Lat, 4.0 Conc, 69 Comp, 4 Inc, 0 Err │ +│ Tok: 276.7 gen/s, 907.2 tot/s, 52.7ms TTFT, 14.1ms ITL, 547 Prompt, 240 Gen │ +│ [17:59:14] ⠋ 100% concurrent@8 (complete) Req: 2.3 req/s, 3.47s Lat, 7.8 Conc, 134 Comp, 8 Inc, 0 Err │ +│ Tok: 541.4 gen/s, 1775.4 tot/s, 57.3ms TTFT, 14.3ms ITL, 547 Prompt, 240 Gen │ +│ [18:00:19] ⠋ 100% concurrent@16 (complete) Req: 4.3 req/s, 3.60s Lat, 15.6 Conc, 259 Comp, 16 Inc, 0 Err │ +│ Tok: 1034.8 gen/s, 3401.7 tot/s, 72.3ms TTFT, 14.8ms ITL, 547 Prompt, 239 Gen │ +│ [18:01:25] ⠋ 100% concurrent@32 (complete) Req: 8.4 req/s, 3.69s Lat, 31.1 Conc, 505 Comp, 32 Inc, 0 Err │ +│ Tok: 2029.7 gen/s, 6641.5 tot/s, 91.6ms TTFT, 15.0ms ITL, 547 Prompt, 241 Gen │ +│ [18:02:31] ⠋ 100% concurrent@64 (complete) Req: 13.6 req/s, 4.50s Lat, 61.4 Conc, 818 Comp, 64 Inc, 0 Err │ +│ Tok: 3333.9 gen/s, 10787.0 tot/s, 171.3ms TTFT, 17.8ms ITL, 547 Prompt, 244 Gen │ +│ [18:03:40] ⠋ 100% concurrent@128 (complete) Req: 16.1 req/s, 7.43s Lat, 119.5 Conc, 964 Comp, 122 Inc, 0 Err │ +│ Tok: 3897.0 gen/s, 12679.4 tot/s, 446.4ms TTFT, 28.9ms ITL, 547 Prompt, 243 Gen │ +╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯ +Generating... ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ (8/8) [ 0:08:41 < 0:00:00 ] + +Benchmarks Metadata: + Run id:5393e64f-d9f8-4548-95d8-da320bba1c24 + Duration:530.1 seconds + Profile:type=concurrent, strategies=['concurrent', 'concurrent', 'concurrent', 'concurrent', 'concurrent', 'concurrent', 'concurrent', 'concurrent'], streams=[1, 2, 4, 8, 16, 32, 64, 128] + Args:max_number=None, max_duration=60.0, warmup_number=None, warmup_duration=3.0, cooldown_number=None, cooldown_duration=None + Worker:type_='generative_requests_worker' backend_type='openai_http' backend_target='http://llama-stack-benchmark-service:8323/v1/openai' backend_model='meta-llama/Llama-3.2-3B-Instruct' + backend_info={'max_output_tokens': 16384, 'timeout': 300, 'http2': True, 'follow_redirects': True, 'headers': {}, 'text_completions_path': '/v1/completions', 'chat_completions_path': + '/v1/chat/completions'} + Request Loader:type_='generative_request_loader' data='prompt_tokens=512,output_tokens=256' data_args=None processor='meta-llama/Llama-3.2-3B-Instruct' processor_args=None + Extras:None + + +Benchmarks Info: +=================================================================================================================================================== +Metadata |||| Requests Made ||| Prompt Tok/Req ||| Output Tok/Req ||| Prompt Tok Total||| Output Tok Total|| + Benchmark| Start Time| End Time| Duration (s)| Comp| Inc| Err| Comp| Inc| Err| Comp| Inc| Err| Comp| Inc| Err| Comp| Inc| Err +--------------|-----------|---------|-------------|------|-----|-----|------|------|----|------|------|----|-------|------|----|-------|------|---- + concurrent@1| 17:56:04| 17:57:04| 60.0| 18| 1| 0| 546.4| 512.0| 0.0| 246.4| 256.0| 0.0| 9836| 512| 0| 4436| 256| 0 + concurrent@2| 17:57:09| 17:58:09| 60.0| 35| 2| 0| 546.4| 512.0| 0.0| 233.9| 132.0| 0.0| 19124| 1024| 0| 8188| 264| 0 + concurrent@4| 17:58:14| 17:59:14| 60.0| 69| 4| 0| 546.6| 512.0| 0.0| 239.9| 60.5| 0.0| 37715| 2048| 0| 16553| 242| 0 + concurrent@8| 17:59:19| 18:00:19| 60.0| 134| 8| 0| 546.6| 512.0| 0.0| 239.8| 126.6| 0.0| 73243| 4096| 0| 32135| 1013| 0 + concurrent@16| 18:00:24| 18:01:24| 60.0| 259| 16| 0| 546.6| 512.0| 0.0| 239.0| 115.7| 0.0| 141561| 8192| 0| 61889| 1851| 0 + concurrent@32| 18:01:30| 18:02:30| 60.0| 505| 32| 0| 546.5| 512.0| 0.0| 240.5| 113.2| 0.0| 275988| 16384| 0| 121466| 3623| 0 + concurrent@64| 18:02:37| 18:03:37| 60.0| 818| 64| 0| 546.6| 512.0| 0.0| 244.5| 132.4| 0.0| 447087| 32768| 0| 199988| 8475| 0 +concurrent@128| 18:03:45| 18:04:45| 60.0| 964| 122| 0| 546.5| 512.0| 0.0| 242.5| 133.1| 0.0| 526866| 62464| 0| 233789| 16241| 0 +=================================================================================================================================================== + + +Benchmarks Stats: +======================================================================================================================================================= +Metadata | Request Stats || Out Tok/sec| Tot Tok/sec| Req Latency (sec) ||| TTFT (ms) ||| ITL (ms) ||| TPOT (ms) || + Benchmark| Per Second| Concurrency| mean| mean| mean| median| p99| mean| median| p99| mean| median| p99| mean| median| p99 +--------------|-----------|------------|------------|------------|------|--------|------|------|-------|-------|-----|-------|-----|-----|-------|----- + concurrent@1| 0.30| 1.00| 74.0| 238.0| 3.33| 3.44| 3.63| 49.6| 47.2| 66.1| 13.4| 13.3| 14.0| 13.3| 13.3| 14.0 + concurrent@2| 0.59| 1.95| 137.1| 457.5| 3.32| 3.61| 3.67| 50.6| 48.6| 80.4| 14.0| 14.0| 14.2| 13.9| 13.9| 14.1 + concurrent@4| 1.15| 3.95| 276.7| 907.2| 3.42| 3.61| 3.77| 52.7| 49.7| 106.9| 14.1| 14.0| 14.6| 14.0| 13.9| 14.5 + concurrent@8| 2.26| 7.83| 541.4| 1775.4| 3.47| 3.70| 3.79| 57.3| 50.9| 171.3| 14.3| 14.3| 14.4| 14.2| 14.2| 14.4 + concurrent@16| 4.33| 15.57| 1034.8| 3401.7| 3.60| 3.81| 4.22| 72.3| 52.0| 292.9| 14.8| 14.7| 16.3| 14.7| 14.7| 16.3 + concurrent@32| 8.44| 31.12| 2029.7| 6641.5| 3.69| 3.89| 4.24| 91.6| 62.6| 504.6| 15.0| 15.0| 15.4| 14.9| 14.9| 15.4 + concurrent@64| 13.64| 61.40| 3333.9| 10787.0| 4.50| 4.61| 5.67| 171.3| 101.2| 1165.6| 17.8| 17.7| 19.2| 17.7| 17.6| 19.1 +concurrent@128| 16.07| 119.45| 3897.0| 12679.4| 7.43| 7.63| 9.74| 446.4| 195.8| 2533.1| 28.9| 28.9| 31.0| 28.8| 28.8| 30.9 +======================================================================================================================================================= + +Saving benchmarks report... +Benchmarks report saved to /benchmarks.json + +Benchmarking complete. diff --git a/benchmarking/k8s-benchmark/results/guidellm-benchmark-vllm-v1-20250922-111127.txt b/benchmarking/k8s-benchmark/results/guidellm-benchmark-vllm-v1-20250922-111127.txt new file mode 100644 index 000000000..8bee7d905 --- /dev/null +++ b/benchmarking/k8s-benchmark/results/guidellm-benchmark-vllm-v1-20250922-111127.txt @@ -0,0 +1,170 @@ +Collecting uv + Downloading uv-0.8.19-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.metadata (11 kB) +Downloading uv-0.8.19-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (20.9 MB) + ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 20.9/20.9 MB 126.9 MB/s eta 0:00:00 +Installing collected packages: uv +Successfully installed uv-0.8.19 +WARNING: Running pip as the 'root' user can result in broken permissions and conflicting behaviour with the system package manager. It is recommended to use a virtual environment instead: https://pip.pypa.io/warnings/venv + +[notice] A new release of pip is available: 24.0 -> 25.2 +[notice] To update, run: pip install --upgrade pip +Using Python 3.11.13 environment at: /usr/local +Resolved 61 packages in 561ms +Downloading hf-xet (3.0MiB) +Downloading pillow (6.3MiB) +Downloading transformers (11.1MiB) +Downloading pyarrow (40.8MiB) +Downloading numpy (16.2MiB) +Downloading pandas (11.8MiB) +Downloading tokenizers (3.1MiB) +Downloading pydantic-core (1.9MiB) +Downloading pygments (1.2MiB) +Downloading aiohttp (1.7MiB) + Downloading pydantic-core + Downloading aiohttp + Downloading tokenizers + Downloading hf-xet + Downloading pygments + Downloading pillow + Downloading numpy + Downloading pandas + Downloading transformers + Downloading pyarrow +Prepared 61 packages in 1.25s +Installed 61 packages in 114ms + + aiohappyeyeballs==2.6.1 + + aiohttp==3.12.15 + + aiosignal==1.4.0 + + annotated-types==0.7.0 + + anyio==4.10.0 + + attrs==25.3.0 + + certifi==2025.8.3 + + charset-normalizer==3.4.3 + + click==8.1.8 + + datasets==4.1.1 + + dill==0.4.0 + + filelock==3.19.1 + + frozenlist==1.7.0 + + fsspec==2025.9.0 + + ftfy==6.3.1 + + guidellm==0.3.0 + + h11==0.16.0 + + h2==4.3.0 + + hf-xet==1.1.10 + + hpack==4.1.0 + + httpcore==1.0.9 + + httpx==0.28.1 + + huggingface-hub==0.35.0 + + hyperframe==6.1.0 + + idna==3.10 + + loguru==0.7.3 + + markdown-it-py==4.0.0 + + mdurl==0.1.2 + + multidict==6.6.4 + + multiprocess==0.70.16 + + numpy==2.3.3 + + packaging==25.0 + + pandas==2.3.2 + + pillow==11.3.0 + + propcache==0.3.2 + + protobuf==6.32.1 + + pyarrow==21.0.0 + + pydantic==2.11.9 + + pydantic-core==2.33.2 + + pydantic-settings==2.10.1 + + pygments==2.19.2 + + python-dateutil==2.9.0.post0 + + python-dotenv==1.1.1 + + pytz==2025.2 + + pyyaml==6.0.2 + + regex==2025.9.18 + + requests==2.32.5 + + rich==14.1.0 + + safetensors==0.6.2 + + six==1.17.0 + + sniffio==1.3.1 + + tokenizers==0.22.1 + + tqdm==4.67.1 + + transformers==4.56.2 + + typing-extensions==4.15.0 + + typing-inspection==0.4.1 + + tzdata==2025.2 + + urllib3==2.5.0 + + wcwidth==0.2.14 + + xxhash==3.5.0 + + yarl==1.20.1 +Using Python 3.11.13 environment at: /usr/local +Audited 1 package in 3ms +Note: Environment variable`HF_TOKEN` is set and is the current active token independently from the token you've just configured. +Creating backend... +Backend openai_http connected to http://vllm-server:8000 for model meta-llama/Llama-3.2-3B-Instruct. +Creating request loader... +Created loader with 1000 unique requests from prompt_tokens=512,output_tokens=256. + + +╭─ Benchmarks ─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮ +│ [18:11:47] ⠋ 100% concurrent@1 (complete) Req: 0.3 req/s, 3.35s Lat, 1.0 Conc, 17 Comp, 1 Inc, 0 Err │ +│ Tok: 76.4 gen/s, 239.4 tot/s, 29.6ms TTFT, 13.0ms ITL, 547 Prompt, 256 Gen │ +│ [18:12:52] ⠋ 100% concurrent@2 (complete) Req: 0.6 req/s, 3.53s Lat, 2.0 Conc, 32 Comp, 2 Inc, 0 Err │ +│ Tok: 145.0 gen/s, 454.5 tot/s, 36.9ms TTFT, 13.7ms ITL, 546 Prompt, 256 Gen │ +│ [18:13:57] ⠋ 100% concurrent@4 (complete) Req: 1.1 req/s, 3.59s Lat, 4.0 Conc, 64 Comp, 4 Inc, 0 Err │ +│ Tok: 284.8 gen/s, 892.7 tot/s, 59.0ms TTFT, 13.9ms ITL, 546 Prompt, 256 Gen │ +│ [18:15:02] ⠋ 100% concurrent@8 (complete) Req: 2.2 req/s, 3.70s Lat, 8.0 Conc, 128 Comp, 7 Inc, 0 Err │ +│ Tok: 553.5 gen/s, 1735.2 tot/s, 79.8ms TTFT, 14.2ms ITL, 547 Prompt, 256 Gen │ +│ [18:16:08] ⠋ 100% concurrent@16 (complete) Req: 4.2 req/s, 3.83s Lat, 16.0 Conc, 240 Comp, 16 Inc, 0 Err │ +│ Tok: 1066.9 gen/s, 3344.6 tot/s, 97.5ms TTFT, 14.6ms ITL, 547 Prompt, 256 Gen │ +│ [18:17:13] ⠋ 100% concurrent@32 (complete) Req: 8.1 req/s, 3.94s Lat, 31.8 Conc, 480 Comp, 31 Inc, 0 Err │ +│ Tok: 2069.7 gen/s, 6488.4 tot/s, 120.8ms TTFT, 15.0ms ITL, 547 Prompt, 256 Gen │ +│ [18:18:20] ⠋ 100% concurrent@64 (complete) Req: 13.6 req/s, 4.60s Lat, 62.3 Conc, 813 Comp, 57 Inc, 0 Err │ +│ Tok: 3472.1 gen/s, 10884.9 tot/s, 190.9ms TTFT, 17.3ms ITL, 547 Prompt, 256 Gen │ +│ [18:19:28] ⠋ 100% concurrent@128 (complete) Req: 16.8 req/s, 7.37s Lat, 123.5 Conc, 1005 Comp, 126 Inc, 0 Err │ +│ Tok: 4289.1 gen/s, 13445.8 tot/s, 356.4ms TTFT, 27.5ms ITL, 547 Prompt, 256 Gen │ +╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯ +Generating... ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ (8/8) [ 0:08:43 < 0:00:00 ] + +Benchmarks Metadata: + Run id:8ccb6da1-83f4-4624-8d84-07c723b0b2a5 + Duration:530.4 seconds + Profile:type=concurrent, strategies=['concurrent', 'concurrent', 'concurrent', 'concurrent', 'concurrent', 'concurrent', 'concurrent', 'concurrent'], streams=[1, 2, 4, 8, 16, 32, 64, 128] + Args:max_number=None, max_duration=60.0, warmup_number=None, warmup_duration=3.0, cooldown_number=None, cooldown_duration=None + Worker:type_='generative_requests_worker' backend_type='openai_http' backend_target='http://vllm-server:8000' backend_model='meta-llama/Llama-3.2-3B-Instruct' backend_info={'max_output_tokens': + 16384, 'timeout': 300, 'http2': True, 'follow_redirects': True, 'headers': {}, 'text_completions_path': '/v1/completions', 'chat_completions_path': '/v1/chat/completions'} + Request Loader:type_='generative_request_loader' data='prompt_tokens=512,output_tokens=256' data_args=None processor='meta-llama/Llama-3.2-3B-Instruct' processor_args=None + Extras:None + + +Benchmarks Info: +===================================================================================================================================================== +Metadata |||| Requests Made ||| Prompt Tok/Req ||| Output Tok/Req ||| Prompt Tok Total||| Output Tok Total || + Benchmark| Start Time| End Time| Duration (s)| Comp| Inc| Err| Comp| Inc| Err| Comp| Inc| Err| Comp| Inc| Err| Comp| Inc| Err +--------------|-----------|---------|-------------|------|-----|-----|------|------|----|------|------|----|-------|------|----|--------|------|----- + concurrent@1| 18:11:52| 18:12:52| 60.0| 17| 1| 0| 546.5| 512.0| 0.0| 256.0| 231.0| 0.0| 9291| 512| 0| 4352| 231| 0 + concurrent@2| 18:12:57| 18:13:57| 60.0| 32| 2| 0| 546.5| 512.0| 0.0| 256.0| 251.0| 0.0| 17488| 1024| 0| 8192| 502| 0 + concurrent@4| 18:14:02| 18:15:02| 60.0| 64| 4| 0| 546.4| 512.0| 0.0| 256.0| 175.2| 0.0| 34972| 2048| 0| 16384| 701| 0 + concurrent@8| 18:15:07| 18:16:07| 60.0| 128| 7| 0| 546.6| 512.0| 0.0| 256.0| 50.7| 0.0| 69966| 3584| 0| 32768| 355| 0 + concurrent@16| 18:16:13| 18:17:13| 60.0| 240| 16| 0| 546.5| 512.0| 0.0| 256.0| 166.0| 0.0| 131170| 8192| 0| 61440| 2656| 0 + concurrent@32| 18:17:18| 18:18:18| 60.0| 480| 31| 0| 546.5| 512.0| 0.0| 256.0| 47.4| 0.0| 262339| 15872| 0| 122880| 1468| 0 + concurrent@64| 18:18:25| 18:19:25| 60.0| 813| 57| 0| 546.5| 512.0| 0.0| 256.0| 110.7| 0.0| 444341| 29184| 0| 208128| 6311| 0 +concurrent@128| 18:19:33| 18:20:33| 60.0| 1005| 126| 0| 546.5| 512.0| 0.0| 256.0| 65.8| 0.0| 549264| 64512| 0| 257280| 8296| 0 +===================================================================================================================================================== + + +Benchmarks Stats: +======================================================================================================================================================= +Metadata | Request Stats || Out Tok/sec| Tot Tok/sec| Req Latency (sec) ||| TTFT (ms) ||| ITL (ms) ||| TPOT (ms) || + Benchmark| Per Second| Concurrency| mean| mean| mean| median| p99| mean| median| p99| mean| median| p99| mean| median| p99 +--------------|-----------|------------|------------|------------|------|--------|------|------|-------|-------|-----|-------|-----|-----|-------|----- + concurrent@1| 0.30| 1.00| 76.4| 239.4| 3.35| 3.35| 3.38| 29.6| 29.0| 38.9| 13.0| 13.0| 13.1| 13.0| 13.0| 13.0 + concurrent@2| 0.57| 2.00| 145.0| 454.5| 3.53| 3.53| 3.55| 36.9| 39.0| 59.6| 13.7| 13.7| 13.8| 13.6| 13.7| 13.7 + concurrent@4| 1.11| 4.00| 284.8| 892.7| 3.59| 3.59| 3.65| 59.0| 65.7| 88.2| 13.9| 13.8| 14.1| 13.8| 13.8| 14.0 + concurrent@8| 2.16| 7.99| 553.5| 1735.2| 3.70| 3.69| 3.76| 79.8| 80.7| 152.6| 14.2| 14.2| 14.5| 14.1| 14.1| 14.4 + concurrent@16| 4.17| 15.97| 1066.9| 3344.6| 3.83| 3.82| 3.99| 97.5| 96.3| 283.9| 14.6| 14.6| 14.9| 14.6| 14.6| 14.8 + concurrent@32| 8.08| 31.84| 2069.7| 6488.4| 3.94| 3.90| 4.31| 120.8| 101.7| 564.3| 15.0| 14.9| 15.9| 14.9| 14.8| 15.9 + concurrent@64| 13.56| 62.34| 3472.1| 10884.9| 4.60| 4.54| 5.43| 190.9| 133.9| 1113.2| 17.3| 17.2| 18.2| 17.2| 17.2| 18.2 +concurrent@128| 16.75| 123.45| 4289.1| 13445.8| 7.37| 7.21| 9.21| 356.4| 161.9| 2319.9| 27.5| 27.5| 28.8| 27.4| 27.4| 28.7 +======================================================================================================================================================= + +Saving benchmarks report... +Benchmarks report saved to /benchmarks.json + +Benchmarking complete. diff --git a/benchmarking/k8s-benchmark/results/vllm_replica1_benchmark_results.png b/benchmarking/k8s-benchmark/results/vllm_replica1_benchmark_results.png new file mode 100644 index 0000000000000000000000000000000000000000..86c6c046e0d5ca35f41823bcbcfb34099f3efdc6 GIT binary patch literal 575562 zcmeFZbySsG+b@i|!7Yfob%9D6Tci;MlrBX<2^U?0AYIZOf>;PBumEZ4MrzTZNGK^S z4blzLeXa@W^Pczp{`~$qXB@|P#=~ZBVcqkd^SXX@&6hG#w@Ha9hzSS?NX75m#1ask zOn@)j{w9L&#AR+x!~gME-BPlWHPf}SeQ2RWAoEx2=>dg7IP;+9`r{U5>z-znO*XwAjkumn}w(V-&JIk?#uy+qfixb4<;Sc=w|Mo}d zCP&&Fdc^lTw8LdJD6NDHh#;xK6bca_6#exS!XA-EgeNXon#0mEj?Z`RIE0TCB}NHoxPE7v7&gf zfs)^0>4kvvMg=ib>WP%pEQzJbwiNx^L+8pewX3UY*~+LgN;eGeg>WPZM;sxlYAwG`l}tLH`ma;7 z>w2T@>*Ywbe+K0|@z;`kWnSgD7&f(lQYjtdqyxwNFBkV!c)@`d{ zculwN#aI8!da}gA>uW>4LvcY5Hss&kI<3xu?=~$ubK|ilGyc2Qa=U`tGvmqDBxRu% zFSgPfmKy^e$D@;zlf{~P1)n41vzpESPw;Z}_zg}OfCx(vG zq$?+yP%3tVKK;lkx{CCoS&FepR~P5&gaoffOE+h|N}V^W?y{B0^-CUb^RtjVy#ELv zr~m$4?rPfMFVNWbS}We4EZkn{)?ONKx|QU$YyJJ<^U62pMJJ2S63B4$J1t5YXMLqx z*x8)xu$3i<8ve73=2d@hezz=}rdy}U;vz`cia*dVUonDmpSjxSSUvpJf2xQ9evEdt zkGJ6VgfzSJ#?povH#ZS(a%>XT@$T+}2ROdMcxgrcq$ixT&im)tiEo zF+Kmss|`~k0*pM5Z~o54)D-%77U>hee#)BJe?E-upy%oKsjXq#lu_)VdJ*@&>$CT}rp>_CJT$rn4J=taO|C)^l~IiY=G@tYPXjKS?kd z`e#`tU;S=(QPbN?Ez;~zpeX7c+vF81W5xYn^~FDf+QF6i@gPZs7^Mj&A=1U+D6Ie= z+OIK%5w1Jy(Rs(CGWFY%kMlg;Np9o8FsP3tr-{QB%QIvR)Z_culYWVJ?cis^H7 z3d1}zeI<^@dA&9Z9}gX`AX8MkALH=s7`4h0{(w;CpEZj59&)-wY=6DnPUgcJWJmcx zAsdd+t9pIb{OhHlfE;yF`D!2Pq4-eKS7-|s&6TQtE50c9`bFUtho$i~STC*C#QO`| ztNnWCAGO3w))ML1PPQ^QtW2MUDq&|e)0HdLb;v%}gu|pr!)f7`)A~pdyJ=6pakpek z0D~+XS90YyQeDrAtS0;jCz-RpTxiPDsdX?~%)kDK>*{@70iA@3}$}r{c0cGPS&EdUU1BD8mlc<40C4D^t;s zYFBl$MRO+0jAN47olVuQ4j!xV6R0$!I@jId_EYg?wKK)B4y(#RwcwCD&MsZ1&8{tY z{)gpHjf)KWitX|Bu_k&@sT%O_JWoHkF&b{$w_$p9fAQ-4{=D1^=&jK>FExGFkMXu> zwA|fZt-c)Tgl)Fre3Yh|=X24Q?<&zTDy4aXA?%$)JaZ+hefe{xn?E}BBI`@S9+Wuf zyl3N`{vc}n;S*6)jzJ6k^^3QCUOUbfT#j&<(QJz%S&2m zx$Un^@SSud>E|Pl3vONMRzRiE4t{mE=8KH79UeNVuwYUr>8U*RBAaW6G&Ytd{L`j5 z+m$X-R%nE3qO+9R?*PT^2Rzi*cvyK}O1nt+MdG(ar3p4^1*0LE(3h%V4}=gZ2h_l? zI065SBj3_D(FG`bWW~}6%lKixyH(KQ-k4-SA=M%;%+Yc1FwAFt zdz@@mx*k71b4QqP!s!xqKkUg6>f=9^G@lS^l`OY=&E)k9Or5S_|3c?EAKSR{<)Uvz zs9EVdXZ%u;l?yu*FP%YZ)I(8M$(${m(k;ulI}tn&=Si>nh1Im=`->B6p{4#-ukQ^0 zGjZl^Jci<}&p%!)c%@W)m!WcGpva}kT3@K~Db|}436X(qh2j2I_X=k4-9Iv`X}qA$ zGj(UsNk@bc7R4?XH%l;8wyTYt)CD}GB@6MOCrX6>zeB=&=9 z@^wiATE=(@f!Pi@;)#N(^r9aN)wGTH&r7}WCf5i_;#T4t%|ZTGW54wQYKmf9 zx3qmc^yfnQ+G40pmTcD~efd|u8&6Si=*tLOw~eLYMY`V!s5&QpHxdzxy;#-{3{x3{uNwPAnUGEhBV zD-}7I_l%TMAs4!u0w=&KTmBRPD^#1=#SwNtUb=U=)^m0Yr}N@iVrN?ewa&6@-E3>R zO{?CPARVb4LF{TfP0q1l9(Uk5TiqI_#>zmP&5mnMzF-_opL^Gl8T2rDPf~!K&-1 zw6pGpF%+g+^+u<~dPQsK9`cgmJh{mMs1GE!Nb#l_zS9XzYU443gWncnl&)+ICttyv ziaV>JeP+BVCS|4Hb=Mu=tCiL*(m3PlXe>SD0xu%b5b#I(`f0VtpOO)r=-^i6S(yXq zB@eZ|Uf!1Ry5>i>RLNZVm(|-{5oJ4B)bZMm){DCUS9Y(tPG;P7rs5rNJ4F1Tv6i*S zxDAfFygV(jNs3Y7j|VNd#e&B?JXNhX8G`P24?U3VQc5+DnpvO0mwZ0PE5~Wn zo;q%#4^_DB8KtR`^<+{4`AG1u4a9lhCBtL?>!=GeuwDhVrHc)`&1$IrHZ1I*rTPU_NXe?Ydz0`;2hDwYP?7cVASV*5GRp+}(<9wTH7? z;dhtytfHFvt$XjTUV1fynhA7uIw}6;*8H&u$5#&oTW`XKBw^GTUwCY@Sq_IdGTaqj zC1Gb~IvzoRwJD8VidyFEdweV3weLq_X@A!0p*mvGxC(`<>d9f6VCu-*zBKAfHqI-Z zdI&PXKk@&_AM){nf?1@n4BLPu0{-0%Sdt3Vc21>QG&q)!`$qPfbk z>H=hE5XcSP(^R3^;<3f)qt??O1_}-}G+btt-R%t5Z6*?` z0w}viZHf)z3_kp2ce-n6cjli1{ySvYCVkqmchvgF%gegmVv>1Y7)${)q^j%Cq*D45 z=B}y_#SIMrv@@jISg01wqw-kVbKhp$>4;d$@Y4qYeV@0ab~-UkoI%aF+fR6u1h&nvq3Yur1_LgnK;e`csv& z&s@U zPC$gBrqXq1G4eZ*A0rO4F7j0pmlHF!+S#)e&x?@L2Oo5o zV3?_8I7&}=7I*c^MBV|xP!qgzkKK^>Es{=&12=MKI%MB8La(KMPHm&qUL_GAfVvh2 z5ijMm?qVtKk$~u@adF$$DQWnS&eY zo>@Ny8yo2{X<=K>V-e}z+P?f;tk6&V*e-k0#tP*C0wBxnJ1($x4lsTHc=FBd(Eq<*@6BmH$e>Txc<#FwYhj{-tF(fOL7WoscM?Ml?Ev=x-MZknMNSkw zC1@MzD}R1|+_!&sXSMU(V4=;I^Uo{%r3I9mbx`SA0E`$AJF6Gzj88mpVuY2j7$Ik6 zA+p^@_G+qA+EuT=s_#H$eqq~ZpAc)}Zm|SpuxNn53zO9ZgvLE+8I|tQP%|3THd=FC zp>vpTFLwl4odq36ja&pv%v(UaJnZpehPmAI=!$sej?Pg zkU@%fCMUWh+~+xTZEKFFzI}Q20N;Gykw8K=j}6Oj z!iVKmM@ND*8i=MFYhc5X!})t~KTxz{;FAZ*u{qR4h#yE%6o(PLlm?bN`FUxgMH}9P zulZ0F&iE|n#2i5U5jZm4P2b|4EW;DXIxRKbUhWOZ@-H_-=ci|6u5c>d4}Z9(vQcoC z3Nbi*y;*iWS0)r@a!m8v^1D(z6R{L5jsSmNG{xM$?JPdV3*BB>E*f(c=Uzc0z*?A-a=zpo+4uKBIOHBMM-RN@IW05eZLxj7bw>GYO zj@F0X)*k$|Qh3V!C87wevb3e%``V4?Ezv<5*R6%lsE?Dcsd>3*>;|5E2Th4Yr3#8; zK+&{m(F{3@N)COZ%cLSj-9}K^)+LZrins%d#-qKopyzBy_G{P;dbY7@!@;f%{2a!= zP;rWo^pR#t|e=K|?+pA6wL zQK7OQe!BoI?3SnvFzyNzVlfqv=APCoC-GmDfon0F;6UI$=;s5!e<#S1(5ELkV25%-GHK{A>0 z3#pB;Ht~lp_Hi@UJh_eY2cLDWK;P(K{&3mzc^!WOwU3!;kq*xl_G1js<=abYf=FIT2r0Q_1B2lZX}ZtRqyh9nJ?nNV6uYzOfOgmloJIeSE$>C2 zlUo@}bk{>^Iqk)qb;oM9hg$`2e0HeXH?pAD33QiEF8_E;`aAru&P;##PiIax?JcZC zr38SVS^7_esf7pSP#FOo>~cZv+#c%2(qLuk00)!lg_&1T)%IG{vY0n;k3Bk6;<|^l zyH>E<2Im;Ek7wlr<{YXxC0%#W_h%PS7rnD*6v8>K?3%f5s($JgCuX3yqWN)m%LL)^ z_$7W?^NN3z6Yo4ontu44I&fJhE`Z2+4j^==+Xjcwa$fVtQIBIh^fd4c?vvD4AKfVi zi6ryKD<(0~C7@>2M=poS#Mrld9Kb}ZB?xXafIxDk`oPR;kEJv@fo$jrKlt>#HXx0D z*YaY?BFLKD2;(y8dL&CsInkYGMjmAgfTBupcfE1?+F0*t0KVa#p=p^_6qd|E<&D@* zK5V`iMR8=;imHKne3IkpZ02-UZ53Cy@wG)WhH)msm;A8Fl+TP*ygX&ea=hl&WD3ZI z)67?5WDIC|M}xJAkIjicp>W-v(#YQ3HA8exL{oNtQduvY3|N8Htb-W{2&qo$RFv2c zUx0y-12w4FP4z_p@))SM%wH~MU@!q2I~ZbYc&jv$%s35gdB_u%ORH%dwBT>5zC+(3Cf;%a zifV+BlAo>KenuBA8VRqPu-<>;Q;W19KLtsLm1SwXC99fpbJ1Y~V{JIgwJ&c9 zG5l$>|9VvYd?p+BK;a+VJ=zz4bsEm5@|g;#`+BOnH31Cfm1K$) zpmp#r+8St1g^h}ba2f@+^(*lM80plU?MIjc9rgvFVW?^cY^%M<$pBf%p3|@;x8p%5 z3vb2}b-Zu{$RG<;wYmCD7ZAgm&W?TT&WG*fc;WahO8CBnL3g;U-GjNllI#O@4Eh%c zH8B@((#zLxPGpm1rEOjCEQp=sl&0@3Ct(XC^w>Um%my&T7)^cz(*KlsW$%a)hbMZs z_F-b*OfvlYcmza+G_KeSgnq-+O5x=P^*GOz@$fsY)QLDZ2OK1U5|1}_-8HfMJ0J#( zmPgxS#N>%DTb~~X%^=Di+s_Z6#_&+K56@&GbK*I(bE3opcd9=lf+fMQoNI74yQ^BZ zNVY7vVV&eiyyOGt{dI1xJciOmYHz+0jIh_t-5e+ye2pF@6wL)IVA08FyYK8NJuxob4xK(g&2wz2W|IP*h|n z8AtLp?lHVDN(i^95lI3L_!Z%HyonFUxkZ6@o-|MJ?BWz3Fns+f`%&)w!?=l!F+?Mu zm2;}kWK4vSC z@oLBY-kEs(Pqiv!!GFI%85N@UO@a6fatu$yHs58dKS&} zG_PZ?mg9Y~UIu4&x29_qfXXPND~R|(9AT3{P-=Sx)q!0vz}i-QdoOC)5lO_a0aCuQ zrl{yu0B-Icg?<<+3n(k?`tJ~7An!7V@-q@~*;9o~m6+kK$B)Hlk4BEPf8jl|8#LhE zC2=U*^@vpx>&+9Bsyv6qpKx;?!6Z&(ngprae6<$X^1?L08?e0vjWS#8k~zLCRsKw@H%%n&(HBD5jb*|yjVp{encBuYf` zdL{%&aHn>MO!gF5l2dS{XeMjqnDq;|>~8j-wo2WuWJn0R+6~`~ee)IjOjf?eyi92Y zPWakp|1J$My+)|pp9oLa#d~vg(enmLjeW=^o!&^x28gdXSYf}l7`a>5P)2#O!z#B7 zipM?4)@2)ipO~`0E_a*$dX;Ps%6?UYrnpbNQ0N_J_j*pc1;GBtNZTu@i5G5gUHeRH zk@w`MCG;*uRb7At$YFf68%b0;)+z9_^{$J-{5n%c@yQa0<>aQV30~$$Le3On?+$(i za9Eijykn2VjD?Ms;!w8Ey%O=jRryd;B8JDo!4Sn{cIPu2R`V7yd!jey z2KLp!OOaR^UnKe1t|RE(bv2t97aV?C!-@Tsfzk9nPqDSvFMn0Gt4Z+{6BeU{9m`~gmcQ;6FY}r8Lfnicyjc#~rhk4l<^pxgyFUFN#(473;bV2`E8w@j zMgpe(d4;dEyKB{cq$d+hk%&=1MRU$&pR_x>0xwVs^3{4HnkTGmyD@WyYCW24Hz=+zlJ2K`Y% zcrpHpI~a_^tYw4GD0L6;cy<|Q*JsT~ZwTO*r#dpChFY)IGRw+9YGh42R|lbK`c|+e z!U?+qvn`bJIC1!T;55UGMPDv>VbolSFGxM)v}Z0D_A8j$Mt~EfqO*SVk2pdwA)aeUl`F4a)71yUoEt#VBV65u4;NS`9e zr~UoI!-B~e8?5H{cX|=;2(>ss9Bp4N0Z2uN>xUO^loN(@O3GLP;InEY8nDFlp1=i5 zs}{+!(veQ7uaA5;_d~OR8ZPVfr$OPWIcU^uyNFsN2wx$d;;2(1Gb{M2j>J6>ko9XR z1YMkR-!p+s?vVa1qqPdG1y%$}p{kH-LGP_|zuBBws+jTM)&xnEnlr${%+U}d-ND-v zJ@_ym6A<2P@yA_YODsDWBfbbbW5At+oL?yEoA%Ag&!`&H+oH{F7>84M1?)pmu@g`y zjw3ey+p?cet--FLKHyx5Psz}uTv~%vO$#pd0fOimQ3VhS;*=#6xw6=qWYC#*d@Uam zw*lg1&R>EKpM;+VG!y7~kF{_-TKUcftWnVRE?_-!09*9*nwb5vGx^88m(YbeQb#6* z>v{Z{)beP8#3wn1C`Mln8DpST^}SLx9f*8YQ(4~Qa&wdd;#;QXkqicP#|3=4xrE1* z?~NZX)}X9t4}5%*OCz%mmh@@4QnUV2P8BH-8MPzqM_&SEp;KH(j?}9(WEIMYN@BVa z;^vax+e4ovW{f0y(~*b53r~oz_t|Oltq=PvpSY#|?uNNm?s+l*Ddy=1*2~tm78{2^ z+N+P>?Mnyf8BUrdRo##I8(+hi@~F(?*#*ziSb-6+DqcnKI|kNgvb=+HWcgec_v3qD zD(qT9ob=cu&-7g_+KX6yNuKNbuORu&Od*}HjAv^<-lW^TnW*auYWFzJ!)|^>MgV;e;inzj2%}2*OAlp z{li!LYb|s7Pp!F%OhGD(FXs!0_{$KbajUu%sHBA-l=pn9)pRAtsDqX0=$RAn)_16C zk(tp|h~-ZbFr4!^F7N^!5Qr2M=EHW>0-Bp*t{&;KVIVwGWIaW0J(%4nz~m5aFkk@D z6%h0&#?@Z1m9AZ&@S7{!E$wK`z+JY!ahH78*5dLme&xN(lx}W2?zlgFx4mO2t)1%UY0 z$=Be;X!-nu!^2Uq>9Edj2K(H7QtH!v&oEbVhaLHGhok_|U}nJmy?+FILy_k+14nCG zriJ7f*t^^y;QnwYVSND{vMt{SqZ?e_0!VV%<*kT}?3z4r)4gu##Zj8Y{gg%24sLg< z|5wvhGI+e?!#f*Xv^9M&5h)2MHeh+2uMhZ{C7b_GTaY{U#BllBA%bn9<_K5=2{Nic zX3h{#^NzX?$Qud4S00MopHhP~k0BotpjBl)h!CIqdg`bWgBTbH%`&gGBnGcTw#W-O zTVmfq#-Bt+vF9Q|rDB1|N>hTF8jd0z43FXeLUHqL%;&oOxD8wChHI??1#^_0k=qX>oWZ|#^j z^Y28u)fGQ+kpTj1mwU75nmcpm#=0(B$D zu#Iu@Vw6_6b^A+X@Gw@sy-jl#X^9Ti*FcSbyZkwuB>HLLF|vFpzk4o;UEf{S zg4pQIel6N=puRHme3i#!lEw8!iL)3`#hscgj#JLoC47D^$U}l}_Ov1R<*fAQa!aAz z%HQOzmDffj@1A5Bc=gIx9x}waWn(^s>_{?u&g~m1Le77bJ@GWiaCEx0^9k&%4cS4! z!ScC68`n{<8gr2J+NQQhzrvx)`qW)^&;PQt4?2s8wSNa4UK@xVV}66;1N%!m8y#is ziTw5+W0RsP*DK}xtv9 zLb8G#art~`$r7c^U$l{L2b2^aW#7DT)$?ARxHb>I?caatmwDkQU%_qMkdpgRnAW%$ zv5{Q#o_3W4A*#f`k~E~ARKWg~;vh<&cxBsT$-3pbeb!T4_zQeiThwZXYbp30tdL~6 z@Lk&%=cK&9Bd#$0;UNVg2V+b@fYR9Jvl#wj2XNn_z8lmf6rdnBr5!N?|NaF8Bii)) zU|&@OTX?X<#ThG%BVqm^gmmz|SQhlS)6SbKEcp@OO9`T^%e)iHTUc-clZbA=ZqOX7 zQjZ)i_ZmdXD4K0lUMvh%-&QZ0h!6b%1k+oh6~ZXSyRP7xqP@eg{u4z=&Tttk2`|PD zxLHJQKzcCCT5N&}ju9a)66iSj0Q+U{iSG*jS7M?3v`?`|m-?K-<(nGC1PCjSoG6$7 zTD>iTI5}e_@=%bm@*1LT6qJDKd1vLz3m!B0E}$?+Q+M+jtMPB=XQ31rt3321lPFBZ z@P!|gha$S@$NDSnr5ooIA-2DnqCO!($ntq?5434^KrrtF`@v4RFE5WX>Vrf;Oe)bM zS-uHJeq>c~n1wXjywyNf z#;+FG{6;`6ihhOfWsFiY#SrLb0X^o)bv`3fvdI0Z=F)n^uf<)>)egy$v0-~&pFmiW0a(5;#5BB05! zP1bbTCqz0gxLDqU@nXhyGqLFxX>6pC8k4d>u7t0N74qZS|?h zYe>+MByRkyW!qb=wFb`wV4?!Ud~Oa7jZciP0MF*?H;h$# zq4kss+Yl(Nij{=5!qU^O@$ za^LupoI-rdmuGuMXtpV+leLVjKD1S^k9}?Sf{jisZASO{OVorR7KIOQ2q1DTs?agXnR#YI9soEIR z0Inu)ScJ4uB^Y6+4%66aG6PH{?AQi{CNQ>MCeg~6q2ha{wwI0ZUDQGKs_~dtEhoqv z>e6eq|00zZ6_^c*Idtqs)WFn7(Cg_pue)PhdV>q%Q?@zPog+yS&aD*F-3yk9F=~Bz z>M}VWttEcGoTPfs?u8aUgqTM9Sc`*{uqKGda%xaKGdmtQR*I0Y$jOvU^q-1=w(ghv z%c9V|^*aP+C?LjBmH!MGDgh%RZ4mx zqwPA%soHjO1TO-Y^^(95`IUkP%^8ADAamjt_AUz>*7z0w9f>+JPjE7|m);k>p!uoXJ8JmuUu#;qahRwHi%(8dSUq|#v% z!!Jmj_aGu=v@5;V$ajtMOlY-XN}7U9FTxgbSzw-}i7oa*At1!Dah!=e8T+Z<(+>C* zyp_Heh4Zkc0UUhOpz3%d^QxfRszq`L!ki82r6&bWk!ld@&~wBlLSwPqa@6L<%l|-j z%0K2H$p)tKa~S(9k)$A)#+h6KYq&BVW@B3Q#b0SmB&mdw^Z}tw?)5Ef0#B zJSe)`4T-*JszWKL^{&-w?D#p-RR1dOlOew|gp+kNj?-^Ri))60wS8XRj}aSztz&^w zQGsbOSSqV;!nate!)BmWG{JFmA6??u5 z>o6-X7%+Z#!k;&w*%L=3Ky<}&YZJm9A(Ea?t&qEMpAq4Aa+{VnZNq2Yx}T%4)FkB` z%hwR>$}u>;YL2z%#bGBg9W=BocK~(Z8Bfk?% z1|ohnI3xOfxKQ)%&*I#pI9dR^XpC_a*zZ`nEpX7(TPcYg-6nbJR#WXJK04%3eN(A& zJBsZWnVHjN3}m)p)stC*+(!_C>{)gJdp8q4Z6(BLqJyz(Er_N<0_G)(;z^7E1@Qvg ziraR5i5ptgd?HX4erbx2#c-x>i~19lAZ9~Ye+~LIvr{Zrvkgk9HfG*KNvPySFiC3F zS72qmk#8$82+!+{q-N+oaydLL0wEm`qV~e8CB8)ZGK%M7_%tFk1E_7jzmIZ$2rI?5 zA+P`ps`Are+AvRpUXTQu-o!QL169RvG@>jEqRYqFi@~`;S&Q6cj~Z+e7!Oep9YEa4 z-6If~^Sg2AnJDQ*aS?W+BWp2)wa9X|;Nf@`3zkaaEuV^{U#rcPrhl|aUsceK-1U6W zfGuYz?F*jmi!V`Ozh`Npq{w*h7($q~f$W3~v1AAb!&fTh27rhF zLa2JYab*by@-erG>ktnRUIeCg6_HOho#POkai2uZO&etIS71WlGI0Vuc&}4!tjvTG zs;B`}xJ9kW!)vgK8onitAEGQjKv`l<+(F?`blOQJkvf24rT5qBpvW0w#OC1$=yq2D zy17wp0o{WkUjtrBWD3hF3@KE>ar!6jCkPOFpO_84Z6Z1VhajbmU>VXYr6fnNOtG^T zktnQAkq%-j zhaNL}tjq%Pd>`u@gj^;(%+rgWO=hE}ZC+PlNPoY7Xrj*Wd6VvaDHPrXp13wZ>jt8R zAnosDxQEr$wsmxqV#GY)ip2bg@;Jt*Us|@iJ=b||e6pOo9fXVDsv9Axu9Sx^3JNdJ}u*JLFYps%c%F+HK)5J@h%$^Ze-9lc&|K?ypdfoF(W%)vaq0 zT3AJ(s_8qzFUVKkU0emACD84P(h0!=&JF=8Dt+8zVg8Z^8WIP%Lyfb?aHm=NBQSA*e6o)}0x}Bns2DM~m28}-~puqy$-idt3Cwl3;R|X?WHN8{^ z7Nb*7qB^J5HcqCb@NX67+Xl`F^Q~4#S#GMBL81BDz<|B;73w!{ch&^OD2g6~)yA>O z<}DjXyGrSv(-^YOx%6&GkK^20={{;uFSytF_3F7Ce4GD3^3xe2g)vO#FaE z*)r7lYUI8nXu|Oq3f|-ShjHl(rjYGOox3xLg(m-1?sZ78WG(t|#1*32 z{~dUPHt@4rmxfaUk@z92z99Tiv6|>U(U9r*BS9so(K}UvZHn*~3}RzUm3U!<(4qqnbF6 z?Q9sK12v*yjl71fiKy&kyQRo0C?iSiWooIFn#3Th0WXpWwIH_2sWJ!KT}^lqqQ)0H zKmI`RjcyxRf_6AbLxAn;iM#;kH{PdhcCmm&^CMY55xeFcoX9yWWy=mOp5u-y)Y(o4 z$%o=-;NnxQ3Z%9q=8rJSQpmZMAGr+iqdoWQ=bgb*I0`A;!Aq0n$bm1KKC2h@50d}z z8N-}FW!?!NHYmIM=?rAb2I^!=G<-}L?p!2%=mdHY=LQw&eJ^sBtjCd%A3VSEnL5B<7LB$j zr9S5Bark%x8BGgnvBj2yR?HIBu_)bcTf*?c1TuCnAZ&)}R#4kQ{q_DwW1(eF=eRHc zKMi{T01>)YGn_GzLWIolbJ9*Xq)mok%QVDm?37pl&#MthcIni0;SNIK*Q~|7C3Poo zi0;#O{0h~za{i8tw${3R(RwNy_sOR0=W0dz{8l$)g0W|A?(S@Rsay`|LeiaQ_XtiT4y)7* zT~4=&*7e_>LB}bh6oZ$$Ibh22y64rDu(2?t1yv-qWYO_SzL@788hD~ zM2TNkRqWO2;}Ft9UhwJS*A{A#m3WX7#JEF1e};GfQ>WZLlrukg@)v7otzVa7->=RA zAJMb~sS2~$7cv=JWDN#GSt1V6Lpkfn-L1=toq$3LgpcPK11}Vx5`?{rj;Yr(R?=5x zPz_Li_&#g%z)y~EWpX^$lNc1e;rLh8Bv*b3_(o~yfr919Hm1Ei!&o=4+ANtPlTsTI z&}dcr>!S`>_OP)bT^33`XXh&R1u8*4Aj#_+Ly74tn1@HDNK?sWv=3!$g11kDb_WOf zL|7J};pN_6${xkpKd;)Wi|8&`%37Jww@;_>3oRq$2R+j6(_%Q}p%AGstc8d=GZHzJ z;Frdn?}B3ztx@K3DajFFfN$CMj9HTsj0|z2NEbp60bYlW^Pxeb`+kLNuvxM;Qghot zZATj3{r-Bl9yAk)6j;>T(wnvb*V-FH&AVlGI$KcVEQDNQ{x*)?xiK3A9&qQS9SGc# z^YsHpqeL<(2VMFEzXJBhT+2i28@&S|0mp2L(hMW;)a6;=c)T&jv+8SLQ%!u=^NlZ9}iG zHM~H(btIgG)^R%X)^YWFPv$0gt}g50jL}dVn>_e}c(V!;R)cu!S2J8cKNT{^wf3pRupPq%J93)4X!-MI1T$#c`{^Kr1 z2+*>{3e@S5DRzHS6;j{X^WFdg*(hQN$(7C_u!@rPA*4&`X7Dq;!L`ZMKU54Xef$Q< z12ONx`V;K|St%2yMcZs;&neDp5c}FeP%*}+BRw~rZTUVjyKJ0NrUZ&q^Gt6Y7fbz% zn%Cy_=3JRz1JKUto`bLI&C9m7X3Si@0OV#2tov|}2B-R(GVg8m$HW)VC`7hfpVpo8 zcE~(Ob_#`iPWbi+o9jz}?l(pK8-}poRWo-;_t%Gj_|l*C$p%TgUB48?DMrD5iOxIx zW$caUv9Cn! z0ciD!mo#$eb^#pfgVH7>`i6DTeyKsw*4@i(!JuKlqqCk)(n+KSs*}K7y@P^?UTQ$L z&m4BcZH6=`RLUR3Oz@wJ@vv-m5IWQbd4P32D~hYyLvUxo7m?U1gmpXAZCN(1qOj5Q zcbnn2w*xt@B*CCUCUo{adGH}@!i8B^8A z{!boR|vtKKpOx={gDvcUsD4tMuNMIU?fqZ=~_5-hm}8mh8If#IWO_F z(ijfV2WIko5rrbG55;HXxQ0Q~-y=0Jm-1X~5v8O^{JFuK+`T+}VLMGeMd22yg!p-G z1Bz?9_xLu(V~{pp3HC|Yj5eB$>6%1YpdHi{rZ=B#tkk-+LJnXYk|xag1MZy#`ow4M zY|g+lDuH$1{|tjhN>Bx>09%L_fiTp23VaV`caK3uT%XPljK}1^J(#>Eh*DDx7k5_j z%If(d?>vzQL*GBAK6XfS@^%Z?ts!}a>g}ovgrw^5q{u5_PNd6dJ)B?}h@lD=(VX%# zD%=3Ytio~-YNL+HmX5Ov?5l#&yJLT$st^W4Van8`ZQ$PoNKS;z1JU~0kb%wLLwOLF z_X5Ga8dL_O+}9ZRNRXMhTIAyjYG~Hnzl5O;!R#^Zk>{z8+rU{jE}CddQB0fK*L2;w z46*W|2_gG+m>|jro>y-HLNpc7*7icrNDu|hGX?o-i1kv|^+USbcoHfH^M{WI(MWn- z7}|@|W|cB`PJ9G8FM^aH5{GF<0>Yz6CQqH%#zn~M=^RRxb(1i(rFdKdN33EFa7lDd z3Hu!nzvsuODNyvDOKA;_zQC7guJVSZssYT^;Q0|bX)3avGge2_EXsc?L1Nda_ZbHP z52=cjN3RByJ>zu)0w)Sgcwi{e6dQzgmA`ycP&L7kYGs%i^u|WHbG+dtbb=wXtD)HL z7MH;IoMZku-tmoZ@h#BL^@IiYW`B;gxO(ac2{5SrNJ@yP0SJk?NIeCLXE-$pnq2fe zzipv*cNcAE?S;zIk@m)SKgk&g{#$0XgT^EqSDY@SEkXxvm`-V7-^(RKl8bX{=#@3A z@MkQ{!0JzfUf{qQ*7dG|8mWe;O=VfWL`WP8A;;ndUG8~L&bS>qLcjYw21R$e7ePhh zvrs z66JmyYX9Y%|L=|z0)qb^E_A8i?cYUxNa!Ji_J1I)7^*6FXdf_csPD8tK*D$p^;y@| z41}pV(2SbERok0se(y|g1 zQ+QxDfPzI8UsoOge3uGbCoeP|en0|^1)y?4wDbJH^*ot-(EoKgh}NVudyc*5L%oh3-*#o6?e>D!64tcu!-%~;^N%z*m~~|dClbLw=0bz9(@!QW z-dI#uds7BUBJkj{3hk|a%h4epWtn}bZF|_EzbOXnHC=NETUJ5nJ4Ok``HTx;);KG& zWy2Xbzn6mG-Y+MRxz4yy%EZBeE^L_JvK!8%huaBn~0zg%uhFjoJ{_h7UbIkTd`+wK1D(U3h@82$ZdH=TuVjs64i4Qjn zoXHE^g_JG}C`jft3<<5`p}+rP%76Kb`?MkIZ{+AFa=?g#m=h?qmdr>lhZ&FK799mB z_Yb{`0>v4T_QCG5wH6G6Fi0p}K!V|iho7^otpSNvA;A=650>)Fzg`H1yF~Hauj50C z+cO2CngHV&!A&%iiY;&!wBX*8JvjCLIgQF=eXN7W9O(R$sU-#y@1;>Hn-8{`Igp2H zFcZ~fN*Hb!f_GxcjBaWeOHP4^2MQTiqT~z`jh3c5*bvFohbF(02cwraA-y?dTehjb zccl*CkZO1}6hLlYf+=|p-3_7yp=J`p-&@y}ai)}Mf2Cy3?33kxn!te#MjaZQ2wz|x zY!G$vb}#qC-f0DaKbke}TS7xPZ#A4wYIG4uF>F%g=$)3UMn|l=tZb?IZo%X_7)U3P zoQwhfsF2yI8(Il`5rdLlJ+QGdkrL4oztj0^xfmrc_1XUFE4pdx#xCe&e@k4RXt|8W zX1@b-vup%7*I$9y{_-XMVP{y9YRH400t~5>ZV$uSxL^=AVE^a_x}u?V%QnP)#MsO6 z;0}fwBQ*OPvJp%wa`)J71K}A082A$9ej)yvhAv9U(uv)SZAp-BoW(VO?So7#C74Ud z4mxC#(USu?+Av(jq|8eZ z0wk#V^Krqjv=)Hhm&Lp(aD)+YbA`#tj9rlPhAAR%sKmFSRK|eh(AipSZ}3ds2`~~G zzN&Dw3o$| z>LNR{bVvkUL4#BgjcrzwG5ffnXK^lc(!1*8B+WGi{q<8ooNFE|!OXd@j>#?xOu`^X zXYCL+R1pE%I3wgTK>5#nG!qQ@*rSwO%!pIlflHb-X4|~N2|(Vs+YlN>yKOAj(sbuF zG~1ur4^!2gS-bIik99|&5WI#rU)(jqmh(-79dbCG?Xux86(qea{MX0yzrZ$}}_?e_Z25e$96@Z)*1@9iiN$Kj;ocY4+FfYWToYJE7`e zXR6SA=*h%;{ABFmh2}#z^mE{cjwI)7rf2)pyp=w{%rL)qiAK2$@mu#tHt@=CAo&Xh zoxHUQQRRYC(I_IA>|cHx`=JBm|HTxWSfRLt2#4gZ^~0nT80ZwuRJE}-v2MY90zkZ& z|GMOhyhUVrs_7VAi+u<;S?!J5pVvnb_D|OJpi^|#1|Nf*CG(BMGf%EEFi(QPStF8V zxY!AnG!VxCLR_2yM1$UqcqKI3U=0n{CwS9HJdOPs>X;f!<&N&%69v_U9a)1piQimw z6q;SaH<~ct{PC4q8IfIRVp^}9$j5G+8lGZ7zwiBh_gKg`x_+Yg5O z8kk%uESt!g0V=LGzjr^4TVYGiu^@EvWz3r?DHbITNRDU%>1IlFa_|_N9=0D~{kll^ z>q5UM^W@sibOydrRN}}VFGGgDm0m~}1aNbt%)?I(Cycun!N+YlgbbpNfB0;>0qvYc7gz@7^I0@U=mD=Aaj0-+pc%!BbajM{bdL^7-U)C@C`R@_@;>uVtc0n7H`^9xHh z-yl14&M}c<|G}eJ=ZfO5_#;QQ;l|KwzrP%d;qg(FeeZ^-n8s3oITc8inX;jR`iE-A zO>HjlK$wLlp{=oqZzHQJ6~uLRP%Ng1Fc{sd%GKYoqtip(upNV^%-y8A%&-{H8N;Q5h_G zJy+q03jA2d;1o0-tVH?Wp8f?C2yW(TvO|_PszhSkOsg)}eG#=lcalW6**1$`ChKXy z=vxCsCSSf}Wls%!94>`g7OlbFkUu}DjRubqyn?G9oQ;E6)h#*@L?>va-NzZ(Z~F{4 zV6{gWi@-0qovm9RO@;2UgYaTY=<^OJh3>ROQpaiIuiGPh+ywVYeShRHnRR`w4+_;K zd(9L353OIksxF&f4G(hCdO11@`YxyKn>)mU;xkO~pbc|%or^`q9W@;uWrZ%?O9oIY0`)gfn?cuXSQA{#NazUMkXX*pfL;Y$$h#&K(XrFfr9vKH4HZa z9B4!M?KJ}St9OCdv`iBU*&oV*1VLs#5GE~jc>#VJ?3pp0(n`@Wrq6OZwo!W?o z5S^efEBA-4EEHoS-?~>OUjuy39LBJG*Yi$y8;k;wfl01{Qf5t{Bc<+&v%R`ILj^He zl;pN`W^e-|WHtrg0|6}>G_{vI(ww;iY%3YBrcyRxe;&QUsH^*u&YJg9R6DX`5K)*t ztODJmHqmTiCLbNXm2b)qn9_2v2yen$1@H#Ufwl9HRpnIxD8_{-ONPQ%pW6T*o2`gd zfj)&X;YL3n(8TA`IfvH!w?~eZO0YGFuky>ze=!S(P`WuXNC%bdMWRq~nHDevolZ}6 z6qHk6q*woxU|T~Mxn$Yww8JC%_sZ6v+GvuY1|_$kHXV`$C_$|RQGwktGbF~7Tj1P3 z|9qMsYho-lD2EDut~EHC9O!BT=GSzM{0kTvT)7>p%qVu2(n|-U4?APFkW3H+b0fRw za&QT9K^&VDLz)ZkHu4X%JFU&%fPv>9kZ`Dz-+}06gw755$%`(V;R$+I9F`|>DSbKh z4at!Pe{Y*gvH)~P7kfV1-8N&;XI!pDGihWT!R~X|M0sML5PvH*=HbqWCACI?;qR6` zz!wQKDZm)p0y@-n?g5KL!=xn1OcnJ>0X-?Ko4lb}o@wu>lIfQ>=atW?S~sr-i`1YM zb*mZBSVaFXHU`m}-N@%*%^sF0L%2fM3>n5N2*apZ!`)uoXfitS_{68YC8D;aH{YS^ zMV2I8DdEmL0Vvx!R|kPVZ=8LH_<1mRLrM&;N+M-5494#|yRYsOJ-43<{j2JN=#0S2 zwZzQ;Uuf^+CVaLvc--{`{QkW`O+!(yW-kxZ;)N>a507ln+|m~#NGbWCI3%8p99@=y z9Jx$@p}MOIl%bfYB}l!FG8Unc&nHq~SaleCL?7cBj|zr&sRd>WT=WE~PL>oiU}ljc z{fov!6Qx^WcwE24Lv{lmAh6nSd&S=Tn?aI(v;WCTa zFL+Nrw!iOo_d+YrGQq0_IF_lNLbp}5SH}*0OGUGN3!oiU^@A3#woD3`-BG-II`&*T zh6bld{8YkO$YEX08U_*GEK{PiD+-*NgMp*KE6oTrWfKBt8>Z=?G~bxb9~xC+_4FQj z>%Ou7p3d))cYQ1D3)v7uCjQhAnk{u0q=*S<7FCY3yOQ$1ID7ASto#0bTy?1{uF_R# ziI$A4l!~ZSDrB#05kgXgkP&HU+nX{^Gvg$?L0P5Dj8cT`?9KOhsr#<(>%Kpa-{aRG zS9Cc~@ALhBy`JNE9>?(_h6*$zTNCbC2xkB z;APiTemD9_KiW*?7)S^%VAA+{$HunR2*a|>S{G5At7u~8n;c?rycD^C$quYMNV&x;3Z1_vTb$*ci}Gr%C*PE6W!RFlc9QXbG{2-D}GWAHNInma*XV;ICCYs`^3%5IENv! zg8B6yif z1vWV=v3yHP#jSTvTD?MOE7zYK?tX14q`w~P`*3Sk8^GF3+OjVJXl~;}4p5!Z&t)}A z*l`~fsNrucUn$M=ApUHZbg889SdI`{V$H(uyfr|P?R}bY^me7|wZ_Y=#M~2JHJbuW zq#Ba082ML?+6K69En#Jxotwoq8C@~0;VLSd&$TX<-)G+PE`*g#b{Y|An2y*~SzapM zCswF>gV;!7q)8RA+tN)0yyvIBuN#+_7n+4=^+;WqRoaJVOV~8+H z1}zA!t*^}-xrmmU{C3cX$cd2PlV!CT;~6C%eV*w>|mYWI97kUACX@c3HH%xUVkL zym7a$x>3M;qagE^8(Z$)AY5PK4cfFx%lkT`_b?j2LSoQDlHyqaDk;^9(nX**u@Mef zXw31cu7v1e#}1;c;3ONU_6QtmEd6>xhDx#|B@fGsmxQC)WDX2$;t?MK3)_yXW<^~0LP+lBd)Z(pwk_R2d<;Wem1Ee;5bC># z6B7;<>3Lf&+WI4GV^;OODA79e;M1t0`8VRJXgB+h(;n z2!Kg8g@pPWpv`MQ3cCv`4p$Ca0f1a?ZH>YrR_P3<=zz&F-W!k1^tHMARQs8a7& z(<>YoP*J@74e0hMxc)rigFc)eJj^W9vMA$w*l|uHIima_nwSp~7&BRAJ;~fIli!n1 z_+m5^w|Zpqi|oH9D$kRzm%Yf~|x?7fWNnXP((a4qI zFPl4h2t<(t4L*;65%fzEi9ye&;xJd)H?`kseR&b)OPx?zMq4+G>eGH?Y5`+| zl2J~m7;v(BUmnJB!hZ!}tx|`2QO`=KUniGw@WT+l1Nl3G)DEW^=%Y;_qpH_5!{tu! zC{y5zoz*RQMGoW(v%LM6-lO*Jxsv71tieglT~9)S-vTm%6%kAmApsGW^#EF{UvJxe zIBdV;ytxz^r#dY9LbfoLs)e{U;d`)~v3*mOrLs*KsG!s2P3T?GCD*JNtdtTpg@qEXTu&MwIeBT<}~Zq(W;aq2f$0_b!t z-E&PZibP9{nzYQbhCQ=&n=q@XS?m{O97MLyqxAW`80)ZXPWKpj&~bK`5sn{IY%q!6bS%-*K&or8#iy@(A4Sd^k!Mzy(a`%c<{6vsR>|PXPD>d~Q zP=b-5`3Qrltd8|$?=}8_s+DUU>xeK-*kAi(6(IW%v)PNuncH68V`CfHJ zqORg3e#iS zM14KFFuSV>E$;vT4Wl_{qyjZfCzJ?xP>wJ~-641W;D_%zm2bL)8 zuvP|mkrCNzdYlLkdLGtWI(_GJ9^8j#i}a>318gh#w;kNq za+|H`4ozW(5D`plQ%Hh2J6VJ|U@Mt)!P|E$87&ge3No*$udst^Y^VASO_(D|y|;u= zdsLCl^A%*WEsYB} z<9ua=yVUm47BG;Zl{rg75`5G|HL2Rx=mgZb8??(UM8c!qsPv~I)b8;i&WI}m7?#vZYEBdgJQgKZxlPZA z)|jC4oYC2rI@Pkqa(wjg@NW|`of?@zrhc4Ehwo2hgCLhyKm3AFIuS>bgy#AAF1O$O zz|5tdc*Q@$%qXi=7FrJCl6>Y2ILWRj&!!Zm?qQV;5R5uALY5zGp3jdQ9D5?_Nq+PN+5WAA6aZ3GAW}r%7aZS%*^q*H0A99zZ2zmCJFH?NYFQYxwj~WABitp#6A!Nb zG3_9@5#j+8kglnvtfyU6RQvr$D2lgOv*ft{V%Pxz;*dZxYM@tIYX`8 zZhy-niqKRH2=NX>v7egdq{)gYu{8PfWY>5sw*f<|Gjv~ll?shDmiNCT%Ytm})2kRiSY z*pN>3+c1I^5%8SYQ*@j}kh~zFu7fmS=|dtQ)o}0+d-kG_q3Z&38>_G&gLB^GPC0BE zbZVx~yeZ3SPGm$DH}6X&*hwuzO*J-;nP@*c(Unx6&@pvPcTBbCr}y#&{{lZzoP>z& z4IX=#Bx*5`s0@n*6++s=WJpH}beQf{vUJqrCRx?ZA^q({YnChQ z3of%}3&sn#6;E20uv__{5NwQFwmb*awN@~*@8~yR?^-Td8r5$k^(LC1^S-=Z|S3P|goXVN0Wb~rdHhA?W8RukmWn<5`ka?a;#tu`EGmO_`HxafC4%ioP04nShaqk^JLPlACG;wSOuo!4dJ!@ZhE4->lZgYz~U z4tkf7BkSF+bn>PWK$is(nGngw>k4Ll9Mn6PdDyW9{z!)FDje$=RXug$yj~%ut{_hP zM0J$qc8P$6?mSWF@1Wm%Nia#`+h@bJ>mFllDjZ~v>U4&7!xY?~b_>~HP5=(#d<42g?q<(TpuiL{1@_+TpKP)h(CW^Nx> z?ZM;S``n$Qtb_Zm#Ei^fq}6_|naITN$E34jV-FB0JdNhj@RVrfZfn#`U!2ye0$;*z z1yK1VuA4yO&r1}8l*TIvc@dRFfwK^Ti?%`%;e+t-P)=4sf8ea*+%Pso?ATI`ISH$> zesN4x0m|?a1#Y{7p>%V8%qa(O$Ari%TivPSp6K9liP0RNa3K4%BVL_rgGu#Aw90Gt zoYSH{)a$GdX`bn`try`LcDI@%oJ?AGo>^6Z{jg5)M^= z>isZAMo(YALxz>!hm45R9M3R(enF}xl{yJ6Ssiu&`%@`N#0gAYK!FwJ5BkhT^LWT6 z`OeS*QpejiT{xClS05Z{ehM|y8x0GaTAR?UGhRoH_%;Xtg5>!#_P(`Wt%Ei6 z0_(|SGikDtK1R{OI0iM^y8`FAGq+XM4Sjf?a^1t6X9vCFymW1PJ4)F+AKoL`Ce;ZM(hmlK-K|!BH`j#O#s2MZMxO|GwT zB1DG40?=1N^PB+{clZdRPntlAsN#4%p2CKaO^zLuW*(|#zwLH$I!X?iEnrWTPu|QW zDE7SQCHuZ>VFvad0T}2)Z6W()H<|CT<;MbRU(5rg+_Lr&=2)_pJ~M5+`PEwXPj==x zrUURA`S8Q8Dg1VS4w+sM?!1IBAptNeS7F@ss3wcJ(f|%+Et($_pd!(!7SW`dG8NgN zreK^&Qwt;(g0?Pi5&pCXM|WK$6bckPQL)y96_5f&>X8(47;upE5li3J)UWD6hBw3s znbUS&l0HQ2Q|YDWtB-YyzfYxvN#TqEXiQUEm8O0HY8TH8$|h-s01HsE|1B&DFUN$D zCYCrW!!MhyE!MXGBbn?mvL|rSF8=@<1#(UdX9m2@BoI$L6zd4YfeFVcMol34t)#zR zn7uASW_SHooVNnM9=t@&(>y9g7?KDw9g(1Hr>&Vm=~A-rv(&)K$Bds;R}<8TkvLWb zlgRRhG*YfFs=+@ncAU?oyEcAbX>^xvS=jq0`&$g~+S(nkNFf4PhvO4~V`8h?zB9OJ zd>opE-1SJMsr~^d)-B645EqOdN}+R$yRdRY8AqNAK|nXo_C-YG$)=HBRMnqq*@r&N_-slEHS|^A zCS^!uj6|46e~){9i4h%(Kdo<6exlaAY|e*&>yh~n^sjNZr3S&R?>SE!C^WZd_K|TQ zaedT>Y=&#X?R=-qE%fbLEJ$VS+CQ3`x8M45qMydYx=kpj!{0Sn>LJz#8M(eh`X`M8 z-3S=gYGxl0#f%Dvks(*?n7S*?mFPuw7I9}i z3C6T^>TN=V0@}ky4v%7fBD9a|4lHp>L$)og%^; zBblBI<%9wYAQK^!Fhgw-Vqf?hi{wncP>6$t6;r-`G?MjTPlZi87M7Z+BJ{(`Lz%=qI&pI^M12Y>VeGQK-kDzg z7?A*s){`2=+K>o*NGC?deeYrR_XvY=NQG&&H^59x{m*ykN7MX-=Z$)UIn0+3A{z=O z5m`8M@ca=69f*P^SNRzd7=eZyAf+46{rG6oj_`zYyGIad*Zh2CfqrKW_e;mQmz#UX z2w{WS+uK%Cda4)LFcT49P#YCf#_kL|#+;|7YZDWF^)S!pRK-u~DLz&Onq2dueKsPb zNOOwaed_84k&DHyNwUBrAEon}zv4>ZC$LNeXW9J0IHkwD5OL!s&&_}5(}AJ>T{5?E zSTl-wZ+SGtfqO}nK&G&%Tw4O0s7-cMa(Ri(-I{jtzU zokDaRKnY{SUnVJjlwf?!qPqw=5vEhjlO$@MC2pU@c!UTFV12A5c||cw5Wp&-Hm2^5 z8jYm6Uww^;D|0eM_K~9j7beB+gwg(9=;TeC@)--gTmwlsoHJZ%F(M`oGD=Zg9Zs2w zWQI+AGUvU;^Y_v+IiYR+m$uX0r&KOSNjQbjOZ!K)B6Z|nMlwHsBnylyqZBlL zHQ$e1a9Q~;QR0suILHTQ+w*_1itZ&|&doCOi(BgWf4ogi7x+Eo(n$UxC-~uyy#Dv( z_T!CcX#5jlonN?M3Cjwyp~0(-$Pb!N<<(c(ty6xGLw@{psV;!4M~KYCt^Oqhk8F_U z*z^FT`u-c{i9_<&0||mr)3)%(mizawqM_l`{m0#y|G(b5yn5 zHcN!#3#@?+q2vZ0QF$;9rBgp2g5zDLRW?vV7BjGF4OfJ8CCCJUm!USi`ybbIklj?L zd0F`A{E0oN`di=@L!4d(OW`8G+nqE26o0)cnx|*~j4`Dl+u{juzlfEjE+BE7oOJk~ ze+1S)r>uJdke~>g8-8~LSG)w$v+1sWqCx{J@p*X|Aw>9N;uld(^z)32u0rVR{L;n# z^UY}FxvnY+ZG<7-J%p*3m;td6oxo@_LDC56QKP02SloL6&-9`Fgta(U?}d zNBL^R9X0>QCAz$n-K( z`UG*lc|A>lraM42Ys`XNN+6tEEA0#$4__&d$C34eG={0lQ|~g#L~+ynC+D~8_3y&kqDe`J`MU-$xUG zRfxaxj}?8oz5u|kJ^+JyXX7Z;&h_c&TwWrHtp~a2HUa+Ho2zo+d7)1@JJyvt|9D?c zwdWMhKxBYXwF5EXvBYsu);ABatc`CUv5>=@WxmcPs_vc6&Zrz-fegb+;5UVai%%CU zIbFtCNT3ds&|&jSKLT`I2@^Skoy4xJGP0yRtOLHzXFh8AEom#BrSmD;Pw(^M$KOA{ z))ejBzvbuERbS(<c`(dzvf-u{Zq&Y^{Phqx{aHO!4OWK z{!$)ByqL-S%R7xUerQj}^)^y)Bw|69YFs7_sft$M>dAxrj zY+uEJ?sKI^i!>EKCR?>{wHFK+Ap*<2{z^_Qj%&g0A=eVlGwDQ@rXDiv*!VKpyvsu=#bm`Jm zI9Z&1#i^DQT%Dxd_(gcBzBMz4m?*~ZO zl1>jiJvaOD>%O5jBcJm@7)1X}`L}oe`OQ~aC14{ml~q;d+9uWAn{##b%IPOPL+>rT)>>7OoevS0wjVDHsK+J+Xy}h>@ zzX^U&=Eq-lXZ@b7A|e{}@q>edl?xN%)ROsdPWMVbm=goL~{{evd_v80?_ouH+@zW!EjZmFsLL;dY|5b<-fu+DJz zpbIg58-69@XR`bK{j1owZe8<-K4)lXsAB$QyM_2fk2f;Se(meyW0&^ze*9SA=H0us zdC^XLIJRx`h>wpy>6NEq{Lhl@`@0^@k7T?0;BRkn0VW!n+6bqPxaPbr+sFB_v79Np z|D)^qy7Nwm`Tdm_J6%HJw2UgDmXa!tRl)&i4d%5$%1&^oBuLC{N=K~f9bNBPfSd# zY(MsPP&LXp1!D^fi^_h}TeW&M_5b+kpZ{<_`CmTNKmYC5uQvSei^PwGAO4R{^4FKr z&|Lhji~s%qp^{qu9RmK(fB*6Q+wa_=|M7omME>m?@ZWyo;PwA`r^t_g{g1}{x3}0` zoA2n5l9pCwPNOIN|NFNvuI=pXTp4no=kFBB2DO^SdJYJZsSac30(KZ&gN{^=TP=yl z#>Qr`ro8<9#4?_0MJ1&+oNF!!&JE-(vDL}Cx-2X#e|>ZV%U1H#OQCVUh>v5xUFa|0 z9DHass_LCEF?EfFA&;Nq#iK9cms9(wE$3tvGjsiR#mXO=+{ME$RC=i)z4j3iiwj=* zrl;-j`MEn#!sPeq+fM4}>py~ThSYLaQBDrI&}!E!dX4~#q7t-oRPVBi#kpT)lF)KX z_}@?T;KTHp9`gyVubwQqD<2rJF)1^#tV}XbbLEptE8Q=c>ll79R=qTix==#l^5xv} zpgk3}hKzOyHh%EclU8^sRP6D;pBW?fgA~cZfk36y_VGKSZ1JuM%lSO+?_X9{5~*Wd z*!ZG;v(Q3;H$_DfxQp!U>_xRvjOwGKqYYExhYCHor#4?+)?=>y%l-QOOFcg0b4MjJ zEo{Y<1$^>roSWai6n5BNdX~DNIMmI}tvXRt4MhzP=1IONvZOCwO!wy3{a72t#O1@S z;t8REDh$83?X&5*KQ-1bP4Xh==XKL%3jP1AL4N$=@PkW~M#6G*SqnLW409V5ZVpZd z&kQy`ZdXjZ?Wg|ok8k`83=H*IRx!xyN2XXa9xi;gaM7YDWs0Jr@`YuosTD>)7+}AD z5b~XT_>q^}O19H81oHZGyREZ$Td{;Xu)yCBDGbMB`|5G8C)Uyr7z|t1oo@4gz5k!@ z@cm!H4^CWq&6Tym=gfnYnkQbhp`I2~ds2(XX|?hBS@zkS02a?N*5B+`Sa{@ut?g>W z8;Vv|DryEzDL+2*k?cc<54WLVwVW6*bh#ZH#93kj(#XWP%S znqS8oGYgZt$df7h4O(5(W;Jo_*cOT>wesv$94cyr?s|AszLB9l;e&I87cN{FiT1yx ztBc!R;mDDzEMoS`hYlS|pWm@1nFXUi)GsPsWtVg{SZ@^ur@^WyW zm!j3}RN5qtBFM*QyPB!4ii@JGvcKX``)fncH!4AJzP|jf;%7Bb<7$$`kJ6~xfLb5% zI^qpEghyW%qdHH(8j>0sfwea0&)^vLwX`^*3O*dElr}tA_Eh57I)W)o(xcqmcF}C@6T=4TRShFX?PR?d}Q6 z+?o*0J5;0B>$Eks<(U46NwShvzQZlBT~JWb>;O1@mft>!b8&tIgS1ztEW9so)8T7h z?1G_iKaTK}^bqZLtRv0Js5zdLlT+ynwt4I0IxCp~j=auRg%8hV~7bAO73H-O;T_mA<*7_H@E zyRjcnE~TgUay{{3JNI-vT1LzWnIoPlubqKvKb}?{%_CP?H#9K2&Y*?(@bwafLP@pi zkacq$7#L_6dCe=zx5b}3$8IPGk85qZACJ0c$BycX1v6$bt^A#^RJGkK_!Y3Q-I?|# z>f-^XI3^aBvyYqKypb*S<=u{=_HUGMD5-qc?>SeDt~*MApaSW7)N*tI>0=ss9o$VP zKB(=n_*ib8i(^^MHtAouFgKNzg*7>W=WW&F{H6H8*%uYn7l>$n;7R#IHCo^X}xoL=`TgA(K$C=!g7hW^|$o$K6vtlv;EnGNRF5rAzl%YQ{(Tm ze}(zw3v2lbw?#`?YGm)NZ@hWW=a90?^Fy>s)*%5xkui_gWenet>1Y;>PE_XaHA$OT zwQ3dFmW!vrVTgBEfd}VFdY;Odg}1QEx8k@fKf^NLwYkxU?qr;;f8?0#`Y>89EXko4 zwp%`+(X^kuF0y-{lao_rvhD#A5}3hu3UI%AwHRb9o}I>Ts%bSS;b9;psS@^0x6m5+ zq$Aogt&B_(2cB1iYHzrD-^@zX z%2K3XTpIrT6>#dU=+^J!nHhH`FU$f)`Y>b&hcrfRR61n@4#Cd%d(OTWSSx0q&K&Hm zj$WtdLyj8#(kVRLv<*tMcHk5q#omvk!k04q!)orw-21vdmUCV1f|+DVip@-GFaitO zJ;k@N0u)U2bjSLIm|l(oeF?mr>vRc31LDBSt7v@c-xl^{r9a)a@=b_etabO+*}?;! z=eyD)B_uj^ZVe8utP`OYCF(d1*r&!kQB6KqrSVHefAI6~H41C7+c@I~v!V|yQRgOF zD#H&g?W}s7Tg_>ZvtkWRv4!#{8Ek?ioY#0zJ@?XuyECY7qc8w(*lpdVymZ;Jn!I+T z0U)Ne`E||7B<+j^QsBYGiAJUJrBF2Pr3No|VH|>Q_7Ew$NOi-q!RqemfSty7p}u3w z&Y){0rzRMJQC2^yc4e=1SM|HyOgc=Aj9c%uz_PwF;uwRlO^^RMGR`0=p?S)(E^k`AxiVHMLN=mXvK^@;phHNPXB5F*xqjxi9L_d#9 zjo8lsi%dyLNsaM3LghF3Q)RKWvvKa&5(ZXpfB!XHstG534U}IyjP|^v!d@}dU|hv1 z`gtVIA_#ZS<&yU0*&&QwbXEJwdGWfw%BWjtO5f;HnU9WU@cj~kl(jO`qCi~0=TU=cf&GkS|9*`*|B!v=s`JdIAFtyS%?QimopEa5_>f=EORBc> z$DjQBH8(A6OlE9@^9<4g7i>Hr>^z$*?f}4b8(Viz56^-H3-q~gta7oCzmzV#w5fWO zzfPSxm5SLi%T!Ec@b>Ob9eHYGVW>B!ekz%6Fw7S z$#7cWpe=|Rd zYT-9(@}wTy7|FMF>k;}8L3g^;$~|Y^ZcM9Fd;eQ^^Vq|?`1n!>n{`{g!SmgmSoEDmG!p8l zVZ|FuN+ju0;RAgORbrAk&$to7n%zICW}cW~<w;qoXrett6)&ng9IuuO*I45qt1H4!Mf%Ib`y)68Hm5a&mH=s0#0HQm)?+(>H+RAuT=vaMJ9v;#%de-gIGt z09A!7=Vl$XbKuO<(%x?LPK16-+1$lnLdkIjhUjdO^YRoui~7U9iEVBXc$ z$^#=KKA4A<0=hX@D{=ANyLT&DSa>=r!u*gx&EF|RN%=$~IjA#xF?n14%=mhu{&90n zGlLuV*YmV~xGUw|(b41Ad`-wN&~SE{6phQHM+jFfpFV{ry2~5A38p0SuH9#o@W&s2 z9CvzHYo35GPZ}#)ZptS%s_ItZ`tg1@l)`P}4KVmy)&P&071BXs4jH)^TX_2VM$-#T zA~2`x@tAdD=l?-VYtkG)mWSeV5M+@O6kD8qeSM1l6sxdZCZ0(%AZHXKI;M|B!UFN$ zw7TLm0}p%W8X;Bj6O+R)VgwISsxPd)%XT0sv0t&y-7BL5z$<-~?(K5YsSxIGT}qPWnKwl$hQ(VCd@4Db*bbmj+q}KRsJy zo>&PY{ueA3p+6O>7*3Um-s6qEzVzj*S3%Wk?j~8;*+xtKO8<;e^hKd-u-7O10LFZg zW=j??HZ|DX|665tvb>ioOtLg&AM;wxI}TH66vf&2PUf|2#d6ipgQ0Ca^I2ifxh8?B zaR}cs!P=18)Atc4v8?KFILu5aT4SB`Bbx}{%fO3b3cp{{s{Y{ z1aWuSX#A2#6dAE<>BJl`aITQ<10pQ;_=J1Jls?^BpkC}rx$@1M^>ZI@pyPDCDL6hc z(Pn2ZsnfYcNmxY0)J#$EI!C}E+L2i5&S?2f2jR~y_&(;)%W7&b@OS2mKH`Z*3TC?1 z(Tv+wPtcp%LBzv8bfzBokQ7VpLk6S;~3nw52{jPoiVNSsAgJJ}{>qzaM}2@S*TxB??E650}!> zDSMpoZ2tKk-Gxfs+?q6FIdgHjx!D<+P$e@qLsz)2$JWNCmYF&0$&)ieMK51= z=_r|xco$*hB!z4!6KYoE!8C}I9L~@`ANJu3*QDK{9;jjA`L}P>a~o!U zorI8EQHN7fBV7GtLq)kT@pb1p`S{@G&6`t)Z{EE50CN5_jmX@I=Bqel8PQmA6)Uf( zM@w;fc6wqErMmR-QI{f*N?qMm5 ztaVG_Qn$ys@L4fsU@m;Y#bWz|d`oWFMqSChwmK+kQ%bci0Hl0AF{Bzm|5%9nG!f9s zATmxV8kaAnKHF1mdNtB+Co*rONXT?`UPEu{1=PrBX|$r0FAv3iFV2ZgQD01b!jlv8 z*6^6vXE|Q)su*Siay)VN3XUQSo5;MaKF=Z3n^WOXrY>)2rE_-34kFVBaMRTQYNmfi zvBCj=DFyncs!3X0;EQEHnNNG zEhyG`EvQqOFj&yNhKHig#70rLrWaRUE#d`cc^NRVO}2ea@1Dn1yFCLnE`n4Mjm+b6rVtA62xbTVKAxoYpq=N>#&L#UOPkE_t zUU>`guC2CbQi_{2V~bLbo8Ww`fie9kp&DkA=JfK)QMXghbF**W{CwkS$pg2g zFgU+!6K1?$*8Nmxg`eGJO@+GJ>ak5R0$fyGcbU%QEXD2*!<35a`9Pf1zuxxveY#|{ zIx4gHmB>(HX4hpGDjCWG3}pufTNk=JHgtb1GcV$O2~R6dl-4G|p?da3O2(NIMu@fj z-04@Z>rr|rw`tR+EY>M>ztX0raYp9 zP2z&-zyl3V|Eg62;QVS*R1*WwHDf59797L-OLTTIshxIwkv+75A+75&O{#r_ql-%W z+K+s1xrZ1}n=U(wgCo)(bC1yQQ=5>(@mCGgF7Xhp9Y%u+BZFW)7ZG~>_ zm8(|CbU}5X@?os&iV2dy-_lB-4{@K77JJY40?UY-kf`^V$uu=JrC%?Co=Tg36YQfN zJ?kcTDT;Nj+tr5`tQRufibA6fh~wOhZLj@l`OlIllS&81U0i6~to69RNGo&~3O=v! zSk2Ez+BC}qr*FzHFRax~>sDHGdU;SKLxf^?CU|?RwKd(dDb_ZZF8wwKD(3_4p&G*f ztaNBWE%TZ+v0~bayr)zDV3IX7<@Cvi_kfvorxN|=+X`}YTF|yX(=P-R+a^*6;CLDH zDQzIzh#RKE{vi3)f8ug66%W-IKXV&%%Up&64d&7U=)wYu~XI2GV94fK7Wn&)~9hu7nGYB2)f#xxG*(p?q&l(cohS0FAL z#h_VvbaoYO@B22NiC~9=A3tJl9)ThaW#^CZ7n_DN)>7-smms*CfTZjoprUk$U(tk@HI^@b&IF|dkv^%T& z`U%57PEf`~a=vjpPEH*@eAp1WT}w2>AMy!?ek$U5v@)mWHDn58aLx37j6Kf2wS^af zYI5@9-v*s}swOEZo}*8*I6Ln+ zGl%LycvK9jbo3ALnW9_BGP_Jd%N=Vr7nWN${@VHYZ`-y*g0)bSgLA7}ApdTznmDV4 z#ifle)R_w!PI%-92Uu$fg|1V(bMLyBa4^SE;3|m&7bUYUPo$Q#`f(|}49`PW^}4I{ zS&>xqB|{)C9s^jNV5XaWQIf!vwP4Gys!uVv?u~jb(*ibRgGBxZFU*464tEuu3Nfp_ zHNY{cBXYudp%2NF#`iPK&IClxoq8aA(G>W0LpBvI|J|c1vGNb!h876@2Hgn6U)(N6 z%h#P7E!Mf*#m?Q`eQmmZh@{i>&$h=JtOWMipdNh1 z^mljSH1Q2k__oH8ws zhqaB1i)-768pC2j_4E~56;MM_dKI3BQHtd53u1xmD(WYizdeSSr3Cx_4r>JK=237A zrFHi1-Ftc|4e8U;g2PhG9zKs^l|Vtn&dFK4@xB>|GL?y%dr%+#ZG{@aldwI|of!@8 zKu7!l)1Z&(^0ZVuW<|MNRco@I=}} zxdSd-R-BrrmKo!q12<4$x*G^kQyz9ecjd~J7pHI{eE0|3OS__zpZwCcKmEf-R(5xw zU(Cvdwb9I4hB|MR(V?(R#TU6ERV7V|;Ak3YY0aw36m5A5^y`im}Jf^}Q`Ba-84D}@n$-F&S^ zQXr6V7D!7HT{!;(eXa*28Azs1~*#p&#KZM?28894Kq(SwL#n}yf^~3 zY3k*?d-t9M6vmDbbLE>Eh~vGnv~T(OsrgzT;of>8Bqwf%n}~(=iF5FI--_E-Djk2=p>*hX*?BwN184oVHbt~_BPEGrwZwI=T-Uj8VmfG9X zlg=T~euTI9o$i|U_V#UTR<5pYfJ~>MWoTFgEXAA7pUf3Dw0`=u5#7D#=NH$5SY)GO1;Qb~ zHeH~wmdszwxi3p6F5yymboI!wV`Wscy1$a#=!6BASj%G2TKW7IP>wjHMvE}!x9P~S zx30F5hM`gUPd~coIQfUJyYFS+?V6;#Ut7(xy^I4xxeWz9G28gwicY06DpH)l-30{U47UpCc2nI zuTG>~>{K)_yF2+8Of+6h$2>o+s5*RlT7;ofYdKmd-g;2|Gj^u z@ek3=n^avEW0|PdY-+V&JdCvTAW(*z#k(uObRyuLf#89qN@DCglLgtlK2!<4-l5h$ zi|LW4zkjTlcvbMwm$u+RDR-?l#yB4@Oo4ei5_f;mCe@MGL6!9fXA3)+I8Tn3FQlap zQxE_2X^4)I=d#fiSN94Yy?rC4>cYWs!5q$-Q*%$27bh!!s?ISq?Q%8L_fll%VwVZt z&|CDP{)$VMs6X0!lFm{0abWKB0Bd)BZ+~m+79=Y#G7|)d z3^3jhue=C~Mo1kH!W^hv z!@w$f|J(U)-uL_`s^_#AH*846gMV#$VY|!p^@{ECkG}=b(lPH(JNWF`FVFF*jfUDq zudoDBHaxkp{@VwgVq9ZAvi5qc;alW#6Ad~Sy3*R+ZG&xP8l08LNz||ffV~w#Fig}% zK8XbMZ8y8;KHZ)`NZk+D;Cf_uPkcoI+aTii_O1NQTenv6^Yc?QsB!6M>lNv>Ds9_J zne0w-%YVhQu3H!cSUN^~$;iPS)*D2{#Hin5F&L53)6+{bprxf1Q(gvK+Ydx2kEmEH zWq3t6CxmpsZJByKoMM(xn;l!>ot=;BrFN2HKd6tIu)&vYVrt54!D&;axlpxJCad|h z?xU75d1%6YTQ#o&RD*YYnoO6XS%=32Fp(LQe??TE4WpdO{sAHdu1DO%0(SN!Zq!*M z-CCgYvx1{B>d=VDej;>^XTV+-=R87Hd=s1y%mSd-F~K&SL2$BhP&PV zYB-`inJHv6pu&9WI-s zVWHvVj#H*QGM|uviBuFuQmR36i3=1y?{*InksDc&)5LmOZ4G5b5(4a*_416OTID}% zvFF3U(a4x+kH{!>L%!y^YZ`{EG@DV4cwtSM>F)IA)7Aj|&@$y%uo{W84x^4cZZkgkS^5?zFZHLQ34h%@->;6uOAP`=D<&YK6E=gbGP zazigGdQi=b2kdBWAWfM)Q^qi>u6Mgm?h|amk}n*(%-dDV!$S~MIz(DpTkqU8Ny-we z@T$_P6^+SV2a1s>gc)`s+b~ciTiI>weO+B0&j_Osis6PT!JXsd<2NF~b8IbyFONSy7e)v_0QT1HI-@tZH{h@zqREh!bi2WcWih4Q zS^-n>bCQKMH8nj$r)_U%J*SWXrun_+nA0|XJ5T78eVdZl?>i6J{n&cXjhQ+3j^}<4 zp?aTp(!Z~bk*o1KthS}iM)^_wE56>g&0)ioR~;g&l5jNp!OwaY-9HC_G&JtV3M&m) z?w{hgRbhY{X}ltcv>Zu0mL8mG$kU%|2dT(Mxof%w;vPlD_gc~xIB)e<6PJ^3}iH%7OXI462F zhB+Dy*s)0acuGn8-Y~ngQ<$|H>j@^lQNr?S)+kflq@9`Lo zv1Z|5L*}qo-6b4RrCkS>MlVd*C?=+@<2++ML5|jG1c{u3z%>|m@2~ckm6ct&X3d$$ z{m4Pv*uwn%IWbWab~JuKC#QOmCn;ouHI$k_4M>K)1A^UiX1Ln+VU~oB(zOgYm%7MY~voAeDg!?#ZItnnx`n!5VRu`*`;e#7xy3N@-zHQjMxUAhU{ z`{+ZL(l`>#l^Ap{o`TmKvFvT%a*x>VtV_>4TdzNu5->H2qlsSSBT0Ire$w8zdw1=Z zx12S$;2LCSgoJ4OW}9F5_1?-TN(HiHvz$_FZaH_iGCMBpcFzjVppT~8=k_GHUyLnr zGs1_Ezqq#{`{x6pIrz-`a<{M6dO>By{^p9jw7fj;paGvtq90FWmQn4k&6V&3wux!4r^O z#H*;7m@)vge~sdNnpazcv}7 zxdwHc+4l?AoC(WpRJk8&JzZFELb8@nX2OrBWm^A|S6o~<*aa2oqouO!sv>6%x5=$c zhLir~51_{NG<_(_KXRcr-gMF9d^C{7aLfE_lt{?Q$T#ivXVgqM$G}_sAUS!+QmhX? z1istVlD;+&mN3||>&4n3$`cy58*HANRRasoVA%ia)jz)DcFSOU-~3A_?Q(tfoOSQ4h_vwSp~ zWk3v!N3(DsAkXON9G@nEg{Lu85*|I^IGGN=!dks%$m{&Ol{}zX+)k!8R4-4@)946S zGBNp>J2P>^io&7<5c0(-P;k@l$4^`Sx@vUJ7mGzCPx+mHAgD9_dO2AlELlI?!RFVA zQWOV=^w+PMTW7~Fcuh|IwT?4Cxxi>3+vU+l)NM#WX*~x*JBR%5-`|K9{6R=B{feB zbr{0)Dis7vx7LF37Wxa8mZjFLW}&}8jJdZYPdsR?o10m$Z4)@@ppi(FdK(M2{5S=6 z{xj=&4yW(R+HvYpVc$n{MQ6AxMOHiX-vpJn$ZU~^E2*W?D+Zbspx}mPT07NI#+?l; zD$cT5^c}}ZnV*kBOA3BAgIdODF1K=Wa@IK!^a552rD#s68FVivL7g##W>GOpiV0k( z2Y4sR6DMvzyMP`%6;Q*4i@VJ0r7?9ieCA3!2!vS5-aeb}Z9FV*6jM)2Qck8k!o52N zuC{fuF>E=#N#frYmP38>%kcH%hFlgtE|Y7{tIB&)Jakm!kqT*w`+sKwZ=6%Q!fT5z zA(m<;)7Aej`i}S1S&#SiL&hdF^;WjFeqjGdLbkkY6d-E}PM7!sShr+li*lBwVLgV~ z%E>xna#kb#&BUT&^#v=do$s9i4}nl7@H2luHi_yyszWZG|$e}qRzUs1Pi@krG3%;p;*X=z1J-94TdA1?;Pce<}B zOA%9th#3&=Hgd=Y--ofjShW^Z_pYP^)q#lsSp_M&fb9U_9Y;&bXJa~IxBs^Wn0|Sd z@$g84p;*+Dpoo86%B=M-8$p2EvWPAV^vrD|*3185oC|YW>0oPntB#gY2(Vwu`}g1( zR_@k(oSEqdd816DvV0Yqmo`-Io`Hef`T6;ZFoUoIck#|*sQ_+tw&Yd?fFlIN`WTW@RJp|;^8AlL+R$(&jCn!+_vgs@=kGy<)4p3ZYb3?w ziqKudGO418p~82KjV;y-ID?_Wi!t|YZ);-*H|hTKi@$^b%ZxGoOG%Czi^oq!5shbf z_~YNh>NMBrC-J2YQyU(nr)y1#F!CqSDhd1Wn)x)$Z;iAOslSAAnlBRHBw9a%;%pj-G` zv9j1RN!JgmWImG}JF;wTE_%~7J93;`w(exau3xUnMKp`~|1tO0VO6H#{~+Ut0k#5y z2#SJmNKrsq5kwjehb|>lx;qC&L{vJYRq7l%4jqa#2+}2>NOyPa{W3bjcYpia-GBC4 z{ut-FX28SyKF?jBxT&snTp4)1tgq45Xt0F*H$uX_r3OJ{V4>|$x9>ZDhsM>jcW(r4 z3=lK4$K&CM?fF4==Rc8IYW>}W!=))0ARm?J%)XBk);jtme|eovti~`EWN#6mP z_YnA77KY8bUVWKuvD;A^1^3_j2%Z6* zns>)ux#}#v``ziG?gVQN!6Xo{L8)|eZ>eCpB|61Y01?UJ?592%2A($oB9 zJ-hpH+~PiCH(zo~yl#&Ab$0IWJ=<Z!WzGV>5=nu}S2iK8s-DZG%oc(Vr=7>YOP0F{Z^?WhsNR(pWOUsd$cQds2Kb?=1 zZ?sBTGsLj)bcp_aI-!UuimI7*`NET|rkgckwqhv~jz#*B;%G*G1xIwL{`0o>0>gC_ae z-uVW-(0~th$k&}$q+((<_%!DXZM1nGpZW4iuDJ1@r$8`##%T_2BIA0Vcd1X|ZZOOD z_Vx|{zm#eyDTaVd)ZGE@x)h5D=mYb{zDFFSiXa>dM34}eB_T60e-JS0^h0W@0TZx6 zaDxj(^7_L75Sk(|(liyO2WpC|&>eI<{v}1b|4?+_={fC1##+17;VI_e6%kqC zy3AyrqSCVex`#@rqhC@MlImy6B;k<2c3U9!z`ZjcM9={ulo7(}d?J&RMj8r!i1!9L z5cBS?L6)wjYSdP3whye32Xsw0W2rB@h zfn^VXE1n7a;JIBk^GIb0_uk-``}a%iG^{3jcn* zp>3b)PWwlMnPkh<-4;x0`}AEi$fAImI0!EVP#*15RHP&%w1{LJ%8EK@ zW*7;3f!BmzC@gK-P1kQ9t~-=WU~%MRhV0mdaRw=h$Ew0^<# zK72df66;z+5Bj~SRz?m8Y`vtsf)0zF%ud7Y)pXCYK{z3IE`CHVGsirvjdvjEys!SO zy7n?n-3Ix|_}Vw)rJLM-{hr&Vlmw&+Wv&>uW&r2)Kw)pOI{OfjzQBa7ry!f=9Y8CY z;7QGGKJW}#z1f^+uJiN(s-mt=0>R~=pb3Bh>G`5%sF1}#$$icWQLm+_a@Zrnb+C{0 zgAQ>@z^Jb%|D4F1eKh?C0>*7#zuzi(lr;S`hZ-?Tk01S7MtnTHynqi#JA3M4B1`Rm); z+erC4#V;Wt(Xx#23Ekb@W1+M}%ciJg-5c*nW2F@jOt)rO`{m;J@6nb$5|u>-^Kx}4V;h$ry za^VRhI9Ijj6d6Fzj@)0U^wWBB!F~9^Md=FXP?EjrTDCeC+R3TLQs2bVZFX#_Xb&fP zI;*j~p|9_~b+1ewtNcmnAb9?RYsw_L)>b`oV{&nxuS_{L#q;JdApZXE%U5Bx!ttJ# zZFX+JBL$~q#ghb#-rlFyhEx`I8PLoVjOvD*d zKu?bvqWFSd#3hj+LX?Dp0tK8te}vPFaF3h?1OyPdyMEJq55?&G*!Xy)>K_`Y@U{RB z=2RF$G!2)CbOm}%@;rfZaFH+kdlNXE;9UAZ1{g6nXFBNMndP5v^6Lg!rT8| z*w@Ywy`AN@q_r4B2do!x7}1lItlgW8h+tA}$$w$Vu03%i|E%kXU!{txeKBQ;welm| zx6EzDN#QAb<)yN>CXZjIl5YE2`phnGwzTVSkM?z2k@u#mkBm5`pPSP-kElJ`JRnZE z2!wSJ1df2g_Pq_<*C^mY*UtX&4q$6T0=xzb(lD}`h#Y#J z*tj@-wNEghbHRn0nLAhmRY|XE5Dx#nP zC|9_T$v~4#*#a}l8VKJN>g*Bci#n31~5rKomD_U zv#=!Jqe}0fydKxghuY1O_4V~I>&-n%PMev&6wsBzNc5;Xb{;se|6ObX`m66bO@q|} z=)zk&GK^HPw_HnZ1=2rk3Y)(6E#$PC=zR=2P^C)Y=kb1a^$UBI*td_K$PY1$Zimv< zql2o2YJ8>Iy%gWTw-!OqEuyAxGW z+%k(nDwabd1;ABBG>R%C=!X*H>jw`XzA&jYV+_z(EYL8!*KiZ+Wn~j*jDNs-g=Y6Q z_Jz5*rfCN2(xie$9Ejgew8a zF5bDhxt~UErd_r`R3Q`~-=ws(zxd}V$`X`Q-J<8}BWKhuD?3keU%~v7lX+%YKy*A+ z1j=?`Mp+l`{m5a#5PjnW6vSBCu-K^gnb^#^f1!Mw-dLBHy{oNz%t;lXar ziF#`e<-vL_nv#FCZ}ce$N2nWfIwS4{7q}W8Xu)I?pN=9y2XencfrANxO#Y|sRE(D- zM^4c47If4IC8VGOc3Wxy<9yXk>@2NEyIq418zb&}U zNV2#9lcZW$eqm932;y@vh(O3E0nCcDISxyiSXo$D3bs&1fuPa+Wpk2W1yPJ*H z=wZdTXN2O)5|CBLl!hIG4G_G5D$6`<0Vp^^Vg6JCer+$fv5ifDp|gTxSU~$5FR!Kp zxK`)KF99H%>iZJo-h%l~BDud9H#?djBQg5ow0~4Y1Wc=KZRetSMb!@+VAAYJ{i>1q zWB!nLL&o;J!x;Hj`EJE0hE4W+-s$b_V8EyxS)X5+YDs?SbBniIErl-TzT78FR+xm} zT#rOfq-(j0A6n(Ed9ny$pRlm-Xg5-F1EXf76A?%A*i0rG0|zk(V9Z`a0L+>pAWS)K zZHdFA&^qm{0id+aiE>wr)pc-+DY&-xLdigliRFz3K}t33geY&iK5{=88QcPi_?=-A zTPnCWq7gf9V^>EwXOAbdMVNf75m-k=l|2TDQX-**-VspO!)G1o6ht&h_*%;50C_frN2uyr zGQB9}%(VC5xP%HC1v^0-Fgv7r%}%d-w_+osH6+x--i00%YUcoLnSe5$Ry9;Rtn= ziuI<8dpeC<;?SpdFydkT(~ju38bHL$KYLJ)`(_BvCr z3`l#{R4%j@8pq$fdDDzHRGJc~p319#s5DHJ0LE?+$f~D98?Z>191wON<(Dpr7?^}J zspT+r=$P~sF~F$24X^Mqh{)z{-#$YdLRkY$pt`Gb=vA#!6ZB3qm|`jUP-!z?U@=Ya zR?i9DTW1fle!5&qJv}rveHCBlpaPR@`g$m`9)IPerKb~IfF=R@_pxqx%5@nt5H^o@ zg9S>ixN-~BMGVkC1iyH3q_^bgS-NTfXtF=j7?zBH?**sBYoZGhy)y`h5!`gZbfTrY zx|(SVgog+#4t$)N;l5GcP0Zw#?)?d8$aOHRZ3_kptX?3#no0tqRDC3`5|ci}#_pxs zba=VyK5{eiyPS34@p-o?h3x=M*W<>p)_&7+vpM@U+Kl+KE7Ir2f34`* zeYv-{{rtn|4zrM-OfVoHy|%n;qnLD*fG7*@I?{Zm@>>o|BFKq45L@R1Al&Q<31y-M zkjOo^uy7WVHJAg{W%d@?%iAJmr52QkQQe^_Dn+{|gD{AV12YM5R7=Av+;4=Pbc0!q z0%vz6o70XYt1UqKd@JZ$0&+{ShY7CJwLq@ELhUsB&$j~WI;QBjWBU5~02v3y`M9iN z?$HNrn^(cSX4dSp>tXB)GE*tA0gQ&4TUe^s6@kHs$ym-m(}WH{+{xLw!hdsX>v+Q& zWFQLwC_hw<9#+OS<`Lxy^{EJ~Be=}3uLqoC3=C&DZIa6`3K*ex&OjD$`EbvR1Hswe z&fZXrT(DZzH`c_v{r(2z&vVQ>&-i^u%g@1NOc8JNHU;r0 zfuOA4lasPfF}XYY`ByUuYK6u*jx7Qfl6oLvGiSttpt2SO!PdrHTwI7d2p>4|+f#^o zm}1je|DOL?tEFToQ)h71B0NBr}_ zEUbEubP^a}tp{+3sRLdfjn00M4&oklM=8R4h&uw5_rb90la zL_kI`v=*3L#P@3{qjX;ac!R8Ll^RbHawBC{)lHZ2c!f3W0bU04DC#aCX>ii-^#p>6 zo&FsugnmOBi~;&q28VSt&Wu4GgTshHJoMKqB|13KmJ~ACU#gYMinw7E*B&WB&&U95 zI|Llp*69@pJ|jHQ>yijNhHO2q47)hyDT)2gMDjciDAo5ND_C`CTuh*r#yfA=JT<2R zIaP{=!pbv;og0a3h}03vxulw(q3cw-^>5!6B*5md%K(e0Za~cx1T_;+4_h|W6c@4; zw(M>#pR}j^bH+c`PB(1cqe|ZFjV+l5VS0XAym#c&r^;#;-K8=;nenl$o?4QBLv+zyuI%sON9}d75q{9;~WYfl3$F+JUz* z#?F3T(Vm%P%K5Gvy~KcN|33L3d|~h8J?Ct6AWAg#9>r7(U?ilm1Rvdtl3u*(G%Z|P zX(Z(?=yX`%pt{=Zl-IfFF!J~K;|Z`fk1>X1(=HSR^C?|0^?|uaG1HcU?<*n@{=v!D zS$61i-Ejs)v=txDVHoeh-IlD<5^GuWIw9e4Fg)1}D1e9H&IiLJJ%t~(gEBi!0BlbR z^7Tt^(^M80@JKlcB0%)U69kX}jYa zln8HQ4byFBG$EC-kA?>a(}8Ter9oo}EBE1flNoA@jh15?^rR8AR^o!?D9c+xM30D% z9}glTLEQ%n7sOg?MHOBh)w(7*mr2AXAiRe*V4t?3JxH`FNWuK_Dn$KOJopjO?D7q$ zN!}njO)#C1hn7Ma-%z%1tv-fKIP9UzMF81B#n&dqm})di zKM2V7>x)gL9^5>2%7g>fc>)&$UJ{eOfcx2He1|z3J7n1Fp@erfTzDq``+tW&U&eg* zomJn+K9W79N<^S2Tkz(7MR5DuBs3$y11UF@{)$VvoTMN@jOzw9!elpIVsmr*I8hOR z7)-EUH`x+8J`Ax@E$k~`4W*PMIdg^vv?p{+kT-GD8=alX2#%y2Mns1GBntVkz`1mL zJ!uiZc%ZS-3YuA320$nM*|V{Iktrm{FK~z19WJglcFj?2Aj) z@HvJ6L69`uM7ZVMTu2IQrx}(p>J@ut}{>6x73O+oTC9> zFh6kMEql-pRYd0TwWg5M^*S#RUUar$YvMzoReg4{;3ad0xdNG?>;jbHD#Q%6F+#pz zEM;hs9*n=m&0PagBNoJL1{E`=lEb{rK+#I$x2}fFv!PBN^PdXNJHaYwQz2< z|LN%N0kJ$FVO_zu6NnDR=`*133PEV&^M8{_$L+ASz?6QpMCp#g`ekb{hWh>~!RN)^ zxmC628CG@Q3DaXCi_e~^Z*=G9z1W#l83^;NxEZY2k`S*jGNBn)s4%jJ9YK(@a*0Jn z`WZi4cYMIC*Rf{2}RFX+x$>iUtIBg{=60lQbWK8D{w}Zy~y{XzUhPK_@U?oAj&YvM4y%* zK6dQp5dmJi*%&0mY`B0)u8Mo|?34Y+fNrhwcs}PMhZrom4f?--JT-+sN zs+)6-ZS`)_myTGgv%3Jw!rnq^^I?CSSxumbzsLj*#&;s(K4UadddxR+C~`MKg2@Yy zR8uzmoSKS+%6!xxF*OXRVwI17b;l9%4&B8BA=~Zk4buRG4DEwNoQ@K!F@MRhn_|g` zb6+M5$*Bb;;U-vhdaN6i{eEx{>tLs))dnCpAnF4|Ol~O67NH~k z`g)lMo=5qdx{0yhN{rDvnb9t&sEZ5Bx{MNXGPPl@+9gH!pUhq|Ub)>xY3`3H58l2!GJR!!eugHMww^bYLgsZ+rKc0D*2y&LVuxw{ zb$jD3aNy5;#-yhRw$M+Pp}fAz&D|Bt-D(FqfP!UMXs!!6I{*0`vi{ef?8J!^DhJ#I zU>!Hp$m2=XL^G_YT&aumQ6eJtBZJ7wIt0uCK~MQNP#X-w+E9N8>u;UvVSuI!SO7S9 zaUqb;IbkSu1L2?<%tSH(tUCn2XWf!Zhf)pO1~-%?eK__9X57UA zR@WaBFomup2uTE#7cbJ5%Ha$0^T)c!N1Dn!h+iL4{_$h5)OOE&_hn*sr*i%_kTlrm z^iAU`ORmsH*{jY!EpHWmn{DgAX+6f8)X)R?oW9z-6ooxBB?5xAySs#xCB}1PGD_EW zQD1ruQGl`h^qc_$5m>j2(%T`EjH~n*hSidz=)1z}p59J>btwrZVNd?jgsIrq zsTt@L?u05nLOgbICKD&(X8s@O<3jETl1#=5m9^$4QQSyeP^=n^hc4a%kX@z?OX5&; z6|-{srMhisGbC=`zMZ-d1q3gLm1$$MNQEz`K*%u~{$waNIH-!+`s3X&9Bt|5#{vUQ z1EC1^PK+<~!I+lM#}OoT;4p>BNfWtuk0Kie1je(L%n8v_g!^d7z9(a^(Ta__-jgWv zI!m{-Le8h`^!%9L=6B6ae)3|S>`luR>ZAs>+LS;*82dn!yZ83}Xn%Sz--@dp$}ec| z5K_Yj_t@t%BwcLMgXJ$hsT2AvX?jb~nXg=bZ0%7A!*44}z2Q&PEk&%R5L0l~e zHfZVS=<3XGJgWBvQ2Q}&JW&z)A-HW-`?!4d5#T5x`d%{&H83dLP?yByv^v3&)z5ya)|`AKRMi(5hO%iMr)l0+!12c$et7@IP?y1M?aL~$s- z`yOP7;2qLuzW{TLKFFm8rly#OZ2)FBmcOiy3dJGL7kuM9xQPUzT+G*y5>QzpgbPzE zb&~Elp?b-8?jJ4QyO%MEXy{na;JyGAx6o7JQaF(=dL@jgqn0u@F0~HfI0)p+%>cDv zJJfg;V^TGw=lW=T3$ubPfl^Zcouz%;^pxmv%^PhHJHa;P0x6c}>Rndv=3*lCSk+`_&KaAo!VoEb{#nxnpYQxDMHs;h8eZuO$_RbEMvYgbRAlMfD07nUbs;`!Mb(BXsRAB`<;tQCuXVry3 zfIfQiWCtFE@)e*fjOX~Pnkrf;2GO~kqjb{Tl?wi=LpvdmMo&NeC5qX$bgLn@#N;)F zSVc71i{kL`PXF~A3+@5LgM}aZ#R@{VuZ?VTtk*p)Kb-la_PJ+Np=b~ldr6lagP*M=^*Y-d3iTQZqFM|DaxgXA0PPW8{MKfKT&#Tdyx96bVo>n%C zi;b-YV%V`|2*Ogt^9)v))_dqz_r?8Re8_rXdHpmmubPs=1C0_V6~u!Y+)jePS?)d> z?T;`b5RDx4jREjndj=)uEVYdbloM~BDq>GA*Vxg98&eW3#5PCk30?1)k@aBmq zd^4>5 zWQ+i?9ubq0YU_JU@-kK^A9Fs0NcsTL=b0g)Rn|X|gn<4$&CW)6%_j^?8xBF~jj1Gq zLc{0-R-}XRA?;yKuRauiaBAJWVqehRqPkJ@@!HTxfMA_pkEkTo2eC1_d4pc1I3UWL zRN&hCL-|~2>qv`k8-_`eAN;}+ z4-*=)z7A&JAcwtPIT5sPXps|Frc9 zcal6Ba%Nu2(=^)*dkpnJ+?b4pwfcG8g~9UTvlcv?*}}9UW9xR@j$+3B-RQ=&D66z) z4V=Bwjg7tYcsF8Q^t^U0RXEEcaiu0P%=Ad09x5-Bb&?*Endoqt3ylk~DQ`W=SQ z+{T7eZEMfNi0;>&xRdSmu-(tK46R0}2x z&;LvOGf#g!g@npk`n??t0i#%fg-B}YazSiG<#1nDjTmZkwm7dXi803?;8S8SV={f? zbY;xnWZwL5!;^uz;YG|RmQRqT?8S7>@n8E)bsr=2vI(f7>;I|~V$xx?$e-Ul`O;d$ z#oe~xo-l9~!T8ygTZ&IL=bW0DxRig*23=j4x1pp!WmBJ=fYJ6lKKUtf@AkcX-IuA~ zy;m%zS~79bzv#?2_GQg7^oRF@>wrO8D8u8Ba9#b!&U%I==L{7!i;jC`bp~&hq(J;L ziKB13T;gvsx3s?BOW$^TZ)|!$uc@QXE??X&+Vfv7{eG?4NB8D4X9m{+jJBJO5Zl_i z_vTzQnbtWqZZdP}?W`?9iz~~|YpM>Co(!Dfb!Od;+9ple`!3EIAFaV!jEX;N5@1eR zfBA>zyHC*eQK(rSeRXom_UiWRX&^z{y(?WU=0+RQjym`jNqF5@3vC}#t6R)z zi3_#7zW*7SEvm*|jgKXtY5^tHuU}&SQ#t@!V1|Z8sU_-{r=U8VY?rD9EJ!Nq8`eO> z&fuMs<=_Re5UT*63$l)GMJ=lxdoja4DZ|N@k`B_i$>v?XQkKA4C@3IISojCT;Bb2!Kw+sGU)ElpYN>(V9ibeG#v?pW0jQ)UTACfZ$z;qPzk z6y8-l_4IgUA4%WlK@=V_=@!|037N9z%P;cNJv4oNT1@H-KCL(;WVJDxwSlD8dlzMU zFYm28?Dy86C7(|m)9BXy_h2O5%!{YRPems7J|VkKGn~Vaw}iPZ(lY*^9?!=s;h|WrW6jDCGvyQ*Ui7j)QZ#gzXP^m zX^gvi-dP=BBjb=J1O5_vqP-!>P1Ki?l&-_Ggic>h4uleBzVrR{=T<6TSA@}=q0y~> zbKPRGK`y|DVH&OeC?}f1C&<2j|7#e0G*f}hE{U%0h9I_Udr#^2%W=ZO)%eSIX@?pv z!X1lb7vbZzI%QaJ%KpwhV`|!m*B?T3mj$24(bcD`j%#Y!dxXyf1o8(xzuj0b$of!x zGiB2F-$VL-ADPSU2=;o0#n#e8f2*OF5Q>U7QUmSQ88YG{J8Wz7G=5%Xp=}t{Q4KPs zZRwFFlX)z&{}MlVxwyEf{uvvlI8O>Lgh_1(0CbLUpE!Xkj+R!e)AgQMSxo@aIX>*l3fY|ERX1ZnrYWw*^A;&u_=?0g>}?DgO80HrLq zM>%Bg8x@A)0yhTjmFXK;*ExVJ&^lEw@mCY*>aJ}F`U&3MzPWZ@lvniaS0{Hqr7iCL zzl5*Sr^`sRX8(%xAn+w}bT1|L!FwQ5=Wlgkyi`j+L66g&8v=tO8elSOA3uHcH2b5f z^V|+2i8WQ{Y#CUzayL}Nf{Y(E?UU|MRrYyTe#Y`?P{wJl4g5MssJ-Wi;B0R=zZz`G z;=-n>{j5a040mXcJc$&n(|l2M=|hf>e|jiefDaa3^m6m-++pmfLeu_J#P=#Y+p5d< z`nM<1Rew8GG=1tb;6M_n2;olcp3HPs7^cM*pyQPqpFpRCtu{u{E}NKWA1@TLt#Ld4 z_xw4@Hk>-6O1lpEr@b4xF7@*`-w>zy>A$P<>G)S$BjROE)wD_ee+@(^ zC?)C5kw!AlfeL0#B>+B{xQm4!QASL9Kt^1MYX$ zd`Y25@#iSGoz8$Y7_V*n6~tuom#t^#PVW#dRA8+bygPy-!kD6`cQD&W);jS? zDC~FCkDczxE6RN5@PhO$USuqxz+q_(AJ{4*CQV`B=1_^J45dk8 zNoHR=f0+01+u7BFV@e;Q_dl%kXQAci);89ifuC{cchyIqxlf1ZOAS@5L}zF&?e?e~ zQ1nYz-><$t55!iQvou3^=CmP((Av5#iD9d^cai02|9#P?pU^xJ5}0iTKU-l}TtM)V z2aq{kV7{<})e_QOAX9Jn#g63wgHA0(1=*K?EDg*ox&~N}f7w;w=7QZg3vl3rK(Z?i zGUJL*pWewvTS`;z+s)Le3b*Oo=BSR>b@NZ|No*RJ~U@%C0NND>etl9H=^(wGz96(!S z$cz}u;A3v?>z6ESE05XFR#DR}Ej{THs&$$3=W0V5mq*AnqhANdb@C@ zqOYq`i<`zkTX^$}0>b$B-uMhmL2lhl)0>YmEB&5HFlAm%JtwNY? zW!!$##~p_3{j&Z({FiY!Knpin+LWKSUZ62%%*Gp}5F7(P==;Fnij9r!EC{4whTTJb zuy9DD2do^y$0IHgbgv!LA|$bjt?BH4_>8yxtap3_hZ+{gAnL*ygZAsRr#2NSmKN@X z0PpPEO_v|GP{*cQ`X2R>@pa)?SBa(DdmapX91$fwa}q2^zht{|cDkq=Gmw$%84mp!b%Y?q-=E@C36PVZ_Zgc_Q!KSYTP#-I>C;~w7)?H9UgP0v# zfVbw<#yyynfWS!?XvJt{a9i&RaI$w$5bAC?e{tNBou2QSt0dL1n-807@PQo?fp%R9-1ObdtUC&8l9kG z;G4L)kExe)lV?~z`{q@;aQ|m=X_4lMejX-d5INr0_C=A}%@v^;!<+<9aA}EuJ_H72 z6GCq>Zk?bc8-y`_NZAt@je`XTJ#0D11WC{H;*`Bd)6kpOLb$At;tD8`!A1j?YCb?E z%nvc6>*6*-1}m0WhZ#a~5WrRXEV=h3)R?bFOP=sW;N(P1&24S6ku&{>tt}~B(|Hgv z-;elo;c(qr^}-|alWv#66dO2W%%3o8vPMS9MSyx0EW2(mP%{fBr^B{7Lf9NKn`ZLo zNr;G-&#P zY82)GVX1rE+5@0W7>y3Xq&e-(4eHtF3P!xFEAsZv$jDfF>0?`McTXH)rCO&)i?8%A(m;~6AZmg|| zA)uip*GRD*BVv5p_c#tFoAWT!?=HBi3>#A3-3y3N?2fephLUCA|IV z=F)cz$bYJ6bdt;k1y}PW4SB!N{3OGmVjcr|Cex&s2U&vIt>m%1IN2o+2tuj{2LrPE zY5DPESOec3e3s-^oO{|L);9)*vbBKB;M2%I@pQ>O6o=D_nEs2wD3prlmbizOR3wi= z;UV(Bl)D%JeC71v*#SPx3vMunkbtX5tFOPK7BC9_eF&-j*hQY!p-!f+*AxX^oMHL<)rmia_3JcbUwn8icGu7dZh63H*x6 z4wd{5o%Thrn5Ss{f3a6h`L4KKo;o$VFnT&PXEt&2v3z-!vtw3=9}KgiCwGM7FNQs` zU<-O0`Bc)$>Aj?pfZzVY=E+nItSkN8b!S|O{vmWl=a`WC7lw08JXPy;6L|Ys!F}4E zpwo0qpHB)_!?9&nln0(^9IPVAeDLW2vM=pq*th?kwkIIt0cr@)NCY@!)~${}wiOXx z(tAdmUszZN$if#Y$+!b=0L^8DVJ+1;_3;au0?Dt2!L zm`4Gxvk1H#?)japYH|x{lE}d0{H(3 zEV+x0V{WyB#99~Z2@9OZ`F4OcfY{%H{AVVbsEr6VCv}>F>k{m+2?EIA1(4Vg^GX0O z2EhXl9qP2$B&wRO`Uv!f-Hs`JmLw+e(@F5R5A$dOT!%lE0d$X);{VNVHxMK^gMq#U z0Krp^*3_DX;lwx{F4bPc@0{MFGa`t&#AC~=TBZ~5YFVFr)DVvQpp>@3dvzan zXXC(pjn@Sz(HTm7t-7cQwV$z4uKq-!QAK~9mO7=n5vS{Z=^~NRv@WZrxhboV5kKtCuFN0Re`BF2#2nLc%xM)48xoCKZQdd zgzWw=mckA7uUz~8=~6iVaIg;+E!mux&`@)Z?sYU`MoEqXFRr6R>9RcP)f9w_n`?Gk zvz#P+E3idPEw-U--)<2PMF#`ixAQAe)lYOHL_KIi&Y}N+EyX)>Xrr0ILl|A__E%Eaewp|3BUm_Z+w! z2tU+%1X7tAIlJzQPJg0+FxbsSIv)?jjPgM_l&h6c%dcJF4E1iCD z$to7C=fAY3#7md}JFXwZB7TU)DUv zwO*ig{V`Uqy9F6MSioit`=`qknHV;O;guq&$nAL!lVE~0 z?9g}S=vNBC26>wsj6F{{*Ga>5M&ynM(;-sAf~-?enc3($euFp%_#aEvTIPqcE-;#W z?>sXwKm)xf$3#K5r(B7X{ZropxVFqzwdYXP;{8ApsMplmXGY;BG}h;nb=6`m4f+tn zZsA&2{=1W}_{Nyh{9F8o0=A;7$qtwLW-spWr!a7xusOm0WA5nuorRO-HGMTkyF<6% zr+e^m4OZXcyZ@XSj`SZF&Xb}91e-GdE|kMQNVA=Q?WjO?AMLJmH-!jF3jkvaUg2vy zXa$)xb?#|EXW|ci-uY)!u$;Ml;D^lmjQt(g(uKOMJ}@UhSQx3rAXGNmnCi)uQF;pN zFO;GldJw>@OicI=2JvexJZZtpV%e!+@&f~goNRd^*TDA(;A`K_OO}b4;jh>Tp<-kK zghmhW2@nHF@7Dc#o0zX&$|dU4TeDBWN(HAxwxg0&E^tytyza}^vyJ)6U@qOEwIDj` zpJS5@Sv-yYWCkSdijp0k#TTR>5(7$EUc^%|A(C z5D#@AB}YhjIseZ@)No zd0HiW=k1SZW6n(8fXRmL5zB^%$>J6J>6y20BO?bVzu3M%icox@O!#210siyKCR0!q zY8h`lJ1bo+rrZKND^lL6YkIo?xmSvfPFxBW(uSWto3vKP~DPvqP7LTNiPV=gZAs2-3$tA5TtHEj}`QKFhYji1{7n>9=D}!qE z4eU|lqVR?|DtM6ve;;LqA`wss0D(2%qxw)eymR$sPhnVAF>c*3eE+u-%Gcz2SSJ;_ zSmk{K$2{3`ZT&>)m3guakEPo6N5fp^qb;75J!ktH@*d;gBvt(F$am_lB02i8D_L{tM}NiG@J^=R9UK`^GTvEhbbSMRD6a#xDg22f_+q!@jlTER?sr~! z&C#xW<)ydx2Pj4S?q3ZqkP2mchcktGzK(wcOp_Fi9bwPQi*=hi=G^js4pS+UPzDll z6u{5<=`X?JrQQYXwWN~N#Kaf9Ha*Nx^Haes_Z~Kx+laD&%~+L$Wa_729a3^YM>9=O zP|zGC5LSgOyVchBvbc&3f%VZ3p*;BY{y21F9T0<6@cgi4h2n0jN%2y<9fY|Stpv@J zK;U*<$2Tj-3dNy+puJ;-63{>7Ir2xM9C60f_Je*)oLZKOJ59E~o&z_#ZTXAyuFKq5 zA2S@Dvs5j2)OKW+UVXBqL9zYC+?9c3rG}SXdRaH7yWX#mnlI%ji6*p1jvM{fO}WL# z>bB0`y^UVCHoo9onDeEJkDxUf+K9P2t!?({yq|9j{u0Ob(1jbFK~9iS))&rzUW<0JQ0SD-L4V?^%d#U-0+PRWq;bC| zZfyi-06D+OkJR{d4dhO>fgD8(&ks9T?0|ktGBC9e1GJAb_X^g+i&K)KMfaa;l40`Yr&u zb(VcYzCXH=e?`4*8R*e1BUc@NgFsB*8)K@1uPr$RuMsU!ba?zXY|m#;%jOd}f1|iE?A_CXAtNdR z_5dOjEQ`_Rn=3!twp_Z>=Q!2_`VJ~DVH(bFW}iEqS9*V@e?H-D-Jy}&H{t;6j(&dp z`{XMiT#^V>0UtCZ-?cqiW$eLw5x5sED;WaJRFVp?9s9(6Rln~s7}>_1?U|iNm~f)M z3ZOVlnv(E%6-U+Myxeu|q7}Xx#w`P2Cn3|12CaDX2?L(*ZhtpF6a&)Uo9Dsn0#Y6l zdfNClMQ@lbvf>3vj^x1StJ*#KX_=Yq7aj2QtEi<-BZx8?U=0^n+Q0GG?6tu-M-z~* zabMFgx7r3sPrel=d>mJnj-Fpw(18e*;_yx0+1pcoYomWB)g~&e3=2yjvmWoPzDtIN zLb}vu;_mqMHCPSBj)T)<8se}C_Xz6?I+c5Ix!_RVWpzZsN6+d0)ZZuhWT)`!-dda5 zaU-VKc?ySLcgigYKigxf15NL}p(1;HI~@_RPFuLiOHOMmKM55*mCd;?f|b#I+wzq# z+wt1GW$L{!;Lgl?O7gexC;N%1D=%{`%AceC7`bvpmOVkWq@0}G=0fz2r023xcGJDO zt?yN^ii3>>j;k_gEt=o)Lt~zt`?h3#Jjv>IBiLMEXA_xoI%%Y#>CgM|{K5d(%sTSO zGLp<^uQHRI!i0K$=)4b$I>VLi0B|9r#C!u85vt^{nU%faxxs2-2_8`_Oy6L204 zATME{NUFFSkM^-0A8E||<~UQ_=5pvrf~q+o<8R>U>-SnZsh1g|7cY{u7;Yc@k}XW5 zm_Lqtk~>6dow;1^apPxwNaL$qx{@Gs8PBp4=501g6}}2Cn~T4Z4!2;V@PQ3cu!Ocf8KWB0b{f<=-vO`NQ?5_ZB zRv=NKJ;WUy2>%jo2|{M*zXY*@xnPLS6FmaY@-8&mG(#2+pIT*#4 z1AV&?b3_4EKk?q1mL}`tqHB99QhIc&DqZ(M3Jg|bBUx)BB%_1+5a{cWJ)CAgWze7-Eyr`JpIz3aVO4(3RkenO;T z$}n(EQ*)L%dyLM4AUthBMV09Hr0sTq0xXMp#lJpEzp=gXYTR*ad!@;|Lt|Wb%Jh-T z*@VrB!1Fg8B`f*2cow}c*c4qpWJMu+?Z$rz+nV-D$O%@JZ{5W_!nw;SmYgTkwN*!Q z-`vqS#L>C#nQHk&`ZM-~+DQ7L;?mbmFm7te1%(C2Mal)>g2(>tMdh;k!%Der;2)90 z7p-Jr@ihv9j@ILe1o!vocS_zchPx33*LxJ)wC-(TZ%21qO?F-?iP5I7d<4&xpbsQ838Feg$v8D{b zS@hxRce)YfvOZ=v`|0q{jf&I>CI$wttOg!N6F41Dj$k2rKD=kG*CNFw)!)E95@B_! z4c4~?Zo4>+zVmF>Vr4fUC|_K0H0Yl{@ILrhr0O|o4j8x@T$b?ml#5F)oGuufSpYqS z!qP=Z@MCPrt&(-Tu6N1#9jqexLa^yr%q3NE)Uye2(D4G#+B6*9(z>$x`1OYsLjnhW zQKVu{U>c&Sb!2W`Cw1Xx|FAxtu#GC%oJ@er^kPP|{D;iNC9U++`==F9B=~X zFoo|J0D<)Dfq|WEzGyysi*Mk?Yh5r5$29tck?P=x;Ep|nMhIxH;0`^)@ILwKdbeh{ zA@Tyq>+M@}F?q76)kH9xP}taB?DyEnk85jJPeR{#Mz}A5a&R4GD@{IceGKj?dD;L=Tgj6_Y~yhPM_qPz1?O5*RbWs zgXCL(PI~|oqxW1wB-Mi8>ZK3sES}UA3dq}#VA$Xs8a)#AJUDCA2+-iR;9NiQ{< z5?UVoG-l6fKWyrBgJauuxXj`>i8P_^XyTGjZ4FPU`b-G7N&)XW4tp)C zZeTu_)yK2MiT-C)k+5b&Ru}i&0^YTxd4kKaM)#`th%hGb-eB&_`!>d-UcYm&!}5AH z0|ymrwM6-FQsHxg>Uz#3le2|sC60UxQ#Y1!DyfoY{4_l$RtSj-He*z9+ zW6m;sbHbBQeb2$N(tD7tZ|00R&B?~=@sBXCZ8+EXV&R@98Ss*@1v#XKkZ9ubDpq_h zaIt`LGiVj`ptxmY*e1x43aXHmP6(wmYQXk)#ZUe9_o3vk_KLzNBNR!k4KyKfxzLyT zo+uYD=A41D-T*I3Wv?s!$e;lydgvEV{H8@fS^>|a?S*Lawwwz*Hx=_Io9{Et=^J!~ z<(oZoE(0@Qf=$y2$Lb`q2Y4e#8s!H=60PP1yBGj9}-Gy6i(w2&(GeuQ5wZb#BM zVL8DEx@nK!46)k_*WU-5;a;!Xys=3kw%|PZbult`&A#b_l#c_q?RZgX*CyAJ#dPq4 z8nY-!@JtFVc*CXJWnf0m`Ey|fM&I4b1Mlv0hsLp#JIK-s#&KVkw@3Vcs{&(cLLEjTuN!B`JjaPO9lB7C z>(C(--WD>L@4$Hs2x#qr1oAhAwM&> z&T$$XExZVC;DTavOPz1-)Aa&=b!I)k@+DFk&~UPY-|zNqxQQ^6g6_z4vc znf069+nzJ7oG>C4$!gu#y5_YyW$JnXdEbE{A&)W9l5{_zu+l{7>WjezGr>q`oc#jAi5JZElArhguQcE39BF|_`3v!72Y8IKGNRouH^d`_xK z>{{eG&U*Ofz|{}VVXX-gZ<=5RjWKsn?1_J;v>#J;AZ5=!g`s_cO&`Oj}4N4NJqm?W6olR#=Zux~f;NH;Nn`Q3j3|^gh#-7`cERp4=dFdAkcwPsbltZ6X47Ll zMlL@QKQ7Nr^7htv;)em4yrd9miF=SjtE@5yn-?n}7F_5tDKyT8r`Y{-7R(i@kZLs# zTBer2c(AkaLD%hOzuOH3DK-DN3xKH1j3Xps?GOzcug6jLbUfC$Lc{a&kgUEx9qWk? zH=#hPq)FIAmjNZM0`Wn$bGl0_r91o=zjMF|!fhc15S}fC)_LIz*H}*`6VG(asEqBbuoD%p_-m3udt7WMaKD7#U-m zZ{}62kcxu4wbVXha5D|OGwKGe5EOJECpS^X!4yM~jHP(7d2ty;O(8_DdFQLIWCf6(>bQBj>=)G&!ZHL)QgUBG~XQl)p0NKt7by(?X+NUuXQ>Hq_XfFNB^ zdhbZH482S5aZoypL+|sROVjsz*T+9uD=UGSd!Of&z4zHi)2bMWOWQZtsqUg0)`syu z5z48Gl^;3TpFV;<93!0mu6|U=PxiEWnWhquJ$4H zmTt{8B{AuQIJ8MyGn}8Wbuc_XPLbU;(DDVV!UT?Q#xBc7trl}*)$$l03EU5PCJ!!R z=!gAC;ah7f!}(R+_Qaw|QdKNew(S*fAHQYjp9m?Poom8P*~c4xU7XF^U?4=dpvYqb zw#0Q`!L(ytR>??I)w`wnVKJopmR1GmR>?vMoNg@Asxoq_L}47ipxH6`_Z%2)gJ#e8 z6%}QH=_^?_c_xap;o$FkYug0CSa~>X+Ys|w>f6_cx zd-wK}FVxP@ovwE=ArQyLs}rNJAl2S!en=#ClLsI=tKb`K#3Zh_^PTWlqt0+|K>Pe< z6JB?q)AddSO62}3oW>E_#Yyog{6w;@bGJt4%v*-KuCa(lfm=ttIkSORb@+T*sLO3c z-BODU%R!!YG57neqffgdx=dm=MwEu{ig2Xizp7u<0~qkjsC8Oy;^ilWcY~Y20kcz} z=$1sV(6Cb{@8=Y&nI?0TW5|hkD3ZhT*G#HwDD|+q(D?lQS|IJeB1NRsgwy)g=ZsCs zuuI2srUMwS_yZ*3SrNJg0c1@ zQiCZ{p9in*epGkG)8yTg8;;?oc(@!P!L+mb;5Uu^lhFRZcaNEG%XMEM$zPu~NYaot zY&HKqDqcOI>-(TSgXft(zWI%B*>3h<@{a_)G7F81#&Y*=n%NXg3oeVAIEJ3^xjp=f zm7;wSYG@I9>LPLZ3l1_~fZ8~~y*H=l=YRO$hczf}8ICi!-7C75s&3f=l9Kp$)39#y z%SUx+F+EK)fYO;FNexvNy-KfMw3dlrlwb~JM*(>GmR!UM)y}N9MGu)_kg;|JDG_iaX=8)v50N&Jj zsbo9uS7Y+(;?Kf%4(lwX^Axh9diH)j zPmX2%@Zh6r#gH3{|CMnsedX!gSTeo6|K}bN#cSR9&C!&E57N$5ibXf4y;d35#@6?K z9f>c?_n8Jq-1B|`BT`_PbYoUvBNB9;P# z00EFT-adKDyW2b#2qVrM-+RuVKaZ6@PJbRrC0k1=Qh^kpy2@BGft5n|y5EjpIEz%S zc|HhGhBUlL6Pv04By9k!?70lRKo;bgI&KOVepn6?E{TFAykn5{(clzw?HQErATP-- zvUqY@@aBa3+rK~F{p)X~e!#!Ught#cv}BnO@r}UJPu6YJn~#Me?!-4bpIP zHt;NeHiv?Py|5KW)sZqnk`16$=7yU6%Im6*93aNzun2rW5#X)sGOffbFaZdWei3*0 zeB?%x{IrrYp_(6-;b1{L!f={1{O?jEJ=vyw5m%e~*EA9uj1v)6USGY+ub0AN`qA!JENx$b>Dq4jhyLvGP^$`2d=NbH# z(u+~C-`PL6y?8%{Pil8^tNgnYCvZ|JpqGQ6-Y}=V(5+?nUo@>mytE%nWR=Xw8*fm1 zR^#C<`rU>lr}zEXYLJqaySuv=AWGdUS$VazQ^e5Gp|^>GCf7nf_Gg4bWZfrP!#qSMKakgbg2iT6)apCR!ghjkJB{boR zQnhI|pSt1m@dK#oU4b%SL$J~1%WICbYuPYV z_>3XkJfVWDf?KG%`nSS6X^eM~J8M(iZ$99lkz<8&0^!#;*btGV8l#xtIp#0#s5yc@gT zMP#a9>!us6CbOt|WWHA(npX-2SQl5ah*EWLA7yK))oSauzoyYxha&PMShX0;xE@F* z5?aGBTlRl+mj_yXT;3+%v*3(Q>6vuGNTl$$7dIXi8v<-< z0xfR9IG3{&Y9TcKtvx5fq7H6bc$Kum#h7$Ig{Rl%@|(Ewz=Dc9JSyTuiq)TBTlkuq z$5^K5JP!O^9MkTl%ii6@L&kB+A5UDuX&HG77(z_#gOKMaxIfR>q{(BUjFA}cyRvDg zD7P$uaKfaqcXw#3wSXkCNU0Yn|h{T7W-LvnJf%w%BTptjw*b zjrwbkmLR#;uWOe`*76BCrI0r=it!QETV`^V3Oy2F8KbJJtDCZKRPv(CR94oDI8$IU z5^Zm;K01|fBx!RhC97TcAk^=yd>`eVe_+%nX*WPf7WVq_HRR@+X{)aH)*9PR(r=W)`ooL4j)GkGg|7EnhinX&u=LA#;yFfg8u2_1=(j zz%0hJ=8Bf}XQI&kPyen#+A)FUKpimjeuWFR#Z`JvI6XsjW&if!*Qsf`Fn;{<#!5c|P?ydi;7E%Nj2g0z-`z+X& z%-yYnp>+zR83H(VO9g>%mL;2DI$X!L9H>d1Wp177Z|i%HI@PEk&PSBR;L$C)qNm=Q za@AsX!CPngpOS`ay{eyx3jaXB=r-!3oUGL_o=feaX8b;w5h=Reaaso+m^{>*VO zLD@CG9HM5G)o*pLB&HdVm@bZ-S7W(h;IPHX7s-aKOC_}5AgzJYm;opc2hsX;Nu@aP zvVoQKjO-{46sS3^#P@AgmMxTT-NHys453Z)dj_^}xLs0qazr9Sz&yOwKXk|WuI5Me zxs!u+fnr0{@~0&KzSiyE$ZZqpd{S4S`ThPWx-KV&Nf(K+YKfaml7F5EWeePPBk9w1 z_uc`Ne>@Kc%X3wE0Z$IkX~ny;dwS{ul}>syai@If`A9IrrnSyy^4|IRGZV z{G*KIC%`K>5i)uWz`1mf@wRwIa2IexAb-e4(W3DW8m^@!CeFTm0seSuW9yo`q!yKd zQ^)OC6L5dw0Ss6)I_>hU?c+&c4X9$`58zTIL)rOWg|dH&Z`6_UelLLW3^H zA76`|Ra5r+wzXbFMMWuB4nV62fC4cbKK2VAyGU`tj5`1U6IVSG1nHdmFZz^p;1ku{ zS*w%Mju^bprpT&Bv0Kc9yU<H&1U4U2H0p;PlAXu0#;;nF0GuG+LEe9ZScH2BK$x~zmkIBFrq!RqFtK+q^o4PG5 zdAwumsk7LPm~(X(tKHY#`#W9njSW)Rn1Z&TZ<#tpR1@E2%SR2*K9%afk|7XxVbgSI zZ9Q=J{#vX`me*ZAAF`vJ)vZ%eW)gz+QwK2bbr(5I)ZH<{R)vfW zPlEN{+k2(e)=YM2Xw4(9A(-&-tl?7?#XW$4jAh?oMQ|gPpZ8@-B3i zF&9L5fk>`Sp970CS*S~=ZIWNT1ybpppG>z4@c2myAA-d#F$dM@=lybZ|5(}TvjK&K zSCQaklSf6UdiNT|o`ZDDJGR)y6-z%+;iFt3LTJHw4p0;ZNS)qPJ7r*ISu4?XuQswC zwehx|Zc(l^B73$(!%5d9BPM51`<+kQAN$8BumSt}Brck99Bz}-!EKtD_MBE?LtB9k zi?}r*#RE;lB%Jx!tPqgS0a??%GE^o&Ome!V(9>%stN|vjUrNGNVMS0?o-t7DKqYTm zFb7}eH~jw#4`&+k^QkvyjOrc-OE#ufHE{=_8CYZPaO!8Wn3xCpA;Aq3Cm=fZdZQ3e zE;RqpQlad;* zTCkE^re7Uk_lWbf0~*R+#ZAm-r>m{tMDhU4{t$X4h+xmd)f{_{(EgQ-D4zH6ahmb= z6Xu?wclQs?0C?~6rh|i7&r$b0hiWcBeo07DV;{0jcSEe#wcUi^liInMQ`Do|U0jEu z3DqFJTn7D+OKkI=1mHt3qapA50=sd~n2M?Ts9j&K_V+IeOd%2dIXpys6ER@SP?!rc zL8Dvp_VGE!&#p8K2LAfZrC+MN1aae>%vEmrU(F}m#f(?kY3&Xs<1Z#z-;~3|=$f>Q zXSfC?e%jhC|GKg-KB3jV4+L^|aZ_XC^wO5Xvs=(XTIehTyF79DfGC8V*M3C0v`GN= zWm_tp>9Oq`V%eSEGqBLOP&z%Ff%~V8vEJ>K%q3j2QX9tT)Q;?>bAFgj?PpI5nB&B_ zaoe7BEp{)cW!XjQXoAZ;DsZ56An|SfBPG#LDMmPN04zL*XO_00 z(Nry(gU-;j+vx7yyJP#gTbqZE!Tpj?=|&V(7pE^!d)rqEEDRK96}f0mWeRVG7bJb# zoUWcoyH)57=JMEld8omr<7J?KAB)A@*3VxeGI(F7U0Tp0GDJG=RidPrwSliDoCCIU|5%2 zQVlAMrKpUoV%@AtaKs4$j_$oxIn--Y`*l(7BXi&wdA^oZH>DOQXyr@_Z3SHc=DBA8 z$&U?0Ns+49b=%s4r3a&|c0*rlsk_VoOX9fU{s7w)AsePo7n0eWU7|olZ`%hf{n5n+T3ZJ;zSp6-$rOo6H&K<&EWe$yTM3x5aDNu9ABc4w zDTA(w);d!)#rix2MGZ(w?%Iw5C=;%Vf9VVzj$R>{!zl0DBU(NfuUu5dNNr=#jRQw8 z3u4axKCWkiKaEscXL);m8bow=<`jxW!2gbYlwdrsSd`C#V&L(5j_%EAkc_k%V`dIQ zZP(pP4+BW+pU=!^wyV+I&&*x3)wkcEhVHwaRDG^EfJJomwze*kTbr+-s=t1CiDj zp}ufXt^~jyU-Kb^Agcw@Z^jCkbF;KU$)@WGeCsDfmY7})Fy^2etaP=W?FRvm$v%F@ zS1AECi&J|SbFlcir%x4#7EeI4wM0-KW{aII; zCXG91GYnA%h5eREv`vldO=HupIYFCJ)ly?3=R(kYLK1vFJZn_YLdmpH2%6YnO;}|x zKAf8)MXUaOoA1#sH2T6(Ct{}8%aLkWb->8b z`*mg7wNwNfobJrM|M|;r+Pj*>D#R}fVOpK8XoCOb80as8VP^qHcQm9rpton7_vW^J z$J34BcR9}HsS27S5Ja08x9D7@R-k~1MPOhk(fg4X-(oaoVzRSJWhnRa={&gz0p9uh zeR~KJGbadjJj&dMX zSlf7tM#Y`yNf{sgjq7r?2KEem|s1?vQ)Hms^l(7CG8jP8>)GVVzPFGy090yfu(8iFDG&#j z3j=e8Sil+?MqyMLc2Wp|uNW2VrNMw!R?Z<0mAWTH$V>%MEIIeajb@*(PvQH_R;Vp) zY~z_iZgMQTL6xq*Jg?zEoLIFGzrl3Qp_au08#2RCHney*AP+Ai?qP#1w9mIulsP4G z+4%WMrW3looe%eJBFS~N)m?c9V_&7g(zJTmE9B7IpnOar8OCD2cJQv19Jp|HCc|(aApNiAL$ox!FHjh=VU(&JuS>(enA`;kK02Gyj>rli9t!|I>#PNlqPc)U{3 zS~>NQEt5Vo2XT`f>O#Awv+R>)&GN^i{yOqh?YCST&@JDGGAn%$5ki=39>Xhov9`LcVFb(%SjM(wY@*uWCwR=cZ{cuJIF8G# zFHKEJsSREqhsc0~-Ch3h-X(%SE#G(V$!SEag!EZ+VDW7;$@5RRdTu`J{)34sS!eV< zKc*}p0205Rfr^#6q*3}3`HU*>2vJQ{9Wt$ISLdPCes7wbShP$`Rl^iPYGy}exftdd7xRTo-Q^T2W+-c&VMwDrmi1Hy+mNS70O|W=KcW zt+g)Uw4{r$cXYSubuG`Fup^8s1-MN&qg99@-u9!MOe@s_i8H<%kq4$amgCT&>sq(8 z|MMx$cj)!@LK6>C_7mqlo3d^l)oAe?Ygw|Lo-2`$Rub~VnFRT*4BAC^!sqowq>b?K zttNSVFB~qR;ZW=U_fMYjNs~n5TFgMe;zDAZfR=oDi;&TDdtblFSQskyT#|WEBP`dN z^Qb#5Hgwk7*?@g8k7nH%E2RZbj2#jEhFb*?q&5T93IHYO zW-m;2ntZ8=z`|2*d@n>{DzGxVnmA_YDciQ#7VwzM$4*)a(5pniIFJ(K8N<=k8}82T zynBx{VO>8g^h7dS{0p5As(2~=^YktQ57M^r%3eZeyr51e<&8Z4> zN~?b<@x$zswD&pm4$aj}#gaeWL2^GqyNRI|D5{N8+Hm$u{JWQxWZ4={KyAt9e97NH z{6#N+3!PfzSX;;tjXoXqq+3&u^Ni?ZLMdo<#$e{bAJ%hW|9XDmOS{Q$&Y20>D*G)v zzis&9cunb;3i^xc>!Y`wrN%ImUhUEfbHut{B3i0yz3xg5N1NN6_py2M>e1=d4z_9y zO}-MhvC)9Fx;!#9dGr2Abl>z_G`$aT?|)=yD++qqskkoT$St4weD#Ud6V`YCOM1|wg`G0c%1dW9f}{rO?7lI zV#|e*#147L!V(Kq9dnUM8FLw_nP}^ga+dk+*%3^yk_?mb;J3oHQD>qMT+$xL5^V}I zvK&JS!gM%Uga51txM}ARImt5Y)r>k1KWX#Ku5!n87iKL~{0?H}K9iuV0)$MNp!00z z$=i@(g!gSQy)@JwW&^b7X^G!o+&G-1C^R)Q^FocR^Q;#2@}}cKAk#4x`(7S1rjS?7iJ>M(sB#qRMNc7M!tCL4j*K+q0fRTkhET2>J8Q>A?;A z!2|+5HZ|&VnrI;xdU>x2Yv@xM3!qXomsnP>%;uSC zVC|eKR7b{kL=zr#%pp>pH;Xo){OWF91aMm}dlz&sDv}Roh#isg*;+#cONp-dkvyO) z>tGIs4y33)8dFCr)OpR0>U13eTo}HvWbQ zp~)#zT@A!RKZ+@OpI!7fU&+k^7MUT`J#43iY*<@cwrhJU8EX|y-n`E*x$Utx$eI=7 zwKPpy+NFmPo#TQcy`(tnj3Ql?@mHyqk0J65I<}i5o_yu=4;=szG^ki;WY-u(=Gl~l zhWTl~0L)KDXIFZE2&DZ;Id0a2sLlafiAN?f(&tp3O51`0e3#&qy5gh*^jtbL9~p#h7* z^bUD`7$I!_RUO>3o~30uPB|4S&lD%l41~(;#)(0>S&v&-79w59&8}XjgWr5o$ha#^ z*ZSFMw$=uY>+>31`qXA7wfub>?~>%}wp>S>8gv&&Ks;5wW?ZOiTV#3V>Gp=K;mnW` zss!Nk8qjrx%$uBTMm;|~lns{c4xI#B{=gY6R%T_>~Q3t{79H04?o2{X=v^4Cn zxCWaGsYhWC4Te#wDqT=u6*RAu2+m^zDr7=$^^QOgbfoEXHGC4l>8(OEFLZ(RouqTyDGzPz=sDx5*3w% z^+!uCW@ctF4z)A{_@6l|rIx8P%f_P!DN@^4ksboDH;wn%5FHpm^DhjzdHUlVB$kwd zj1EzcW_ND355JJyYa1GRr@luJUo@BVuY99 zsX>EbrPj`pJ-jm@Y_**Pdt$A+6v%`~0lHz!xoEt362wY6KZ~+TcFr7(YgH^+}8Ie(LSxfV;oR1t3E^G^;_>JWQ~pXC{3PU?vew9kX!Dn+P5TD@5dAGeQhd`rRPr z5rkK}2HHY;2{3UPScM=`3&IzAM0f-WH_^&Uc-vY>)!sn^xOYjskuPCRB~XU{nJ zmWRGmob8X>q=Fq-5~De1F2zY2u?J z3k2luzyrxN*xY*?gXS@P0QMZ4ivD+nT;UlDGK$ebjdbUT?D9JUY(fp6;KALP^aPhmmybTHQ_$TrcO zR#}>RO|x=m!?NJxv8k3-)=EYYAWZN)s;$TL4(4t?Bm5UfTB~c&tNS`nF9hsSr-neJbGk|uRtD=Prap`YNVQ#eM=N%OFf16U%=a|Vx8t8&nS zY0PxeF}48Fff<|F4ILT@VctHixJ&us&&g0d~DLgkNr4|_~Qmf zWO_0+lK0&T4w=!K&9{`YvGiEX3kj}KZDXY9q*88ktE@aeOYb`GVR631!Qp-uTO+e! z8L#o0GMQQxz?>%WXl90hzHJqCUo%>s{BdhlO>R3XZ_)DP-xA7@iK8|=9{G6uBrt2FV1QZ0ebk4A?g`9XF#Poz-%FX z4qO6|(LYcl^ki*p{s+6}4n957=>#mxOj-OYrO%GL-14xpu;hCN2e)Rtlz`gHdIs?(P_=#pcM>Rxzk2CBMCx z+yT|!n#kDLH&pBeW(!QSTbALRM-9SXj2VLw|GvjFC zV?na=Egs{7Bvi#C@`LyKPxx-*{jpL^F2W@XDNe4P*jx_yO+|d<-i%85>PRGE^|@oQ z;lvZtpzLa4ro92if8?r(+jy80e;mXB+$4gWy-J7w*b`X0OXnWHm=2lvU#h}k9;Mm* z`hJGD>c8YUPztbV8PEiyHcj=HYGqY5bzTufJx}+sb6t3Jzp&N5@?2*z$w_lLac>ta zYUhQy{|)g4mdA<7jb6J9;9J~{s0 z^{zrxf^P3Gv|GNF{L^katHexw(Bp?_$L6yc+(59s|H<22^{|MtD^Mj+;kg08ErO#} zlnzbp(7T;mCmY;m!KF?dRXgY}0vpk)YSvjaU>;rnPhwFIMljm$WoXfW-TMdUv&zhs zd#q;RjHKO5l9hx*zVDCu7Z85zzw8Nu2J=ss;L3t#n_WL?)aU{V*&%`3;nE1$_0ZAiIX=konz;*<NlDY@?Xx8Om*ns7@Alt6$J2{pQjHGL_A5_V`-!t&H#qFpTbg5f4Fm8fM?<-y z_2Gb|H?Uvd-*Z8csLxck1!`s^|&TPLxa*()GAU!+wy>N4nIkd$`o zC>>Z~QQkVr`0n=?cafpiNSH|P&O35O_@b!OWcx+O;!E%xvkx2tea%gGESgITgs-NjfQ*MhEHJYwSTP!HNd?W}VG!TI(GC7_( zPy(8m+B0Ia?IfK=ipaq{-_@YAcXfP^X$ao`doNRq6s+L3w%k_V+Kw%}b~P`m&GA{t z5cb$kVh*{Pxt7qP!%IWhksxb}qf!+VDj!KyCi65T&)bpy**aa1^{9jiF_)|blP4Nt zAky-c^#`jBO^7tq(4VVHx-Z<0&wzlI7r(raFcn(u~yYoF^8K8j_r5rnppu zUvYJeOq^Jskd=<$auziLp}p|!qx1$IQ}3qc05Puv=Z-sB3y8QD{?5X-AM=NK@PzeAAH7R-0@Y>4)%yj(5~(R z{and#v7v>HGE__fk6+wHv_Q+tlzKK~$h7zorJhIKb&d-iaNnTOk5Qe2f;OUx6Iq#i z9s!$sW{#9yKG>lUm1_Fn0RsDI|L8!$H@Tl7=rHjtjpQ9b6Ude9wL{rD*$;YOX0=VG zZ1#6s5h7z8iTAe02Qr;0l}IcPu-*R_zR4+jC;SZ3kdhQl&sn;ds<(QAaiShjlGj&Cnnd_`Ek>)=RYg znVWxD*O7OI6j@3G?{x15s|&-l57Gw`McpK7GD8)fGQ6KpS}3nKTy<#Ps4HzZ*J-4Z+uFpT$%Nj<`9XR(gYF}) zpsS*P2^GuPnTfn38_6I>$vQ?UZy0B-;#5RpE+P0)_X>-0QbtOQOtamn^ ziekOUXtp;wK}nx?_GO=YQS8jUMsrIXD;ZH((0C!Gf7NcI32nd?WcmH?12@`)2b-3& zm`FWcRlr&PL2wqZvzGe#qIkE7JKR2{D+3s-y7Th-J`a7uD0>(byOV5#OYc9YGk#d| z(fOJgpPCLCp*E0=SS6g8$X`CPBEh^;#$()KFl{Y*aHwL~Xhe#7!1=`Akr%`rcThk7 z2+z#=gbD5`m6`hHjXJafDvHr@u!}*l$cM1uFuc+$yIMSqd=vAHNwmBQnwpPkbHsVY zuWx1m?IQW-`Taj&DR~=&A_TY5Y}-Wp-r_yg5947q^=IT}&mdv@wS}y@W{<8|h7z_$ zswwyZy)|j_KqYaW@ca!5o%lFWG^+6RO%`TJuZy_Xj!d^FOnV34n_wBVIG}F$ zdBaaqVoS+Y{GS?mg{W?iK4-y|DOsIK9>^lv5$fKcFuP|UpXLg8pxgQv^vfBhm*M@( zE>nzoL|d}$;>=(EP`FUlYuX0W7J<*mNxoii*e}tB?Dk7DnUMgd&~!@?LuIzSXQG~@ zDGyCzg?*lkK`QTpZ}Z`88xw-*k~d7 ztr=1>ijz=(^-37W(=qi7RQ`;imib@R>6Yg%%;|38XGloe_16aXjSuUC377)UOD_%I(A2<+SO@aYpPxB|aCEh*t24Vw7?+6m{DT0Sqn< zvjeDJkElXF9bs17`bnmdO@)<8iQZj&)o`Z!ClIC7+8a87B`u&r#HhPNc3tsi-q(!T z63&p+SDIBGpV+v80hDSt_*_4ty|&y7MH4ww**)p3qIXBhA{fIMO*}cao3ISF9@u3u zea0Ee96gm#K^~J)Kewem^n+1TAitUb-u$|#NAnWXPKA-7SHCOFfI63F z(e>J*43=zq3*uO8|7L4sGAt8E`j6dSFmB%q#3JgF-X2KpekGp& zYSM<@YJI?JkM;(+oy%Oc^_IgVW0I0|v`1vV-|H<|Y*L+^;@XwXk-#&-eRKI}CaRkU z%nwIe#X+g?*O35bZtfD|ErwJnMAV2l3E9F*U$OU~3rXPn?YaX0-n77AN!$9VgM@HV zo^7Hv5C|TsccVVhs@vX!6E*B~9Q2CLxM!@j1UiQJMU|=tPHgPVBUPNZr=#-f9DwfG zI$$MxWn}cU z`Z)LDloP)iz`oS08EPgU>liK6iEEU8ZpKa1AJwxK_3COqa|I1=;5Aj$1pnfzlNEO{ z#+Kxmj+T$lOTpX|UiFv2N4Iw(Kot!q;!zU#Wp)>b0;da%ou-~`(UmJ_RevK{&H@$p z_DHk`Y4((aC{@LN?|WTBK~uAKbz+BQ{8gB#I&opc&+XnOe1_pcr{EdaQpp~6LvG!| zE^ZwuA7NY?A2VeuJcnEZtX+hx%~k+fCb5cTZ<>gN#8U9KoN^YyExy&(xX8{Hviuz) zsH~F^ftTmXY`XV5kl2Bh0?gH$Y-nn0Qv*ts<8XvTQyuLGJbQ3Z6~>9{OQ|R+wuw7M|nTqLN2Xa9yDT<7+l6s+KvX`N1w4*`jScBug;KwbkkMsTA?3-W9AN_;zamj@*2ix zd!q&n35{V+>a@fel0sqR8UgK*JQ_-OXb7Boydcg~5~jsSX}Xo?&pR}zESlIwGd@W} zY^?&G8(t{Ss?sa892*Hh;#V4T0f?b&obO`KR0m$+NKg5C`1MO(hQL%`R)2x_(&T>w zrz~4_OYCCLqyj+_0A2ve_GvkAc5eh9BWY0v@zrrvkcM9MwywXEE_+x4(?@TP>k+nf z4yx0Z;E(E^Vq4UT-IYqKr9RJROe%59i8bk00^F97P8Wr>qQG5o!T`9tpuBrjgWOK}p`nC^)@Opc=b#7-5H zA(%VdEm<|mB6j$tSe!Nq5$G8w16I4fug@m?vn>j>)vAKl>UhXTQ7^pl&!mF;winQe z%D(`O0fbs1HRjiuW#*F?zpA&N<2=!N^Qk2XNlWxWNtw!wFq)iQ!KDiy zD%O%$;aiL46g%pRFX1fp`UG{~c6DRyN684E@Jx*p7QKVX*4U9=xl-&|L;`G zBbCE5{!jj`P?Kg=dHI^c2aqY`u%|sIYFM{XTi;5@1ckYfimYCtuwCV4^s+aIUi_(- z@w1-2eV366Np$I_z<@;e?e1H)&9zFI)K-Tq0mCUnhxeI1&A2CXZGJK-(PnE6GmRe- z;2zOu<<|XPq*ZR%!4&9m6_-cOY>tXIFfx?Jx=hHOl8|5;%@I8)TBmR90*|^> z-)d^N-+x0!1QYI;8t;R|n%8+>V_e&W*#@e2?Btf2dv0M3#3pK5w_W{^8)tiRP%c1C zPzqObl6mC4z~%_92(Ssx|C=-0B3c{&zmpXFhuwSb?^ItUTwA~94J_gz2gUFBl{(~9 z2%9I3;ob%+`-6v7q43yfu-j58`l^xHXnD<_WMbQriMdKY#jziVt1V$=JPtjNk+{my z3Wx&9_0NY;txlwoq!h#ZAGv)vLK|N?V>df)s{1-rQ@8|Y?0o}L& zIvVIzSCi5I4EFvkIyjQ|A(rV^yTh)}4q+T#{s;4KOBd6bjfv0e0DSQ7MGpqel9kLl z->_--eq!m69ORFviN;1-s$92k?Bb|O6F-|qUy46crnS}2&SZbNy4y0GKHME@`d{bO z_*&bN3v_imwz_i5odfb)bEN`fK~L-gfWDCpcnQ>#rxtdRN+ztODZ3=q5o?GF(#HG# zq@H}uQd1Rc>5`Irw2^ol5+6~&Ta^BMI7MzQO9c*XMr{F(3{i~h4FfY1=ViBM3g0*k ztKf5c>FJ=J9DG^P*9eiEx6d+PiJc={lU*n9ei1y@rD zI5hPH+Xb>3R$S%sNM+LP^_nvn`1Bav*4od_wbp+*B%(fm@_T0;2roE|ca}hSF(5O$ zP={^_3WCvNrTxI|`|J*k`2zX6+rIr=wDsz~^!np9+Xnlw;ovyG0HP+@997qdS_nGQ zkj3+?JhsZLA#s# zZ^I%>T@H9|QS+^Yu8obdCCbJUE2&^q}5!5O$4wWSBtAh}$-JGH(6=<|Qqs3!g`*v;k21VZO zmfj(a2aW@Ob`a5&=M^=8-7rF--C!B9Cqixfw}O_8{-v}qo!SPf{r=vpFXis6Z^G9D z^eI6Hpf#QnFS{_USMt(^(oRY)Sw$0N9c?v7bBxY@KRHoXMoh&>lk@3ij1d`Vyn~1u zh1BGdy9ZawE5sW=UMC0msZ2)k&%{B(eh*uZc!JXJ7W%s94xSf3oskleEpC0~^_p8_ z9bvtz%>*Wl(oMkd1LOQYi+qMEhtV^$NuG_&e!jFE&64IM_= zywJSv$V#wAt0b%Lzm5Lrm)6XN?>Tl6{xg-#E0tG`+k<{KUL@?Prd?sQ!KAYzTprGB zjeFtkK7)8h7uPSoX>N(P_(0(=bqCt=6bn0 zz(P(c^mdv*(fbYWGoLt}YZ|~(25ap6cn%y>$E?yO3$9~~xwb0Y8~^^e%&fb!%wYDf zPvm~ju}o$cA`r?*j+jIp}T{;%Kh zb#9*FxK(S1x1dz)HV;+W)qW->ye2kszQ(u_xIkz4NzywJPwy(@lcL;_>AfR^B~OuSj*c=gl2*mG zqR@S_k?4wwU%reeud#Z|SM{0Isq?V|l;gV@$>Bh;ay^vSFksTjm=F?1 zbbtqefz6i^?!bmc)?UL%MY-rN=*Rx(g)Q`Y786rQs%HMizouIoA&pluQ@5SKV@-Ax zX5clqH{}ZiHkJ{*Gg5?QcTld!Le|F9MW#xn;jlenL-OFBUKrBs<%1A;J(PeP(bx9z zI`f38&`_S)f<|iLzl=X%O$&{FjG8$5GgVE6qg5-J4UL4j8yA>cH>>@fd^K!gRw-{< zNk}f*xi`=}&Fen4nn=xqt5r|ea;Y?c^NI458EyHA>5@#}YCvor?KNIdMX%uZkdWFN z2gR3CZ7kzxS@X6OjSkIbl@865I<9IV3iYColcqM;M2(3;Y>E6*i5jxU0$9%FHHK@+ zm4o|``Ga5aY7ccR7Ybw9o&B?bNnp4f+Ca@?Wfdq8y)<)9_UZcWXxdNJNc$x(f$a=8 z)WT->N>O|S#;EEJ&1XpkbMGq5<20tkUObA5-gQtQDi#6(nUD+u;Wy^bdJL{&kSs0W zlKm6oOSKqPilrK}Xa-KQj~1z>p(oTosK?qbA!e4{#hXgXweF-EGQA?pCFX=2Wj`*d zO&xx*PI-B8kH4{zWc{nz1u9s>Ub(^<&7V!~3+COfh0ip>S_WR;yPq%b2O%st?_4GP+WMcYG6j&Iy&j^l1ru^%=C7x_e?g{yX<9GJ-g)uzA>}1_|jqI#xk9vM!quB{D__OmUvW%h?I=DgB3PH#cXsC zHM7gu4VC4jta5d5AMRhYI2G*yBEnA< zuM|nqIT7A{07(I4D0xt=S}rxRp(@VKvof=r^jS1`7-TdJp-)#S)gFIxPE}WRpzw1V zWowYzdpE>FQJy(cCnORCOiMQZ`visLx-}Tha6EjUsR`zGg?S4n~x@6aXh5=di6SJTwe`4Nq`-5+L$6`>S9DRScOR@ey@z^De=cW=V419aD!S5`{Yk}7zi({A7O7lqjH z>#sU-lFo8ivt!b0*$e3`BgI7aklrmp`e#liIf6= z92th(9n;jb{c`UqzlfD#B9nd6+b|Vn+e05?SfWb3>4MGrta&k#jf`ih3vIH)dAMOb z;b}Cl#eFXx2bTk%A9VOPNgKv7J(#bbr`L3 zw#Eif$^D9f#tvTOKDfrT)h|^6)7gG&6k$2oh?0W1@AJ)Qe-@FSW^}H=VX0nPSfj)w zDCiiEqdqc*>$PbG%*XtW2^4t@zZ7vweSHrWjb{tj;f8^?(JpdO%boLP|F`)nhG~Y? znjLMcn|VUM{9YM!0{$@9LnjihD7Q61WU^y;>3vNjV})#U=qzCo=3frteL}QIakX`2QzdmZY?sU><%Jf&?<}&8u72l zHb-eYoR@zIjpm66?+{#K9nMIXIUurk0gZkRmleIPy5}*p6F=B#)b=16ErpM!Y7jMK z1~tH>XC1vNNMgP<_j1b(RcOGRgZoo5u^mYqDxUIimhO5Wq!AwDZ(%TBzAOCL?uFej z|5cx$+@#%m2ej|>B;Q{KlkV(+5hqjLbIxu%kHPHXqdM|ZMN~zF0K%57;1k~*nV*qC z#BTW0zjTmMuen)Ug3=rn5au*@??y!(JG@a=qpe$lJ3HS;Gm6VwZ`aP_FVDxJXRa!t$5tJZNTY^dw$yq^i&Y7aM zRgk12AQ?e2RDt9yS#lDJi~^E_NG?LXbE`m||GmG~nwd4-3#jjY_ug~PKKtyw!tWj6 zHcu@9YBg7vs#K{1ndld{4?@RreaU-}E0BF!>8CrxFIZWrR&)3xgIsRc`;iZg(qp9P zZt^`{j#omXd1Y<}xgKI3xjf%Y>l00vf?}#osYL$(%$wU`px|amh(w(7eS1xZE<}?b zgOQeMp(+-gbqn#0hmdF4`}b`2c~@-y)PlKU$Lt?PZ70o%nznnd>&W-lbz9zjN!*=# z&Np@LpJ6urG%nLyiO;;5jG_TN8>!Rm&wF9KIlA-FQLdRFiqNStmvfs#ypBFS6Sdw) zM1J%jDKxy%J)40V!$94lppf(YjR*|N`%{G zXDoGYr98urQj*PVZpMZ%)gFt+9;VYl&9J4+sjC?V0x!h%zyIkR(i-ZRxVT?JYG7o6 zf4Fu{exzDFE<JqH9XVNC`XMC9&xnIlX)42LQO2 z8rxji8y}@`7=`ig`1H7Os(r`3Puo<6x5@&t?EQ!mY9M2Uhz+b zBCRE1pkv*WrM5Lq!~`_yLeu@wgRULn`GsKuK4w}`4^WJB_)Mj zwW`;h0Cgok_ZGqW8Fv=`NSnQKNMr$`r{n++B?(FRcx^AoqQs`ZJCF5T067guH?fn0 zhWLTd;S@!Cq3PrgJ|DYW7luwQZdtK3j2qxJKVH?tiAkk9UHgFq>8(D(ymfaWV-LvkniVfkHVF~LSy4=2&jN~rt$P~B^Tmi zjanydd)_E4ht8&(LFQ1G(;+K3jGFA4z=N6<2WSsBELtMg_ zVzgf=@9_Ji)-6AnUB3UWyKEi?t$ZFDY^9okr|-N=wu3mv zLNNa`Yo~%*oJtE;xT9{T+g>yy`Bd8}rEDo};*3r?pI(!9sr{c zZ9ftJT}VW)nTWw2VwTt%?eS(V`>@ku?rB~vcU&UJG{WP1s`T*%j;+;)*^nz8jo|O5 z)J5OV`>B{V=P$*oD*gF=Zy%U%tH0|WB3<0o#K7oq{tF{hx>D}ntXFTmeVER~K%F&o z9jF$*?1dNO-U%1m*-tW}9r?(y$z3Hy|*Plq&z-$c(iW~myu@`#a-XytOSoTpA@q*d=E(ceh?mPvB`?n(RlH6 z%$<4sp3a8X7j|5-Uw&B%NCBq(GkAuJ>qT}LWa5e6IZ0Pn-cL|f!!QN07(}*W%C!{C zbm9H@^UdIxxvey+_Z{Q~fn=|_GpnUn;}l~CaC?%66uj%sd&-@NR);ufZ8>{&*D0gK z3$JONwk85hH~CJ6`Q;vOOw~x-+M4v7P7(9mUdFK)%6mt0us`eBprVdoq2_eBWP6fHSB{;D~pPfm$-lpHBHytd<4yt-JBKSR({mLylJqc-p7 zs0Z;4b47b=`}{Gf!Wl}ki%`qZ>?g0S#rI$9V`b=0g9L!ORw*~HoZR+IF606oy`wSq z9f9;XUClt6i-p#n)qDVfEzQ6Q9Qa`fudZ=Ng?hn146zkpeP7(%O_SW%diW4UNd} zOS`tVSs@W*q3XAZuP zz&&w3wX0jzA~#prj8QvJWoGsd_&*sM7Q+`a(sBtZX~z!U*)LvWapDa7-#whq$0CUi z0hqgI#)J=59=atOGvkUKbD1CZ7%qPl9g2^haF3~91SN)Qknqt1=jV2i)9nG#6#Z&% zYK6OZ-wmyr_~Jn22|iw{7RzI))#21%5?rPL|23xHJJ6ZeL0emItl$MDHaPue-J-s& zSPFOia{A@?0;h#QIYT+`l7=-;iZ*d@ti7j4&}5?Q{Z1!DD!;7ovZDACNfgmFxx zYUGb+U@)_DWg>4qoV>kG>B|_*1I2dJ$=7pGL>PVFqDsS$?7}D2(s`v@e z(BC;QJOg8EzF+}&CN-5#RJ{=91hbY}gz7*Z7IB#>dccfsQ{c-h#WRC`_v(~5j>Uk~ z;3$}y=s%hX%YFL$Ns?J4$a7{_^h92@BTdZ0a6sNBeiwL7^NZr)Up#4k>H7nAcr&M($S-zuT0)jG97X9(BDgA0C;%(d9k(}FRt<5BzvC$~sVBQL`du~6cD6Qp ztrNa9hT?VUuNdDEUT(X=4Guug;8>?W4dT*Zvn2q7VDwEMFgh~=LgeP(bik%fdkYL( z%&h0kbT>6%Bv~X;ChSiz?rfS5Q+M*cke7^8&oft#1l`Rn>(7;ro4cFjo`XIszx&O` zx?{BBvsnf)B`ZK6&!ODAf_hGgY7y=aY)=ou#=a<1cb|(@IFb7dAsXX()P8n-_^$d-T=D-`g;0QWzgEG7maqi&V6`7!u+XeEESEbkju4ib=!UoFo#-=$ z!Dw_OKxp3BdJbM%(}BNp^S^JMh}=v;)>ifK>_k0d^&tWrg}(2FUb>T2lLyO==*9vi z)FUFJjLbV)z9-C@`RFIv!x zeWAKBL`9*|GrY5!e_#Tslm?A6f~gnxgAdOMOTgu;K_(57GoU<416D36V#6Tzr4O6N zszZl)Vd~9OCR3-~TbM$H-_;f_Ho2O|S&g)%OWi2IJMJ-d?v>K53?)0??>-DWwpFH% z$%^eSMG5h8uqS-@@L?{MCFbw3uB4?BW{RBHv(h2RMY8i#AN>Blw}oNl#Z)jrcK{C# zE0`-9M3|kqA|M9R>U6|SqCQV<8a-Te=e3J+21|BVWPSa{Sgle^v-)Ls>lpT_JFoJi zVcX?>2R&wFWm8!#Ut8a(@}07Gzpun$W0}A2h&SjNb~s-r&Yj6SLG8kwd?t>Vxiz~V zE?T4sY-(ycO*$$24*YKXZ3|}P4oo16llWX_W_s?pDNMN)2+*PlZo(2=uC<_fHDsx? zJB68UdAqCQb#Ahtk*tKv?oOiJO9j*U*UB8MWHhg2ROB)yC60D>b{4YH9u*%x%yo0< z-U92#bgE-6eFrJ{{))Gd^I92MRkaM<&q;fwAa8i zbDtT=eKhv|^j&Uib1>?&;Wjq9rdR1S=p-KRcbS1a!B}(0?cgq&kRHEATYenlJ{m}g zJ=T>lI%ag&$IcB@O6&(p?w`6Lr%e!_UCi}nyBN5V`c}0%Wet-fN|AFJf}@G`P_7x? zu$haU-Mb}9sBWajmtNb>0uN-@mr?x;%nKG4n>k(hk6K~R)4&Y%ikTeXOplhr!^3B< zFLiZyOKNLtKeD?wI=1~=hVR<>oQp%*ZLZGcf6t7F97g|uzTs`yVSNRMc}&bILr1@n zNb{%dqMh}%BNVX~d$87fHpk9?BjQ-QzCMZDr*o^0b;+)kbF$-XLz$!F5?`7+6Zd?8 z8m`Fdo5Ce!;#~Ja5k=c=cj4btKq;ixEM59}XVH9+S##c2c=$}WrjZdTL{MVlMxOqK&XY zd_v9|*2P&{qE7^tZ#q9RV>IiqskDR4Ai*e-x+Wo^x&NzJzQlQVuI`9Ac|U?aSG%IaJ@U{ygGyU$=9g=n zDtGU8d~$~@vsp*K=Gn2U_@)U_i}xt1V0aKsApe9Utiw=-StVx+K(PD);`Q9IfQE~a&9GWtfy<7q@4!; z;N9shqlOYSh0qrDY+@4M%2oNxF6CIUu-22mP#AA-VXDYUYI@Lg-*mxLO+(%v3ititJ6Y$CEmz9DcLafK12H(k{AZYjG%?POghqN6~HtT!P)){{(G|4@~J1 zAYnupzO1YD)#wmC*Mh3Cc8Sp&hsEf}-Bp{%G>$K*qko`2938Vdd@zsKaM*&d>14s^ zT#jYl8Gz9Iq%y>k{Pn%Mr>Ly9PK&A$u0Jv>J)Sh`y;vC2@Vb4Ce%QNGE()GuRLt*Y z(x0?Le0rgsVuaGzQyq-O5=C|~v#m{6DKZ_IsV;>B6*+qx13D?aN&m&&1->*KWwVb4 z*bJsVB}GLVuye5N)`7yo+OojGY$iHy$6kLF_x3?^#Gnv}!9ZD7<2q;tvy~S7dqJ318DGtLnRYxqg>Q>9!;~WLI?QXW{4c*ye>uqSp-mCn ze(5b<7gMUfGz{)sku$l~I^WBI_e+Z7651SVB7!VWenT_sqF48#*_Fnz{XwHRE24w{ zObmwgn8cx8rL#iwe+(WGOm?A{+qzLbi?_ueJu1oIC@X&bI(o==XkZYT%4~0d^ak=7 zga8Z04ZpxJNd3@dY_InKF+99PJ~2tgD(!(Q6Q8+SvCHmyUn+XXG2wjwdbN&b$an^5 zd&bUvN0hR)#C8Zb6BH@2lwrXE&-nj*37m>yiQ`h&?f&yt<$S>UT35Y;Pz=a47AN8k zQ(S37j+!97Nw2jDvO-;N3#aS_k@o8We1PC|vg8aJ+deQ6Rv5+`j?BodtUcfVa!?#} z+WVUK?k4Ua$aXzkv!mOy8!^lyur!(2?{EKs{tz=wYm2+1|4fpf=?RrwKJB$3p`!UL zw#+8G@<~X4>T7*n^`8C;~D0cL#!I z4tPCIwLn3xLMctX};JoMzSk+|Q6gzezaaY_4y;gZ~6ym%wQ9IPFpA7KfZ0Pbur zU?w7i8TJbRQjqHj6pYzVe&X}E?b^=uPhHmPE{NVEozQATb)@`QHDb+T>>HI~%!2@e8 z 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 ie15lj9kehHu~qF3v#cO;S~6OnT^ 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

HDMf(2u#vURcR$rP6dB9pX!@4}u%%Y&z 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

tQ1+Z`8)^F@vNRq|lziM9T@u=+@^ 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

=JAH~-@=Y9V9jX8w-a3>6O0%aj{TF4_d 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

_0-MWZ3@xiJd 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ⅅ$*mfZd-yxZZNB}4i!Y_cgtS`g6?lmicAYT4v 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%0AM0I6>Vl&s7X` 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 Target to benchmark (default: stack)" - echo " -d, --duration Duration in seconds (default: 60)" - echo " -c, --concurrent Number of concurrent users (default: 10)" - echo " -h, --help Show this help message" - echo "" - echo "Examples:" - echo " $0 --target vllm # Benchmark vLLM direct" - echo " $0 --target stack # Benchmark Llama Stack (default)" - echo " $0 -t vllm -d 120 -c 20 # vLLM with 120s duration, 20 users" -} - -while [[ $# -gt 0 ]]; do - case $1 in - -t|--target) - TARGET="$2" - shift 2 - ;; - -d|--duration) - DURATION="$2" - shift 2 - ;; - -c|--concurrent) - CONCURRENT="$2" - shift 2 - ;; - -h|--help) - usage - exit 0 - ;; - *) - echo "Unknown option: $1" - usage - exit 1 - ;; - esac -done - -# Validate target -if [[ "$TARGET" != "stack" && "$TARGET" != "vllm" ]]; then - echo "Error: Target must be 'stack' or 'vllm'" - usage - exit 1 -fi - -# Set configuration based on target -if [[ "$TARGET" == "vllm" ]]; then - BASE_URL="http://vllm-server:8000/v1" - JOB_NAME="vllm-benchmark-job" - echo "Benchmarking vLLM direct..." -else - BASE_URL="http://llama-stack-benchmark-service:8323/v1/openai/v1" - JOB_NAME="stack-benchmark-job" - echo "Benchmarking Llama Stack..." -fi - -echo "Configuration:" -echo " Target: $TARGET" -echo " Base URL: $BASE_URL" -echo " Duration: ${DURATION}s" -echo " Concurrent users: $CONCURRENT" -echo "" - -# Create temporary job yaml -TEMP_YAML="/tmp/benchmark-job-temp-$(date +%s).yaml" -cat > "$TEMP_YAML" << EOF -apiVersion: batch/v1 -kind: Job -metadata: - name: $JOB_NAME - namespace: default -spec: - template: - spec: - containers: - - name: benchmark - image: python:3.11-slim - command: ["/bin/bash"] - args: - - "-c" - - | - pip install aiohttp && - python3 /benchmark/benchmark.py \\ - --base-url $BASE_URL \\ - --model \${INFERENCE_MODEL} \\ - --duration $DURATION \\ - --concurrent $CONCURRENT - env: - - name: INFERENCE_MODEL - value: "meta-llama/Llama-3.2-3B-Instruct" - volumeMounts: - - name: benchmark-script - mountPath: /benchmark - resources: - requests: - memory: "256Mi" - cpu: "250m" - limits: - memory: "512Mi" - cpu: "500m" - volumes: - - name: benchmark-script - configMap: - name: benchmark-script - restartPolicy: Never - backoffLimit: 3 -EOF - -echo "Creating benchmark ConfigMap..." -kubectl create configmap benchmark-script \ - --from-file=benchmark.py=benchmark.py \ - --dry-run=client -o yaml | kubectl apply -f - - -echo "Cleaning up any existing benchmark job..." -kubectl delete job $JOB_NAME 2>/dev/null || true - -echo "Deploying benchmark Job..." -kubectl apply -f "$TEMP_YAML" - -echo "Waiting for job to start..." -kubectl wait --for=condition=Ready pod -l job-name=$JOB_NAME --timeout=60s - -echo "Following benchmark logs..." -kubectl logs -f job/$JOB_NAME - -echo "Job completed. Checking final status..." -kubectl get job $JOB_NAME - -# Clean up temporary file -rm -f "$TEMP_YAML" diff --git a/benchmarking/k8s-benchmark/scripts/generate_charts.py b/benchmarking/k8s-benchmark/scripts/generate_charts.py new file mode 100755 index 000000000..7b920fc04 --- /dev/null +++ b/benchmarking/k8s-benchmark/scripts/generate_charts.py @@ -0,0 +1,294 @@ +#!/usr/bin/env python3 +# Copyright (c) Meta Platforms, Inc. and affiliates. +# All rights reserved. +# +# This source code is licensed under the terms described in the LICENSE file in +# the root directory of this source tree. + +# /// script +# dependencies = [ +# "matplotlib", +# ] +# /// +""" +Script to generate benchmark charts from guidellm text results. +Creates 2x2 grid charts with RPS, Request Latency, TTFT, and ITL metrics against concurrent@x values. +Outputs one chart file per vLLM replica group, with each line representing one benchmark run. +""" + +import glob +import os +import re + +import matplotlib.pyplot as plt + + +def extract_setup_name(filename: str) -> str: + """Extract setup name from filename and format legend appropriately.""" + basename = os.path.basename(filename) + + # Try new pattern: guidellm-benchmark-stack-s{stack_replicas}-sw{workers}-v{vllm_replicas}-{timestamp}.txt + match = re.search(r"guidellm-benchmark-stack-s(\d+)-sw(\d+)-v(\d+)-(\d{8})-(\d{6})\.txt", basename) + if match: + stack_replicas = match.group(1) + workers = match.group(2) + vllm_replicas = match.group(3) + date = match.group(4) + time = match.group(5) + return f"stack-s{stack_replicas}-sw{workers}-v{vllm_replicas}" + + # Try new vLLM pattern: guidellm-benchmark-vllm-v{vllm_replicas}-{timestamp}.txt + match = re.search(r"guidellm-benchmark-vllm-v(\d+)-(\d{8})-(\d{6})\.txt", basename) + if match: + vllm_replicas = match.group(1) + date = match.group(2) + time = match.group(3) + return f"vllm-v{vllm_replicas}" + + # Fall back to old pattern: guidellm-benchmark-{target}-{stack_replicas}-w{workers}-{vllm_replicas}-{timestamp}.txt + match = re.search(r"guidellm-benchmark-([^-]+)-(\d+)-w(\d+)-(\d+)-(\d+)-(\d+)\.txt", basename) + if match: + target = match.group(1) + stack_replicas = match.group(2) + workers = match.group(3) + vllm_replicas = match.group(4) + date = match.group(5) + time = match.group(6) + + if target == "vllm": + return f"vllm-{vllm_replicas}-w{workers}-{vllm_replicas}" + else: + return f"stack-replicas{stack_replicas}-w{workers}-vllm-replicas{vllm_replicas}-{date}-{time}" + + # Fall back to older pattern: guidellm-benchmark-{target}-{stack_replicas}-{vllm_replicas}-{timestamp}.txt + match = re.search(r"guidellm-benchmark-([^-]+)-(\d+)-(\d+)-(\d+)-(\d+)\.txt", basename) + if match: + target = match.group(1) + stack_replicas = match.group(2) + vllm_replicas = match.group(3) + date = match.group(4) + time = match.group(5) + + if target == "vllm": + return f"vllm-{vllm_replicas}-w1-{vllm_replicas}" + else: + return f"stack-replicas{stack_replicas}-vllm-replicas{vllm_replicas}-{date}-{time}" + + return basename.replace("guidellm-benchmark-", "").replace(".txt", "") + + +def parse_txt_file(filepath: str) -> list[tuple[float, float, float, float, float, str]]: + """ + Parse a text benchmark file and extract concurrent@x, RPS, TTFT, ITL, and request latency data. + Returns list of (concurrency, rps_mean, ttft_mean, itl_mean, req_latency_mean, setup_name) tuples. + """ + setup_name = extract_setup_name(filepath) + data_points = [] + + try: + with open(filepath) as f: + content = f.read() + + # Find the benchmark stats table + lines = content.split("\n") + in_stats_table = False + header_lines_seen = 0 + + for line in lines: + line_stripped = line.strip() + + # Look for the start of the stats table + if "Benchmarks Stats:" in line: + in_stats_table = True + continue + + if in_stats_table: + # Skip the first few separator/header lines + if line_stripped.startswith("=") or line_stripped.startswith("-"): + header_lines_seen += 1 + if header_lines_seen >= 3: # After seeing multiple header lines, look for concurrent@ data + if line_stripped.startswith("=") and "concurrent@" not in line_stripped: + break + continue + + # Parse concurrent@ lines in the stats table (may have leading spaces) + if in_stats_table and "concurrent@" in line: + parts = [part.strip() for part in line.split("|")] + + if len(parts) >= 12: # Make sure we have enough columns for new format + try: + # Extract concurrency from benchmark name (e.g., concurrent@1 -> 1) + concurrent_match = re.search(r"concurrent@(\d+)", parts[0]) + if not concurrent_match: + continue + concurrency = float(concurrent_match.group(1)) + + # Extract metrics from the new table format + # From your image, the table has these columns with | separators: + # Benchmark | Per Second | Concurrency | Out Tok/sec | Tot Tok/sec | Req Latency (sec) | TTFT (ms) | ITL (ms) | TPOT (ms) + # Looking at the mean/median/p99 structure, need to find the mean columns + # The structure shows: mean | median | p99 for each metric + rps_mean = float(parts[1]) # Per Second (RPS) + req_latency_mean = float(parts[6]) * 1000 # Request latency mean (convert from sec to ms) + ttft_mean = float(parts[9]) # TTFT mean column + itl_mean = float(parts[12]) # ITL mean column + + data_points.append((concurrency, rps_mean, ttft_mean, itl_mean, req_latency_mean, setup_name)) + + except (ValueError, IndexError) as e: + print(f"Warning: Could not parse line '{line}' in {filepath}: {e}") + continue + + except (OSError, FileNotFoundError) as e: + print(f"Error reading {filepath}: {e}") + + return data_points + + +def generate_charts(benchmark_dir: str = "results"): + """Generate 2x2 grid charts (RPS, Request Latency, TTFT, ITL) from benchmark text files.""" + # Find all text result files instead of JSON + txt_pattern = os.path.join(benchmark_dir, "guidellm-benchmark-*.txt") + txt_files = glob.glob(txt_pattern) + + if not txt_files: + print(f"No text files found matching pattern: {txt_pattern}") + return + + print(f"Found {len(txt_files)} text files") + + # Parse all files and collect data + all_data = {} # setup_name -> [(concurrency, rps, ttft, itl, req_latency), ...] + + for txt_file in txt_files: + print(f"Processing {txt_file}") + data_points = parse_txt_file(txt_file) + + for concurrency, rps, ttft, itl, req_latency, setup_name in data_points: + if setup_name not in all_data: + all_data[setup_name] = [] + all_data[setup_name].append((concurrency, rps, ttft, itl, req_latency)) + + if not all_data: + print("No data found to plot") + return + + # Sort data points by concurrency for each setup + for setup_name in all_data: + all_data[setup_name].sort(key=lambda x: x[0]) # Sort by concurrency + + # Group setups by vLLM replica number (original approach) + replica_groups = {} # vllm_replica_count -> {setup_name: points} + + for setup_name, points in all_data.items(): + # Extract vLLM replica number from setup name + # Expected formats: + # - New stack format: "stack-s{X}-sw{W}-v{Y}" + # - New vLLM format: "vllm-v{Y}" + # - Old formats: "stack-replicas{X}-w{W}-vllm-replicas{Y}" or "vllm-{Y}-w{W}-{Y}" + + # Try new formats first + vllm_match = re.search(r"-v(\d+)$", setup_name) # Matches both "stack-s1-sw2-v3" and "vllm-v1" + if not vllm_match: + # Try old stack format + vllm_match = re.search(r"vllm-replicas(\d+)", setup_name) + if not vllm_match: + # Try old vLLM format: "vllm-{Y}-w{W}-{Y}" + vllm_match = re.search(r"vllm-(\d+)-w\d+-\d+", setup_name) + + if vllm_match: + vllm_replica_num = int(vllm_match.group(1)) + if vllm_replica_num not in replica_groups: + replica_groups[vllm_replica_num] = {} + replica_groups[vllm_replica_num][setup_name] = points + else: + print(f"Warning: Could not extract vLLM replica count from setup name: {setup_name}") + + def create_charts(data_dict, prefix, title_prefix): + """Create a 2x2 grid with RPS, Request Latency, TTFT, and ITL charts.""" + if not data_dict: + print(f"No data found for {prefix}") + return + + # Create 2x2 subplot grid + fig, ((ax1, ax2), (ax3, ax4)) = plt.subplots(2, 2, figsize=(16, 12)) + fig.suptitle(f"{title_prefix} Benchmark Results", fontsize=16, fontweight="bold") + + # Collect all unique concurrency values for tick setting + all_concurrency_values = set() + for points in data_dict.values(): + all_concurrency_values.update([p[0] for p in points]) + all_concurrency_values = sorted(all_concurrency_values) + + # Plot data for each setup in alphabetical order + for setup_name in sorted(data_dict.keys()): + points = data_dict[setup_name] + if not points: + continue + + concurrency_values = [p[0] for p in points] + rps_values = [p[1] for p in points] + ttft_values = [p[2] for p in points] + itl_values = [p[3] for p in points] + req_latency_values = [p[4] for p in points] + + # RPS chart (top-left) + ax1.plot(concurrency_values, rps_values, marker="o", label=setup_name, linewidth=2, markersize=6) + + # Request Latency chart (top-right) + ax2.plot(concurrency_values, req_latency_values, marker="o", label=setup_name, linewidth=2, markersize=6) + + # TTFT chart (bottom-left) + ax3.plot(concurrency_values, ttft_values, marker="o", label=setup_name, linewidth=2, markersize=6) + + # ITL chart (bottom-right) + ax4.plot(concurrency_values, itl_values, marker="o", label=setup_name, linewidth=2, markersize=6) + + # Configure all charts after plotting data + axes = [ax1, ax2, ax3, ax4] + titles = ["RPS", "Request Latency", "TTFT", "ITL"] + ylabels = [ + "Requests Per Second (RPS)", + "Request Latency (ms)", + "Time to First Token (ms)", + "Inter Token Latency (ms)", + ] + + for ax, title, ylabel in zip(axes, titles, ylabels, strict=False): + ax.set_xlabel("Concurrency", fontsize=12) + ax.set_ylabel(ylabel, fontsize=12) + ax.set_title(title, fontsize=14, fontweight="bold") + ax.set_xscale("log", base=2) + ax.set_xticks(all_concurrency_values) + ax.set_xticklabels([str(int(x)) for x in all_concurrency_values]) + ax.grid(True, alpha=0.3) + + # Add legend to the right-most subplot (top-right) + ax2.legend(bbox_to_anchor=(1.05, 1), loc="upper left") + + plt.tight_layout() + + # Save the combined chart + combined_filename = os.path.join(benchmark_dir, f"{prefix}_benchmark_results.png") + plt.savefig(combined_filename, dpi=300, bbox_inches="tight") + plt.close() + print(f"Combined benchmark chart saved to {combined_filename}") + + # Print grouping information + for replica_count, data_dict in replica_groups.items(): + print(f"vLLM Replica {replica_count} setups: {list(data_dict.keys())}") + + # Create separate charts for each replica group + for replica_count, data_dict in replica_groups.items(): + prefix = f"vllm_replica{replica_count}" + title = f"vLLM Replicas={replica_count}" + create_charts(data_dict, prefix, title) + + # Print summary + print("\nSummary:") + for setup_name, points in all_data.items(): + print(f"{setup_name}: {len(points)} data points") + + +if __name__ == "__main__": + generate_charts() diff --git a/benchmarking/k8s-benchmark/scripts/run-all-benchmarks.sh b/benchmarking/k8s-benchmark/scripts/run-all-benchmarks.sh new file mode 100755 index 000000000..0a4a774c7 --- /dev/null +++ b/benchmarking/k8s-benchmark/scripts/run-all-benchmarks.sh @@ -0,0 +1,103 @@ +#!/usr/bin/env bash + +# Copyright (c) Meta Platforms, Inc. and affiliates. +# All rights reserved. +# +# This source code is licensed under the terms described in the LICENSE file in +# the root directory of this source tree. + +# Define benchmark configurations: (target, stack_replicas, vllm_replicas, stack_workers) +configs=( + "stack 1 1 1" + "stack 1 1 2" + "stack 1 1 4" + "vllm 1 1 -" +) + +set -euo pipefail + +# Get the directory where this script is located +SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" + +echo "Running comprehensive GuideLL benchmark suite..." +echo "Start time: $(date)" + +# Default deployment names +STACK_DEPLOYMENT="llama-stack-benchmark-server" +VLLM_DEPLOYMENT="vllm-server" + +# Scaling function +scale_deployments() { + local stack_replicas=$1 + local vllm_replicas=$2 + local workers=$3 + + echo "Scaling deployments..." + + if [[ "$vllm_replicas" != "-" ]]; then + echo "Scaling $VLLM_DEPLOYMENT to $vllm_replicas replicas..." + kubectl scale deployment $VLLM_DEPLOYMENT --replicas=$vllm_replicas + kubectl rollout status deployment $VLLM_DEPLOYMENT --timeout=600s + fi + + if [[ "$target" == "stack" ]]; then + if [[ "$stack_replicas" != "-" ]]; then + echo "Scaling $STACK_DEPLOYMENT to $stack_replicas replicas..." + kubectl scale deployment $STACK_DEPLOYMENT --replicas=$stack_replicas + kubectl rollout status deployment $STACK_DEPLOYMENT --timeout=600s + fi + + if [[ "$workers" != "-" ]]; then + echo "Updating $STACK_DEPLOYMENT to use $workers workers..." + kubectl set env deployment/$STACK_DEPLOYMENT LLAMA_STACK_WORKERS=$workers + kubectl rollout status deployment $STACK_DEPLOYMENT --timeout=600s + fi + fi + + echo "All scaling operations completed. Waiting additional 30s for services to stabilize..." + sleep 30 +} + + +for config in "${configs[@]}"; do + read -r target stack_replicas vllm_replicas workers <<< "$config" + + echo "" + echo "==========================================" + if [[ "$workers" != "-" ]]; then + echo "Running benchmark: $target (stack=$stack_replicas, vllm=$vllm_replicas, workers=$workers)" + else + echo "Running benchmark: $target (stack=$stack_replicas, vllm=$vllm_replicas)" + fi + echo "Start: $(date)" + echo "==========================================" + + # Scale deployments before running benchmark + scale_deployments "$stack_replicas" "$vllm_replicas" "$workers" + + # Generate output filename with setup info + TIMESTAMP=$(date +%Y%m%d-%H%M%S) + if [[ "$target" == "stack" ]]; then + OUTPUT_FILE="results/guidellm-benchmark-${target}-s${stack_replicas}-sw${workers}-v${vllm_replicas}-${TIMESTAMP}.txt" + else + OUTPUT_FILE="results/guidellm-benchmark-${target}-v${vllm_replicas}-${TIMESTAMP}.txt" + fi + + # Run the benchmark with the cluster as configured + "$SCRIPT_DIR/run-guidellm-benchmark.sh" \ + --target "$target" \ + --output-file "$OUTPUT_FILE" + + echo "Completed: $(date)" + echo "Waiting 30 seconds before next benchmark..." + sleep 30 +done + +echo "" +echo "==========================================" +echo "All benchmarks completed!" +echo "End time: $(date)" +echo "==========================================" +echo "" +echo "Results files generated:" +ls -la results/guidellm-*.txt results/guidellm-*.json 2>/dev/null || echo "No result files found" diff --git a/benchmarking/k8s-benchmark/scripts/run-guidellm-benchmark.sh b/benchmarking/k8s-benchmark/scripts/run-guidellm-benchmark.sh new file mode 100755 index 000000000..746eff391 --- /dev/null +++ b/benchmarking/k8s-benchmark/scripts/run-guidellm-benchmark.sh @@ -0,0 +1,219 @@ +#!/usr/bin/env bash + +# Copyright (c) Meta Platforms, Inc. and affiliates. +# All rights reserved. +# +# This source code is licensed under the terms described in the LICENSE file in +# the root directory of this source tree. + +set -euo pipefail + +# Default values +TARGET="stack" +MAX_SECONDS=60 +PROMPT_TOKENS=512 +OUTPUT_TOKENS=256 +RATE_TYPE="concurrent" +RATE="1,2,4,8,16,32,64,128" +STACK_DEPLOYMENT="llama-stack-benchmark-server" +STACK_URL="http://llama-stack-benchmark-service:8323/v1/openai" +VLLM_DEPLOYMENT="vllm-server" +OUTPUT_FILE="" + +# Parse command line arguments +usage() { + echo "Usage: $0 [options]" + echo "Options:" + echo " -t, --target Target to benchmark (default: stack)" + echo " -s, --max-seconds Maximum duration in seconds (default: 60)" + echo " -p, --prompt-tokens Number of prompt tokens (default: 512)" + echo " -o, --output-tokens Number of output tokens (default: 256)" + echo " -r, --rate-type Rate type (default: concurrent)" + echo " -c, --rate Rate (default: 1,2,4,8,16,32,64,128)" + echo " --output-file Output file path (default: auto-generated)" + echo " --stack-deployment Name of the stack deployment (default: llama-stack-benchmark-server)" + echo " --vllm-deployment Name of the vllm deployment (default: vllm-server)" + echo " --stack-url URL of the stack service (default: http://llama-stack-benchmark-service:8323/v1/openai)" + echo " -h, --help Show this help message" + echo "" + echo "Examples:" + echo " $0 --target vllm # Benchmark vLLM direct" + echo " $0 --target stack # Benchmark Llama Stack (default)" + echo " $0 -t vllm -s 60 -p 512 -o 256 # vLLM with custom parameters" + echo " $0 --output-file results/my-benchmark.txt # Specify custom output file" + echo " $0 --stack-deployment my-stack-server # Use custom stack deployment name" +} + +while [[ $# -gt 0 ]]; do + case $1 in + -t|--target) + TARGET="$2" + shift 2 + ;; + -s|--max-seconds) + MAX_SECONDS="$2" + shift 2 + ;; + -p|--prompt-tokens) + PROMPT_TOKENS="$2" + shift 2 + ;; + -o|--output-tokens) + OUTPUT_TOKENS="$2" + shift 2 + ;; + -r|--rate-type) + RATE_TYPE="$2" + shift 2 + ;; + -c|--rate) + RATE="$2" + shift 2 + ;; + --output-file) + OUTPUT_FILE="$2" + shift 2 + ;; + --stack-deployment) + STACK_DEPLOYMENT="$2" + shift 2 + ;; + --vllm-deployment) + VLLM_DEPLOYMENT="$2" + shift 2 + ;; + --stack-url) + STACK_URL="$2" + shift 2 + ;; + -h|--help) + usage + exit 0 + ;; + *) + echo "Unknown option: $1" + usage + exit 1 + ;; + esac +done + +# Validate target +if [[ "$TARGET" != "stack" && "$TARGET" != "vllm" ]]; then + echo "Error: Target must be 'stack' or 'vllm'" + usage + exit 1 +fi + +# Set configuration based on target +if [[ "$TARGET" == "vllm" ]]; then + BASE_URL="http://${VLLM_DEPLOYMENT}:8000" + JOB_NAME="guidellm-vllm-benchmark-job" + echo "Benchmarking vLLM direct with GuideLLM..." +else + BASE_URL="$STACK_URL" + JOB_NAME="guidellm-stack-benchmark-job" + echo "Benchmarking Llama Stack with GuideLLM..." +fi + + +echo "Configuration:" +echo " Target: $TARGET" +echo " Base URL: $BASE_URL" +echo " Max seconds: ${MAX_SECONDS}s" +echo " Prompt tokens: $PROMPT_TOKENS" +echo " Output tokens: $OUTPUT_TOKENS" +echo " Rate type: $RATE_TYPE" +if [[ "$TARGET" == "vllm" ]]; then + echo " vLLM deployment: $VLLM_DEPLOYMENT" +else + echo " Stack deployment: $STACK_DEPLOYMENT" +fi +echo "" + +# Create temporary job yaml +TEMP_YAML="/tmp/guidellm-benchmark-job-temp-$(date +%s).yaml" +cat > "$TEMP_YAML" << EOF +apiVersion: batch/v1 +kind: Job +metadata: + name: $JOB_NAME + namespace: default +spec: + template: + spec: + containers: + - name: guidellm-benchmark + image: python:3.11-slim + command: ["/bin/bash"] + args: + - "-c" + - | + # Install uv and guidellm + pip install uv && + uv pip install --system guidellm && + + # Login to HuggingFace + uv pip install --system huggingface_hub && + python -c "from huggingface_hub import login; login(token='\$HF_TOKEN')" && + + # Run GuideLLM benchmark and save output + export COLUMNS=200 + GUIDELLM__PREFERRED_ROUTE="chat_completions" uv run guidellm benchmark run \\ + --target "$BASE_URL" \\ + --rate-type "$RATE_TYPE" \\ + --max-seconds $MAX_SECONDS \\ + --data "prompt_tokens=$PROMPT_TOKENS,output_tokens=$OUTPUT_TOKENS" \\ + --model "$INFERENCE_MODEL" \\ + --rate "$RATE" \\ + --warmup-percent 0.05 \\ + 2>&1 + env: + - name: INFERENCE_MODEL + value: "meta-llama/Llama-3.2-3B-Instruct" + - name: HF_TOKEN + valueFrom: + secretKeyRef: + name: hf-token-secret + key: token + resources: + requests: + memory: "4Gi" + cpu: "500m" + limits: + memory: "8Gi" + cpu: "2000m" + restartPolicy: Never + backoffLimit: 3 +EOF + +echo "Cleaning up any existing GuideLLM benchmark job..." +kubectl delete job $JOB_NAME 2>/dev/null || true + +echo "Deploying GuideLLM benchmark Job..." +kubectl apply -f "$TEMP_YAML" + +echo "Waiting for job to start..." +kubectl wait --for=condition=Ready pod -l job-name=$JOB_NAME --timeout=120s + +# Prepare file names and create results directory +mkdir -p results +if [[ -z "$OUTPUT_FILE" ]]; then + TIMESTAMP=$(date +%Y%m%d-%H%M%S) + OUTPUT_FILE="results/guidellm-benchmark-${TARGET}-${TIMESTAMP}.txt" +fi + +echo "Following GuideLLM benchmark logs..." +kubectl logs -f job/$JOB_NAME + +echo "Job completed. Checking final status..." +kubectl get job $JOB_NAME + +# Save benchmark results using kubectl logs +echo "Saving benchmark results..." +kubectl logs job/$JOB_NAME > "$OUTPUT_FILE" + +echo "Benchmark output saved to: $OUTPUT_FILE" + +# Clean up temporary file +rm -f "$TEMP_YAML" diff --git a/benchmarking/k8s-benchmark/stack-k8s.yaml.template b/benchmarking/k8s-benchmark/stack-k8s.yaml.template index 8842c0bea..54eeadcad 100644 --- a/benchmarking/k8s-benchmark/stack-k8s.yaml.template +++ b/benchmarking/k8s-benchmark/stack-k8s.yaml.template @@ -58,14 +58,14 @@ spec: value: "/etc/config/stack_run_config.yaml" - name: LLAMA_STACK_WORKERS value: "${LLAMA_STACK_WORKERS}" - command: ["uvicorn", "llama_stack.core.server.server:create_app", "--host", "0.0.0.0", "--port", "8323", "--workers", "$LLAMA_STACK_WORKERS", "--factory"] + command: ["uvicorn", "llama_stack.core.server.server:create_app", "--host", "0.0.0.0", "--port", "8323", "--workers", "$(LLAMA_STACK_WORKERS)", "--factory"] ports: - containerPort: 8323 resources: requests: - cpu: "${LLAMA_STACK_WORKERS}" + cpu: "4" limits: - cpu: "${LLAMA_STACK_WORKERS}" + cpu: "4" volumeMounts: - name: llama-storage mountPath: /root/.llama diff --git a/pyproject.toml b/pyproject.toml index ecbd8991a..86a32f978 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -177,6 +177,7 @@ exclude = [ ".pre-commit-config.yaml", "*.md", ".flake8", + "benchmarking/k8s-benchmark/results", ] [tool.ruff.lint] From 914c8cb6057153f91e0f45987b453499d216b1d0 Mon Sep 17 00:00:00 2001 From: Alexey Rybak <50731695+reluctantfuturist@users.noreply.github.com> Date: Wed, 24 Sep 2025 13:55:12 -0700 Subject: [PATCH 135/150] fix: fix API docstrings for proper MDX parsing (#3526) # What does this PR do? _[Stack 1/10] Docusaurus documentation migration_ Updates the file upload API documentation to use proper OpenAPI format for integer parameters. Replaces `` with `{integer}` in the description of the `expires_after[seconds]` parameter across the HTML spec, YAML spec, and Python implementation. ## Test Plan - docs/openapi_generator/run_openapi_generator.sh --- docs/_static/llama-stack-spec.html | 2 +- docs/_static/llama-stack-spec.yaml | 2 +- llama_stack/apis/files/files.py | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/docs/_static/llama-stack-spec.html b/docs/_static/llama-stack-spec.html index 9ddb070d7..2f34e64a4 100644 --- a/docs/_static/llama-stack-spec.html +++ b/docs/_static/llama-stack-spec.html @@ -4451,7 +4451,7 @@ "tags": [ "Files" ], - "description": "Upload a file that can be used across various endpoints.\nThe file upload should be a multipart form request with:\n- file: The File object (not file name) to be uploaded.\n- purpose: The intended purpose of the uploaded file.\n- expires_after: Optional form values describing expiration for the file. Expected expires_after[anchor] = \"created_at\", expires_after[seconds] = . Seconds must be between 3600 and 2592000 (1 hour to 30 days).", + "description": "Upload a file that can be used across various endpoints.\nThe file upload should be a multipart form request with:\n- file: The File object (not file name) to be uploaded.\n- purpose: The intended purpose of the uploaded file.\n- expires_after: Optional form values describing expiration for the file. Expected expires_after[anchor] = \"created_at\", expires_after[seconds] = {integer}. Seconds must be between 3600 and 2592000 (1 hour to 30 days).", "parameters": [], "requestBody": { "content": { diff --git a/docs/_static/llama-stack-spec.yaml b/docs/_static/llama-stack-spec.yaml index 94dc5c0f9..66216e13b 100644 --- a/docs/_static/llama-stack-spec.yaml +++ b/docs/_static/llama-stack-spec.yaml @@ -3164,7 +3164,7 @@ paths: - purpose: The intended purpose of the uploaded file. - expires_after: Optional form values describing expiration for the file. - Expected expires_after[anchor] = "created_at", expires_after[seconds] = . + Expected expires_after[anchor] = "created_at", expires_after[seconds] = {integer}. Seconds must be between 3600 and 2592000 (1 hour to 30 days). parameters: [] requestBody: diff --git a/llama_stack/apis/files/files.py b/llama_stack/apis/files/files.py index d39e96e96..124e4bc8e 100644 --- a/llama_stack/apis/files/files.py +++ b/llama_stack/apis/files/files.py @@ -119,7 +119,7 @@ class Files(Protocol): The file upload should be a multipart form request with: - file: The File object (not file name) to be uploaded. - purpose: The intended purpose of the uploaded file. - - expires_after: Optional form values describing expiration for the file. Expected expires_after[anchor] = "created_at", expires_after[seconds] = . Seconds must be between 3600 and 2592000 (1 hour to 30 days). + - expires_after: Optional form values describing expiration for the file. Expected expires_after[anchor] = "created_at", expires_after[seconds] = {integer}. Seconds must be between 3600 and 2592000 (1 hour to 30 days). :param file: The uploaded file object containing content and metadata (filename, content_type, etc.). :param purpose: The intended purpose of the uploaded file (e.g., "assistants", "fine-tune"). From 0a7d1adfee5cd76fec45fe09b47658e97f374c3a Mon Sep 17 00:00:00 2001 From: Alexey Rybak <50731695+reluctantfuturist@users.noreply.github.com> Date: Wed, 24 Sep 2025 13:57:27 -0700 Subject: [PATCH 136/150] fix: update OpenAPI generator (#3527) # What does this PR do? Updates OpenAPI generator to use summaries and changed the file generation path. ## Test Plan - docs/openapi_generator/run_openapi_generator.sh --- docs/openapi_generator/pyopenapi/generator.py | 37 ++--- .../run_openapi_generator.sh | 2 +- .../{_static => static}/llama-stack-spec.html | 120 ++++++++++++++ .../{_static => static}/llama-stack-spec.yaml | 153 ++++++++++++++++++ 4 files changed, 289 insertions(+), 23 deletions(-) rename docs/{_static => static}/llama-stack-spec.html (98%) rename docs/{_static => static}/llama-stack-spec.yaml (98%) diff --git a/docs/openapi_generator/pyopenapi/generator.py b/docs/openapi_generator/pyopenapi/generator.py index e2c73e33c..5ac712f02 100644 --- a/docs/openapi_generator/pyopenapi/generator.py +++ b/docs/openapi_generator/pyopenapi/generator.py @@ -9,7 +9,9 @@ import ipaddress import types import typing from dataclasses import make_dataclass -from typing import Any, Dict, Set, Union +from typing import Annotated, Any, Dict, get_args, get_origin, Set, Union + +from fastapi import UploadFile from llama_stack.apis.datatypes import Error from llama_stack.strong_typing.core import JsonType @@ -30,9 +32,6 @@ from llama_stack.strong_typing.schema import ( Schema, SchemaOptions, ) -from typing import get_origin, get_args -from typing import Annotated -from fastapi import UploadFile from llama_stack.strong_typing.serialization import json_dump_string, object_to_json from .operations import ( @@ -624,11 +623,11 @@ class Generator: # data passed in request body as multipart/form-data elif op.multipart_params: builder = ContentBuilder(self.schema_builder) - + # Create schema properties for multipart form fields properties = {} required_fields = [] - + for name, param_type in op.multipart_params: if get_origin(param_type) is Annotated: base_type = get_args(param_type)[0] @@ -636,28 +635,21 @@ class Generator: base_type = param_type if base_type is UploadFile: # File upload - properties[name] = { - "type": "string", - "format": "binary" - } + properties[name] = {"type": "string", "format": "binary"} else: # Form field properties[name] = self.schema_builder.classdef_to_ref(base_type) - + required_fields.append(name) - + multipart_schema = { "type": "object", "properties": properties, - "required": required_fields + "required": required_fields, } - + requestBody = RequestBody( - content={ - "multipart/form-data": { - "schema": multipart_schema - } - }, + content={"multipart/form-data": {"schema": multipart_schema}}, required=True, ) # data passed in payload as JSON and mapped to request parameters @@ -801,9 +793,10 @@ class Generator: ) return Operation( - tags=[getattr(op.defining_class, "API_NAMESPACE", op.defining_class.__name__)], - summary=None, - # summary=doc_string.short_description, + tags=[ + getattr(op.defining_class, "API_NAMESPACE", op.defining_class.__name__) + ], + summary=doc_string.short_description, description=description, parameters=parameters, requestBody=requestBody, diff --git a/docs/openapi_generator/run_openapi_generator.sh b/docs/openapi_generator/run_openapi_generator.sh index 22532ffe7..45d00d6e7 100755 --- a/docs/openapi_generator/run_openapi_generator.sh +++ b/docs/openapi_generator/run_openapi_generator.sh @@ -29,4 +29,4 @@ fi stack_dir=$(dirname $(dirname $THIS_DIR)) PYTHONPATH=$PYTHONPATH:$stack_dir \ - python -m docs.openapi_generator.generate $(dirname $THIS_DIR)/_static + python -m docs.openapi_generator.generate $(dirname $THIS_DIR)/static diff --git a/docs/_static/llama-stack-spec.html b/docs/static/llama-stack-spec.html similarity index 98% rename from docs/_static/llama-stack-spec.html rename to docs/static/llama-stack-spec.html index 2f34e64a4..36cb025c4 100644 --- a/docs/_static/llama-stack-spec.html +++ b/docs/static/llama-stack-spec.html @@ -62,6 +62,7 @@ "tags": [ "DatasetIO" ], + "summary": "Append rows to a dataset.", "description": "Append rows to a dataset.", "parameters": [ { @@ -115,6 +116,7 @@ "tags": [ "Inference" ], + "summary": "Generate chat completions for a batch of messages using the specified model.", "description": "Generate chat completions for a batch of messages using the specified model.", "parameters": [], "requestBody": { @@ -158,6 +160,7 @@ "tags": [ "Inference" ], + "summary": "Generate completions for a batch of content using the specified model.", "description": "Generate completions for a batch of content using the specified model.", "parameters": [], "requestBody": { @@ -194,6 +197,7 @@ "tags": [ "PostTraining (Coming Soon)" ], + "summary": "Cancel a training job.", "description": "Cancel a training job.", "parameters": [], "requestBody": { @@ -242,6 +246,7 @@ "tags": [ "BatchInference (Coming Soon)" ], + "summary": "Generate a chat completion for the given messages using the specified model.", "description": "Generate a chat completion for the given messages using the specified model.", "parameters": [], "requestBody": { @@ -290,6 +295,7 @@ "tags": [ "BatchInference (Coming Soon)" ], + "summary": "Generate a completion for the given content using the specified model.", "description": "Generate a completion for the given content using the specified model.", "parameters": [], "requestBody": { @@ -333,6 +339,7 @@ "tags": [ "Agents" ], + "summary": "List all agents.", "description": "List all agents.", "parameters": [ { @@ -383,6 +390,7 @@ "tags": [ "Agents" ], + "summary": "Create an agent with the given configuration.", "description": "Create an agent with the given configuration.", "parameters": [], "requestBody": { @@ -426,6 +434,7 @@ "tags": [ "Agents" ], + "summary": "Create a new session for an agent.", "description": "Create a new session for an agent.", "parameters": [ { @@ -484,6 +493,7 @@ "tags": [ "Agents" ], + "summary": "Create a new turn for an agent.", "description": "Create a new turn for an agent.", "parameters": [ { @@ -546,6 +556,7 @@ "tags": [ "Agents" ], + "summary": "List all OpenAI responses.", "description": "List all OpenAI responses.", "parameters": [ { @@ -619,6 +630,7 @@ "tags": [ "Agents" ], + "summary": "Create a new OpenAI response.", "description": "Create a new OpenAI response.", "parameters": [], "requestBody": { @@ -662,6 +674,7 @@ "tags": [ "Prompts" ], + "summary": "List all prompts.", "description": "List all prompts.", "parameters": [] }, @@ -693,6 +706,7 @@ "tags": [ "Prompts" ], + "summary": "Create a new prompt.", "description": "Create a new prompt.", "parameters": [], "requestBody": { @@ -736,6 +750,7 @@ "tags": [ "Agents" ], + "summary": "Describe an agent by its ID.", "description": "Describe an agent by its ID.", "parameters": [ { @@ -770,6 +785,7 @@ "tags": [ "Agents" ], + "summary": "Delete an agent by its ID and its associated sessions and turns.", "description": "Delete an agent by its ID and its associated sessions and turns.", "parameters": [ { @@ -813,6 +829,7 @@ "tags": [ "Agents" ], + "summary": "Retrieve an agent session by its ID.", "description": "Retrieve an agent session by its ID.", "parameters": [ { @@ -868,6 +885,7 @@ "tags": [ "Agents" ], + "summary": "Delete an agent session by its ID and its associated turns.", "description": "Delete an agent session by its ID and its associated turns.", "parameters": [ { @@ -920,6 +938,7 @@ "tags": [ "Agents" ], + "summary": "Retrieve an OpenAI response by its ID.", "description": "Retrieve an OpenAI response by its ID.", "parameters": [ { @@ -961,6 +980,7 @@ "tags": [ "Agents" ], + "summary": "Delete an OpenAI response by its ID.", "description": "Delete an OpenAI response by its ID.", "parameters": [ { @@ -1004,6 +1024,7 @@ "tags": [ "Prompts" ], + "summary": "Get a prompt by its identifier and optional version.", "description": "Get a prompt by its identifier and optional version.", "parameters": [ { @@ -1054,6 +1075,7 @@ "tags": [ "Prompts" ], + "summary": "Update an existing prompt (increments version).", "description": "Update an existing prompt (increments version).", "parameters": [ { @@ -1098,6 +1120,7 @@ "tags": [ "Prompts" ], + "summary": "Delete a prompt.", "description": "Delete a prompt.", "parameters": [ { @@ -1141,6 +1164,7 @@ "tags": [ "Inference" ], + "summary": "Generate embeddings for content pieces using the specified model.", "description": "Generate embeddings for content pieces using the specified model.", "parameters": [], "requestBody": { @@ -1184,6 +1208,7 @@ "tags": [ "Eval" ], + "summary": "Evaluate a list of rows on a benchmark.", "description": "Evaluate a list of rows on a benchmark.", "parameters": [ { @@ -1237,6 +1262,7 @@ "tags": [ "Agents" ], + "summary": "Retrieve an agent step by its ID.", "description": "Retrieve an agent step by its ID.", "parameters": [ { @@ -1307,6 +1333,7 @@ "tags": [ "Agents" ], + "summary": "Retrieve an agent turn by its ID.", "description": "Retrieve an agent turn by its ID.", "parameters": [ { @@ -1368,6 +1395,7 @@ "tags": [ "Benchmarks" ], + "summary": "Get a benchmark by its ID.", "description": "Get a benchmark by its ID.", "parameters": [ { @@ -1402,6 +1430,7 @@ "tags": [ "Benchmarks" ], + "summary": "Unregister a benchmark.", "description": "Unregister a benchmark.", "parameters": [ { @@ -1445,6 +1474,7 @@ "tags": [ "Inference" ], + "summary": "Describe a chat completion by its ID.", "description": "Describe a chat completion by its ID.", "parameters": [ { @@ -1488,6 +1518,7 @@ "tags": [ "Datasets" ], + "summary": "Get a dataset by its ID.", "description": "Get a dataset by its ID.", "parameters": [ { @@ -1522,6 +1553,7 @@ "tags": [ "Datasets" ], + "summary": "Unregister a dataset by its ID.", "description": "Unregister a dataset by its ID.", "parameters": [ { @@ -1565,6 +1597,7 @@ "tags": [ "Models" ], + "summary": "Get a model by its identifier.", "description": "Get a model by its identifier.", "parameters": [ { @@ -1599,6 +1632,7 @@ "tags": [ "Models" ], + "summary": "Unregister a model.", "description": "Unregister a model.", "parameters": [ { @@ -1642,6 +1676,7 @@ "tags": [ "ScoringFunctions" ], + "summary": "Get a scoring function by its ID.", "description": "Get a scoring function by its ID.", "parameters": [ { @@ -1676,6 +1711,7 @@ "tags": [ "ScoringFunctions" ], + "summary": "Unregister a scoring function.", "description": "Unregister a scoring function.", "parameters": [ { @@ -1719,6 +1755,7 @@ "tags": [ "Shields" ], + "summary": "Get a shield by its identifier.", "description": "Get a shield by its identifier.", "parameters": [ { @@ -1753,6 +1790,7 @@ "tags": [ "Shields" ], + "summary": "Unregister a shield.", "description": "Unregister a shield.", "parameters": [ { @@ -1796,6 +1834,7 @@ "tags": [ "Telemetry" ], + "summary": "Get a span by its ID.", "description": "Get a span by its ID.", "parameters": [ { @@ -1848,6 +1887,7 @@ "tags": [ "Telemetry" ], + "summary": "Get a span tree by its ID.", "description": "Get a span tree by its ID.", "parameters": [ { @@ -1901,6 +1941,7 @@ "tags": [ "ToolGroups" ], + "summary": "Get a tool by its name.", "description": "Get a tool by its name.", "parameters": [ { @@ -1944,6 +1985,7 @@ "tags": [ "ToolGroups" ], + "summary": "Get a tool group by its ID.", "description": "Get a tool group by its ID.", "parameters": [ { @@ -1978,6 +2020,7 @@ "tags": [ "ToolGroups" ], + "summary": "Unregister a tool group.", "description": "Unregister a tool group.", "parameters": [ { @@ -2021,6 +2064,7 @@ "tags": [ "Telemetry" ], + "summary": "Get a trace by its ID.", "description": "Get a trace by its ID.", "parameters": [ { @@ -2064,6 +2108,7 @@ "tags": [ "PostTraining (Coming Soon)" ], + "summary": "Get the artifacts of a training job.", "description": "Get the artifacts of a training job.", "parameters": [ { @@ -2107,6 +2152,7 @@ "tags": [ "PostTraining (Coming Soon)" ], + "summary": "Get the status of a training job.", "description": "Get the status of a training job.", "parameters": [ { @@ -2150,6 +2196,7 @@ "tags": [ "PostTraining (Coming Soon)" ], + "summary": "Get all training jobs.", "description": "Get all training jobs.", "parameters": [] } @@ -2183,6 +2230,7 @@ "tags": [ "VectorDBs" ], + "summary": "Get a vector database by its identifier.", "description": "Get a vector database by its identifier.", "parameters": [ { @@ -2217,6 +2265,7 @@ "tags": [ "VectorDBs" ], + "summary": "Unregister a vector database.", "description": "Unregister a vector database.", "parameters": [ { @@ -2260,6 +2309,7 @@ "tags": [ "Inspect" ], + "summary": "Get the current health status of the service.", "description": "Get the current health status of the service.", "parameters": [] } @@ -2286,6 +2336,7 @@ "tags": [ "ToolRuntime" ], + "summary": "Index documents so they can be used by the RAG system.", "description": "Index documents so they can be used by the RAG system.", "parameters": [], "requestBody": { @@ -2322,6 +2373,7 @@ "tags": [ "VectorIO" ], + "summary": "Insert chunks into a vector database.", "description": "Insert chunks into a vector database.", "parameters": [], "requestBody": { @@ -2365,6 +2417,7 @@ "tags": [ "Providers" ], + "summary": "Get detailed information about a specific provider.", "description": "Get detailed information about a specific provider.", "parameters": [ { @@ -2408,6 +2461,7 @@ "tags": [ "ToolRuntime" ], + "summary": "Run a tool with the given arguments.", "description": "Run a tool with the given arguments.", "parameters": [], "requestBody": { @@ -2451,6 +2505,7 @@ "tags": [ "DatasetIO" ], + "summary": "Get a paginated list of rows from a dataset.", "description": "Get a paginated list of rows from a dataset.\nUses offset-based pagination where:\n- start_index: The starting index (0-based). If None, starts from beginning.\n- limit: Number of items to return. If None or -1, returns all items.\n\nThe response includes:\n- data: List of items for the current page.\n- has_more: Whether there are more items available after this set.", "parameters": [ { @@ -2512,6 +2567,7 @@ "tags": [ "Eval" ], + "summary": "Get the status of a job.", "description": "Get the status of a job.", "parameters": [ { @@ -2555,6 +2611,7 @@ "tags": [ "Eval" ], + "summary": "Cancel a job.", "description": "Cancel a job.", "parameters": [ { @@ -2607,6 +2664,7 @@ "tags": [ "Eval" ], + "summary": "Get the result of a job.", "description": "Get the result of a job.", "parameters": [ { @@ -2659,6 +2717,7 @@ "tags": [ "Agents" ], + "summary": "List all session(s) of a given agent.", "description": "List all session(s) of a given agent.", "parameters": [ { @@ -2720,6 +2779,7 @@ "tags": [ "Benchmarks" ], + "summary": "List all benchmarks.", "description": "List all benchmarks.", "parameters": [] }, @@ -2744,6 +2804,7 @@ "tags": [ "Benchmarks" ], + "summary": "Register a benchmark.", "description": "Register a benchmark.", "parameters": [], "requestBody": { @@ -2787,6 +2848,7 @@ "tags": [ "Inference" ], + "summary": "List all chat completions.", "description": "List all chat completions.", "parameters": [ { @@ -2862,6 +2924,7 @@ "tags": [ "Inference" ], + "summary": "Generate an OpenAI-compatible chat completion for the given messages using the specified model.", "description": "Generate an OpenAI-compatible chat completion for the given messages using the specified model.", "parameters": [], "requestBody": { @@ -2905,6 +2968,7 @@ "tags": [ "Datasets" ], + "summary": "List all datasets.", "description": "List all datasets.", "parameters": [] }, @@ -2936,6 +3000,7 @@ "tags": [ "Datasets" ], + "summary": "Register a new dataset.", "description": "Register a new dataset.", "parameters": [], "requestBody": { @@ -2979,6 +3044,7 @@ "tags": [ "Models" ], + "summary": "List all models.", "description": "List all models.", "parameters": [] }, @@ -3010,6 +3076,7 @@ "tags": [ "Models" ], + "summary": "Register a model.", "description": "Register a model.", "parameters": [], "requestBody": { @@ -3053,6 +3120,7 @@ "tags": [ "Agents" ], + "summary": "List input items for a given OpenAI response.", "description": "List input items for a given OpenAI response.", "parameters": [ { @@ -3144,6 +3212,7 @@ "tags": [ "Prompts" ], + "summary": "List all versions of a specific prompt.", "description": "List all versions of a specific prompt.", "parameters": [ { @@ -3187,6 +3256,7 @@ "tags": [ "Providers" ], + "summary": "List all available providers.", "description": "List all available providers.", "parameters": [] } @@ -3220,6 +3290,7 @@ "tags": [ "Inspect" ], + "summary": "List all available API routes with their methods and implementing providers.", "description": "List all available API routes with their methods and implementing providers.", "parameters": [] } @@ -3253,6 +3324,7 @@ "tags": [ "ToolRuntime" ], + "summary": "List all tools in the runtime.", "description": "List all tools in the runtime.", "parameters": [ { @@ -3305,6 +3377,7 @@ "tags": [ "ScoringFunctions" ], + "summary": "List all scoring functions.", "description": "List all scoring functions.", "parameters": [] }, @@ -3329,6 +3402,7 @@ "tags": [ "ScoringFunctions" ], + "summary": "Register a scoring function.", "description": "Register a scoring function.", "parameters": [], "requestBody": { @@ -3372,6 +3446,7 @@ "tags": [ "Shields" ], + "summary": "List all shields.", "description": "List all shields.", "parameters": [] }, @@ -3403,6 +3478,7 @@ "tags": [ "Shields" ], + "summary": "Register a shield.", "description": "Register a shield.", "parameters": [], "requestBody": { @@ -3446,6 +3522,7 @@ "tags": [ "ToolGroups" ], + "summary": "List tool groups with optional provider.", "description": "List tool groups with optional provider.", "parameters": [] }, @@ -3470,6 +3547,7 @@ "tags": [ "ToolGroups" ], + "summary": "Register a tool group.", "description": "Register a tool group.", "parameters": [], "requestBody": { @@ -3513,6 +3591,7 @@ "tags": [ "ToolGroups" ], + "summary": "List tools with optional tool group.", "description": "List tools with optional tool group.", "parameters": [ { @@ -3556,6 +3635,7 @@ "tags": [ "VectorDBs" ], + "summary": "List all vector databases.", "description": "List all vector databases.", "parameters": [] }, @@ -3587,6 +3667,7 @@ "tags": [ "VectorDBs" ], + "summary": "Register a vector database.", "description": "Register a vector database.", "parameters": [], "requestBody": { @@ -3623,6 +3704,7 @@ "tags": [ "Telemetry" ], + "summary": "Log an event.", "description": "Log an event.", "parameters": [], "requestBody": { @@ -3666,6 +3748,7 @@ "tags": [ "VectorIO" ], + "summary": "List files in a vector store.", "description": "List files in a vector store.", "parameters": [ { @@ -3752,6 +3835,7 @@ "tags": [ "VectorIO" ], + "summary": "Attach a file to a vector store.", "description": "Attach a file to a vector store.", "parameters": [ { @@ -3805,6 +3889,7 @@ "tags": [ "Inference" ], + "summary": "Generate an OpenAI-compatible completion for the given prompt using the specified model.", "description": "Generate an OpenAI-compatible completion for the given prompt using the specified model.", "parameters": [], "requestBody": { @@ -3848,6 +3933,7 @@ "tags": [ "VectorIO" ], + "summary": "Returns a list of vector stores.", "description": "Returns a list of vector stores.", "parameters": [ { @@ -3916,6 +4002,7 @@ "tags": [ "VectorIO" ], + "summary": "Creates a vector store.", "description": "Creates a vector store.", "parameters": [], "requestBody": { @@ -3959,6 +4046,7 @@ "tags": [ "Files" ], + "summary": "Returns information about a specific file.", "description": "Returns information about a specific file.", "parameters": [ { @@ -4000,6 +4088,7 @@ "tags": [ "Files" ], + "summary": "Delete a file.", "description": "Delete a file.", "parameters": [ { @@ -4043,6 +4132,7 @@ "tags": [ "VectorIO" ], + "summary": "Retrieves a vector store.", "description": "Retrieves a vector store.", "parameters": [ { @@ -4084,6 +4174,7 @@ "tags": [ "VectorIO" ], + "summary": "Updates a vector store.", "description": "Updates a vector store.", "parameters": [ { @@ -4135,6 +4226,7 @@ "tags": [ "VectorIO" ], + "summary": "Delete a vector store.", "description": "Delete a vector store.", "parameters": [ { @@ -4178,6 +4270,7 @@ "tags": [ "VectorIO" ], + "summary": "Retrieves a vector store file.", "description": "Retrieves a vector store file.", "parameters": [ { @@ -4228,6 +4321,7 @@ "tags": [ "VectorIO" ], + "summary": "Updates a vector store file.", "description": "Updates a vector store file.", "parameters": [ { @@ -4288,6 +4382,7 @@ "tags": [ "VectorIO" ], + "summary": "Delete a vector store file.", "description": "Delete a vector store file.", "parameters": [ { @@ -4340,6 +4435,7 @@ "tags": [ "Inference" ], + "summary": "Generate OpenAI-compatible embeddings for the given input using the specified model.", "description": "Generate OpenAI-compatible embeddings for the given input using the specified model.", "parameters": [], "requestBody": { @@ -4383,6 +4479,7 @@ "tags": [ "Files" ], + "summary": "Returns a list of files that belong to the user's organization.", "description": "Returns a list of files that belong to the user's organization.", "parameters": [ { @@ -4451,6 +4548,7 @@ "tags": [ "Files" ], + "summary": "Upload a file that can be used across various endpoints.", "description": "Upload a file that can be used across various endpoints.\nThe file upload should be a multipart form request with:\n- file: The File object (not file name) to be uploaded.\n- purpose: The intended purpose of the uploaded file.\n- expires_after: Optional form values describing expiration for the file. Expected expires_after[anchor] = \"created_at\", expires_after[seconds] = {integer}. Seconds must be between 3600 and 2592000 (1 hour to 30 days).", "parameters": [], "requestBody": { @@ -4529,6 +4627,7 @@ "tags": [ "Models" ], + "summary": "List models using the OpenAI API.", "description": "List models using the OpenAI API.", "parameters": [] } @@ -4562,6 +4661,7 @@ "tags": [ "Files" ], + "summary": "Returns the contents of the specified file.", "description": "Returns the contents of the specified file.", "parameters": [ { @@ -4605,6 +4705,7 @@ "tags": [ "VectorIO" ], + "summary": "Retrieves the contents of a vector store file.", "description": "Retrieves the contents of a vector store file.", "parameters": [ { @@ -4657,6 +4758,7 @@ "tags": [ "VectorIO" ], + "summary": "Search for chunks in a vector store.", "description": "Search for chunks in a vector store.\nSearches a vector store for relevant chunks based on a query and optional file attribute filters.", "parameters": [ { @@ -4710,6 +4812,7 @@ "tags": [ "PostTraining (Coming Soon)" ], + "summary": "Run preference optimization of a model.", "description": "Run preference optimization of a model.", "parameters": [], "requestBody": { @@ -4753,6 +4856,7 @@ "tags": [ "ToolRuntime" ], + "summary": "Query the RAG system for context; typically invoked by the agent.", "description": "Query the RAG system for context; typically invoked by the agent.", "parameters": [], "requestBody": { @@ -4796,6 +4900,7 @@ "tags": [ "VectorIO" ], + "summary": "Query chunks from a vector database.", "description": "Query chunks from a vector database.", "parameters": [], "requestBody": { @@ -4839,6 +4944,7 @@ "tags": [ "Telemetry" ], + "summary": "Query metrics.", "description": "Query metrics.", "parameters": [ { @@ -4892,6 +4998,7 @@ "tags": [ "Telemetry" ], + "summary": "Query spans.", "description": "Query spans.", "parameters": [], "requestBody": { @@ -4935,6 +5042,7 @@ "tags": [ "Telemetry" ], + "summary": "Query traces.", "description": "Query traces.", "parameters": [], "requestBody": { @@ -4978,6 +5086,7 @@ "tags": [ "Inference" ], + "summary": "Rerank a list of documents based on their relevance to a query.", "description": "Rerank a list of documents based on their relevance to a query.", "parameters": [], "requestBody": { @@ -5026,6 +5135,7 @@ "tags": [ "Agents" ], + "summary": "Resume an agent turn with executed tool call responses.", "description": "Resume an agent turn with executed tool call responses.\nWhen a Turn has the status `awaiting_input` due to pending input from client side tool calls, this endpoint can be used to submit the outputs from the tool calls once they are ready.", "parameters": [ { @@ -5097,6 +5207,7 @@ "tags": [ "Eval" ], + "summary": "Run an evaluation on a benchmark.", "description": "Run an evaluation on a benchmark.", "parameters": [ { @@ -5150,6 +5261,7 @@ "tags": [ "Safety" ], + "summary": "Classifies if text and/or image inputs are potentially harmful.", "description": "Classifies if text and/or image inputs are potentially harmful.", "parameters": [], "requestBody": { @@ -5193,6 +5305,7 @@ "tags": [ "Safety" ], + "summary": "Run a shield.", "description": "Run a shield.", "parameters": [], "requestBody": { @@ -5229,6 +5342,7 @@ "tags": [ "Telemetry" ], + "summary": "Save spans to a dataset.", "description": "Save spans to a dataset.", "parameters": [], "requestBody": { @@ -5272,6 +5386,7 @@ "tags": [ "Scoring" ], + "summary": "Score a list of rows.", "description": "Score a list of rows.", "parameters": [], "requestBody": { @@ -5315,6 +5430,7 @@ "tags": [ "Scoring" ], + "summary": "Score a batch of rows.", "description": "Score a batch of rows.", "parameters": [], "requestBody": { @@ -5358,6 +5474,7 @@ "tags": [ "Prompts" ], + "summary": "Set which version of a prompt should be the default in get_prompt (latest).", "description": "Set which version of a prompt should be the default in get_prompt (latest).", "parameters": [ { @@ -5411,6 +5528,7 @@ "tags": [ "PostTraining (Coming Soon)" ], + "summary": "Run supervised fine-tuning of a model.", "description": "Run supervised fine-tuning of a model.", "parameters": [], "requestBody": { @@ -5454,6 +5572,7 @@ "tags": [ "SyntheticDataGeneration (Coming Soon)" ], + "summary": "Generate synthetic data based on input dialogs and apply filtering.", "description": "Generate synthetic data based on input dialogs and apply filtering.", "parameters": [], "requestBody": { @@ -5497,6 +5616,7 @@ "tags": [ "Inspect" ], + "summary": "Get the version of the service.", "description": "Get the version of the service.", "parameters": [] } diff --git a/docs/_static/llama-stack-spec.yaml b/docs/static/llama-stack-spec.yaml similarity index 98% rename from docs/_static/llama-stack-spec.yaml rename to docs/static/llama-stack-spec.yaml index 66216e13b..c4b82b630 100644 --- a/docs/_static/llama-stack-spec.yaml +++ b/docs/static/llama-stack-spec.yaml @@ -27,6 +27,7 @@ paths: $ref: '#/components/responses/DefaultError' tags: - DatasetIO + summary: Append rows to a dataset. description: Append rows to a dataset. parameters: - name: dataset_id @@ -64,6 +65,8 @@ paths: $ref: '#/components/responses/DefaultError' tags: - Inference + summary: >- + Generate chat completions for a batch of messages using the specified model. description: >- Generate chat completions for a batch of messages using the specified model. parameters: [] @@ -95,6 +98,8 @@ paths: $ref: '#/components/responses/DefaultError' tags: - Inference + summary: >- + Generate completions for a batch of content using the specified model. description: >- Generate completions for a batch of content using the specified model. parameters: [] @@ -121,6 +126,7 @@ paths: $ref: '#/components/responses/DefaultError' tags: - PostTraining (Coming Soon) + summary: Cancel a training job. description: Cancel a training job. parameters: [] requestBody: @@ -155,6 +161,8 @@ paths: $ref: '#/components/responses/DefaultError' tags: - BatchInference (Coming Soon) + summary: >- + Generate a chat completion for the given messages using the specified model. description: >- Generate a chat completion for the given messages using the specified model. parameters: [] @@ -190,6 +198,8 @@ paths: $ref: '#/components/responses/DefaultError' tags: - BatchInference (Coming Soon) + summary: >- + Generate a completion for the given content using the specified model. description: >- Generate a completion for the given content using the specified model. parameters: [] @@ -220,6 +230,7 @@ paths: $ref: '#/components/responses/DefaultError' tags: - Agents + summary: List all agents. description: List all agents. parameters: - name: start_index @@ -255,6 +266,8 @@ paths: $ref: '#/components/responses/DefaultError' tags: - Agents + summary: >- + Create an agent with the given configuration. description: >- Create an agent with the given configuration. parameters: [] @@ -285,6 +298,7 @@ paths: $ref: '#/components/responses/DefaultError' tags: - Agents + summary: Create a new session for an agent. description: Create a new session for an agent. parameters: - name: agent_id @@ -326,6 +340,7 @@ paths: $ref: '#/components/responses/DefaultError' tags: - Agents + summary: Create a new turn for an agent. description: Create a new turn for an agent. parameters: - name: agent_id @@ -369,6 +384,7 @@ paths: $ref: '#/components/responses/DefaultError' tags: - Agents + summary: List all OpenAI responses. description: List all OpenAI responses. parameters: - name: after @@ -419,6 +435,7 @@ paths: $ref: '#/components/responses/DefaultError' tags: - Agents + summary: Create a new OpenAI response. description: Create a new OpenAI response. parameters: [] requestBody: @@ -449,6 +466,7 @@ paths: $ref: '#/components/responses/DefaultError' tags: - Prompts + summary: List all prompts. description: List all prompts. parameters: [] post: @@ -471,6 +489,7 @@ paths: $ref: '#/components/responses/DefaultError' tags: - Prompts + summary: Create a new prompt. description: Create a new prompt. parameters: [] requestBody: @@ -500,6 +519,7 @@ paths: $ref: '#/components/responses/DefaultError' tags: - Agents + summary: Describe an agent by its ID. description: Describe an agent by its ID. parameters: - name: agent_id @@ -524,6 +544,8 @@ paths: $ref: '#/components/responses/DefaultError' tags: - Agents + summary: >- + Delete an agent by its ID and its associated sessions and turns. description: >- Delete an agent by its ID and its associated sessions and turns. parameters: @@ -554,6 +576,7 @@ paths: $ref: '#/components/responses/DefaultError' tags: - Agents + summary: Retrieve an agent session by its ID. description: Retrieve an agent session by its ID. parameters: - name: session_id @@ -594,6 +617,8 @@ paths: $ref: '#/components/responses/DefaultError' tags: - Agents + summary: >- + Delete an agent session by its ID and its associated turns. description: >- Delete an agent session by its ID and its associated turns. parameters: @@ -631,6 +656,7 @@ paths: $ref: '#/components/responses/DefaultError' tags: - Agents + summary: Retrieve an OpenAI response by its ID. description: Retrieve an OpenAI response by its ID. parameters: - name: response_id @@ -660,6 +686,7 @@ paths: $ref: '#/components/responses/DefaultError' tags: - Agents + summary: Delete an OpenAI response by its ID. description: Delete an OpenAI response by its ID. parameters: - name: response_id @@ -689,6 +716,8 @@ paths: $ref: '#/components/responses/DefaultError' tags: - Prompts + summary: >- + Get a prompt by its identifier and optional version. description: >- Get a prompt by its identifier and optional version. parameters: @@ -726,6 +755,8 @@ paths: $ref: '#/components/responses/DefaultError' tags: - Prompts + summary: >- + Update an existing prompt (increments version). description: >- Update an existing prompt (increments version). parameters: @@ -757,6 +788,7 @@ paths: $ref: '#/components/responses/DefaultError' tags: - Prompts + summary: Delete a prompt. description: Delete a prompt. parameters: - name: prompt_id @@ -789,6 +821,8 @@ paths: $ref: '#/components/responses/DefaultError' tags: - Inference + summary: >- + Generate embeddings for content pieces using the specified model. description: >- Generate embeddings for content pieces using the specified model. parameters: [] @@ -820,6 +854,7 @@ paths: $ref: '#/components/responses/DefaultError' tags: - Eval + summary: Evaluate a list of rows on a benchmark. description: Evaluate a list of rows on a benchmark. parameters: - name: benchmark_id @@ -856,6 +891,7 @@ paths: $ref: '#/components/responses/DefaultError' tags: - Agents + summary: Retrieve an agent step by its ID. description: Retrieve an agent step by its ID. parameters: - name: agent_id @@ -904,6 +940,7 @@ paths: $ref: '#/components/responses/DefaultError' tags: - Agents + summary: Retrieve an agent turn by its ID. description: Retrieve an agent turn by its ID. parameters: - name: agent_id @@ -946,6 +983,7 @@ paths: $ref: '#/components/responses/DefaultError' tags: - Benchmarks + summary: Get a benchmark by its ID. description: Get a benchmark by its ID. parameters: - name: benchmark_id @@ -970,6 +1008,7 @@ paths: $ref: '#/components/responses/DefaultError' tags: - Benchmarks + summary: Unregister a benchmark. description: Unregister a benchmark. parameters: - name: benchmark_id @@ -999,6 +1038,7 @@ paths: $ref: '#/components/responses/DefaultError' tags: - Inference + summary: Describe a chat completion by its ID. description: Describe a chat completion by its ID. parameters: - name: completion_id @@ -1028,6 +1068,7 @@ paths: $ref: '#/components/responses/DefaultError' tags: - Datasets + summary: Get a dataset by its ID. description: Get a dataset by its ID. parameters: - name: dataset_id @@ -1052,6 +1093,7 @@ paths: $ref: '#/components/responses/DefaultError' tags: - Datasets + summary: Unregister a dataset by its ID. description: Unregister a dataset by its ID. parameters: - name: dataset_id @@ -1081,6 +1123,7 @@ paths: $ref: '#/components/responses/DefaultError' tags: - Models + summary: Get a model by its identifier. description: Get a model by its identifier. parameters: - name: model_id @@ -1105,6 +1148,7 @@ paths: $ref: '#/components/responses/DefaultError' tags: - Models + summary: Unregister a model. description: Unregister a model. parameters: - name: model_id @@ -1135,6 +1179,7 @@ paths: $ref: '#/components/responses/DefaultError' tags: - ScoringFunctions + summary: Get a scoring function by its ID. description: Get a scoring function by its ID. parameters: - name: scoring_fn_id @@ -1159,6 +1204,7 @@ paths: $ref: '#/components/responses/DefaultError' tags: - ScoringFunctions + summary: Unregister a scoring function. description: Unregister a scoring function. parameters: - name: scoring_fn_id @@ -1189,6 +1235,7 @@ paths: $ref: '#/components/responses/DefaultError' tags: - Shields + summary: Get a shield by its identifier. description: Get a shield by its identifier. parameters: - name: identifier @@ -1213,6 +1260,7 @@ paths: $ref: '#/components/responses/DefaultError' tags: - Shields + summary: Unregister a shield. description: Unregister a shield. parameters: - name: identifier @@ -1243,6 +1291,7 @@ paths: $ref: '#/components/responses/DefaultError' tags: - Telemetry + summary: Get a span by its ID. description: Get a span by its ID. parameters: - name: trace_id @@ -1279,6 +1328,7 @@ paths: $ref: '#/components/responses/DefaultError' tags: - Telemetry + summary: Get a span tree by its ID. description: Get a span tree by its ID. parameters: - name: span_id @@ -1314,6 +1364,7 @@ paths: $ref: '#/components/responses/DefaultError' tags: - ToolGroups + summary: Get a tool by its name. description: Get a tool by its name. parameters: - name: tool_name @@ -1343,6 +1394,7 @@ paths: $ref: '#/components/responses/DefaultError' tags: - ToolGroups + summary: Get a tool group by its ID. description: Get a tool group by its ID. parameters: - name: toolgroup_id @@ -1367,6 +1419,7 @@ paths: $ref: '#/components/responses/DefaultError' tags: - ToolGroups + summary: Unregister a tool group. description: Unregister a tool group. parameters: - name: toolgroup_id @@ -1396,6 +1449,7 @@ paths: $ref: '#/components/responses/DefaultError' tags: - Telemetry + summary: Get a trace by its ID. description: Get a trace by its ID. parameters: - name: trace_id @@ -1425,6 +1479,7 @@ paths: $ref: '#/components/responses/DefaultError' tags: - PostTraining (Coming Soon) + summary: Get the artifacts of a training job. description: Get the artifacts of a training job. parameters: - name: job_uuid @@ -1455,6 +1510,7 @@ paths: $ref: '#/components/responses/DefaultError' tags: - PostTraining (Coming Soon) + summary: Get the status of a training job. description: Get the status of a training job. parameters: - name: job_uuid @@ -1485,6 +1541,7 @@ paths: $ref: '#/components/responses/DefaultError' tags: - PostTraining (Coming Soon) + summary: Get all training jobs. description: Get all training jobs. parameters: [] /v1/vector-dbs/{vector_db_id}: @@ -1508,6 +1565,7 @@ paths: $ref: '#/components/responses/DefaultError' tags: - VectorDBs + summary: Get a vector database by its identifier. description: Get a vector database by its identifier. parameters: - name: vector_db_id @@ -1533,6 +1591,7 @@ paths: $ref: '#/components/responses/DefaultError' tags: - VectorDBs + summary: Unregister a vector database. description: Unregister a vector database. parameters: - name: vector_db_id @@ -1564,6 +1623,8 @@ paths: $ref: '#/components/responses/DefaultError' tags: - Inspect + summary: >- + Get the current health status of the service. description: >- Get the current health status of the service. parameters: [] @@ -1584,6 +1645,8 @@ paths: $ref: '#/components/responses/DefaultError' tags: - ToolRuntime + summary: >- + Index documents so they can be used by the RAG system. description: >- Index documents so they can be used by the RAG system. parameters: [] @@ -1610,6 +1673,7 @@ paths: $ref: '#/components/responses/DefaultError' tags: - VectorIO + summary: Insert chunks into a vector database. description: Insert chunks into a vector database. parameters: [] requestBody: @@ -1640,6 +1704,8 @@ paths: $ref: '#/components/responses/DefaultError' tags: - Providers + summary: >- + Get detailed information about a specific provider. description: >- Get detailed information about a specific provider. parameters: @@ -1670,6 +1736,7 @@ paths: $ref: '#/components/responses/DefaultError' tags: - ToolRuntime + summary: Run a tool with the given arguments. description: Run a tool with the given arguments. parameters: [] requestBody: @@ -1699,6 +1766,8 @@ paths: $ref: '#/components/responses/DefaultError' tags: - DatasetIO + summary: >- + Get a paginated list of rows from a dataset. description: >- Get a paginated list of rows from a dataset. @@ -1756,6 +1825,7 @@ paths: $ref: '#/components/responses/DefaultError' tags: - Eval + summary: Get the status of a job. description: Get the status of a job. parameters: - name: benchmark_id @@ -1787,6 +1857,7 @@ paths: $ref: '#/components/responses/DefaultError' tags: - Eval + summary: Cancel a job. description: Cancel a job. parameters: - name: benchmark_id @@ -1823,6 +1894,7 @@ paths: $ref: '#/components/responses/DefaultError' tags: - Eval + summary: Get the result of a job. description: Get the result of a job. parameters: - name: benchmark_id @@ -1859,6 +1931,7 @@ paths: $ref: '#/components/responses/DefaultError' tags: - Agents + summary: List all session(s) of a given agent. description: List all session(s) of a given agent. parameters: - name: agent_id @@ -1901,6 +1974,7 @@ paths: $ref: '#/components/responses/DefaultError' tags: - Benchmarks + summary: List all benchmarks. description: List all benchmarks. parameters: [] post: @@ -1919,6 +1993,7 @@ paths: $ref: '#/components/responses/DefaultError' tags: - Benchmarks + summary: Register a benchmark. description: Register a benchmark. parameters: [] requestBody: @@ -1948,6 +2023,7 @@ paths: $ref: '#/components/responses/DefaultError' tags: - Inference + summary: List all chat completions. description: List all chat completions. parameters: - name: after @@ -2000,6 +2076,9 @@ paths: $ref: '#/components/responses/DefaultError' tags: - Inference + summary: >- + Generate an OpenAI-compatible chat completion for the given messages using + the specified model. description: >- Generate an OpenAI-compatible chat completion for the given messages using the specified model. @@ -2031,6 +2110,7 @@ paths: $ref: '#/components/responses/DefaultError' tags: - Datasets + summary: List all datasets. description: List all datasets. parameters: [] post: @@ -2053,6 +2133,7 @@ paths: $ref: '#/components/responses/DefaultError' tags: - Datasets + summary: Register a new dataset. description: Register a new dataset. parameters: [] requestBody: @@ -2082,6 +2163,7 @@ paths: $ref: '#/components/responses/DefaultError' tags: - Models + summary: List all models. description: List all models. parameters: [] post: @@ -2104,6 +2186,7 @@ paths: $ref: '#/components/responses/DefaultError' tags: - Models + summary: Register a model. description: Register a model. parameters: [] requestBody: @@ -2133,6 +2216,8 @@ paths: $ref: '#/components/responses/DefaultError' tags: - Agents + summary: >- + List input items for a given OpenAI response. description: >- List input items for a given OpenAI response. parameters: @@ -2203,6 +2288,7 @@ paths: $ref: '#/components/responses/DefaultError' tags: - Prompts + summary: List all versions of a specific prompt. description: List all versions of a specific prompt. parameters: - name: prompt_id @@ -2234,6 +2320,7 @@ paths: $ref: '#/components/responses/DefaultError' tags: - Providers + summary: List all available providers. description: List all available providers. parameters: [] /v1/inspect/routes: @@ -2258,6 +2345,8 @@ paths: $ref: '#/components/responses/DefaultError' tags: - Inspect + summary: >- + List all available API routes with their methods and implementing providers. description: >- List all available API routes with their methods and implementing providers. parameters: [] @@ -2282,6 +2371,7 @@ paths: $ref: '#/components/responses/DefaultError' tags: - ToolRuntime + summary: List all tools in the runtime. description: List all tools in the runtime. parameters: - name: tool_group_id @@ -2319,6 +2409,7 @@ paths: $ref: '#/components/responses/DefaultError' tags: - ScoringFunctions + summary: List all scoring functions. description: List all scoring functions. parameters: [] post: @@ -2337,6 +2428,7 @@ paths: $ref: '#/components/responses/DefaultError' tags: - ScoringFunctions + summary: Register a scoring function. description: Register a scoring function. parameters: [] requestBody: @@ -2366,6 +2458,7 @@ paths: $ref: '#/components/responses/DefaultError' tags: - Shields + summary: List all shields. description: List all shields. parameters: [] post: @@ -2388,6 +2481,7 @@ paths: $ref: '#/components/responses/DefaultError' tags: - Shields + summary: Register a shield. description: Register a shield. parameters: [] requestBody: @@ -2417,6 +2511,7 @@ paths: $ref: '#/components/responses/DefaultError' tags: - ToolGroups + summary: List tool groups with optional provider. description: List tool groups with optional provider. parameters: [] post: @@ -2435,6 +2530,7 @@ paths: $ref: '#/components/responses/DefaultError' tags: - ToolGroups + summary: Register a tool group. description: Register a tool group. parameters: [] requestBody: @@ -2464,6 +2560,7 @@ paths: $ref: '#/components/responses/DefaultError' tags: - ToolGroups + summary: List tools with optional tool group. description: List tools with optional tool group. parameters: - name: toolgroup_id @@ -2494,6 +2591,7 @@ paths: $ref: '#/components/responses/DefaultError' tags: - VectorDBs + summary: List all vector databases. description: List all vector databases. parameters: [] post: @@ -2516,6 +2614,7 @@ paths: $ref: '#/components/responses/DefaultError' tags: - VectorDBs + summary: Register a vector database. description: Register a vector database. parameters: [] requestBody: @@ -2541,6 +2640,7 @@ paths: $ref: '#/components/responses/DefaultError' tags: - Telemetry + summary: Log an event. description: Log an event. parameters: [] requestBody: @@ -2571,6 +2671,7 @@ paths: $ref: '#/components/responses/DefaultError' tags: - VectorIO + summary: List files in a vector store. description: List files in a vector store. parameters: - name: vector_store_id @@ -2641,6 +2742,7 @@ paths: $ref: '#/components/responses/DefaultError' tags: - VectorIO + summary: Attach a file to a vector store. description: Attach a file to a vector store. parameters: - name: vector_store_id @@ -2677,6 +2779,9 @@ paths: $ref: '#/components/responses/DefaultError' tags: - Inference + summary: >- + Generate an OpenAI-compatible completion for the given prompt using the specified + model. description: >- Generate an OpenAI-compatible completion for the given prompt using the specified model. @@ -2709,6 +2814,7 @@ paths: $ref: '#/components/responses/DefaultError' tags: - VectorIO + summary: Returns a list of vector stores. description: Returns a list of vector stores. parameters: - name: limit @@ -2764,6 +2870,7 @@ paths: $ref: '#/components/responses/DefaultError' tags: - VectorIO + summary: Creates a vector store. description: Creates a vector store. parameters: [] requestBody: @@ -2794,6 +2901,8 @@ paths: $ref: '#/components/responses/DefaultError' tags: - Files + summary: >- + Returns information about a specific file. description: >- Returns information about a specific file. parameters: @@ -2825,6 +2934,7 @@ paths: $ref: '#/components/responses/DefaultError' tags: - Files + summary: Delete a file. description: Delete a file. parameters: - name: file_id @@ -2856,6 +2966,7 @@ paths: $ref: '#/components/responses/DefaultError' tags: - VectorIO + summary: Retrieves a vector store. description: Retrieves a vector store. parameters: - name: vector_store_id @@ -2885,6 +2996,7 @@ paths: $ref: '#/components/responses/DefaultError' tags: - VectorIO + summary: Updates a vector store. description: Updates a vector store. parameters: - name: vector_store_id @@ -2920,6 +3032,7 @@ paths: $ref: '#/components/responses/DefaultError' tags: - VectorIO + summary: Delete a vector store. description: Delete a vector store. parameters: - name: vector_store_id @@ -2950,6 +3063,7 @@ paths: $ref: '#/components/responses/DefaultError' tags: - VectorIO + summary: Retrieves a vector store file. description: Retrieves a vector store file. parameters: - name: vector_store_id @@ -2986,6 +3100,7 @@ paths: $ref: '#/components/responses/DefaultError' tags: - VectorIO + summary: Updates a vector store file. description: Updates a vector store file. parameters: - name: vector_store_id @@ -3028,6 +3143,7 @@ paths: $ref: '#/components/responses/DefaultError' tags: - VectorIO + summary: Delete a vector store file. description: Delete a vector store file. parameters: - name: vector_store_id @@ -3065,6 +3181,9 @@ paths: $ref: '#/components/responses/DefaultError' tags: - Inference + summary: >- + Generate OpenAI-compatible embeddings for the given input using the specified + model. description: >- Generate OpenAI-compatible embeddings for the given input using the specified model. @@ -3097,6 +3216,8 @@ paths: $ref: '#/components/responses/DefaultError' tags: - Files + summary: >- + Returns a list of files that belong to the user's organization. description: >- Returns a list of files that belong to the user's organization. parameters: @@ -3154,6 +3275,8 @@ paths: $ref: '#/components/responses/DefaultError' tags: - Files + summary: >- + Upload a file that can be used across various endpoints. description: >- Upload a file that can be used across various endpoints. @@ -3213,6 +3336,7 @@ paths: $ref: '#/components/responses/DefaultError' tags: - Models + summary: List models using the OpenAI API. description: List models using the OpenAI API. parameters: [] /v1/openai/v1/files/{file_id}/content: @@ -3237,6 +3361,8 @@ paths: $ref: '#/components/responses/DefaultError' tags: - Files + summary: >- + Returns the contents of the specified file. description: >- Returns the contents of the specified file. parameters: @@ -3269,6 +3395,8 @@ paths: $ref: '#/components/responses/DefaultError' tags: - VectorIO + summary: >- + Retrieves the contents of a vector store file. description: >- Retrieves the contents of a vector store file. parameters: @@ -3307,6 +3435,7 @@ paths: $ref: '#/components/responses/DefaultError' tags: - VectorIO + summary: Search for chunks in a vector store. description: >- Search for chunks in a vector store. @@ -3346,6 +3475,7 @@ paths: $ref: '#/components/responses/DefaultError' tags: - PostTraining (Coming Soon) + summary: Run preference optimization of a model. description: Run preference optimization of a model. parameters: [] requestBody: @@ -3376,6 +3506,8 @@ paths: $ref: '#/components/responses/DefaultError' tags: - ToolRuntime + summary: >- + Query the RAG system for context; typically invoked by the agent. description: >- Query the RAG system for context; typically invoked by the agent. parameters: [] @@ -3406,6 +3538,7 @@ paths: $ref: '#/components/responses/DefaultError' tags: - VectorIO + summary: Query chunks from a vector database. description: Query chunks from a vector database. parameters: [] requestBody: @@ -3435,6 +3568,7 @@ paths: $ref: '#/components/responses/DefaultError' tags: - Telemetry + summary: Query metrics. description: Query metrics. parameters: - name: metric_name @@ -3470,6 +3604,7 @@ paths: $ref: '#/components/responses/DefaultError' tags: - Telemetry + summary: Query spans. description: Query spans. parameters: [] requestBody: @@ -3499,6 +3634,7 @@ paths: $ref: '#/components/responses/DefaultError' tags: - Telemetry + summary: Query traces. description: Query traces. parameters: [] requestBody: @@ -3529,6 +3665,8 @@ paths: $ref: '#/components/responses/DefaultError' tags: - Inference + summary: >- + Rerank a list of documents based on their relevance to a query. description: >- Rerank a list of documents based on their relevance to a query. parameters: [] @@ -3564,6 +3702,8 @@ paths: $ref: '#/components/responses/DefaultError' tags: - Agents + summary: >- + Resume an agent turn with executed tool call responses. description: >- Resume an agent turn with executed tool call responses. @@ -3617,6 +3757,7 @@ paths: $ref: '#/components/responses/DefaultError' tags: - Eval + summary: Run an evaluation on a benchmark. description: Run an evaluation on a benchmark. parameters: - name: benchmark_id @@ -3653,6 +3794,8 @@ paths: $ref: '#/components/responses/DefaultError' tags: - Safety + summary: >- + Classifies if text and/or image inputs are potentially harmful. description: >- Classifies if text and/or image inputs are potentially harmful. parameters: [] @@ -3683,6 +3826,7 @@ paths: $ref: '#/components/responses/DefaultError' tags: - Safety + summary: Run a shield. description: Run a shield. parameters: [] requestBody: @@ -3708,6 +3852,7 @@ paths: $ref: '#/components/responses/DefaultError' tags: - Telemetry + summary: Save spans to a dataset. description: Save spans to a dataset. parameters: [] requestBody: @@ -3738,6 +3883,7 @@ paths: $ref: '#/components/responses/DefaultError' tags: - Scoring + summary: Score a list of rows. description: Score a list of rows. parameters: [] requestBody: @@ -3767,6 +3913,7 @@ paths: $ref: '#/components/responses/DefaultError' tags: - Scoring + summary: Score a batch of rows. description: Score a batch of rows. parameters: [] requestBody: @@ -3797,6 +3944,8 @@ paths: $ref: '#/components/responses/DefaultError' tags: - Prompts + summary: >- + Set which version of a prompt should be the default in get_prompt (latest). description: >- Set which version of a prompt should be the default in get_prompt (latest). parameters: @@ -3833,6 +3982,7 @@ paths: $ref: '#/components/responses/DefaultError' tags: - PostTraining (Coming Soon) + summary: Run supervised fine-tuning of a model. description: Run supervised fine-tuning of a model. parameters: [] requestBody: @@ -3863,6 +4013,8 @@ paths: $ref: '#/components/responses/DefaultError' tags: - SyntheticDataGeneration (Coming Soon) + summary: >- + Generate synthetic data based on input dialogs and apply filtering. description: >- Generate synthetic data based on input dialogs and apply filtering. parameters: [] @@ -3894,6 +4046,7 @@ paths: $ref: '#/components/responses/DefaultError' tags: - Inspect + summary: Get the version of the service. description: Get the version of the service. parameters: [] jsonSchemaDialect: >- From 45da31801c411ba42dcfd778e1011e1aacc28f44 Mon Sep 17 00:00:00 2001 From: Alexey Rybak <50731695+reluctantfuturist@users.noreply.github.com> Date: Wed, 24 Sep 2025 13:59:31 -0700 Subject: [PATCH 137/150] fix: update API conformance test to point to new schema location (#3528) # What does this PR do? Update file paths in the conformance workflow to reflect the new location of the llama-stack-spec files from `docs/_static/` to `docs/static/`. Also update the `.gitignore` file to exclude Docusaurus-related directories (`docs/.docusaurus/` and `docs/node_modules/`). ## Test Plan - Run the workflow locally --- .github/workflows/conformance.yml | 6 +++--- .gitignore | 2 ++ 2 files changed, 5 insertions(+), 3 deletions(-) diff --git a/.github/workflows/conformance.yml b/.github/workflows/conformance.yml index c7962c93d..9383476f5 100644 --- a/.github/workflows/conformance.yml +++ b/.github/workflows/conformance.yml @@ -13,8 +13,8 @@ on: branches: [ main ] types: [opened, synchronize, reopened] paths: - - 'docs/_static/llama-stack-spec.yaml' - - 'docs/_static/llama-stack-spec.html' + - 'docs/static/llama-stack-spec.yaml' + - 'docs/static/llama-stack-spec.html' - '.github/workflows/conformance.yml' # This workflow itself concurrency: @@ -66,6 +66,6 @@ jobs: # This step will fail if incompatible changes are detected, preventing breaking changes from being merged - name: Run OpenAPI Breaking Change Diff run: | - oasdiff breaking --fail-on ERR base/docs/_static/llama-stack-spec.yaml docs/_static/llama-stack-spec.yaml --match-path '^/v1/openai/v1' \ + oasdiff breaking --fail-on ERR base/docs/static/llama-stack-spec.yaml docs/static/llama-stack-spec.yaml --match-path '^/v1/openai/v1' \ --match-path '^/v1/vector-io' \ --match-path '^/v1/vector-dbs' diff --git a/.gitignore b/.gitignore index 11cc59847..b516d4dd9 100644 --- a/.gitignore +++ b/.gitignore @@ -30,3 +30,5 @@ AGENTS.md server.log CLAUDE.md .claude/ +docs/.docusaurus/ +docs/node_modules/ From d23865757f3469da0c9a778bc51cb237880c3590 Mon Sep 17 00:00:00 2001 From: Alexey Rybak <50731695+reluctantfuturist@users.noreply.github.com> Date: Wed, 24 Sep 2025 14:01:29 -0700 Subject: [PATCH 138/150] docs: provider and distro codegen migration (#3531) # What does this PR do? - Updates provider and distro codegen to handle the new format - Migrates provider and distro files to the new format ## Test Plan - Manual testing --- .../self_hosted_distro/meta-reference-gpu.md | 125 +++++++++++ .../self_hosted_distro/nvidia.md | 171 ++++++++++++++ .../providers/agents/index.mdx} | 19 +- .../agents/inline_meta-reference.mdx} | 8 +- .../providers/batches/index.mdx} | 21 +- .../providers/batches/inline_reference.mdx} | 8 +- docs/docs/providers/datasetio/index.md | 16 ++ docs/docs/providers/datasetio/index.mdx | 16 ++ .../providers/datasetio/inline_localfs.mdx} | 8 +- .../datasetio/remote_huggingface.mdx} | 8 +- .../providers/datasetio/remote_nvidia.mdx} | 8 +- docs/docs/providers/eval/index.mdx | 18 ++ .../providers/eval/inline_meta-reference.mdx} | 8 +- .../providers/eval/remote_nvidia.mdx} | 8 +- .../external/external-providers-guide.mdx} | 2 +- .../external/external-providers-list.mdx} | 0 .../providers/external/index.mdx} | 8 +- .../providers/files/index.mdx} | 13 +- .../providers/files/inline_localfs.mdx} | 8 +- .../providers/files/remote_s3.mdx} | 8 +- .../index.md => docs/providers/index.mdx} | 31 +-- docs/docs/providers/inference/index.mdx | 48 ++++ .../inference/inline_meta-reference.mdx} | 8 +- .../inline_sentence-transformers.mdx | 17 ++ .../providers/inference/remote_anthropic.mdx} | 8 +- .../providers/inference/remote_azure.mdx} | 11 +- .../providers/inference/remote_bedrock.mdx} | 8 +- .../providers/inference/remote_cerebras.mdx} | 8 +- .../inference/remote_databricks.mdx} | 8 +- .../providers/inference/remote_fireworks.mdx} | 8 +- .../providers/inference/remote_gemini.mdx} | 8 +- .../providers/inference/remote_groq.mdx} | 8 +- .../inference/remote_hf_endpoint.mdx} | 10 +- .../inference/remote_hf_serverless.mdx} | 8 +- .../inference/remote_llama-openai-compat.mdx} | 8 +- .../providers/inference/remote_nvidia.mdx} | 8 +- .../providers/inference/remote_ollama.mdx} | 8 +- .../providers/inference/remote_openai.mdx} | 8 +- .../inference/remote_passthrough.mdx} | 8 +- .../providers/inference/remote_runpod.mdx} | 8 +- .../remote_sambanova-openai-compat.mdx} | 1 - .../providers/inference/remote_sambanova.mdx} | 8 +- .../providers/inference/remote_tgi.mdx} | 8 +- .../providers/inference/remote_together.mdx} | 8 +- .../providers/inference/remote_vertexai.mdx} | 28 ++- .../providers/inference/remote_vllm.mdx} | 8 +- .../providers/inference/remote_watsonx.mdx} | 8 +- .../openai.md => docs/providers/openai.mdx} | 4 +- docs/docs/providers/post_training/index.mdx | 17 ++ .../post_training/inline_huggingface-cpu.mdx} | 1 - .../post_training/inline_huggingface-gpu.mdx} | 15 +- .../post_training/inline_huggingface.mdx} | 1 - .../post_training/inline_torchtune-cpu.mdx} | 8 +- .../post_training/inline_torchtune-gpu.mdx} | 8 +- .../post_training/inline_torchtune.md | 0 .../post_training/remote_nvidia.mdx} | 8 +- docs/docs/providers/safety/index.mdx | 19 ++ .../providers/safety/inline_code-scanner.mdx} | 8 +- .../providers/safety/inline_llama-guard.mdx} | 8 +- .../providers/safety/inline_prompt-guard.mdx} | 8 +- .../providers/safety/remote_bedrock.mdx} | 8 +- .../providers/safety/remote_nvidia.mdx} | 8 +- .../providers/safety/remote_sambanova.mdx} | 8 +- docs/docs/providers/scoring/index.mdx | 16 ++ .../providers/scoring/inline_basic.mdx} | 8 +- .../providers/scoring/inline_braintrust.mdx} | 8 +- .../scoring/inline_llm-as-judge.mdx} | 8 +- .../providers/telemetry/index.mdx} | 11 +- .../telemetry/inline_meta-reference.mdx} | 10 +- docs/docs/providers/tool_runtime/index.mdx | 19 ++ .../tool_runtime/inline_rag-runtime.mdx} | 8 +- .../tool_runtime/remote_bing-search.mdx} | 8 +- .../tool_runtime/remote_brave-search.mdx} | 8 +- .../remote_model-context-protocol.mdx | 17 ++ .../tool_runtime/remote_tavily-search.mdx} | 8 +- .../tool_runtime/remote_wolfram-alpha.mdx} | 8 +- docs/docs/providers/vector_io/index.mdx | 25 +++ .../providers/vector_io/inline_chromadb.mdx} | 39 +++- .../providers/vector_io/inline_faiss.mdx} | 48 +++- .../vector_io/inline_meta-reference.mdx} | 13 +- .../providers/vector_io/inline_milvus.mdx} | 8 +- .../providers/vector_io/inline_qdrant.mdx} | 49 +++- .../vector_io/inline_sqlite-vec.mdx} | 204 ++++++++++++++++- .../vector_io/inline_sqlite_vec.mdx} | 13 +- .../providers/vector_io/remote_chromadb.mdx} | 39 +++- .../providers/vector_io/remote_milvus.mdx} | 212 +++++++++++++++++- .../providers/vector_io/remote_pgvector.mdx} | 109 ++++++++- .../providers/vector_io/remote_qdrant.mdx} | 8 +- .../providers/vector_io/remote_weaviate.mdx} | 37 ++- docs/source/providers/datasetio/index.md | 15 -- docs/source/providers/eval/index.md | 16 -- docs/source/providers/inference/index.md | 42 ---- .../inference/inline_sentence-transformers.md | 13 -- docs/source/providers/post_training/index.md | 16 -- docs/source/providers/safety/index.md | 18 -- docs/source/providers/scoring/index.md | 15 -- docs/source/providers/tool_runtime/index.md | 18 -- .../remote_model-context-protocol.md | 13 -- docs/source/providers/vector_io/index.md | 24 -- .../distributions/nvidia/doc_template.md | 12 +- llama_stack/providers/registry/vector_io.py | 2 +- scripts/distro_codegen.py | 2 +- scripts/provider_codegen.py | 156 ++++++++++--- 103 files changed, 1796 insertions(+), 423 deletions(-) create mode 100644 docs/docs/distributions/self_hosted_distro/meta-reference-gpu.md create mode 100644 docs/docs/distributions/self_hosted_distro/nvidia.md rename docs/{source/providers/agents/index.md => docs/providers/agents/index.mdx} (50%) rename docs/{source/providers/agents/inline_meta-reference.md => docs/providers/agents/inline_meta-reference.mdx} (80%) rename docs/{source/providers/batches/index.md => docs/providers/batches/index.mdx} (51%) rename docs/{source/providers/batches/inline_reference.md => docs/providers/batches/inline_reference.mdx} (86%) create mode 100644 docs/docs/providers/datasetio/index.md create mode 100644 docs/docs/providers/datasetio/index.mdx rename docs/{source/providers/datasetio/inline_localfs.md => docs/providers/datasetio/inline_localfs.mdx} (78%) rename docs/{source/providers/datasetio/remote_huggingface.md => docs/providers/datasetio/remote_huggingface.mdx} (77%) rename docs/{source/providers/datasetio/remote_nvidia.md => docs/providers/datasetio/remote_nvidia.mdx} (83%) create mode 100644 docs/docs/providers/eval/index.mdx rename docs/{source/providers/eval/inline_meta-reference.md => docs/providers/eval/inline_meta-reference.mdx} (76%) rename docs/{source/providers/eval/remote_nvidia.md => docs/providers/eval/remote_nvidia.mdx} (74%) rename docs/{source/providers/external/external-providers-guide.md => docs/providers/external/external-providers-guide.mdx} (99%) rename docs/{source/providers/external/external-providers-list.md => docs/providers/external/external-providers-list.mdx} (100%) rename docs/{source/providers/external/index.md => docs/providers/external/index.mdx} (68%) rename docs/{source/providers/files/index.md => docs/providers/files/index.mdx} (55%) rename docs/{source/providers/files/inline_localfs.md => docs/providers/files/inline_localfs.mdx} (82%) rename docs/{source/providers/files/remote_s3.md => docs/providers/files/remote_s3.mdx} (89%) rename docs/{source/providers/index.md => docs/providers/index.mdx} (57%) create mode 100644 docs/docs/providers/inference/index.mdx rename docs/{source/providers/inference/inline_meta-reference.md => docs/providers/inference/inline_meta-reference.mdx} (84%) create mode 100644 docs/docs/providers/inference/inline_sentence-transformers.mdx rename docs/{source/providers/inference/remote_anthropic.md => docs/providers/inference/remote_anthropic.mdx} (69%) rename docs/{source/providers/inference/remote_azure.md => docs/providers/inference/remote_azure.mdx} (78%) rename docs/{source/providers/inference/remote_bedrock.md => docs/providers/inference/remote_bedrock.mdx} (91%) rename docs/{source/providers/inference/remote_cerebras.md => docs/providers/inference/remote_cerebras.mdx} (76%) rename docs/{source/providers/inference/remote_databricks.md => docs/providers/inference/remote_databricks.mdx} (75%) rename docs/{source/providers/inference/remote_fireworks.md => docs/providers/inference/remote_fireworks.mdx} (80%) rename docs/{source/providers/inference/remote_gemini.md => docs/providers/inference/remote_gemini.mdx} (70%) rename docs/{source/providers/inference/remote_groq.md => docs/providers/inference/remote_groq.mdx} (76%) rename docs/{source/providers/inference/remote_hf_endpoint.md => docs/providers/inference/remote_hf_endpoint.mdx} (59%) rename docs/{source/providers/inference/remote_hf_serverless.md => docs/providers/inference/remote_hf_serverless.mdx} (79%) rename docs/{source/providers/inference/remote_llama-openai-compat.md => docs/providers/inference/remote_llama-openai-compat.mdx} (75%) rename docs/{source/providers/inference/remote_nvidia.md => docs/providers/inference/remote_nvidia.mdx} (85%) rename docs/{source/providers/inference/remote_ollama.md => docs/providers/inference/remote_ollama.mdx} (75%) rename docs/{source/providers/inference/remote_openai.md => docs/providers/inference/remote_openai.mdx} (77%) rename docs/{source/providers/inference/remote_passthrough.md => docs/providers/inference/remote_passthrough.mdx} (74%) rename docs/{source/providers/inference/remote_runpod.md => docs/providers/inference/remote_runpod.mdx} (75%) rename docs/{source/providers/inference/remote_sambanova-openai-compat.md => docs/providers/inference/remote_sambanova-openai-compat.mdx} (99%) rename docs/{source/providers/inference/remote_sambanova.md => docs/providers/inference/remote_sambanova.mdx} (76%) rename docs/{source/providers/inference/remote_tgi.md => docs/providers/inference/remote_tgi.mdx} (71%) rename docs/{source/providers/inference/remote_together.md => docs/providers/inference/remote_together.mdx} (80%) rename docs/{source/providers/inference/remote_vertexai.md => docs/providers/inference/remote_vertexai.mdx} (56%) rename docs/{source/providers/inference/remote_vllm.md => docs/providers/inference/remote_vllm.mdx} (86%) rename docs/{source/providers/inference/remote_watsonx.md => docs/providers/inference/remote_watsonx.mdx} (82%) rename docs/{source/providers/openai.md => docs/providers/openai.mdx} (90%) create mode 100644 docs/docs/providers/post_training/index.mdx rename docs/{source/providers/post_training/inline_huggingface-cpu.md => docs/providers/post_training/inline_huggingface-cpu.mdx} (99%) rename docs/{source/providers/post_training/inline_huggingface-gpu.md => docs/providers/post_training/inline_huggingface-gpu.mdx} (74%) rename docs/{source/providers/post_training/inline_huggingface.md => docs/providers/post_training/inline_huggingface.mdx} (99%) rename docs/{source/providers/post_training/inline_torchtune-cpu.md => docs/providers/post_training/inline_torchtune-cpu.mdx} (70%) rename docs/{source/providers/post_training/inline_torchtune-gpu.md => docs/providers/post_training/inline_torchtune-gpu.mdx} (70%) rename docs/{source => docs}/providers/post_training/inline_torchtune.md (100%) rename docs/{source/providers/post_training/remote_nvidia.md => docs/providers/post_training/remote_nvidia.mdx} (87%) create mode 100644 docs/docs/providers/safety/index.mdx rename docs/{source/providers/safety/inline_code-scanner.md => docs/providers/safety/inline_code-scanner.mdx} (50%) rename docs/{source/providers/safety/inline_llama-guard.md => docs/providers/safety/inline_llama-guard.mdx} (67%) rename docs/{source/providers/safety/inline_prompt-guard.md => docs/providers/safety/inline_prompt-guard.mdx} (68%) rename docs/{source/providers/safety/remote_bedrock.md => docs/providers/safety/remote_bedrock.mdx} (92%) rename docs/{source/providers/safety/remote_nvidia.md => docs/providers/safety/remote_nvidia.mdx} (81%) rename docs/{source/providers/safety/remote_sambanova.md => docs/providers/safety/remote_sambanova.mdx} (77%) create mode 100644 docs/docs/providers/scoring/index.mdx rename docs/{source/providers/scoring/inline_basic.md => docs/providers/scoring/inline_basic.mdx} (51%) rename docs/{source/providers/scoring/inline_braintrust.md => docs/providers/scoring/inline_braintrust.mdx} (70%) rename docs/{source/providers/scoring/inline_llm-as-judge.md => docs/providers/scoring/inline_llm-as-judge.mdx} (50%) rename docs/{source/providers/telemetry/index.md => docs/providers/telemetry/index.mdx} (58%) rename docs/{source/providers/telemetry/inline_meta-reference.md => docs/providers/telemetry/inline_meta-reference.mdx} (73%) create mode 100644 docs/docs/providers/tool_runtime/index.mdx rename docs/{source/providers/tool_runtime/inline_rag-runtime.md => docs/providers/tool_runtime/inline_rag-runtime.mdx} (50%) rename docs/{source/providers/tool_runtime/remote_bing-search.md => docs/providers/tool_runtime/remote_bing-search.mdx} (70%) rename docs/{source/providers/tool_runtime/remote_brave-search.md => docs/providers/tool_runtime/remote_brave-search.mdx} (74%) create mode 100644 docs/docs/providers/tool_runtime/remote_model-context-protocol.mdx rename docs/{source/providers/tool_runtime/remote_tavily-search.md => docs/providers/tool_runtime/remote_tavily-search.mdx} (74%) rename docs/{source/providers/tool_runtime/remote_wolfram-alpha.md => docs/providers/tool_runtime/remote_wolfram-alpha.mdx} (68%) create mode 100644 docs/docs/providers/vector_io/index.mdx rename docs/{source/providers/vector_io/inline_chromadb.md => docs/providers/vector_io/inline_chromadb.mdx} (60%) rename docs/{source/providers/vector_io/inline_faiss.md => docs/providers/vector_io/inline_faiss.mdx} (55%) rename docs/{source/providers/vector_io/inline_meta-reference.md => docs/providers/vector_io/inline_meta-reference.mdx} (80%) rename docs/{source/providers/vector_io/inline_milvus.md => docs/providers/vector_io/inline_milvus.mdx} (87%) rename docs/{source/providers/vector_io/inline_qdrant.md => docs/providers/vector_io/inline_qdrant.mdx} (56%) rename docs/{source/providers/vector_io/inline_sqlite-vec.md => docs/providers/vector_io/inline_sqlite-vec.mdx} (51%) rename docs/{source/providers/vector_io/inline_sqlite_vec.md => docs/providers/vector_io/inline_sqlite_vec.mdx} (85%) rename docs/{source/providers/vector_io/remote_chromadb.md => docs/providers/vector_io/remote_chromadb.mdx} (59%) rename docs/{source/providers/vector_io/remote_milvus.md => docs/providers/vector_io/remote_milvus.mdx} (50%) rename docs/{source/providers/vector_io/remote_pgvector.md => docs/providers/vector_io/remote_pgvector.mdx} (53%) rename docs/{source/providers/vector_io/remote_qdrant.md => docs/providers/vector_io/remote_qdrant.mdx} (88%) rename docs/{source/providers/vector_io/remote_weaviate.md => docs/providers/vector_io/remote_weaviate.mdx} (63%) delete mode 100644 docs/source/providers/datasetio/index.md delete mode 100644 docs/source/providers/eval/index.md delete mode 100644 docs/source/providers/inference/index.md delete mode 100644 docs/source/providers/inference/inline_sentence-transformers.md delete mode 100644 docs/source/providers/post_training/index.md delete mode 100644 docs/source/providers/safety/index.md delete mode 100644 docs/source/providers/scoring/index.md delete mode 100644 docs/source/providers/tool_runtime/index.md delete mode 100644 docs/source/providers/tool_runtime/remote_model-context-protocol.md delete mode 100644 docs/source/providers/vector_io/index.md diff --git a/docs/docs/distributions/self_hosted_distro/meta-reference-gpu.md b/docs/docs/distributions/self_hosted_distro/meta-reference-gpu.md new file mode 100644 index 000000000..84b85b91c --- /dev/null +++ b/docs/docs/distributions/self_hosted_distro/meta-reference-gpu.md @@ -0,0 +1,125 @@ +--- +orphan: true +--- + +# Meta Reference GPU Distribution + +```{toctree} +:maxdepth: 2 +:hidden: + +self +``` + +The `llamastack/distribution-meta-reference-gpu` distribution consists of the following provider configurations: + +| API | Provider(s) | +|-----|-------------| +| agents | `inline::meta-reference` | +| datasetio | `remote::huggingface`, `inline::localfs` | +| eval | `inline::meta-reference` | +| inference | `inline::meta-reference` | +| safety | `inline::llama-guard` | +| scoring | `inline::basic`, `inline::llm-as-judge`, `inline::braintrust` | +| telemetry | `inline::meta-reference` | +| tool_runtime | `remote::brave-search`, `remote::tavily-search`, `inline::rag-runtime`, `remote::model-context-protocol` | +| vector_io | `inline::faiss`, `remote::chromadb`, `remote::pgvector` | + + +Note that you need access to nvidia GPUs to run this distribution. This distribution is not compatible with CPU-only machines or machines with AMD GPUs. + +### Environment Variables + +The following environment variables can be configured: + +- `LLAMA_STACK_PORT`: Port for the Llama Stack distribution server (default: `8321`) +- `INFERENCE_MODEL`: Inference model loaded into the Meta Reference server (default: `meta-llama/Llama-3.2-3B-Instruct`) +- `INFERENCE_CHECKPOINT_DIR`: Directory containing the Meta Reference model checkpoint (default: `null`) +- `SAFETY_MODEL`: Name of the safety (Llama-Guard) model to use (default: `meta-llama/Llama-Guard-3-1B`) +- `SAFETY_CHECKPOINT_DIR`: Directory containing the Llama-Guard model checkpoint (default: `null`) + + +## Prerequisite: Downloading Models + +Please use `llama model list --downloaded` to check that you have llama model checkpoints downloaded in `~/.llama` before proceeding. See [installation guide](../../references/llama_cli_reference/download_models.md) here to download the models. Run `llama model list` to see the available models to download, and `llama model download` to download the checkpoints. + +``` +$ llama model list --downloaded +┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━┳━━━━━━━━━━━━━━━━━━━━━┓ +┃ Model ┃ Size ┃ Modified Time ┃ +┡━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━╇━━━━━━━━━━━━━━━━━━━━━┩ +│ Llama3.2-1B-Instruct:int4-qlora-eo8 │ 1.53 GB │ 2025-02-26 11:22:28 │ +├─────────────────────────────────────────┼──────────┼─────────────────────┤ +│ Llama3.2-1B │ 2.31 GB │ 2025-02-18 21:48:52 │ +├─────────────────────────────────────────┼──────────┼─────────────────────┤ +│ Prompt-Guard-86M │ 0.02 GB │ 2025-02-26 11:29:28 │ +├─────────────────────────────────────────┼──────────┼─────────────────────┤ +│ Llama3.2-3B-Instruct:int4-spinquant-eo8 │ 3.69 GB │ 2025-02-26 11:37:41 │ +├─────────────────────────────────────────┼──────────┼─────────────────────┤ +│ Llama3.2-3B │ 5.99 GB │ 2025-02-18 21:51:26 │ +├─────────────────────────────────────────┼──────────┼─────────────────────┤ +│ Llama3.1-8B │ 14.97 GB │ 2025-02-16 10:36:37 │ +├─────────────────────────────────────────┼──────────┼─────────────────────┤ +│ Llama3.2-1B-Instruct:int4-spinquant-eo8 │ 1.51 GB │ 2025-02-26 11:35:02 │ +├─────────────────────────────────────────┼──────────┼─────────────────────┤ +│ Llama-Guard-3-1B │ 2.80 GB │ 2025-02-26 11:20:46 │ +├─────────────────────────────────────────┼──────────┼─────────────────────┤ +│ Llama-Guard-3-1B:int4 │ 0.43 GB │ 2025-02-26 11:33:33 │ +└─────────────────────────────────────────┴──────────┴─────────────────────┘ +``` + +## Running the Distribution + +You can do this via venv or Docker which has a pre-built image. + +### Via Docker + +This method allows you to get started quickly without having to build the distribution code. + +```bash +LLAMA_STACK_PORT=8321 +docker run \ + -it \ + --pull always \ + --gpu all \ + -p $LLAMA_STACK_PORT:$LLAMA_STACK_PORT \ + -v ~/.llama:/root/.llama \ + llamastack/distribution-meta-reference-gpu \ + --port $LLAMA_STACK_PORT \ + --env INFERENCE_MODEL=meta-llama/Llama-3.2-3B-Instruct +``` + +If you are using Llama Stack Safety / Shield APIs, use: + +```bash +docker run \ + -it \ + --pull always \ + --gpu all \ + -p $LLAMA_STACK_PORT:$LLAMA_STACK_PORT \ + -v ~/.llama:/root/.llama \ + llamastack/distribution-meta-reference-gpu \ + --port $LLAMA_STACK_PORT \ + --env INFERENCE_MODEL=meta-llama/Llama-3.2-3B-Instruct \ + --env SAFETY_MODEL=meta-llama/Llama-Guard-3-1B +``` + +### Via venv + +Make sure you have done `uv pip install llama-stack` and have the Llama Stack CLI available. + +```bash +llama stack build --distro meta-reference-gpu --image-type venv +llama stack run distributions/meta-reference-gpu/run.yaml \ + --port 8321 \ + --env INFERENCE_MODEL=meta-llama/Llama-3.2-3B-Instruct +``` + +If you are using Llama Stack Safety / Shield APIs, use: + +```bash +llama stack run distributions/meta-reference-gpu/run-with-safety.yaml \ + --port 8321 \ + --env INFERENCE_MODEL=meta-llama/Llama-3.2-3B-Instruct \ + --env SAFETY_MODEL=meta-llama/Llama-Guard-3-1B +``` diff --git a/docs/docs/distributions/self_hosted_distro/nvidia.md b/docs/docs/distributions/self_hosted_distro/nvidia.md new file mode 100644 index 000000000..fba411640 --- /dev/null +++ b/docs/docs/distributions/self_hosted_distro/nvidia.md @@ -0,0 +1,171 @@ +--- +orphan: true +--- + +# NVIDIA Distribution + +The `llamastack/distribution-nvidia` distribution consists of the following provider configurations. + +| API | Provider(s) | +|-----|-------------| +| agents | `inline::meta-reference` | +| datasetio | `inline::localfs`, `remote::nvidia` | +| eval | `remote::nvidia` | +| files | `inline::localfs` | +| inference | `remote::nvidia` | +| post_training | `remote::nvidia` | +| safety | `remote::nvidia` | +| scoring | `inline::basic` | +| telemetry | `inline::meta-reference` | +| tool_runtime | `inline::rag-runtime` | +| vector_io | `inline::faiss` | + + +### Environment Variables + +The following environment variables can be configured: + +- `NVIDIA_API_KEY`: NVIDIA API Key (default: ``) +- `NVIDIA_APPEND_API_VERSION`: Whether to append the API version to the base_url (default: `True`) +- `NVIDIA_DATASET_NAMESPACE`: NVIDIA Dataset Namespace (default: `default`) +- `NVIDIA_PROJECT_ID`: NVIDIA Project ID (default: `test-project`) +- `NVIDIA_CUSTOMIZER_URL`: NVIDIA Customizer URL (default: `https://customizer.api.nvidia.com`) +- `NVIDIA_OUTPUT_MODEL_DIR`: NVIDIA Output Model Directory (default: `test-example-model@v1`) +- `GUARDRAILS_SERVICE_URL`: URL for the NeMo Guardrails Service (default: `http://0.0.0.0:7331`) +- `NVIDIA_GUARDRAILS_CONFIG_ID`: NVIDIA Guardrail Configuration ID (default: `self-check`) +- `NVIDIA_EVALUATOR_URL`: URL for the NeMo Evaluator Service (default: `http://0.0.0.0:7331`) +- `INFERENCE_MODEL`: Inference model (default: `Llama3.1-8B-Instruct`) +- `SAFETY_MODEL`: Name of the model to use for safety (default: `meta/llama-3.1-8b-instruct`) + +### Models + +The following models are available by default: + +- `meta/llama3-8b-instruct ` +- `meta/llama3-70b-instruct ` +- `meta/llama-3.1-8b-instruct ` +- `meta/llama-3.1-70b-instruct ` +- `meta/llama-3.1-405b-instruct ` +- `meta/llama-3.2-1b-instruct ` +- `meta/llama-3.2-3b-instruct ` +- `meta/llama-3.2-11b-vision-instruct ` +- `meta/llama-3.2-90b-vision-instruct ` +- `meta/llama-3.3-70b-instruct ` +- `nvidia/vila ` +- `nvidia/llama-3.2-nv-embedqa-1b-v2 ` +- `nvidia/nv-embedqa-e5-v5 ` +- `nvidia/nv-embedqa-mistral-7b-v2 ` +- `snowflake/arctic-embed-l ` + + +## Prerequisites +### NVIDIA API Keys + +Make sure you have access to a NVIDIA API Key. You can get one by visiting [https://build.nvidia.com/](https://build.nvidia.com/). Use this key for the `NVIDIA_API_KEY` environment variable. + +### Deploy NeMo Microservices Platform +The NVIDIA NeMo microservices platform supports end-to-end microservice deployment of a complete AI flywheel on your Kubernetes cluster through the NeMo Microservices Helm Chart. Please reference the [NVIDIA NeMo Microservices documentation](https://docs.nvidia.com/nemo/microservices/latest/about/index.html) for platform prerequisites and instructions to install and deploy the platform. + +## Supported Services +Each Llama Stack API corresponds to a specific NeMo microservice. The core microservices (Customizer, Evaluator, Guardrails) are exposed by the same endpoint. The platform components (Data Store) are each exposed by separate endpoints. + +### Inference: NVIDIA NIM +NVIDIA NIM is used for running inference with registered models. There are two ways to access NVIDIA NIMs: + 1. Hosted (default): Preview APIs hosted at https://integrate.api.nvidia.com (Requires an API key) + 2. Self-hosted: NVIDIA NIMs that run on your own infrastructure. + +The deployed platform includes the NIM Proxy microservice, which is the service that provides to access your NIMs (for example, to run inference on a model). Set the `NVIDIA_BASE_URL` environment variable to use your NVIDIA NIM Proxy deployment. + +### Datasetio API: NeMo Data Store +The NeMo Data Store microservice serves as the default file storage solution for the NeMo microservices platform. It exposts APIs compatible with the Hugging Face Hub client (`HfApi`), so you can use the client to interact with Data Store. The `NVIDIA_DATASETS_URL` environment variable should point to your NeMo Data Store endpoint. + +See the [NVIDIA Datasetio docs](https://github.com/meta-llama/llama-stack/blob/main/llama_stack/providers/remote/datasetio/nvidia/README.md) for supported features and example usage. + +### Eval API: NeMo Evaluator +The NeMo Evaluator microservice supports evaluation of LLMs. Launching an Evaluation job with NeMo Evaluator requires an Evaluation Config (an object that contains metadata needed by the job). A Llama Stack Benchmark maps to an Evaluation Config, so registering a Benchmark creates an Evaluation Config in NeMo Evaluator. The `NVIDIA_EVALUATOR_URL` environment variable should point to your NeMo Microservices endpoint. + +See the [NVIDIA Eval docs](https://github.com/meta-llama/llama-stack/blob/main/llama_stack/providers/remote/eval/nvidia/README.md) for supported features and example usage. + +### Post-Training API: NeMo Customizer +The NeMo Customizer microservice supports fine-tuning models. You can reference [this list of supported models](https://github.com/meta-llama/llama-stack/blob/main/llama_stack/providers/remote/post_training/nvidia/models.py) that can be fine-tuned using Llama Stack. The `NVIDIA_CUSTOMIZER_URL` environment variable should point to your NeMo Microservices endpoint. + +See the [NVIDIA Post-Training docs](https://github.com/meta-llama/llama-stack/blob/main/llama_stack/providers/remote/post_training/nvidia/README.md) for supported features and example usage. + +### Safety API: NeMo Guardrails +The NeMo Guardrails microservice sits between your application and the LLM, and adds checks and content moderation to a model. The `GUARDRAILS_SERVICE_URL` environment variable should point to your NeMo Microservices endpoint. + +See the [NVIDIA Safety docs](https://github.com/meta-llama/llama-stack/blob/main/llama_stack/providers/remote/safety/nvidia/README.md) for supported features and example usage. + +## Deploying models +In order to use a registered model with the Llama Stack APIs, ensure the corresponding NIM is deployed to your environment. For example, you can use the NIM Proxy microservice to deploy `meta/llama-3.2-1b-instruct`. + +Note: For improved inference speeds, we need to use NIM with `fast_outlines` guided decoding system (specified in the request body). This is the default if you deployed the platform with the NeMo Microservices Helm Chart. +```sh +# URL to NeMo NIM Proxy service +export NEMO_URL="http://nemo.test" + +curl --location "$NEMO_URL/v1/deployment/model-deployments" \ + -H 'accept: application/json' \ + -H 'Content-Type: application/json' \ + -d '{ + "name": "llama-3.2-1b-instruct", + "namespace": "meta", + "config": { + "model": "meta/llama-3.2-1b-instruct", + "nim_deployment": { + "image_name": "nvcr.io/nim/meta/llama-3.2-1b-instruct", + "image_tag": "1.8.3", + "pvc_size": "25Gi", + "gpu": 1, + "additional_envs": { + "NIM_GUIDED_DECODING_BACKEND": "fast_outlines" + } + } + } + }' +``` +This NIM deployment should take approximately 10 minutes to go live. [See the docs](https://docs.nvidia.com/nemo/microservices/latest/get-started/tutorials/deploy-nims.html) for more information on how to deploy a NIM and verify it's available for inference. + +You can also remove a deployed NIM to free up GPU resources, if needed. +```sh +export NEMO_URL="http://nemo.test" + +curl -X DELETE "$NEMO_URL/v1/deployment/model-deployments/meta/llama-3.1-8b-instruct" +``` + +## Running Llama Stack with NVIDIA + +You can do this via venv (build code), or Docker which has a pre-built image. + +### Via Docker + +This method allows you to get started quickly without having to build the distribution code. + +```bash +LLAMA_STACK_PORT=8321 +docker run \ + -it \ + --pull always \ + -p $LLAMA_STACK_PORT:$LLAMA_STACK_PORT \ + -v ./run.yaml:/root/my-run.yaml \ + llamastack/distribution-nvidia \ + --config /root/my-run.yaml \ + --port $LLAMA_STACK_PORT \ + --env NVIDIA_API_KEY=$NVIDIA_API_KEY +``` + +### Via venv + +If you've set up your local development environment, you can also build the image using your local virtual environment. + +```bash +INFERENCE_MODEL=meta-llama/Llama-3.1-8B-Instruct +llama stack build --distro nvidia --image-type venv +llama stack run ./run.yaml \ + --port 8321 \ + --env NVIDIA_API_KEY=$NVIDIA_API_KEY \ + --env INFERENCE_MODEL=$INFERENCE_MODEL +``` + +## Example Notebooks +For examples of how to use the NVIDIA Distribution to run inference, fine-tune, evaluate, and run safety checks on your LLMs, you can reference the example notebooks in [docs/notebooks/nvidia](https://github.com/meta-llama/llama-stack/tree/main/docs/notebooks/nvidia). diff --git a/docs/source/providers/agents/index.md b/docs/docs/providers/agents/index.mdx similarity index 50% rename from docs/source/providers/agents/index.md rename to docs/docs/providers/agents/index.mdx index a2c48d4b9..df020f284 100644 --- a/docs/source/providers/agents/index.md +++ b/docs/docs/providers/agents/index.mdx @@ -1,3 +1,16 @@ +--- +description: "Agents API for creating and interacting with agentic systems. + + Main functionalities provided by this API: + - Create agents with specific instructions and ability to use tools. + - Interactions with agents are grouped into sessions (\"threads\"), and each interaction is called a \"turn\". + - Agents can be provided with various tools (see the ToolGroups and ToolRuntime APIs for more details). + - Agents can be provided with various shields (see the Safety API for more details). + - Agents can also use Memory to retrieve information from knowledge bases. See the RAG Tool and Vector IO APIs for more details." +sidebar_label: Agents +title: Agents +--- + # Agents ## Overview @@ -15,8 +28,4 @@ This section contains documentation for all available providers for the **agents ## Providers -```{toctree} -:maxdepth: 1 - -inline_meta-reference -``` +- [Meta-Reference](./inline_meta-reference) diff --git a/docs/source/providers/agents/inline_meta-reference.md b/docs/docs/providers/agents/inline_meta-reference.mdx similarity index 80% rename from docs/source/providers/agents/inline_meta-reference.md rename to docs/docs/providers/agents/inline_meta-reference.mdx index 5f64f79e1..fd961745f 100644 --- a/docs/source/providers/agents/inline_meta-reference.md +++ b/docs/docs/providers/agents/inline_meta-reference.mdx @@ -1,3 +1,9 @@ +--- +description: "Meta's reference implementation of an agent system that can use tools, access vector databases, and perform complex reasoning tasks." +sidebar_label: Meta-Reference +title: inline::meta-reference +--- + # inline::meta-reference ## Description @@ -20,6 +26,4 @@ persistence_store: responses_store: type: sqlite db_path: ${env.SQLITE_STORE_DIR:=~/.llama/dummy}/responses_store.db - ``` - diff --git a/docs/source/providers/batches/index.md b/docs/docs/providers/batches/index.mdx similarity index 51% rename from docs/source/providers/batches/index.md rename to docs/docs/providers/batches/index.mdx index d6d2fa9a3..a966cc153 100644 --- a/docs/source/providers/batches/index.md +++ b/docs/docs/providers/batches/index.mdx @@ -1,3 +1,18 @@ +--- +description: "The Batches API enables efficient processing of multiple requests in a single operation, + particularly useful for processing large datasets, batch evaluation workflows, and + cost-effective inference at scale. + + The API is designed to allow use of openai client libraries for seamless integration. + + This API provides the following extensions: + - idempotent batch creation + + Note: This API is currently under active development and may undergo changes." +sidebar_label: Batches +title: Batches +--- + # Batches ## Overview @@ -17,8 +32,4 @@ This section contains documentation for all available providers for the **batche ## Providers -```{toctree} -:maxdepth: 1 - -inline_reference -``` +- [Reference](./inline_reference) diff --git a/docs/source/providers/batches/inline_reference.md b/docs/docs/providers/batches/inline_reference.mdx similarity index 86% rename from docs/source/providers/batches/inline_reference.md rename to docs/docs/providers/batches/inline_reference.mdx index a58e5124d..f43800555 100644 --- a/docs/source/providers/batches/inline_reference.md +++ b/docs/docs/providers/batches/inline_reference.mdx @@ -1,3 +1,9 @@ +--- +description: "Reference implementation of batches API with KVStore persistence." +sidebar_label: Reference +title: inline::reference +--- + # inline::reference ## Description @@ -18,6 +24,4 @@ Reference implementation of batches API with KVStore persistence. kvstore: type: sqlite db_path: ${env.SQLITE_STORE_DIR:=~/.llama/dummy}/batches.db - ``` - diff --git a/docs/docs/providers/datasetio/index.md b/docs/docs/providers/datasetio/index.md new file mode 100644 index 000000000..6c02acf6c --- /dev/null +++ b/docs/docs/providers/datasetio/index.md @@ -0,0 +1,16 @@ +--- +sidebar_label: Datasetio +title: Datasetio +--- + +# Datasetio + +## Overview + +This section contains documentation for all available providers for the **datasetio** API. + +## Providers + +- [Localfs](./inline_localfs) +- [Remote - Huggingface](./remote_huggingface) +- [Remote - Nvidia](./remote_nvidia) diff --git a/docs/docs/providers/datasetio/index.mdx b/docs/docs/providers/datasetio/index.mdx new file mode 100644 index 000000000..6c02acf6c --- /dev/null +++ b/docs/docs/providers/datasetio/index.mdx @@ -0,0 +1,16 @@ +--- +sidebar_label: Datasetio +title: Datasetio +--- + +# Datasetio + +## Overview + +This section contains documentation for all available providers for the **datasetio** API. + +## Providers + +- [Localfs](./inline_localfs) +- [Remote - Huggingface](./remote_huggingface) +- [Remote - Nvidia](./remote_nvidia) diff --git a/docs/source/providers/datasetio/inline_localfs.md b/docs/docs/providers/datasetio/inline_localfs.mdx similarity index 78% rename from docs/source/providers/datasetio/inline_localfs.md rename to docs/docs/providers/datasetio/inline_localfs.mdx index 87a0c795c..b02a3a3bd 100644 --- a/docs/source/providers/datasetio/inline_localfs.md +++ b/docs/docs/providers/datasetio/inline_localfs.mdx @@ -1,3 +1,9 @@ +--- +description: "Local filesystem-based dataset I/O provider for reading and writing datasets to local storage." +sidebar_label: Localfs +title: inline::localfs +--- + # inline::localfs ## Description @@ -16,6 +22,4 @@ Local filesystem-based dataset I/O provider for reading and writing datasets to kvstore: type: sqlite db_path: ${env.SQLITE_STORE_DIR:=~/.llama/dummy}/localfs_datasetio.db - ``` - diff --git a/docs/source/providers/datasetio/remote_huggingface.md b/docs/docs/providers/datasetio/remote_huggingface.mdx similarity index 77% rename from docs/source/providers/datasetio/remote_huggingface.md rename to docs/docs/providers/datasetio/remote_huggingface.mdx index 3711f7396..82597d999 100644 --- a/docs/source/providers/datasetio/remote_huggingface.md +++ b/docs/docs/providers/datasetio/remote_huggingface.mdx @@ -1,3 +1,9 @@ +--- +description: "HuggingFace datasets provider for accessing and managing datasets from the HuggingFace Hub." +sidebar_label: Remote - Huggingface +title: remote::huggingface +--- + # remote::huggingface ## Description @@ -16,6 +22,4 @@ HuggingFace datasets provider for accessing and managing datasets from the Huggi kvstore: type: sqlite db_path: ${env.SQLITE_STORE_DIR:=~/.llama/dummy}/huggingface_datasetio.db - ``` - diff --git a/docs/source/providers/datasetio/remote_nvidia.md b/docs/docs/providers/datasetio/remote_nvidia.mdx similarity index 83% rename from docs/source/providers/datasetio/remote_nvidia.md rename to docs/docs/providers/datasetio/remote_nvidia.mdx index 1ad1cdb32..35a7dacee 100644 --- a/docs/source/providers/datasetio/remote_nvidia.md +++ b/docs/docs/providers/datasetio/remote_nvidia.mdx @@ -1,3 +1,9 @@ +--- +description: "NVIDIA's dataset I/O provider for accessing datasets from NVIDIA's data platform." +sidebar_label: Remote - Nvidia +title: remote::nvidia +--- + # remote::nvidia ## Description @@ -20,6 +26,4 @@ api_key: ${env.NVIDIA_API_KEY:=} dataset_namespace: ${env.NVIDIA_DATASET_NAMESPACE:=default} project_id: ${env.NVIDIA_PROJECT_ID:=test-project} datasets_url: ${env.NVIDIA_DATASETS_URL:=http://nemo.test} - ``` - diff --git a/docs/docs/providers/eval/index.mdx b/docs/docs/providers/eval/index.mdx new file mode 100644 index 000000000..e486814de --- /dev/null +++ b/docs/docs/providers/eval/index.mdx @@ -0,0 +1,18 @@ +--- +description: "Llama Stack Evaluation API for running evaluations on model and agent candidates." +sidebar_label: Eval +title: Eval +--- + +# Eval + +## Overview + +Llama Stack Evaluation API for running evaluations on model and agent candidates. + +This section contains documentation for all available providers for the **eval** API. + +## Providers + +- [Meta-Reference](./inline_meta-reference) +- [Remote - Nvidia](./remote_nvidia) diff --git a/docs/source/providers/eval/inline_meta-reference.md b/docs/docs/providers/eval/inline_meta-reference.mdx similarity index 76% rename from docs/source/providers/eval/inline_meta-reference.md rename to docs/docs/providers/eval/inline_meta-reference.mdx index 606883c72..b0eb589e0 100644 --- a/docs/source/providers/eval/inline_meta-reference.md +++ b/docs/docs/providers/eval/inline_meta-reference.mdx @@ -1,3 +1,9 @@ +--- +description: "Meta's reference implementation of evaluation tasks with support for multiple languages and evaluation metrics." +sidebar_label: Meta-Reference +title: inline::meta-reference +--- + # inline::meta-reference ## Description @@ -16,6 +22,4 @@ Meta's reference implementation of evaluation tasks with support for multiple la kvstore: type: sqlite db_path: ${env.SQLITE_STORE_DIR:=~/.llama/dummy}/meta_reference_eval.db - ``` - diff --git a/docs/source/providers/eval/remote_nvidia.md b/docs/docs/providers/eval/remote_nvidia.mdx similarity index 74% rename from docs/source/providers/eval/remote_nvidia.md rename to docs/docs/providers/eval/remote_nvidia.mdx index cb764b511..36bb4726b 100644 --- a/docs/source/providers/eval/remote_nvidia.md +++ b/docs/docs/providers/eval/remote_nvidia.mdx @@ -1,3 +1,9 @@ +--- +description: "NVIDIA's evaluation provider for running evaluation tasks on NVIDIA's platform." +sidebar_label: Remote - Nvidia +title: remote::nvidia +--- + # remote::nvidia ## Description @@ -14,6 +20,4 @@ NVIDIA's evaluation provider for running evaluation tasks on NVIDIA's platform. ```yaml evaluator_url: ${env.NVIDIA_EVALUATOR_URL:=http://localhost:7331} - ``` - diff --git a/docs/source/providers/external/external-providers-guide.md b/docs/docs/providers/external/external-providers-guide.mdx similarity index 99% rename from docs/source/providers/external/external-providers-guide.md rename to docs/docs/providers/external/external-providers-guide.mdx index e2d4ebea9..eb30afd93 100644 --- a/docs/source/providers/external/external-providers-guide.md +++ b/docs/docs/providers/external/external-providers-guide.mdx @@ -283,4 +283,4 @@ additional_pip_packages: No other steps are required other than `llama stack build` and `llama stack run`. The build process will use `module` to install all of the provider dependencies, retrieve the spec, etc. -The provider will now be available in Llama Stack with the type `remote::ramalama`. \ No newline at end of file +The provider will now be available in Llama Stack with the type `remote::ramalama`. diff --git a/docs/source/providers/external/external-providers-list.md b/docs/docs/providers/external/external-providers-list.mdx similarity index 100% rename from docs/source/providers/external/external-providers-list.md rename to docs/docs/providers/external/external-providers-list.mdx diff --git a/docs/source/providers/external/index.md b/docs/docs/providers/external/index.mdx similarity index 68% rename from docs/source/providers/external/index.md rename to docs/docs/providers/external/index.mdx index 989a7f5b8..375a97c82 100644 --- a/docs/source/providers/external/index.md +++ b/docs/docs/providers/external/index.mdx @@ -5,9 +5,7 @@ Llama Stack supports external providers that live outside of the main codebase. - Share providers with others without contributing to the main codebase - Keep provider-specific code separate from the core Llama Stack code -```{toctree} -:maxdepth: 1 +## External Provider Documentation -external-providers-list -external-providers-guide -``` \ No newline at end of file +- [Known External Providers](external-providers-list) +- [Creating External Providers](external-providers-guide) diff --git a/docs/source/providers/files/index.md b/docs/docs/providers/files/index.mdx similarity index 55% rename from docs/source/providers/files/index.md rename to docs/docs/providers/files/index.mdx index 128953223..98bd89633 100644 --- a/docs/source/providers/files/index.md +++ b/docs/docs/providers/files/index.mdx @@ -1,3 +1,8 @@ +--- +sidebar_label: Files +title: Files +--- + # Files ## Overview @@ -6,9 +11,5 @@ This section contains documentation for all available providers for the **files* ## Providers -```{toctree} -:maxdepth: 1 - -inline_localfs -remote_s3 -``` +- [Localfs](./inline_localfs) +- [Remote - S3](./remote_s3) diff --git a/docs/source/providers/files/inline_localfs.md b/docs/docs/providers/files/inline_localfs.mdx similarity index 82% rename from docs/source/providers/files/inline_localfs.md rename to docs/docs/providers/files/inline_localfs.mdx index 09267b7d8..86d141f93 100644 --- a/docs/source/providers/files/inline_localfs.md +++ b/docs/docs/providers/files/inline_localfs.mdx @@ -1,3 +1,9 @@ +--- +description: "Local filesystem-based file storage provider for managing files and documents locally." +sidebar_label: Localfs +title: inline::localfs +--- + # inline::localfs ## Description @@ -19,6 +25,4 @@ storage_dir: ${env.FILES_STORAGE_DIR:=~/.llama/dummy/files} metadata_store: type: sqlite db_path: ${env.SQLITE_STORE_DIR:=~/.llama/dummy}/files_metadata.db - ``` - diff --git a/docs/source/providers/files/remote_s3.md b/docs/docs/providers/files/remote_s3.mdx similarity index 89% rename from docs/source/providers/files/remote_s3.md rename to docs/docs/providers/files/remote_s3.mdx index 2e3cebabd..353cedbfb 100644 --- a/docs/source/providers/files/remote_s3.md +++ b/docs/docs/providers/files/remote_s3.mdx @@ -1,3 +1,9 @@ +--- +description: "AWS S3-based file storage provider for scalable cloud file management with metadata persistence." +sidebar_label: Remote - S3 +title: remote::s3 +--- + # remote::s3 ## Description @@ -28,6 +34,4 @@ auto_create_bucket: ${env.S3_AUTO_CREATE_BUCKET:=false} metadata_store: type: sqlite db_path: ${env.SQLITE_STORE_DIR:=~/.llama/dummy}/s3_files_metadata.db - ``` - diff --git a/docs/source/providers/index.md b/docs/docs/providers/index.mdx similarity index 57% rename from docs/source/providers/index.md rename to docs/docs/providers/index.mdx index 3f66ecd0c..d275ac1a3 100644 --- a/docs/source/providers/index.md +++ b/docs/docs/providers/index.mdx @@ -1,3 +1,10 @@ +--- +title: API Providers +description: Ecosystem of providers for swapping implementations across the same API +sidebar_label: Overview +sidebar_position: 1 +--- + # API Providers The goal of Llama Stack is to build an ecosystem where users can easily swap out different implementations for the same API. Examples for these include: @@ -12,17 +19,15 @@ Providers come in two flavors: Importantly, Llama Stack always strives to provide at least one fully inline provider for each API so you can iterate on a fully featured environment locally. -```{toctree} -:maxdepth: 1 +## Provider Categories -external/index -openai -inference/index -agents/index -datasetio/index -safety/index -telemetry/index -vector_io/index -tool_runtime/index -files/index -``` +- **[External Providers](./external/)** - Guide for building and using external providers +- **[OpenAI Compatibility](./openai)** - OpenAI API compatibility layer +- **[Inference](./inference/)** - LLM and embedding model providers +- **[Agents](./agents/)** - Agentic system providers +- **[DatasetIO](./datasetio/)** - Dataset and data loader providers +- **[Safety](./safety/)** - Content moderation and safety providers +- **[Telemetry](./telemetry/)** - Monitoring and observability providers +- **[Vector IO](./vector-io/)** - Vector database providers +- **[Tool Runtime](./tool-runtime/)** - Tool and protocol providers +- **[Files](./files/)** - File system and storage providers diff --git a/docs/docs/providers/inference/index.mdx b/docs/docs/providers/inference/index.mdx new file mode 100644 index 000000000..a9365c5f2 --- /dev/null +++ b/docs/docs/providers/inference/index.mdx @@ -0,0 +1,48 @@ +--- +description: "Llama Stack Inference API for generating completions, chat completions, and embeddings. + + This API provides the raw interface to the underlying models. Two kinds of models are supported: + - LLM models: these models generate \"raw\" and \"chat\" (conversational) completions. + - Embedding models: these models generate embeddings to be used for semantic search." +sidebar_label: Inference +title: Inference +--- + +# Inference + +## Overview + +Llama Stack Inference API for generating completions, chat completions, and embeddings. + + This API provides the raw interface to the underlying models. Two kinds of models are supported: + - LLM models: these models generate "raw" and "chat" (conversational) completions. + - Embedding models: these models generate embeddings to be used for semantic search. + +This section contains documentation for all available providers for the **inference** API. + +## Providers + +- [Meta-Reference](./inline_meta-reference) +- [Sentence-Transformers](./inline_sentence-transformers) +- [Remote - Anthropic](./remote_anthropic) +- [Remote - Azure](./remote_azure) +- [Remote - Bedrock](./remote_bedrock) +- [Remote - Cerebras](./remote_cerebras) +- [Remote - Databricks](./remote_databricks) +- [Remote - Fireworks](./remote_fireworks) +- [Remote - Gemini](./remote_gemini) +- [Remote - Groq](./remote_groq) +- [Remote - Hf - Endpoint](./remote_hf_endpoint) +- [Remote - Hf - Serverless](./remote_hf_serverless) +- [Remote - Llama-Openai-Compat](./remote_llama-openai-compat) +- [Remote - Nvidia](./remote_nvidia) +- [Remote - Ollama](./remote_ollama) +- [Remote - Openai](./remote_openai) +- [Remote - Passthrough](./remote_passthrough) +- [Remote - Runpod](./remote_runpod) +- [Remote - Sambanova](./remote_sambanova) +- [Remote - Tgi](./remote_tgi) +- [Remote - Together](./remote_together) +- [Remote - Vertexai](./remote_vertexai) +- [Remote - Vllm](./remote_vllm) +- [Remote - Watsonx](./remote_watsonx) diff --git a/docs/source/providers/inference/inline_meta-reference.md b/docs/docs/providers/inference/inline_meta-reference.mdx similarity index 84% rename from docs/source/providers/inference/inline_meta-reference.md rename to docs/docs/providers/inference/inline_meta-reference.mdx index eca12a839..328586f9a 100644 --- a/docs/source/providers/inference/inline_meta-reference.md +++ b/docs/docs/providers/inference/inline_meta-reference.mdx @@ -1,3 +1,9 @@ +--- +description: "Meta's reference implementation of inference with support for various model formats and optimization techniques." +sidebar_label: Meta-Reference +title: inline::meta-reference +--- + # inline::meta-reference ## Description @@ -27,6 +33,4 @@ quantization: model_parallel_size: ${env.MODEL_PARALLEL_SIZE:=0} max_batch_size: ${env.MAX_BATCH_SIZE:=1} max_seq_len: ${env.MAX_SEQ_LEN:=4096} - ``` - diff --git a/docs/docs/providers/inference/inline_sentence-transformers.mdx b/docs/docs/providers/inference/inline_sentence-transformers.mdx new file mode 100644 index 000000000..0e207bbdb --- /dev/null +++ b/docs/docs/providers/inference/inline_sentence-transformers.mdx @@ -0,0 +1,17 @@ +--- +description: "Sentence Transformers inference provider for text embeddings and similarity search." +sidebar_label: Sentence-Transformers +title: inline::sentence-transformers +--- + +# inline::sentence-transformers + +## Description + +Sentence Transformers inference provider for text embeddings and similarity search. + +## Sample Configuration + +```yaml +{} +``` diff --git a/docs/source/providers/inference/remote_anthropic.md b/docs/docs/providers/inference/remote_anthropic.mdx similarity index 69% rename from docs/source/providers/inference/remote_anthropic.md rename to docs/docs/providers/inference/remote_anthropic.mdx index 4680608b1..6bd636c92 100644 --- a/docs/source/providers/inference/remote_anthropic.md +++ b/docs/docs/providers/inference/remote_anthropic.mdx @@ -1,3 +1,9 @@ +--- +description: "Anthropic inference provider for accessing Claude models and Anthropic's AI services." +sidebar_label: Remote - Anthropic +title: remote::anthropic +--- + # remote::anthropic ## Description @@ -14,6 +20,4 @@ Anthropic inference provider for accessing Claude models and Anthropic's AI serv ```yaml api_key: ${env.ANTHROPIC_API_KEY:=} - ``` - diff --git a/docs/source/providers/inference/remote_azure.md b/docs/docs/providers/inference/remote_azure.mdx similarity index 78% rename from docs/source/providers/inference/remote_azure.md rename to docs/docs/providers/inference/remote_azure.mdx index 19f8f418b..0eb0ea755 100644 --- a/docs/source/providers/inference/remote_azure.md +++ b/docs/docs/providers/inference/remote_azure.mdx @@ -1,3 +1,12 @@ +--- +description: | + Azure OpenAI inference provider for accessing GPT models and other Azure services. + Provider documentation + https://learn.microsoft.com/en-us/azure/ai-foundry/openai/overview +sidebar_label: Remote - Azure +title: remote::azure +--- + # remote::azure ## Description @@ -24,6 +33,4 @@ api_key: ${env.AZURE_API_KEY:=} api_base: ${env.AZURE_API_BASE:=} api_version: ${env.AZURE_API_VERSION:=} api_type: ${env.AZURE_API_TYPE:=} - ``` - diff --git a/docs/source/providers/inference/remote_bedrock.md b/docs/docs/providers/inference/remote_bedrock.mdx similarity index 91% rename from docs/source/providers/inference/remote_bedrock.md rename to docs/docs/providers/inference/remote_bedrock.mdx index 216dd4adb..04c2154a9 100644 --- a/docs/source/providers/inference/remote_bedrock.md +++ b/docs/docs/providers/inference/remote_bedrock.mdx @@ -1,3 +1,9 @@ +--- +description: "AWS Bedrock inference provider for accessing various AI models through AWS's managed service." +sidebar_label: Remote - Bedrock +title: remote::bedrock +--- + # remote::bedrock ## Description @@ -23,6 +29,4 @@ AWS Bedrock inference provider for accessing various AI models through AWS's man ```yaml {} - ``` - diff --git a/docs/source/providers/inference/remote_cerebras.md b/docs/docs/providers/inference/remote_cerebras.mdx similarity index 76% rename from docs/source/providers/inference/remote_cerebras.md rename to docs/docs/providers/inference/remote_cerebras.mdx index 3bd3dda25..d9cc93aef 100644 --- a/docs/source/providers/inference/remote_cerebras.md +++ b/docs/docs/providers/inference/remote_cerebras.mdx @@ -1,3 +1,9 @@ +--- +description: "Cerebras inference provider for running models on Cerebras Cloud platform." +sidebar_label: Remote - Cerebras +title: remote::cerebras +--- + # remote::cerebras ## Description @@ -16,6 +22,4 @@ Cerebras inference provider for running models on Cerebras Cloud platform. ```yaml base_url: https://api.cerebras.ai api_key: ${env.CEREBRAS_API_KEY:=} - ``` - diff --git a/docs/source/providers/inference/remote_databricks.md b/docs/docs/providers/inference/remote_databricks.mdx similarity index 75% rename from docs/source/providers/inference/remote_databricks.md rename to docs/docs/providers/inference/remote_databricks.mdx index 3b418f7d4..7f736db9d 100644 --- a/docs/source/providers/inference/remote_databricks.md +++ b/docs/docs/providers/inference/remote_databricks.mdx @@ -1,3 +1,9 @@ +--- +description: "Databricks inference provider for running models on Databricks' unified analytics platform." +sidebar_label: Remote - Databricks +title: remote::databricks +--- + # remote::databricks ## Description @@ -16,6 +22,4 @@ Databricks inference provider for running models on Databricks' unified analytic ```yaml url: ${env.DATABRICKS_HOST:=} api_token: ${env.DATABRICKS_TOKEN:=} - ``` - diff --git a/docs/source/providers/inference/remote_fireworks.md b/docs/docs/providers/inference/remote_fireworks.mdx similarity index 80% rename from docs/source/providers/inference/remote_fireworks.md rename to docs/docs/providers/inference/remote_fireworks.mdx index 28dbf1d3f..d2c3a664e 100644 --- a/docs/source/providers/inference/remote_fireworks.md +++ b/docs/docs/providers/inference/remote_fireworks.mdx @@ -1,3 +1,9 @@ +--- +description: "Fireworks AI inference provider for Llama models and other AI models on the Fireworks platform." +sidebar_label: Remote - Fireworks +title: remote::fireworks +--- + # remote::fireworks ## Description @@ -17,6 +23,4 @@ Fireworks AI inference provider for Llama models and other AI models on the Fire ```yaml url: https://api.fireworks.ai/inference/v1 api_key: ${env.FIREWORKS_API_KEY:=} - ``` - diff --git a/docs/source/providers/inference/remote_gemini.md b/docs/docs/providers/inference/remote_gemini.mdx similarity index 70% rename from docs/source/providers/inference/remote_gemini.md rename to docs/docs/providers/inference/remote_gemini.mdx index 14b3223f2..0505c69da 100644 --- a/docs/source/providers/inference/remote_gemini.md +++ b/docs/docs/providers/inference/remote_gemini.mdx @@ -1,3 +1,9 @@ +--- +description: "Google Gemini inference provider for accessing Gemini models and Google's AI services." +sidebar_label: Remote - Gemini +title: remote::gemini +--- + # remote::gemini ## Description @@ -14,6 +20,4 @@ Google Gemini inference provider for accessing Gemini models and Google's AI ser ```yaml api_key: ${env.GEMINI_API_KEY:=} - ``` - diff --git a/docs/source/providers/inference/remote_groq.md b/docs/docs/providers/inference/remote_groq.mdx similarity index 76% rename from docs/source/providers/inference/remote_groq.md rename to docs/docs/providers/inference/remote_groq.mdx index 68bd4d5b3..1797035c1 100644 --- a/docs/source/providers/inference/remote_groq.md +++ b/docs/docs/providers/inference/remote_groq.mdx @@ -1,3 +1,9 @@ +--- +description: "Groq inference provider for ultra-fast inference using Groq's LPU technology." +sidebar_label: Remote - Groq +title: remote::groq +--- + # remote::groq ## Description @@ -16,6 +22,4 @@ Groq inference provider for ultra-fast inference using Groq's LPU technology. ```yaml url: https://api.groq.com api_key: ${env.GROQ_API_KEY:=} - ``` - diff --git a/docs/source/providers/inference/remote_hf_endpoint.md b/docs/docs/providers/inference/remote_hf_endpoint.mdx similarity index 59% rename from docs/source/providers/inference/remote_hf_endpoint.md rename to docs/docs/providers/inference/remote_hf_endpoint.mdx index 8aaf13476..771b24f8d 100644 --- a/docs/source/providers/inference/remote_hf_endpoint.md +++ b/docs/docs/providers/inference/remote_hf_endpoint.mdx @@ -1,3 +1,9 @@ +--- +description: "HuggingFace Inference Endpoints provider for dedicated model serving." +sidebar_label: Remote - Hf - Endpoint +title: remote::hf::endpoint +--- + # remote::hf::endpoint ## Description @@ -8,7 +14,7 @@ HuggingFace Inference Endpoints provider for dedicated model serving. | Field | Type | Required | Default | Description | |-------|------|----------|---------|-------------| -| `endpoint_name` | `` | No | | The name of the Hugging Face Inference Endpoint in the format of '{namespace}/{endpoint_name}' (e.g. 'my-cool-org/meta-llama-3-1-8b-instruct-rce'). Namespace is optional and will default to the user account if not provided. | +| `endpoint_name` | `` | No | | The name of the Hugging Face Inference Endpoint in the format of '{namespace}/{endpoint_name}' (e.g. 'my-cool-org/meta-llama-3-1-8b-instruct-rce'). Namespace is optional and will default to the user account if not provided. | | `api_token` | `pydantic.types.SecretStr \| None` | No | | Your Hugging Face user access token (will default to locally saved token if not provided) | ## Sample Configuration @@ -16,6 +22,4 @@ HuggingFace Inference Endpoints provider for dedicated model serving. ```yaml endpoint_name: ${env.INFERENCE_ENDPOINT_NAME} api_token: ${env.HF_API_TOKEN} - ``` - diff --git a/docs/source/providers/inference/remote_hf_serverless.md b/docs/docs/providers/inference/remote_hf_serverless.mdx similarity index 79% rename from docs/source/providers/inference/remote_hf_serverless.md rename to docs/docs/providers/inference/remote_hf_serverless.mdx index 6764590b8..1a89b8e3e 100644 --- a/docs/source/providers/inference/remote_hf_serverless.md +++ b/docs/docs/providers/inference/remote_hf_serverless.mdx @@ -1,3 +1,9 @@ +--- +description: "HuggingFace Inference API serverless provider for on-demand model inference." +sidebar_label: Remote - Hf - Serverless +title: remote::hf::serverless +--- + # remote::hf::serverless ## Description @@ -16,6 +22,4 @@ HuggingFace Inference API serverless provider for on-demand model inference. ```yaml huggingface_repo: ${env.INFERENCE_MODEL} api_token: ${env.HF_API_TOKEN} - ``` - diff --git a/docs/source/providers/inference/remote_llama-openai-compat.md b/docs/docs/providers/inference/remote_llama-openai-compat.mdx similarity index 75% rename from docs/source/providers/inference/remote_llama-openai-compat.md rename to docs/docs/providers/inference/remote_llama-openai-compat.mdx index 5c97aebc3..cb624ad87 100644 --- a/docs/source/providers/inference/remote_llama-openai-compat.md +++ b/docs/docs/providers/inference/remote_llama-openai-compat.mdx @@ -1,3 +1,9 @@ +--- +description: "Llama OpenAI-compatible provider for using Llama models with OpenAI API format." +sidebar_label: Remote - Llama-Openai-Compat +title: remote::llama-openai-compat +--- + # remote::llama-openai-compat ## Description @@ -16,6 +22,4 @@ Llama OpenAI-compatible provider for using Llama models with OpenAI API format. ```yaml openai_compat_api_base: https://api.llama.com/compat/v1/ api_key: ${env.LLAMA_API_KEY} - ``` - diff --git a/docs/source/providers/inference/remote_nvidia.md b/docs/docs/providers/inference/remote_nvidia.mdx similarity index 85% rename from docs/source/providers/inference/remote_nvidia.md rename to docs/docs/providers/inference/remote_nvidia.mdx index 1b12839df..4a8be5d03 100644 --- a/docs/source/providers/inference/remote_nvidia.md +++ b/docs/docs/providers/inference/remote_nvidia.mdx @@ -1,3 +1,9 @@ +--- +description: "NVIDIA inference provider for accessing NVIDIA NIM models and AI services." +sidebar_label: Remote - Nvidia +title: remote::nvidia +--- + # remote::nvidia ## Description @@ -19,6 +25,4 @@ NVIDIA inference provider for accessing NVIDIA NIM models and AI services. url: ${env.NVIDIA_BASE_URL:=https://integrate.api.nvidia.com} api_key: ${env.NVIDIA_API_KEY:=} append_api_version: ${env.NVIDIA_APPEND_API_VERSION:=True} - ``` - diff --git a/docs/source/providers/inference/remote_ollama.md b/docs/docs/providers/inference/remote_ollama.mdx similarity index 75% rename from docs/source/providers/inference/remote_ollama.md rename to docs/docs/providers/inference/remote_ollama.mdx index f9f0a7622..5d9a4ad6c 100644 --- a/docs/source/providers/inference/remote_ollama.md +++ b/docs/docs/providers/inference/remote_ollama.mdx @@ -1,3 +1,9 @@ +--- +description: "Ollama inference provider for running local models through the Ollama runtime." +sidebar_label: Remote - Ollama +title: remote::ollama +--- + # remote::ollama ## Description @@ -15,6 +21,4 @@ Ollama inference provider for running local models through the Ollama runtime. ```yaml url: ${env.OLLAMA_URL:=http://localhost:11434} - ``` - diff --git a/docs/source/providers/inference/remote_openai.md b/docs/docs/providers/inference/remote_openai.mdx similarity index 77% rename from docs/source/providers/inference/remote_openai.md rename to docs/docs/providers/inference/remote_openai.mdx index 18a74caea..56ca94233 100644 --- a/docs/source/providers/inference/remote_openai.md +++ b/docs/docs/providers/inference/remote_openai.mdx @@ -1,3 +1,9 @@ +--- +description: "OpenAI inference provider for accessing GPT models and other OpenAI services." +sidebar_label: Remote - Openai +title: remote::openai +--- + # remote::openai ## Description @@ -16,6 +22,4 @@ OpenAI inference provider for accessing GPT models and other OpenAI services. ```yaml api_key: ${env.OPENAI_API_KEY:=} base_url: ${env.OPENAI_BASE_URL:=https://api.openai.com/v1} - ``` - diff --git a/docs/source/providers/inference/remote_passthrough.md b/docs/docs/providers/inference/remote_passthrough.mdx similarity index 74% rename from docs/source/providers/inference/remote_passthrough.md rename to docs/docs/providers/inference/remote_passthrough.mdx index 9005e5339..972cc2a08 100644 --- a/docs/source/providers/inference/remote_passthrough.md +++ b/docs/docs/providers/inference/remote_passthrough.mdx @@ -1,3 +1,9 @@ +--- +description: "Passthrough inference provider for connecting to any external inference service not directly supported." +sidebar_label: Remote - Passthrough +title: remote::passthrough +--- + # remote::passthrough ## Description @@ -16,6 +22,4 @@ Passthrough inference provider for connecting to any external inference service ```yaml url: ${env.PASSTHROUGH_URL} api_key: ${env.PASSTHROUGH_API_KEY} - ``` - diff --git a/docs/source/providers/inference/remote_runpod.md b/docs/docs/providers/inference/remote_runpod.mdx similarity index 75% rename from docs/source/providers/inference/remote_runpod.md rename to docs/docs/providers/inference/remote_runpod.mdx index ff1c0bcb6..2e8847dc5 100644 --- a/docs/source/providers/inference/remote_runpod.md +++ b/docs/docs/providers/inference/remote_runpod.mdx @@ -1,3 +1,9 @@ +--- +description: "RunPod inference provider for running models on RunPod's cloud GPU platform." +sidebar_label: Remote - Runpod +title: remote::runpod +--- + # remote::runpod ## Description @@ -16,6 +22,4 @@ RunPod inference provider for running models on RunPod's cloud GPU platform. ```yaml url: ${env.RUNPOD_URL:=} api_token: ${env.RUNPOD_API_TOKEN} - ``` - diff --git a/docs/source/providers/inference/remote_sambanova-openai-compat.md b/docs/docs/providers/inference/remote_sambanova-openai-compat.mdx similarity index 99% rename from docs/source/providers/inference/remote_sambanova-openai-compat.md rename to docs/docs/providers/inference/remote_sambanova-openai-compat.mdx index 3074a5885..9b4716d7e 100644 --- a/docs/source/providers/inference/remote_sambanova-openai-compat.md +++ b/docs/docs/providers/inference/remote_sambanova-openai-compat.mdx @@ -18,4 +18,3 @@ openai_compat_api_base: https://api.sambanova.ai/v1 api_key: ${env.SAMBANOVA_API_KEY:=} ``` - diff --git a/docs/source/providers/inference/remote_sambanova.md b/docs/docs/providers/inference/remote_sambanova.mdx similarity index 76% rename from docs/source/providers/inference/remote_sambanova.md rename to docs/docs/providers/inference/remote_sambanova.mdx index 9d15c97d5..6ee28b400 100644 --- a/docs/source/providers/inference/remote_sambanova.md +++ b/docs/docs/providers/inference/remote_sambanova.mdx @@ -1,3 +1,9 @@ +--- +description: "SambaNova inference provider for running models on SambaNova's dataflow architecture." +sidebar_label: Remote - Sambanova +title: remote::sambanova +--- + # remote::sambanova ## Description @@ -16,6 +22,4 @@ SambaNova inference provider for running models on SambaNova's dataflow architec ```yaml url: https://api.sambanova.ai/v1 api_key: ${env.SAMBANOVA_API_KEY:=} - ``` - diff --git a/docs/source/providers/inference/remote_tgi.md b/docs/docs/providers/inference/remote_tgi.mdx similarity index 71% rename from docs/source/providers/inference/remote_tgi.md rename to docs/docs/providers/inference/remote_tgi.mdx index 104bb4aab..3a348056f 100644 --- a/docs/source/providers/inference/remote_tgi.md +++ b/docs/docs/providers/inference/remote_tgi.mdx @@ -1,3 +1,9 @@ +--- +description: "Text Generation Inference (TGI) provider for HuggingFace model serving." +sidebar_label: Remote - Tgi +title: remote::tgi +--- + # remote::tgi ## Description @@ -14,6 +20,4 @@ Text Generation Inference (TGI) provider for HuggingFace model serving. ```yaml url: ${env.TGI_URL:=} - ``` - diff --git a/docs/source/providers/inference/remote_together.md b/docs/docs/providers/inference/remote_together.mdx similarity index 80% rename from docs/source/providers/inference/remote_together.md rename to docs/docs/providers/inference/remote_together.mdx index be764e635..da232a45b 100644 --- a/docs/source/providers/inference/remote_together.md +++ b/docs/docs/providers/inference/remote_together.mdx @@ -1,3 +1,9 @@ +--- +description: "Together AI inference provider for open-source models and collaborative AI development." +sidebar_label: Remote - Together +title: remote::together +--- + # remote::together ## Description @@ -17,6 +23,4 @@ Together AI inference provider for open-source models and collaborative AI devel ```yaml url: https://api.together.xyz/v1 api_key: ${env.TOGETHER_API_KEY:=} - ``` - diff --git a/docs/source/providers/inference/remote_vertexai.md b/docs/docs/providers/inference/remote_vertexai.mdx similarity index 56% rename from docs/source/providers/inference/remote_vertexai.md rename to docs/docs/providers/inference/remote_vertexai.mdx index 962bbd76f..13a910d43 100644 --- a/docs/source/providers/inference/remote_vertexai.md +++ b/docs/docs/providers/inference/remote_vertexai.mdx @@ -1,3 +1,29 @@ +--- +description: | + Google Vertex AI inference provider enables you to use Google's Gemini models through Google Cloud's Vertex AI platform, providing several advantages: + + • Enterprise-grade security: Uses Google Cloud's security controls and IAM + • Better integration: Seamless integration with other Google Cloud services + • Advanced features: Access to additional Vertex AI features like model tuning and monitoring + • Authentication: Uses Google Cloud Application Default Credentials (ADC) instead of API keys + + Configuration: + - Set VERTEX_AI_PROJECT environment variable (required) + - Set VERTEX_AI_LOCATION environment variable (optional, defaults to us-central1) + - Use Google Cloud Application Default Credentials or service account key + + Authentication Setup: + Option 1 (Recommended): gcloud auth application-default login + Option 2: Set GOOGLE_APPLICATION_CREDENTIALS to service account key path + + Available Models: + - vertex_ai/gemini-2.0-flash + - vertex_ai/gemini-2.5-flash + - vertex_ai/gemini-2.5-pro +sidebar_label: Remote - Vertexai +title: remote::vertexai +--- + # remote::vertexai ## Description @@ -35,6 +61,4 @@ Available Models: ```yaml project: ${env.VERTEX_AI_PROJECT:=} location: ${env.VERTEX_AI_LOCATION:=us-central1} - ``` - diff --git a/docs/source/providers/inference/remote_vllm.md b/docs/docs/providers/inference/remote_vllm.mdx similarity index 86% rename from docs/source/providers/inference/remote_vllm.md rename to docs/docs/providers/inference/remote_vllm.mdx index 172d35873..77b8e1355 100644 --- a/docs/source/providers/inference/remote_vllm.md +++ b/docs/docs/providers/inference/remote_vllm.mdx @@ -1,3 +1,9 @@ +--- +description: "Remote vLLM inference provider for connecting to vLLM servers." +sidebar_label: Remote - Vllm +title: remote::vllm +--- + # remote::vllm ## Description @@ -21,6 +27,4 @@ url: ${env.VLLM_URL:=} max_tokens: ${env.VLLM_MAX_TOKENS:=4096} api_token: ${env.VLLM_API_TOKEN:=fake} tls_verify: ${env.VLLM_TLS_VERIFY:=true} - ``` - diff --git a/docs/source/providers/inference/remote_watsonx.md b/docs/docs/providers/inference/remote_watsonx.mdx similarity index 82% rename from docs/source/providers/inference/remote_watsonx.md rename to docs/docs/providers/inference/remote_watsonx.mdx index e885a07fc..1ceccc3ed 100644 --- a/docs/source/providers/inference/remote_watsonx.md +++ b/docs/docs/providers/inference/remote_watsonx.mdx @@ -1,3 +1,9 @@ +--- +description: "IBM WatsonX inference provider for accessing AI models on IBM's WatsonX platform." +sidebar_label: Remote - Watsonx +title: remote::watsonx +--- + # remote::watsonx ## Description @@ -19,6 +25,4 @@ IBM WatsonX inference provider for accessing AI models on IBM's WatsonX platform url: ${env.WATSONX_BASE_URL:=https://us-south.ml.cloud.ibm.com} api_key: ${env.WATSONX_API_KEY:=} project_id: ${env.WATSONX_PROJECT_ID:=} - ``` - diff --git a/docs/source/providers/openai.md b/docs/docs/providers/openai.mdx similarity index 90% rename from docs/source/providers/openai.md rename to docs/docs/providers/openai.mdx index 44a615456..1a907152f 100644 --- a/docs/source/providers/openai.md +++ b/docs/docs/providers/openai.mdx @@ -42,9 +42,7 @@ models = client.models.list() #### Responses -:::{note} -The Responses API implementation is still in active development. While it is quite usable, there are still unimplemented parts of the API. We'd love feedback on any use-cases you try that do not work to help prioritize the pieces left to implement. Please open issues in the [meta-llama/llama-stack](https://github.com/meta-llama/llama-stack) GitHub repository with details of anything that does not work. -::: +> **Note:** The Responses API implementation is still in active development. While it is quite usable, there are still unimplemented parts of the API. We'd love feedback on any use-cases you try that do not work to help prioritize the pieces left to implement. Please open issues in the [meta-llama/llama-stack](https://github.com/meta-llama/llama-stack) GitHub repository with details of anything that does not work. ##### Simple inference diff --git a/docs/docs/providers/post_training/index.mdx b/docs/docs/providers/post_training/index.mdx new file mode 100644 index 000000000..6faab7a05 --- /dev/null +++ b/docs/docs/providers/post_training/index.mdx @@ -0,0 +1,17 @@ +--- +sidebar_label: Post Training +title: Post_Training +--- + +# Post_Training + +## Overview + +This section contains documentation for all available providers for the **post_training** API. + +## Providers + +- [Huggingface-Gpu](./inline_huggingface-gpu) +- [Torchtune-Cpu](./inline_torchtune-cpu) +- [Torchtune-Gpu](./inline_torchtune-gpu) +- [Remote - Nvidia](./remote_nvidia) diff --git a/docs/source/providers/post_training/inline_huggingface-cpu.md b/docs/docs/providers/post_training/inline_huggingface-cpu.mdx similarity index 99% rename from docs/source/providers/post_training/inline_huggingface-cpu.md rename to docs/docs/providers/post_training/inline_huggingface-cpu.mdx index e663fe8f8..9b5f2a091 100644 --- a/docs/source/providers/post_training/inline_huggingface-cpu.md +++ b/docs/docs/providers/post_training/inline_huggingface-cpu.mdx @@ -38,4 +38,3 @@ device: cpu dpo_output_dir: ~/.llama/dummy/dpo_output ``` - diff --git a/docs/source/providers/post_training/inline_huggingface-gpu.md b/docs/docs/providers/post_training/inline_huggingface-gpu.mdx similarity index 74% rename from docs/source/providers/post_training/inline_huggingface-gpu.md rename to docs/docs/providers/post_training/inline_huggingface-gpu.mdx index 21bf965fe..530ac5c4d 100644 --- a/docs/source/providers/post_training/inline_huggingface-gpu.md +++ b/docs/docs/providers/post_training/inline_huggingface-gpu.mdx @@ -1,3 +1,9 @@ +--- +description: "HuggingFace-based post-training provider for fine-tuning models using the HuggingFace ecosystem." +sidebar_label: Huggingface-Gpu +title: inline::huggingface-gpu +--- + # inline::huggingface-gpu ## Description @@ -11,11 +17,8 @@ HuggingFace-based post-training provider for fine-tuning models using the Huggin | `device` | `` | No | cuda | | | `distributed_backend` | `Literal['fsdp', 'deepspeed'` | No | | | | `checkpoint_format` | `Literal['full_state', 'huggingface'` | No | huggingface | | -| `chat_template` | `` | No | <|user|> -{input} -<|assistant|> -{output} | | -| `model_specific_config` | `` | No | {'trust_remote_code': True, 'attn_implementation': 'sdpa'} | | +| `chat_template` | `` | No | <|user|><br/>{input}<br/><|assistant|><br/>{output} | | +| `model_specific_config` | `` | No | {'trust_remote_code': True, 'attn_implementation': 'sdpa'} | | | `max_seq_length` | `` | No | 2048 | | | `gradient_checkpointing` | `` | No | False | | | `save_total_limit` | `` | No | 3 | | @@ -36,6 +39,4 @@ checkpoint_format: huggingface distributed_backend: null device: cpu dpo_output_dir: ~/.llama/dummy/dpo_output - ``` - diff --git a/docs/source/providers/post_training/inline_huggingface.md b/docs/docs/providers/post_training/inline_huggingface.mdx similarity index 99% rename from docs/source/providers/post_training/inline_huggingface.md rename to docs/docs/providers/post_training/inline_huggingface.mdx index 8b10fe79c..37c113c6f 100644 --- a/docs/source/providers/post_training/inline_huggingface.md +++ b/docs/docs/providers/post_training/inline_huggingface.mdx @@ -38,4 +38,3 @@ device: cpu dpo_output_dir: ~/.llama/dummy/dpo_output ``` - diff --git a/docs/source/providers/post_training/inline_torchtune-cpu.md b/docs/docs/providers/post_training/inline_torchtune-cpu.mdx similarity index 70% rename from docs/source/providers/post_training/inline_torchtune-cpu.md rename to docs/docs/providers/post_training/inline_torchtune-cpu.mdx index 7204e56e8..f789392fc 100644 --- a/docs/source/providers/post_training/inline_torchtune-cpu.md +++ b/docs/docs/providers/post_training/inline_torchtune-cpu.mdx @@ -1,3 +1,9 @@ +--- +description: "TorchTune-based post-training provider for fine-tuning and optimizing models using Meta's TorchTune framework." +sidebar_label: Torchtune-Cpu +title: inline::torchtune-cpu +--- + # inline::torchtune-cpu ## Description @@ -15,6 +21,4 @@ TorchTune-based post-training provider for fine-tuning and optimizing models usi ```yaml checkpoint_format: meta - ``` - diff --git a/docs/source/providers/post_training/inline_torchtune-gpu.md b/docs/docs/providers/post_training/inline_torchtune-gpu.mdx similarity index 70% rename from docs/source/providers/post_training/inline_torchtune-gpu.md rename to docs/docs/providers/post_training/inline_torchtune-gpu.mdx index 98b94f6f6..bd87797af 100644 --- a/docs/source/providers/post_training/inline_torchtune-gpu.md +++ b/docs/docs/providers/post_training/inline_torchtune-gpu.mdx @@ -1,3 +1,9 @@ +--- +description: "TorchTune-based post-training provider for fine-tuning and optimizing models using Meta's TorchTune framework." +sidebar_label: Torchtune-Gpu +title: inline::torchtune-gpu +--- + # inline::torchtune-gpu ## Description @@ -15,6 +21,4 @@ TorchTune-based post-training provider for fine-tuning and optimizing models usi ```yaml checkpoint_format: meta - ``` - diff --git a/docs/source/providers/post_training/inline_torchtune.md b/docs/docs/providers/post_training/inline_torchtune.md similarity index 100% rename from docs/source/providers/post_training/inline_torchtune.md rename to docs/docs/providers/post_training/inline_torchtune.md diff --git a/docs/source/providers/post_training/remote_nvidia.md b/docs/docs/providers/post_training/remote_nvidia.mdx similarity index 87% rename from docs/source/providers/post_training/remote_nvidia.md rename to docs/docs/providers/post_training/remote_nvidia.mdx index 9a381d872..448ac4c75 100644 --- a/docs/source/providers/post_training/remote_nvidia.md +++ b/docs/docs/providers/post_training/remote_nvidia.mdx @@ -1,3 +1,9 @@ +--- +description: "NVIDIA's post-training provider for fine-tuning models on NVIDIA's platform." +sidebar_label: Remote - Nvidia +title: remote::nvidia +--- + # remote::nvidia ## Description @@ -23,6 +29,4 @@ api_key: ${env.NVIDIA_API_KEY:=} dataset_namespace: ${env.NVIDIA_DATASET_NAMESPACE:=default} project_id: ${env.NVIDIA_PROJECT_ID:=test-project} customizer_url: ${env.NVIDIA_CUSTOMIZER_URL:=http://nemo.test} - ``` - diff --git a/docs/docs/providers/safety/index.mdx b/docs/docs/providers/safety/index.mdx new file mode 100644 index 000000000..591b92b8d --- /dev/null +++ b/docs/docs/providers/safety/index.mdx @@ -0,0 +1,19 @@ +--- +sidebar_label: Safety +title: Safety +--- + +# Safety + +## Overview + +This section contains documentation for all available providers for the **safety** API. + +## Providers + +- [Code-Scanner](./inline_code-scanner) +- [Llama-Guard](./inline_llama-guard) +- [Prompt-Guard](./inline_prompt-guard) +- [Remote - Bedrock](./remote_bedrock) +- [Remote - Nvidia](./remote_nvidia) +- [Remote - Sambanova](./remote_sambanova) diff --git a/docs/source/providers/safety/inline_code-scanner.md b/docs/docs/providers/safety/inline_code-scanner.mdx similarity index 50% rename from docs/source/providers/safety/inline_code-scanner.md rename to docs/docs/providers/safety/inline_code-scanner.mdx index 3a3e90b3d..3fc3c38a4 100644 --- a/docs/source/providers/safety/inline_code-scanner.md +++ b/docs/docs/providers/safety/inline_code-scanner.mdx @@ -1,3 +1,9 @@ +--- +description: "Code Scanner safety provider for detecting security vulnerabilities and unsafe code patterns." +sidebar_label: Code-Scanner +title: inline::code-scanner +--- + # inline::code-scanner ## Description @@ -8,6 +14,4 @@ Code Scanner safety provider for detecting security vulnerabilities and unsafe c ```yaml {} - ``` - diff --git a/docs/source/providers/safety/inline_llama-guard.md b/docs/docs/providers/safety/inline_llama-guard.mdx similarity index 67% rename from docs/source/providers/safety/inline_llama-guard.md rename to docs/docs/providers/safety/inline_llama-guard.mdx index 4f57898ec..65866c9b2 100644 --- a/docs/source/providers/safety/inline_llama-guard.md +++ b/docs/docs/providers/safety/inline_llama-guard.mdx @@ -1,3 +1,9 @@ +--- +description: "Llama Guard safety provider for content moderation and safety filtering using Meta's Llama Guard model." +sidebar_label: Llama-Guard +title: inline::llama-guard +--- + # inline::llama-guard ## Description @@ -14,6 +20,4 @@ Llama Guard safety provider for content moderation and safety filtering using Me ```yaml excluded_categories: [] - ``` - diff --git a/docs/source/providers/safety/inline_prompt-guard.md b/docs/docs/providers/safety/inline_prompt-guard.mdx similarity index 68% rename from docs/source/providers/safety/inline_prompt-guard.md rename to docs/docs/providers/safety/inline_prompt-guard.mdx index 10a6b8d3f..c52e03e4b 100644 --- a/docs/source/providers/safety/inline_prompt-guard.md +++ b/docs/docs/providers/safety/inline_prompt-guard.mdx @@ -1,3 +1,9 @@ +--- +description: "Prompt Guard safety provider for detecting and filtering unsafe prompts and content." +sidebar_label: Prompt-Guard +title: inline::prompt-guard +--- + # inline::prompt-guard ## Description @@ -14,6 +20,4 @@ Prompt Guard safety provider for detecting and filtering unsafe prompts and cont ```yaml guard_type: injection - ``` - diff --git a/docs/source/providers/safety/remote_bedrock.md b/docs/docs/providers/safety/remote_bedrock.mdx similarity index 92% rename from docs/source/providers/safety/remote_bedrock.md rename to docs/docs/providers/safety/remote_bedrock.mdx index 99d77dd72..5461d7cdc 100644 --- a/docs/source/providers/safety/remote_bedrock.md +++ b/docs/docs/providers/safety/remote_bedrock.mdx @@ -1,3 +1,9 @@ +--- +description: "AWS Bedrock safety provider for content moderation using AWS's safety services." +sidebar_label: Remote - Bedrock +title: remote::bedrock +--- + # remote::bedrock ## Description @@ -23,6 +29,4 @@ AWS Bedrock safety provider for content moderation using AWS's safety services. ```yaml {} - ``` - diff --git a/docs/source/providers/safety/remote_nvidia.md b/docs/docs/providers/safety/remote_nvidia.mdx similarity index 81% rename from docs/source/providers/safety/remote_nvidia.md rename to docs/docs/providers/safety/remote_nvidia.mdx index 40ae744a4..0f665e60a 100644 --- a/docs/source/providers/safety/remote_nvidia.md +++ b/docs/docs/providers/safety/remote_nvidia.mdx @@ -1,3 +1,9 @@ +--- +description: "NVIDIA's safety provider for content moderation and safety filtering." +sidebar_label: Remote - Nvidia +title: remote::nvidia +--- + # remote::nvidia ## Description @@ -16,6 +22,4 @@ NVIDIA's safety provider for content moderation and safety filtering. ```yaml guardrails_service_url: ${env.GUARDRAILS_SERVICE_URL:=http://localhost:7331} config_id: ${env.NVIDIA_GUARDRAILS_CONFIG_ID:=self-check} - ``` - diff --git a/docs/source/providers/safety/remote_sambanova.md b/docs/docs/providers/safety/remote_sambanova.mdx similarity index 77% rename from docs/source/providers/safety/remote_sambanova.md rename to docs/docs/providers/safety/remote_sambanova.mdx index 7e608f1b7..da70fce6c 100644 --- a/docs/source/providers/safety/remote_sambanova.md +++ b/docs/docs/providers/safety/remote_sambanova.mdx @@ -1,3 +1,9 @@ +--- +description: "SambaNova's safety provider for content moderation and safety filtering." +sidebar_label: Remote - Sambanova +title: remote::sambanova +--- + # remote::sambanova ## Description @@ -16,6 +22,4 @@ SambaNova's safety provider for content moderation and safety filtering. ```yaml url: https://api.sambanova.ai/v1 api_key: ${env.SAMBANOVA_API_KEY:=} - ``` - diff --git a/docs/docs/providers/scoring/index.mdx b/docs/docs/providers/scoring/index.mdx new file mode 100644 index 000000000..cb9bc539b --- /dev/null +++ b/docs/docs/providers/scoring/index.mdx @@ -0,0 +1,16 @@ +--- +sidebar_label: Scoring +title: Scoring +--- + +# Scoring + +## Overview + +This section contains documentation for all available providers for the **scoring** API. + +## Providers + +- [Basic](./inline_basic) +- [Braintrust](./inline_braintrust) +- [Llm-As-Judge](./inline_llm-as-judge) diff --git a/docs/source/providers/scoring/inline_basic.md b/docs/docs/providers/scoring/inline_basic.mdx similarity index 51% rename from docs/source/providers/scoring/inline_basic.md rename to docs/docs/providers/scoring/inline_basic.mdx index e9e50cff4..cbafbc40c 100644 --- a/docs/source/providers/scoring/inline_basic.md +++ b/docs/docs/providers/scoring/inline_basic.mdx @@ -1,3 +1,9 @@ +--- +description: "Basic scoring provider for simple evaluation metrics and scoring functions." +sidebar_label: Basic +title: inline::basic +--- + # inline::basic ## Description @@ -8,6 +14,4 @@ Basic scoring provider for simple evaluation metrics and scoring functions. ```yaml {} - ``` - diff --git a/docs/source/providers/scoring/inline_braintrust.md b/docs/docs/providers/scoring/inline_braintrust.mdx similarity index 70% rename from docs/source/providers/scoring/inline_braintrust.md rename to docs/docs/providers/scoring/inline_braintrust.mdx index 70a6a1e26..d12f9de25 100644 --- a/docs/source/providers/scoring/inline_braintrust.md +++ b/docs/docs/providers/scoring/inline_braintrust.mdx @@ -1,3 +1,9 @@ +--- +description: "Braintrust scoring provider for evaluation and scoring using the Braintrust platform." +sidebar_label: Braintrust +title: inline::braintrust +--- + # inline::braintrust ## Description @@ -14,6 +20,4 @@ Braintrust scoring provider for evaluation and scoring using the Braintrust plat ```yaml openai_api_key: ${env.OPENAI_API_KEY:=} - ``` - diff --git a/docs/source/providers/scoring/inline_llm-as-judge.md b/docs/docs/providers/scoring/inline_llm-as-judge.mdx similarity index 50% rename from docs/source/providers/scoring/inline_llm-as-judge.md rename to docs/docs/providers/scoring/inline_llm-as-judge.mdx index 971e02897..22f326623 100644 --- a/docs/source/providers/scoring/inline_llm-as-judge.md +++ b/docs/docs/providers/scoring/inline_llm-as-judge.mdx @@ -1,3 +1,9 @@ +--- +description: "LLM-as-judge scoring provider that uses language models to evaluate and score responses." +sidebar_label: Llm-As-Judge +title: inline::llm-as-judge +--- + # inline::llm-as-judge ## Description @@ -8,6 +14,4 @@ LLM-as-judge scoring provider that uses language models to evaluate and score re ```yaml {} - ``` - diff --git a/docs/source/providers/telemetry/index.md b/docs/docs/providers/telemetry/index.mdx similarity index 58% rename from docs/source/providers/telemetry/index.md rename to docs/docs/providers/telemetry/index.mdx index c7fbfed73..a13481e13 100644 --- a/docs/source/providers/telemetry/index.md +++ b/docs/docs/providers/telemetry/index.mdx @@ -1,3 +1,8 @@ +--- +sidebar_label: Telemetry +title: Telemetry +--- + # Telemetry ## Overview @@ -6,8 +11,4 @@ This section contains documentation for all available providers for the **teleme ## Providers -```{toctree} -:maxdepth: 1 - -inline_meta-reference -``` +- [Meta-Reference](./inline_meta-reference) diff --git a/docs/source/providers/telemetry/inline_meta-reference.md b/docs/docs/providers/telemetry/inline_meta-reference.mdx similarity index 73% rename from docs/source/providers/telemetry/inline_meta-reference.md rename to docs/docs/providers/telemetry/inline_meta-reference.mdx index 3e5f4b842..13fab87f3 100644 --- a/docs/source/providers/telemetry/inline_meta-reference.md +++ b/docs/docs/providers/telemetry/inline_meta-reference.mdx @@ -1,3 +1,9 @@ +--- +description: "Meta's reference implementation of telemetry and observability using OpenTelemetry." +sidebar_label: Meta-Reference +title: inline::meta-reference +--- + # inline::meta-reference ## Description @@ -10,7 +16,7 @@ Meta's reference implementation of telemetry and observability using OpenTelemet |-------|------|----------|---------|-------------| | `otel_exporter_otlp_endpoint` | `str \| None` | No | | The OpenTelemetry collector endpoint URL (base URL for traces, metrics, and logs). If not set, the SDK will use OTEL_EXPORTER_OTLP_ENDPOINT environment variable. | | `service_name` | `` | No | ​ | The service name to use for telemetry | -| `sinks` | `list[inline.telemetry.meta_reference.config.TelemetrySink` | No | [, ] | List of telemetry sinks to enable (possible values: otel_trace, otel_metric, sqlite, console) | +| `sinks` | `list[inline.telemetry.meta_reference.config.TelemetrySink` | No | [<TelemetrySink.CONSOLE: 'console'>, <TelemetrySink.SQLITE: 'sqlite'>] | List of telemetry sinks to enable (possible values: otel_trace, otel_metric, sqlite, console) | | `sqlite_db_path` | `` | No | ~/.llama/runtime/trace_store.db | The path to the SQLite database to use for storing traces | ## Sample Configuration @@ -20,6 +26,4 @@ service_name: "${env.OTEL_SERVICE_NAME:=\u200B}" sinks: ${env.TELEMETRY_SINKS:=console,sqlite} sqlite_db_path: ${env.SQLITE_STORE_DIR:=~/.llama/dummy}/trace_store.db otel_exporter_otlp_endpoint: ${env.OTEL_EXPORTER_OTLP_ENDPOINT:=} - ``` - diff --git a/docs/docs/providers/tool_runtime/index.mdx b/docs/docs/providers/tool_runtime/index.mdx new file mode 100644 index 000000000..051a8c436 --- /dev/null +++ b/docs/docs/providers/tool_runtime/index.mdx @@ -0,0 +1,19 @@ +--- +sidebar_label: Tool Runtime +title: Tool_Runtime +--- + +# Tool_Runtime + +## Overview + +This section contains documentation for all available providers for the **tool_runtime** API. + +## Providers + +- [Rag-Runtime](./inline_rag-runtime) +- [Remote - Bing-Search](./remote_bing-search) +- [Remote - Brave-Search](./remote_brave-search) +- [Remote - Model-Context-Protocol](./remote_model-context-protocol) +- [Remote - Tavily-Search](./remote_tavily-search) +- [Remote - Wolfram-Alpha](./remote_wolfram-alpha) diff --git a/docs/source/providers/tool_runtime/inline_rag-runtime.md b/docs/docs/providers/tool_runtime/inline_rag-runtime.mdx similarity index 50% rename from docs/source/providers/tool_runtime/inline_rag-runtime.md rename to docs/docs/providers/tool_runtime/inline_rag-runtime.mdx index 784b4fdad..97428c2e3 100644 --- a/docs/source/providers/tool_runtime/inline_rag-runtime.md +++ b/docs/docs/providers/tool_runtime/inline_rag-runtime.mdx @@ -1,3 +1,9 @@ +--- +description: "RAG (Retrieval-Augmented Generation) tool runtime for document ingestion, chunking, and semantic search." +sidebar_label: Rag-Runtime +title: inline::rag-runtime +--- + # inline::rag-runtime ## Description @@ -8,6 +14,4 @@ RAG (Retrieval-Augmented Generation) tool runtime for document ingestion, chunki ```yaml {} - ``` - diff --git a/docs/source/providers/tool_runtime/remote_bing-search.md b/docs/docs/providers/tool_runtime/remote_bing-search.mdx similarity index 70% rename from docs/source/providers/tool_runtime/remote_bing-search.md rename to docs/docs/providers/tool_runtime/remote_bing-search.mdx index 0d5df7679..ec06bc20f 100644 --- a/docs/source/providers/tool_runtime/remote_bing-search.md +++ b/docs/docs/providers/tool_runtime/remote_bing-search.mdx @@ -1,3 +1,9 @@ +--- +description: "Bing Search tool for web search capabilities using Microsoft's search engine." +sidebar_label: Remote - Bing-Search +title: remote::bing-search +--- + # remote::bing-search ## Description @@ -15,6 +21,4 @@ Bing Search tool for web search capabilities using Microsoft's search engine. ```yaml api_key: ${env.BING_API_KEY:} - ``` - diff --git a/docs/source/providers/tool_runtime/remote_brave-search.md b/docs/docs/providers/tool_runtime/remote_brave-search.mdx similarity index 74% rename from docs/source/providers/tool_runtime/remote_brave-search.md rename to docs/docs/providers/tool_runtime/remote_brave-search.mdx index 26bc4010d..3aeed67d5 100644 --- a/docs/source/providers/tool_runtime/remote_brave-search.md +++ b/docs/docs/providers/tool_runtime/remote_brave-search.mdx @@ -1,3 +1,9 @@ +--- +description: "Brave Search tool for web search capabilities with privacy-focused results." +sidebar_label: Remote - Brave-Search +title: remote::brave-search +--- + # remote::brave-search ## Description @@ -16,6 +22,4 @@ Brave Search tool for web search capabilities with privacy-focused results. ```yaml api_key: ${env.BRAVE_SEARCH_API_KEY:=} max_results: 3 - ``` - diff --git a/docs/docs/providers/tool_runtime/remote_model-context-protocol.mdx b/docs/docs/providers/tool_runtime/remote_model-context-protocol.mdx new file mode 100644 index 000000000..869ca275a --- /dev/null +++ b/docs/docs/providers/tool_runtime/remote_model-context-protocol.mdx @@ -0,0 +1,17 @@ +--- +description: "Model Context Protocol (MCP) tool for standardized tool calling and context management." +sidebar_label: Remote - Model-Context-Protocol +title: remote::model-context-protocol +--- + +# remote::model-context-protocol + +## Description + +Model Context Protocol (MCP) tool for standardized tool calling and context management. + +## Sample Configuration + +```yaml +{} +``` diff --git a/docs/source/providers/tool_runtime/remote_tavily-search.md b/docs/docs/providers/tool_runtime/remote_tavily-search.mdx similarity index 74% rename from docs/source/providers/tool_runtime/remote_tavily-search.md rename to docs/docs/providers/tool_runtime/remote_tavily-search.mdx index 3dc31534d..fdca31bbe 100644 --- a/docs/source/providers/tool_runtime/remote_tavily-search.md +++ b/docs/docs/providers/tool_runtime/remote_tavily-search.mdx @@ -1,3 +1,9 @@ +--- +description: "Tavily Search tool for AI-optimized web search with structured results." +sidebar_label: Remote - Tavily-Search +title: remote::tavily-search +--- + # remote::tavily-search ## Description @@ -16,6 +22,4 @@ Tavily Search tool for AI-optimized web search with structured results. ```yaml api_key: ${env.TAVILY_SEARCH_API_KEY:=} max_results: 3 - ``` - diff --git a/docs/source/providers/tool_runtime/remote_wolfram-alpha.md b/docs/docs/providers/tool_runtime/remote_wolfram-alpha.mdx similarity index 68% rename from docs/source/providers/tool_runtime/remote_wolfram-alpha.md rename to docs/docs/providers/tool_runtime/remote_wolfram-alpha.mdx index 325c189fd..96bc41789 100644 --- a/docs/source/providers/tool_runtime/remote_wolfram-alpha.md +++ b/docs/docs/providers/tool_runtime/remote_wolfram-alpha.mdx @@ -1,3 +1,9 @@ +--- +description: "Wolfram Alpha tool for computational knowledge and mathematical calculations." +sidebar_label: Remote - Wolfram-Alpha +title: remote::wolfram-alpha +--- + # remote::wolfram-alpha ## Description @@ -14,6 +20,4 @@ Wolfram Alpha tool for computational knowledge and mathematical calculations. ```yaml api_key: ${env.WOLFRAM_ALPHA_API_KEY:=} - ``` - diff --git a/docs/docs/providers/vector_io/index.mdx b/docs/docs/providers/vector_io/index.mdx new file mode 100644 index 000000000..58dca2d13 --- /dev/null +++ b/docs/docs/providers/vector_io/index.mdx @@ -0,0 +1,25 @@ +--- +sidebar_label: Vector Io +title: Vector_Io +--- + +# Vector_Io + +## Overview + +This section contains documentation for all available providers for the **vector_io** API. + +## Providers + +- [Chromadb](./inline_chromadb) +- [Faiss](./inline_faiss) +- [Meta-Reference](./inline_meta-reference) +- [Milvus](./inline_milvus) +- [Qdrant](./inline_qdrant) +- [Sqlite-Vec](./inline_sqlite-vec) +- [Sqlite Vec](./inline_sqlite_vec) +- [Remote - Chromadb](./remote_chromadb) +- [Remote - Milvus](./remote_milvus) +- [Remote - Pgvector](./remote_pgvector) +- [Remote - Qdrant](./remote_qdrant) +- [Remote - Weaviate](./remote_weaviate) diff --git a/docs/source/providers/vector_io/inline_chromadb.md b/docs/docs/providers/vector_io/inline_chromadb.mdx similarity index 60% rename from docs/source/providers/vector_io/inline_chromadb.md rename to docs/docs/providers/vector_io/inline_chromadb.mdx index 518e3f689..a1858eacc 100644 --- a/docs/source/providers/vector_io/inline_chromadb.md +++ b/docs/docs/providers/vector_io/inline_chromadb.mdx @@ -1,3 +1,40 @@ +--- +description: | + [Chroma](https://www.trychroma.com/) is an inline and remote vector + database provider for Llama Stack. It allows you to store and query vectors directly within a Chroma database. + That means you're not limited to storing vectors in memory or in a separate service. + + ## Features + Chroma supports: + - Store embeddings and their metadata + - Vector search + - Full-text search + - Document storage + - Metadata filtering + - Multi-modal retrieval + + ## Usage + + To use Chrome in your Llama Stack project, follow these steps: + + 1. Install the necessary dependencies. + 2. Configure your Llama Stack project to use chroma. + 3. Start storing and querying vectors. + + ## Installation + + You can install chroma using pip: + + ```bash + pip install chromadb + ``` + + ## Documentation + See [Chroma's documentation](https://docs.trychroma.com/docs/overview/introduction) for more details about Chroma in general. +sidebar_label: Chromadb +title: inline::chromadb +--- + # inline::chromadb ## Description @@ -51,6 +88,4 @@ db_path: ${env.CHROMADB_PATH} kvstore: type: sqlite db_path: ${env.SQLITE_STORE_DIR:=~/.llama/dummy}/chroma_inline_registry.db - ``` - diff --git a/docs/source/providers/vector_io/inline_faiss.md b/docs/docs/providers/vector_io/inline_faiss.mdx similarity index 55% rename from docs/source/providers/vector_io/inline_faiss.md rename to docs/docs/providers/vector_io/inline_faiss.mdx index cfa18a839..03bc2a928 100644 --- a/docs/source/providers/vector_io/inline_faiss.md +++ b/docs/docs/providers/vector_io/inline_faiss.mdx @@ -1,3 +1,49 @@ +--- +description: | + [Faiss](https://github.com/facebookresearch/faiss) is an inline vector database provider for Llama Stack. It + allows you to store and query vectors directly in memory. + That means you'll get fast and efficient vector retrieval. + + ## Features + + - Lightweight and easy to use + - Fully integrated with Llama Stack + - GPU support + - **Vector search** - FAISS supports pure vector similarity search using embeddings + + ## Search Modes + + **Supported:** + - **Vector Search** (`mode="vector"`): Performs vector similarity search using embeddings + + **Not Supported:** + - **Keyword Search** (`mode="keyword"`): Not supported by FAISS + - **Hybrid Search** (`mode="hybrid"`): Not supported by FAISS + + > **Note**: FAISS is designed as a pure vector similarity search library. See the [FAISS GitHub repository](https://github.com/facebookresearch/faiss) for more details about FAISS's core functionality. + + ## Usage + + To use Faiss in your Llama Stack project, follow these steps: + + 1. Install the necessary dependencies. + 2. Configure your Llama Stack project to use Faiss. + 3. Start storing and querying vectors. + + ## Installation + + You can install Faiss using pip: + + ```bash + pip install faiss-cpu + ``` + ## Documentation + See [Faiss' documentation](https://faiss.ai/) or the [Faiss Wiki](https://github.com/facebookresearch/faiss/wiki) for + more details about Faiss in general. +sidebar_label: Faiss +title: inline::faiss +--- + # inline::faiss ## Description @@ -57,6 +103,4 @@ more details about Faiss in general. kvstore: type: sqlite db_path: ${env.SQLITE_STORE_DIR:=~/.llama/dummy}/faiss_store.db - ``` - diff --git a/docs/source/providers/vector_io/inline_meta-reference.md b/docs/docs/providers/vector_io/inline_meta-reference.mdx similarity index 80% rename from docs/source/providers/vector_io/inline_meta-reference.md rename to docs/docs/providers/vector_io/inline_meta-reference.mdx index 6f269c441..bcad86750 100644 --- a/docs/source/providers/vector_io/inline_meta-reference.md +++ b/docs/docs/providers/vector_io/inline_meta-reference.mdx @@ -1,3 +1,9 @@ +--- +description: "Meta's reference implementation of a vector database." +sidebar_label: Meta-Reference +title: inline::meta-reference +--- + # inline::meta-reference ## Description @@ -16,12 +22,9 @@ Meta's reference implementation of a vector database. kvstore: type: sqlite db_path: ${env.SQLITE_STORE_DIR:=~/.llama/dummy}/faiss_store.db - ``` - ## Deprecation Notice -```{warning} +:::warning Please use the `inline::faiss` provider instead. -``` - +::: diff --git a/docs/source/providers/vector_io/inline_milvus.md b/docs/docs/providers/vector_io/inline_milvus.mdx similarity index 87% rename from docs/source/providers/vector_io/inline_milvus.md rename to docs/docs/providers/vector_io/inline_milvus.mdx index 33ea4d179..7e6f15c81 100644 --- a/docs/source/providers/vector_io/inline_milvus.md +++ b/docs/docs/providers/vector_io/inline_milvus.mdx @@ -1,3 +1,9 @@ +--- +description: "Please refer to the remote provider documentation." +sidebar_label: Milvus +title: inline::milvus +--- + # inline::milvus ## Description @@ -21,6 +27,4 @@ db_path: ${env.MILVUS_DB_PATH:=~/.llama/dummy}/milvus.db kvstore: type: sqlite db_path: ${env.SQLITE_STORE_DIR:=~/.llama/dummy}/milvus_registry.db - ``` - diff --git a/docs/source/providers/vector_io/inline_qdrant.md b/docs/docs/providers/vector_io/inline_qdrant.mdx similarity index 56% rename from docs/source/providers/vector_io/inline_qdrant.md rename to docs/docs/providers/vector_io/inline_qdrant.mdx index b5072d220..5c9ab10f2 100644 --- a/docs/source/providers/vector_io/inline_qdrant.md +++ b/docs/docs/providers/vector_io/inline_qdrant.mdx @@ -1,3 +1,50 @@ +--- +description: | + [Qdrant](https://qdrant.tech/documentation/) is an inline and remote vector database provider for Llama Stack. It + allows you to store and query vectors directly in memory. + That means you'll get fast and efficient vector retrieval. + + > By default, Qdrant stores vectors in RAM, delivering incredibly fast access for datasets that fit comfortably in + > memory. But when your dataset exceeds RAM capacity, Qdrant offers Memmap as an alternative. + > + > \[[An Introduction to Vector Databases](https://qdrant.tech/articles/what-is-a-vector-database/)\] + + + + ## Features + + - Lightweight and easy to use + - Fully integrated with Llama Stack + - Apache 2.0 license terms + - Store embeddings and their metadata + - Supports search by + [Keyword](https://qdrant.tech/articles/qdrant-introduces-full-text-filters-and-indexes/) + and [Hybrid](https://qdrant.tech/articles/hybrid-search/#building-a-hybrid-search-system-in-qdrant) search + - [Multilingual and Multimodal retrieval](https://qdrant.tech/documentation/multimodal-search/) + - [Medatata filtering](https://qdrant.tech/articles/vector-search-filtering/) + - [GPU support](https://qdrant.tech/documentation/guides/running-with-gpu/) + + ## Usage + + To use Qdrant in your Llama Stack project, follow these steps: + + 1. Install the necessary dependencies. + 2. Configure your Llama Stack project to use Qdrant. + 3. Start storing and querying vectors. + + ## Installation + + You can install Qdrant using docker: + + ```bash + docker pull qdrant/qdrant + ``` + ## Documentation + See the [Qdrant documentation](https://qdrant.tech/documentation/) for more details about Qdrant in general. +sidebar_label: Qdrant +title: inline::qdrant +--- + # inline::qdrant ## Description @@ -60,6 +107,4 @@ path: ${env.QDRANT_PATH:=~/.llama/~/.llama/dummy}/qdrant.db kvstore: type: sqlite db_path: ${env.SQLITE_STORE_DIR:=~/.llama/dummy}/qdrant_registry.db - ``` - diff --git a/docs/source/providers/vector_io/inline_sqlite-vec.md b/docs/docs/providers/vector_io/inline_sqlite-vec.mdx similarity index 51% rename from docs/source/providers/vector_io/inline_sqlite-vec.md rename to docs/docs/providers/vector_io/inline_sqlite-vec.mdx index 854bb9d08..aa6992a56 100644 --- a/docs/source/providers/vector_io/inline_sqlite-vec.md +++ b/docs/docs/providers/vector_io/inline_sqlite-vec.mdx @@ -1,3 +1,205 @@ +--- +description: | + [SQLite-Vec](https://github.com/asg017/sqlite-vec) is an inline vector database provider for Llama Stack. It + allows you to store and query vectors directly within an SQLite database. + That means you're not limited to storing vectors in memory or in a separate service. + + ## Features + + - Lightweight and easy to use + - Fully integrated with Llama Stacks + - Uses disk-based storage for persistence, allowing for larger vector storage + + ### Comparison to Faiss + + The choice between Faiss and sqlite-vec should be made based on the needs of your application, + as they have different strengths. + + #### Choosing the Right Provider + + Scenario | Recommended Tool | Reason + -- |-----------------| -- + Online Analytical Processing (OLAP) | Faiss | Fast, in-memory searches + Online Transaction Processing (OLTP) | sqlite-vec | Frequent writes and reads + Frequent writes | sqlite-vec | Efficient disk-based storage and incremental indexing + Large datasets | sqlite-vec | Disk-based storage for larger vector storage + Datasets that can fit in memory, frequent reads | Faiss | Optimized for speed, indexing, and GPU acceleration + + #### Empirical Example + + Consider the histogram below in which 10,000 randomly generated strings were inserted + in batches of 100 into both Faiss and sqlite-vec using `client.tool_runtime.rag_tool.insert()`. + + ```{image} ../../../../_static/providers/vector_io/write_time_comparison_sqlite-vec-faiss.png + :alt: Comparison of SQLite-Vec and Faiss write times + :width: 400px + ``` + + You will notice that the average write time for `sqlite-vec` was 788ms, compared to + 47,640ms for Faiss. While the number is jarring, if you look at the distribution, you can see that it is rather + uniformly spread across the [1500, 100000] interval. + + Looking at each individual write in the order that the documents are inserted you'll see the increase in + write speed as Faiss reindexes the vectors after each write. + ```{image} ../../../../_static/providers/vector_io/write_time_sequence_sqlite-vec-faiss.png + :alt: Comparison of SQLite-Vec and Faiss write times + :width: 400px + ``` + + In comparison, the read times for Faiss was on average 10% faster than sqlite-vec. + The modes of the two distributions highlight the differences much further where Faiss + will likely yield faster read performance. + + ```{image} ../../../../_static/providers/vector_io/read_time_comparison_sqlite-vec-faiss.png + :alt: Comparison of SQLite-Vec and Faiss read times + :width: 400px + ``` + + ## Usage + + To use sqlite-vec in your Llama Stack project, follow these steps: + + 1. Install the necessary dependencies. + 2. Configure your Llama Stack project to use SQLite-Vec. + 3. Start storing and querying vectors. + + The SQLite-vec provider supports three search modes: + + 1. **Vector Search** (`mode="vector"`): Performs pure vector similarity search using the embeddings. + 2. **Keyword Search** (`mode="keyword"`): Performs full-text search using SQLite's FTS5. + 3. **Hybrid Search** (`mode="hybrid"`): Combines both vector and keyword search for better results. First performs keyword search to get candidate matches, then applies vector similarity search on those candidates. + + Example with hybrid search: + ```python + response = await vector_io.query_chunks( + vector_db_id="my_db", + query="your query here", + params={"mode": "hybrid", "max_chunks": 3, "score_threshold": 0.7}, + ) + + # Using RRF ranker + response = await vector_io.query_chunks( + vector_db_id="my_db", + query="your query here", + params={ + "mode": "hybrid", + "max_chunks": 3, + "score_threshold": 0.7, + "ranker": {"type": "rrf", "impact_factor": 60.0}, + }, + ) + + # Using weighted ranker + response = await vector_io.query_chunks( + vector_db_id="my_db", + query="your query here", + params={ + "mode": "hybrid", + "max_chunks": 3, + "score_threshold": 0.7, + "ranker": {"type": "weighted", "alpha": 0.7}, # 70% vector, 30% keyword + }, + ) + ``` + + Example with explicit vector search: + ```python + response = await vector_io.query_chunks( + vector_db_id="my_db", + query="your query here", + params={"mode": "vector", "max_chunks": 3, "score_threshold": 0.7}, + ) + ``` + + Example with keyword search: + ```python + response = await vector_io.query_chunks( + vector_db_id="my_db", + query="your query here", + params={"mode": "keyword", "max_chunks": 3, "score_threshold": 0.7}, + ) + ``` + + ## Supported Search Modes + + The SQLite vector store supports three search modes: + + 1. **Vector Search** (`mode="vector"`): Uses vector similarity to find relevant chunks + 2. **Keyword Search** (`mode="keyword"`): Uses keyword matching to find relevant chunks + 3. **Hybrid Search** (`mode="hybrid"`): Combines both vector and keyword scores using a ranker + + ### Hybrid Search + + Hybrid search combines the strengths of both vector and keyword search by: + - Computing vector similarity scores + - Computing keyword match scores + - Using a ranker to combine these scores + + Two ranker types are supported: + + 1. **RRF (Reciprocal Rank Fusion)**: + - Combines ranks from both vector and keyword results + - Uses an impact factor (default: 60.0) to control the weight of higher-ranked results + - Good for balancing between vector and keyword results + - The default impact factor of 60.0 comes from the original RRF paper by Cormack et al. (2009) [^1], which found this value to provide optimal performance across various retrieval tasks + + 2. **Weighted**: + - Linearly combines normalized vector and keyword scores + - Uses an alpha parameter (0-1) to control the blend: + - alpha=0: Only use keyword scores + - alpha=1: Only use vector scores + - alpha=0.5: Equal weight to both (default) + + Example using RAGQueryConfig with different search modes: + + ```python + from llama_stack.apis.tools import RAGQueryConfig, RRFRanker, WeightedRanker + + # Vector search + config = RAGQueryConfig(mode="vector", max_chunks=5) + + # Keyword search + config = RAGQueryConfig(mode="keyword", max_chunks=5) + + # Hybrid search with custom RRF ranker + config = RAGQueryConfig( + mode="hybrid", + max_chunks=5, + ranker=RRFRanker(impact_factor=50.0), # Custom impact factor + ) + + # Hybrid search with weighted ranker + config = RAGQueryConfig( + mode="hybrid", + max_chunks=5, + ranker=WeightedRanker(alpha=0.7), # 70% vector, 30% keyword + ) + + # Hybrid search with default RRF ranker + config = RAGQueryConfig( + mode="hybrid", max_chunks=5 + ) # Will use RRF with impact_factor=60.0 + ``` + + Note: The ranker configuration is only used in hybrid mode. For vector or keyword modes, the ranker parameter is ignored. + + ## Installation + + You can install SQLite-Vec using pip: + + ```bash + pip install sqlite-vec + ``` + + ## Documentation + + See [sqlite-vec's GitHub repo](https://github.com/asg017/sqlite-vec/tree/main) for more details about sqlite-vec in general. + + [^1]: Cormack, G. V., Clarke, C. L., & Buettcher, S. (2009). [Reciprocal rank fusion outperforms condorcet and individual rank learning methods](https://dl.acm.org/doi/10.1145/1571941.1572114). In Proceedings of the 32nd international ACM SIGIR conference on Research and development in information retrieval (pp. 758-759). +sidebar_label: Sqlite-Vec +title: inline::sqlite-vec +--- + # inline::sqlite-vec ## Description @@ -215,6 +417,4 @@ db_path: ${env.SQLITE_STORE_DIR:=~/.llama/dummy}/sqlite_vec.db kvstore: type: sqlite db_path: ${env.SQLITE_STORE_DIR:=~/.llama/dummy}/sqlite_vec_registry.db - ``` - diff --git a/docs/source/providers/vector_io/inline_sqlite_vec.md b/docs/docs/providers/vector_io/inline_sqlite_vec.mdx similarity index 85% rename from docs/source/providers/vector_io/inline_sqlite_vec.md rename to docs/docs/providers/vector_io/inline_sqlite_vec.mdx index 9e5654a50..7f69f617d 100644 --- a/docs/source/providers/vector_io/inline_sqlite_vec.md +++ b/docs/docs/providers/vector_io/inline_sqlite_vec.mdx @@ -1,3 +1,9 @@ +--- +description: "Please refer to the sqlite-vec provider documentation." +sidebar_label: Sqlite Vec +title: inline::sqlite_vec +--- + # inline::sqlite_vec ## Description @@ -20,12 +26,9 @@ db_path: ${env.SQLITE_STORE_DIR:=~/.llama/dummy}/sqlite_vec.db kvstore: type: sqlite db_path: ${env.SQLITE_STORE_DIR:=~/.llama/dummy}/sqlite_vec_registry.db - ``` - ## Deprecation Notice -```{warning} +:::warning Please use the `inline::sqlite-vec` provider (notice the hyphen instead of underscore) instead. -``` - +::: diff --git a/docs/source/providers/vector_io/remote_chromadb.md b/docs/docs/providers/vector_io/remote_chromadb.mdx similarity index 59% rename from docs/source/providers/vector_io/remote_chromadb.md rename to docs/docs/providers/vector_io/remote_chromadb.mdx index badfebe90..807771003 100644 --- a/docs/source/providers/vector_io/remote_chromadb.md +++ b/docs/docs/providers/vector_io/remote_chromadb.mdx @@ -1,3 +1,40 @@ +--- +description: | + [Chroma](https://www.trychroma.com/) is an inline and remote vector + database provider for Llama Stack. It allows you to store and query vectors directly within a Chroma database. + That means you're not limited to storing vectors in memory or in a separate service. + + ## Features + Chroma supports: + - Store embeddings and their metadata + - Vector search + - Full-text search + - Document storage + - Metadata filtering + - Multi-modal retrieval + + ## Usage + + To use Chrome in your Llama Stack project, follow these steps: + + 1. Install the necessary dependencies. + 2. Configure your Llama Stack project to use chroma. + 3. Start storing and querying vectors. + + ## Installation + + You can install chroma using pip: + + ```bash + pip install chromadb + ``` + + ## Documentation + See [Chroma's documentation](https://docs.trychroma.com/docs/overview/introduction) for more details about Chroma in general. +sidebar_label: Remote - Chromadb +title: remote::chromadb +--- + # remote::chromadb ## Description @@ -50,6 +87,4 @@ url: ${env.CHROMADB_URL} kvstore: type: sqlite db_path: ${env.SQLITE_STORE_DIR:=~/.llama/dummy}/chroma_remote_registry.db - ``` - diff --git a/docs/source/providers/vector_io/remote_milvus.md b/docs/docs/providers/vector_io/remote_milvus.mdx similarity index 50% rename from docs/source/providers/vector_io/remote_milvus.md rename to docs/docs/providers/vector_io/remote_milvus.mdx index 8974ada10..ae796837d 100644 --- a/docs/source/providers/vector_io/remote_milvus.md +++ b/docs/docs/providers/vector_io/remote_milvus.mdx @@ -1,3 +1,204 @@ +--- +description: | + [Milvus](https://milvus.io/) is an inline and remote vector database provider for Llama Stack. It + allows you to store and query vectors directly within a Milvus database. + That means you're not limited to storing vectors in memory or in a separate service. + + ## Features + + - Easy to use + - Fully integrated with Llama Stack + - Supports all search modes: vector, keyword, and hybrid search (both inline and remote configurations) + + ## Usage + + To use Milvus in your Llama Stack project, follow these steps: + + 1. Install the necessary dependencies. + 2. Configure your Llama Stack project to use Milvus. + 3. Start storing and querying vectors. + + ## Installation + + If you want to use inline Milvus, you can install: + + ```bash + pip install pymilvus[milvus-lite] + ``` + + If you want to use remote Milvus, you can install: + + ```bash + pip install pymilvus + ``` + + ## Configuration + + In Llama Stack, Milvus can be configured in two ways: + - **Inline (Local) Configuration** - Uses Milvus-Lite for local storage + - **Remote Configuration** - Connects to a remote Milvus server + + ### Inline (Local) Configuration + + The simplest method is local configuration, which requires setting `db_path`, a path for locally storing Milvus-Lite files: + + ```yaml + vector_io: + - provider_id: milvus + provider_type: inline::milvus + config: + db_path: ~/.llama/distributions/together/milvus_store.db + ``` + + ### Remote Configuration + + Remote configuration is suitable for larger data storage requirements: + + #### Standard Remote Connection + + ```yaml + vector_io: + - provider_id: milvus + provider_type: remote::milvus + config: + uri: "http://:" + token: ":" + ``` + + #### TLS-Enabled Remote Connection (One-way TLS) + + For connections to Milvus instances with one-way TLS enabled: + + ```yaml + vector_io: + - provider_id: milvus + provider_type: remote::milvus + config: + uri: "https://:" + token: ":" + secure: True + server_pem_path: "/path/to/server.pem" + ``` + + #### Mutual TLS (mTLS) Remote Connection + + For connections to Milvus instances with mutual TLS (mTLS) enabled: + + ```yaml + vector_io: + - provider_id: milvus + provider_type: remote::milvus + config: + uri: "https://:" + token: ":" + secure: True + ca_pem_path: "/path/to/ca.pem" + client_pem_path: "/path/to/client.pem" + client_key_path: "/path/to/client.key" + ``` + + #### Key Parameters for TLS Configuration + + - **`secure`**: Enables TLS encryption when set to `true`. Defaults to `false`. + - **`server_pem_path`**: Path to the **server certificate** for verifying the server's identity (used in one-way TLS). + - **`ca_pem_path`**: Path to the **Certificate Authority (CA) certificate** for validating the server certificate (required in mTLS). + - **`client_pem_path`**: Path to the **client certificate** file (required for mTLS). + - **`client_key_path`**: Path to the **client private key** file (required for mTLS). + + ## Search Modes + + Milvus supports three different search modes for both inline and remote configurations: + + ### Vector Search + Vector search uses semantic similarity to find the most relevant chunks based on embedding vectors. This is the default search mode and works well for finding conceptually similar content. + + ```python + # Vector search example + search_response = client.vector_stores.search( + vector_store_id=vector_store.id, + query="What is machine learning?", + search_mode="vector", + max_num_results=5, + ) + ``` + + ### Keyword Search + Keyword search uses traditional text-based matching to find chunks containing specific terms or phrases. This is useful when you need exact term matches. + + ```python + # Keyword search example + search_response = client.vector_stores.search( + vector_store_id=vector_store.id, + query="Python programming language", + search_mode="keyword", + max_num_results=5, + ) + ``` + + ### Hybrid Search + Hybrid search combines both vector and keyword search methods to provide more comprehensive results. It leverages the strengths of both semantic similarity and exact term matching. + + #### Basic Hybrid Search + ```python + # Basic hybrid search example (uses RRF ranker with default impact_factor=60.0) + search_response = client.vector_stores.search( + vector_store_id=vector_store.id, + query="neural networks in Python", + search_mode="hybrid", + max_num_results=5, + ) + ``` + + **Note**: The default `impact_factor` value of 60.0 was empirically determined to be optimal in the original RRF research paper: ["Reciprocal Rank Fusion outperforms Condorcet and individual Rank Learning Methods"](https://plg.uwaterloo.ca/~gvcormac/cormacksigir09-rrf.pdf) (Cormack et al., 2009). + + #### Hybrid Search with RRF (Reciprocal Rank Fusion) Ranker + RRF combines rankings from vector and keyword search by using reciprocal ranks. The impact factor controls how much weight is given to higher-ranked results. + + ```python + # Hybrid search with custom RRF parameters + search_response = client.vector_stores.search( + vector_store_id=vector_store.id, + query="neural networks in Python", + search_mode="hybrid", + max_num_results=5, + ranking_options={ + "ranker": { + "type": "rrf", + "impact_factor": 100.0, # Higher values give more weight to top-ranked results + } + }, + ) + ``` + + #### Hybrid Search with Weighted Ranker + Weighted ranker linearly combines normalized scores from vector and keyword search. The alpha parameter controls the balance between the two search methods. + + ```python + # Hybrid search with weighted ranker + search_response = client.vector_stores.search( + vector_store_id=vector_store.id, + query="neural networks in Python", + search_mode="hybrid", + max_num_results=5, + ranking_options={ + "ranker": { + "type": "weighted", + "alpha": 0.7, # 70% vector search, 30% keyword search + } + }, + ) + ``` + + For detailed documentation on RRF and Weighted rankers, please refer to the [Milvus Reranking Guide](https://milvus.io/docs/reranking.md). + + ## Documentation + See the [Milvus documentation](https://milvus.io/docs/install-overview.md) for more details about Milvus in general. + + For more details on TLS configuration, refer to the [TLS setup guide](https://milvus.io/docs/tls.md). +sidebar_label: Remote - Milvus +title: remote::milvus +--- + # remote::milvus ## Description @@ -208,12 +409,11 @@ For more details on TLS configuration, refer to the [TLS setup guide](https://mi | `token` | `str \| None` | No | | The token of the Milvus server | | `consistency_level` | `` | No | Strong | The consistency level of the Milvus server | | `kvstore` | `utils.kvstore.config.RedisKVStoreConfig \| utils.kvstore.config.SqliteKVStoreConfig \| utils.kvstore.config.PostgresKVStoreConfig \| utils.kvstore.config.MongoDBKVStoreConfig` | No | sqlite | Config for KV store backend | -| `config` | `dict` | No | {} | This configuration allows additional fields to be passed through to the underlying Milvus client. See the [Milvus](https://milvus.io/docs/install-overview.md) documentation for more details about Milvus in general. | - -```{note} - This configuration class accepts additional fields beyond those listed above. You can pass any additional configuration options that will be forwarded to the underlying provider. - ``` +| `config` | `dict` | No | {} | This configuration allows additional fields to be passed through to the underlying Milvus client. See the [Milvus](https://milvus.io/docs/install-overview.md) documentation for more details about Milvus in general. | +:::note +This configuration class accepts additional fields beyond those listed above. You can pass any additional configuration options that will be forwarded to the underlying provider. +::: ## Sample Configuration @@ -223,6 +423,4 @@ token: ${env.MILVUS_TOKEN} kvstore: type: sqlite db_path: ${env.SQLITE_STORE_DIR:=~/.llama/dummy}/milvus_remote_registry.db - ``` - diff --git a/docs/source/providers/vector_io/remote_pgvector.md b/docs/docs/providers/vector_io/remote_pgvector.mdx similarity index 53% rename from docs/source/providers/vector_io/remote_pgvector.md rename to docs/docs/providers/vector_io/remote_pgvector.mdx index 6312edabc..d21810c68 100644 --- a/docs/source/providers/vector_io/remote_pgvector.md +++ b/docs/docs/providers/vector_io/remote_pgvector.mdx @@ -1,3 +1,108 @@ +--- +description: | + [PGVector](https://github.com/pgvector/pgvector) is a remote vector database provider for Llama Stack. It + allows you to store and query vectors directly in memory. + That means you'll get fast and efficient vector retrieval. + + ## Features + + - Easy to use + - Fully integrated with Llama Stack + + There are three implementations of search for PGVectoIndex available: + + 1. Vector Search: + - How it works: + - Uses PostgreSQL's vector extension (pgvector) to perform similarity search + - Compares query embeddings against stored embeddings using Cosine distance or other distance metrics + - Eg. SQL query: SELECT document, embedding <=> %s::vector AS distance FROM table ORDER BY distance + + -Characteristics: + - Semantic understanding - finds documents similar in meaning even if they don't share keywords + - Works with high-dimensional vector embeddings (typically 768, 1024, or higher dimensions) + - Best for: Finding conceptually related content, handling synonyms, cross-language search + + 2. Keyword Search + - How it works: + - Uses PostgreSQL's full-text search capabilities with tsvector and ts_rank + - Converts text to searchable tokens using to_tsvector('english', text). Default language is English. + - Eg. SQL query: SELECT document, ts_rank(tokenized_content, plainto_tsquery('english', %s)) AS score + + - Characteristics: + - Lexical matching - finds exact keyword matches and variations + - Uses GIN (Generalized Inverted Index) for fast text search performance + - Scoring: Uses PostgreSQL's ts_rank function for relevance scoring + - Best for: Exact term matching, proper names, technical terms, Boolean-style queries + + 3. Hybrid Search + - How it works: + - Combines both vector and keyword search results + - Runs both searches independently, then merges results using configurable reranking + + - Two reranking strategies available: + - Reciprocal Rank Fusion (RRF) - (default: 60.0) + - Weighted Average - (default: 0.5) + + - Characteristics: + - Best of both worlds: semantic understanding + exact matching + - Documents appearing in both searches get boosted scores + - Configurable balance between semantic and lexical matching + - Best for: General-purpose search where you want both precision and recall + + 4. Database Schema + The PGVector implementation stores data optimized for all three search types: + CREATE TABLE vector_store_xxx ( + id TEXT PRIMARY KEY, + document JSONB, -- Original document + embedding vector(dimension), -- For vector search + content_text TEXT, -- Raw text content + tokenized_content TSVECTOR -- For keyword search + ); + + -- Indexes for performance + CREATE INDEX content_gin_idx ON table USING GIN(tokenized_content); -- Keyword search + -- Vector index created automatically by pgvector + + ## Usage + + To use PGVector in your Llama Stack project, follow these steps: + + 1. Install the necessary dependencies. + 2. Configure your Llama Stack project to use pgvector. (e.g. remote::pgvector). + 3. Start storing and querying vectors. + + ## This is an example how you can set up your environment for using PGVector + + 1. Export env vars: + ```bash + export ENABLE_PGVECTOR=true + export PGVECTOR_HOST=localhost + export PGVECTOR_PORT=5432 + export PGVECTOR_DB=llamastack + export PGVECTOR_USER=llamastack + export PGVECTOR_PASSWORD=llamastack + ``` + + 2. Create DB: + ```bash + psql -h localhost -U postgres -c "CREATE ROLE llamastack LOGIN PASSWORD 'llamastack';" + psql -h localhost -U postgres -c "CREATE DATABASE llamastack OWNER llamastack;" + psql -h localhost -U llamastack -d llamastack -c "CREATE EXTENSION IF NOT EXISTS vector;" + ``` + + ## Installation + + You can install PGVector using docker: + + ```bash + docker pull pgvector/pgvector:pg17 + ``` + ## Documentation + See [PGVector's documentation](https://github.com/pgvector/pgvector) for more details about PGVector in general. +sidebar_label: Remote - Pgvector +title: remote::pgvector +--- + # remote::pgvector ## Description @@ -18,7 +123,7 @@ There are three implementations of search for PGVectoIndex available: - How it works: - Uses PostgreSQL's vector extension (pgvector) to perform similarity search - Compares query embeddings against stored embeddings using Cosine distance or other distance metrics - - Eg. SQL query: SELECT document, embedding <=> %s::vector AS distance FROM table ORDER BY distance + - Eg. SQL query: SELECT document, embedding <=> %s::vector AS distance FROM table ORDER BY distance -Characteristics: - Semantic understanding - finds documents similar in meaning even if they don't share keywords @@ -126,6 +231,4 @@ password: ${env.PGVECTOR_PASSWORD} kvstore: type: sqlite db_path: ${env.SQLITE_STORE_DIR:=~/.llama/dummy}/pgvector_registry.db - ``` - diff --git a/docs/source/providers/vector_io/remote_qdrant.md b/docs/docs/providers/vector_io/remote_qdrant.mdx similarity index 88% rename from docs/source/providers/vector_io/remote_qdrant.md rename to docs/docs/providers/vector_io/remote_qdrant.mdx index 043141007..c44a2b937 100644 --- a/docs/source/providers/vector_io/remote_qdrant.md +++ b/docs/docs/providers/vector_io/remote_qdrant.mdx @@ -1,3 +1,9 @@ +--- +description: "Please refer to the inline provider documentation." +sidebar_label: Remote - Qdrant +title: remote::qdrant +--- + # remote::qdrant ## Description @@ -29,6 +35,4 @@ api_key: ${env.QDRANT_API_KEY:=} kvstore: type: sqlite db_path: ${env.SQLITE_STORE_DIR:=~/.llama/dummy}/qdrant_registry.db - ``` - diff --git a/docs/source/providers/vector_io/remote_weaviate.md b/docs/docs/providers/vector_io/remote_weaviate.mdx similarity index 63% rename from docs/source/providers/vector_io/remote_weaviate.md rename to docs/docs/providers/vector_io/remote_weaviate.mdx index 8fb0f7c11..3f1e36422 100644 --- a/docs/source/providers/vector_io/remote_weaviate.md +++ b/docs/docs/providers/vector_io/remote_weaviate.mdx @@ -1,3 +1,38 @@ +--- +description: | + [Weaviate](https://weaviate.io/) is a vector database provider for Llama Stack. + It allows you to store and query vectors directly within a Weaviate database. + That means you're not limited to storing vectors in memory or in a separate service. + + ## Features + Weaviate supports: + - Store embeddings and their metadata + - Vector search + - Full-text search + - Hybrid search + - Document storage + - Metadata filtering + - Multi-modal retrieval + + + ## Usage + + To use Weaviate in your Llama Stack project, follow these steps: + + 1. Install the necessary dependencies. + 2. Configure your Llama Stack project to use chroma. + 3. Start storing and querying vectors. + + ## Installation + + To install Weaviate see the [Weaviate quickstart documentation](https://weaviate.io/developers/weaviate/quickstart). + + ## Documentation + See [Weaviate's documentation](https://weaviate.io/developers/weaviate) for more details about Weaviate in general. +sidebar_label: Remote - Weaviate +title: remote::weaviate +--- + # remote::weaviate ## Description @@ -50,6 +85,4 @@ weaviate_cluster_url: ${env.WEAVIATE_CLUSTER_URL:=localhost:8080} kvstore: type: sqlite db_path: ${env.SQLITE_STORE_DIR:=~/.llama/dummy}/weaviate_registry.db - ``` - diff --git a/docs/source/providers/datasetio/index.md b/docs/source/providers/datasetio/index.md deleted file mode 100644 index 94a97e2ed..000000000 --- a/docs/source/providers/datasetio/index.md +++ /dev/null @@ -1,15 +0,0 @@ -# Datasetio - -## Overview - -This section contains documentation for all available providers for the **datasetio** API. - -## Providers - -```{toctree} -:maxdepth: 1 - -inline_localfs -remote_huggingface -remote_nvidia -``` diff --git a/docs/source/providers/eval/index.md b/docs/source/providers/eval/index.md deleted file mode 100644 index a14fada1d..000000000 --- a/docs/source/providers/eval/index.md +++ /dev/null @@ -1,16 +0,0 @@ -# Eval - -## Overview - -Llama Stack Evaluation API for running evaluations on model and agent candidates. - -This section contains documentation for all available providers for the **eval** API. - -## Providers - -```{toctree} -:maxdepth: 1 - -inline_meta-reference -remote_nvidia -``` diff --git a/docs/source/providers/inference/index.md b/docs/source/providers/inference/index.md deleted file mode 100644 index c5720daef..000000000 --- a/docs/source/providers/inference/index.md +++ /dev/null @@ -1,42 +0,0 @@ -# Inference - -## Overview - -Llama Stack Inference API for generating completions, chat completions, and embeddings. - - This API provides the raw interface to the underlying models. Two kinds of models are supported: - - LLM models: these models generate "raw" and "chat" (conversational) completions. - - Embedding models: these models generate embeddings to be used for semantic search. - -This section contains documentation for all available providers for the **inference** API. - -## Providers - -```{toctree} -:maxdepth: 1 - -inline_meta-reference -inline_sentence-transformers -remote_anthropic -remote_azure -remote_bedrock -remote_cerebras -remote_databricks -remote_fireworks -remote_gemini -remote_groq -remote_hf_endpoint -remote_hf_serverless -remote_llama-openai-compat -remote_nvidia -remote_ollama -remote_openai -remote_passthrough -remote_runpod -remote_sambanova -remote_tgi -remote_together -remote_vertexai -remote_vllm -remote_watsonx -``` diff --git a/docs/source/providers/inference/inline_sentence-transformers.md b/docs/source/providers/inference/inline_sentence-transformers.md deleted file mode 100644 index 57ec7f7d0..000000000 --- a/docs/source/providers/inference/inline_sentence-transformers.md +++ /dev/null @@ -1,13 +0,0 @@ -# inline::sentence-transformers - -## Description - -Sentence Transformers inference provider for text embeddings and similarity search. - -## Sample Configuration - -```yaml -{} - -``` - diff --git a/docs/source/providers/post_training/index.md b/docs/source/providers/post_training/index.md deleted file mode 100644 index e69f2a45a..000000000 --- a/docs/source/providers/post_training/index.md +++ /dev/null @@ -1,16 +0,0 @@ -# Post_Training - -## Overview - -This section contains documentation for all available providers for the **post_training** API. - -## Providers - -```{toctree} -:maxdepth: 1 - -inline_huggingface-gpu -inline_torchtune-cpu -inline_torchtune-gpu -remote_nvidia -``` diff --git a/docs/source/providers/safety/index.md b/docs/source/providers/safety/index.md deleted file mode 100644 index 5ddda2242..000000000 --- a/docs/source/providers/safety/index.md +++ /dev/null @@ -1,18 +0,0 @@ -# Safety - -## Overview - -This section contains documentation for all available providers for the **safety** API. - -## Providers - -```{toctree} -:maxdepth: 1 - -inline_code-scanner -inline_llama-guard -inline_prompt-guard -remote_bedrock -remote_nvidia -remote_sambanova -``` diff --git a/docs/source/providers/scoring/index.md b/docs/source/providers/scoring/index.md deleted file mode 100644 index f3bd48eb0..000000000 --- a/docs/source/providers/scoring/index.md +++ /dev/null @@ -1,15 +0,0 @@ -# Scoring - -## Overview - -This section contains documentation for all available providers for the **scoring** API. - -## Providers - -```{toctree} -:maxdepth: 1 - -inline_basic -inline_braintrust -inline_llm-as-judge -``` diff --git a/docs/source/providers/tool_runtime/index.md b/docs/source/providers/tool_runtime/index.md deleted file mode 100644 index 8d29aed43..000000000 --- a/docs/source/providers/tool_runtime/index.md +++ /dev/null @@ -1,18 +0,0 @@ -# Tool_Runtime - -## Overview - -This section contains documentation for all available providers for the **tool_runtime** API. - -## Providers - -```{toctree} -:maxdepth: 1 - -inline_rag-runtime -remote_bing-search -remote_brave-search -remote_model-context-protocol -remote_tavily-search -remote_wolfram-alpha -``` diff --git a/docs/source/providers/tool_runtime/remote_model-context-protocol.md b/docs/source/providers/tool_runtime/remote_model-context-protocol.md deleted file mode 100644 index cf9401c2c..000000000 --- a/docs/source/providers/tool_runtime/remote_model-context-protocol.md +++ /dev/null @@ -1,13 +0,0 @@ -# remote::model-context-protocol - -## Description - -Model Context Protocol (MCP) tool for standardized tool calling and context management. - -## Sample Configuration - -```yaml -{} - -``` - diff --git a/docs/source/providers/vector_io/index.md b/docs/source/providers/vector_io/index.md deleted file mode 100644 index 28ae523d7..000000000 --- a/docs/source/providers/vector_io/index.md +++ /dev/null @@ -1,24 +0,0 @@ -# Vector_Io - -## Overview - -This section contains documentation for all available providers for the **vector_io** API. - -## Providers - -```{toctree} -:maxdepth: 1 - -inline_chromadb -inline_faiss -inline_meta-reference -inline_milvus -inline_qdrant -inline_sqlite-vec -inline_sqlite_vec -remote_chromadb -remote_milvus -remote_pgvector -remote_qdrant -remote_weaviate -``` diff --git a/llama_stack/distributions/nvidia/doc_template.md b/llama_stack/distributions/nvidia/doc_template.md index 56e99e523..fbee17ef8 100644 --- a/llama_stack/distributions/nvidia/doc_template.md +++ b/llama_stack/distributions/nvidia/doc_template.md @@ -49,22 +49,22 @@ The deployed platform includes the NIM Proxy microservice, which is the service ### Datasetio API: NeMo Data Store The NeMo Data Store microservice serves as the default file storage solution for the NeMo microservices platform. It exposts APIs compatible with the Hugging Face Hub client (`HfApi`), so you can use the client to interact with Data Store. The `NVIDIA_DATASETS_URL` environment variable should point to your NeMo Data Store endpoint. -See the {repopath}`NVIDIA Datasetio docs::llama_stack/providers/remote/datasetio/nvidia/README.md` for supported features and example usage. +See the [NVIDIA Datasetio docs](https://github.com/meta-llama/llama-stack/blob/main/llama_stack/providers/remote/datasetio/nvidia/README.md) for supported features and example usage. ### Eval API: NeMo Evaluator The NeMo Evaluator microservice supports evaluation of LLMs. Launching an Evaluation job with NeMo Evaluator requires an Evaluation Config (an object that contains metadata needed by the job). A Llama Stack Benchmark maps to an Evaluation Config, so registering a Benchmark creates an Evaluation Config in NeMo Evaluator. The `NVIDIA_EVALUATOR_URL` environment variable should point to your NeMo Microservices endpoint. -See the {repopath}`NVIDIA Eval docs::llama_stack/providers/remote/eval/nvidia/README.md` for supported features and example usage. +See the [NVIDIA Eval docs](https://github.com/meta-llama/llama-stack/blob/main/llama_stack/providers/remote/eval/nvidia/README.md) for supported features and example usage. ### Post-Training API: NeMo Customizer -The NeMo Customizer microservice supports fine-tuning models. You can reference {repopath}`this list of supported models::llama_stack/providers/remote/post_training/nvidia/models.py` that can be fine-tuned using Llama Stack. The `NVIDIA_CUSTOMIZER_URL` environment variable should point to your NeMo Microservices endpoint. +The NeMo Customizer microservice supports fine-tuning models. You can reference [this list of supported models](https://github.com/meta-llama/llama-stack/blob/main/llama_stack/providers/remote/post_training/nvidia/models.py) that can be fine-tuned using Llama Stack. The `NVIDIA_CUSTOMIZER_URL` environment variable should point to your NeMo Microservices endpoint. -See the {repopath}`NVIDIA Post-Training docs::llama_stack/providers/remote/post_training/nvidia/README.md` for supported features and example usage. +See the [NVIDIA Post-Training docs](https://github.com/meta-llama/llama-stack/blob/main/llama_stack/providers/remote/post_training/nvidia/README.md) for supported features and example usage. ### Safety API: NeMo Guardrails The NeMo Guardrails microservice sits between your application and the LLM, and adds checks and content moderation to a model. The `GUARDRAILS_SERVICE_URL` environment variable should point to your NeMo Microservices endpoint. -See the {repopath}`NVIDIA Safety docs::llama_stack/providers/remote/safety/nvidia/README.md` for supported features and example usage. +See the [NVIDIA Safety docs](https://github.com/meta-llama/llama-stack/blob/main/llama_stack/providers/remote/safety/nvidia/README.md) for supported features and example usage. ## Deploying models In order to use a registered model with the Llama Stack APIs, ensure the corresponding NIM is deployed to your environment. For example, you can use the NIM Proxy microservice to deploy `meta/llama-3.2-1b-instruct`. @@ -138,4 +138,4 @@ llama stack run ./run.yaml \ ``` ## Example Notebooks -For examples of how to use the NVIDIA Distribution to run inference, fine-tune, evaluate, and run safety checks on your LLMs, you can reference the example notebooks in {repopath}`docs/notebooks/nvidia`. +For examples of how to use the NVIDIA Distribution to run inference, fine-tune, evaluate, and run safety checks on your LLMs, you can reference the example notebooks in [docs/notebooks/nvidia](https://github.com/meta-llama/llama-stack/tree/main/docs/notebooks/nvidia). diff --git a/llama_stack/providers/registry/vector_io.py b/llama_stack/providers/registry/vector_io.py index e8237bc62..9816838e7 100644 --- a/llama_stack/providers/registry/vector_io.py +++ b/llama_stack/providers/registry/vector_io.py @@ -410,7 +410,7 @@ There are three implementations of search for PGVectoIndex available: - How it works: - Uses PostgreSQL's vector extension (pgvector) to perform similarity search - Compares query embeddings against stored embeddings using Cosine distance or other distance metrics - - Eg. SQL query: SELECT document, embedding <=> %s::vector AS distance FROM table ORDER BY distance + - Eg. SQL query: SELECT document, embedding <=> %s::vector AS distance FROM table ORDER BY distance -Characteristics: - Semantic understanding - finds documents similar in meaning even if they don't share keywords diff --git a/scripts/distro_codegen.py b/scripts/distro_codegen.py index b6698ef9a..ff5025b78 100755 --- a/scripts/distro_codegen.py +++ b/scripts/distro_codegen.py @@ -56,7 +56,7 @@ def process_distro(distro_dir: Path, progress, change_tracker: ChangedPathTracke distro = template_func() yaml_output_dir = REPO_ROOT / "llama_stack" / "distributions" / distro.name - doc_output_dir = REPO_ROOT / "docs/source/distributions" / f"{distro.distro_type}_distro" + doc_output_dir = REPO_ROOT / "docs/docs/distributions" / f"{distro.distro_type}_distro" change_tracker.add_paths(yaml_output_dir, doc_output_dir) distro.save_distribution( yaml_output_dir=yaml_output_dir, diff --git a/scripts/provider_codegen.py b/scripts/provider_codegen.py index 17efa2138..207840d49 100755 --- a/scripts/provider_codegen.py +++ b/scripts/provider_codegen.py @@ -158,7 +158,7 @@ def get_config_class_info(config_class_path: str) -> dict[str, Any]: def generate_provider_docs(progress, provider_spec: Any, api_name: str) -> str: - """Generate markdown documentation for a provider.""" + """Generate MDX documentation for a provider.""" provider_type = provider_spec.provider_type config_class = provider_spec.config_class @@ -166,10 +166,7 @@ def generate_provider_docs(progress, provider_spec: Any, api_name: str) -> str: if "error" in config_info: progress.print(config_info["error"]) - md_lines = [] - md_lines.append(f"# {provider_type}") - md_lines.append("") - + # Extract description for frontmatter description = "" if hasattr(provider_spec, "description") and provider_spec.description: description = provider_spec.description @@ -182,6 +179,37 @@ def generate_provider_docs(progress, provider_spec: Any, api_name: str) -> str: elif config_info.get("docstring"): description = config_info["docstring"] + # Create sidebar label (clean up provider_type for display) + sidebar_label = provider_type.replace("::", " - ").replace("_", " ") + if sidebar_label.startswith("inline - "): + sidebar_label = sidebar_label[9:].title() # Remove "inline - " prefix and title case + else: + sidebar_label = sidebar_label.title() + + md_lines = [] + + # Add YAML frontmatter + md_lines.append("---") + if description: + # Handle multi-line descriptions in YAML - keep it simple for single line + if "\n" in description.strip(): + md_lines.append("description: |") + for line in description.strip().split("\n"): + # Avoid trailing whitespace by only adding spaces to non-empty lines + md_lines.append(f" {line}" if line.strip() else "") + else: + # For single line descriptions, format properly for YAML + clean_desc = description.strip().replace('"', '\\"') + md_lines.append(f'description: "{clean_desc}"') + md_lines.append(f"sidebar_label: {sidebar_label}") + md_lines.append(f"title: {provider_type}") + md_lines.append("---") + md_lines.append("") + + # Add main title + md_lines.append(f"# {provider_type}") + md_lines.append("") + if description: md_lines.append("## Description") md_lines.append("") @@ -198,16 +226,35 @@ def generate_provider_docs(progress, provider_spec: Any, api_name: str) -> str: field_type = field_info["type"].replace("|", "\\|") required = "Yes" if field_info["required"] else "No" default = str(field_info["default"]) if field_info["default"] is not None else "" - description = field_info["description"] or "" - md_lines.append(f"| `{field_name}` | `{field_type}` | {required} | {default} | {description} |") + # Handle multiline default values and escape problematic characters for MDX + if "\n" in default: + default = ( + default.replace("\n", "
") + .replace("<", "<") + .replace(">", ">") + .replace("{", "{") + .replace("}", "}") + ) + else: + default = ( + default.replace("<", "<").replace(">", ">").replace("{", "{").replace("}", "}") + ) + + description_text = field_info["description"] or "" + # Escape curly braces in description text for MDX compatibility + description_text = description_text.replace("{", "{").replace("}", "}") + + md_lines.append(f"| `{field_name}` | `{field_type}` | {required} | {default} | {description_text} |") md_lines.append("") if config_info.get("accepts_extra_config"): + md_lines.append(":::note") md_lines.append( - "```{note}\n This configuration class accepts additional fields beyond those listed above. You can pass any additional configuration options that will be forwarded to the underlying provider.\n ```\n" + "This configuration class accepts additional fields beyond those listed above. You can pass any additional configuration options that will be forwarded to the underlying provider." ) + md_lines.append(":::") md_lines.append("") if config_info.get("sample_config"): @@ -240,24 +287,71 @@ def generate_provider_docs(progress, provider_spec: Any, api_name: str) -> str: return obj sample_config_dict = convert_pydantic_to_dict(sample_config) - md_lines.append(yaml.dump(sample_config_dict, default_flow_style=False, sort_keys=False)) + # Strip trailing newlines from yaml.dump to prevent extra blank lines + yaml_output = yaml.dump(sample_config_dict, default_flow_style=False, sort_keys=False).rstrip() + md_lines.append(yaml_output) else: md_lines.append("# No sample configuration available.") except Exception as e: md_lines.append(f"# Error generating sample config: {str(e)}") md_lines.append("```") - md_lines.append("") if hasattr(provider_spec, "deprecation_warning") and provider_spec.deprecation_warning: md_lines.append("## Deprecation Notice") md_lines.append("") - md_lines.append(f"```{{warning}}\n{provider_spec.deprecation_warning}\n```") - md_lines.append("") + md_lines.append(":::warning") + md_lines.append(provider_spec.deprecation_warning) + md_lines.append(":::") if hasattr(provider_spec, "deprecation_error") and provider_spec.deprecation_error: md_lines.append("## Deprecation Error") md_lines.append("") - md_lines.append(f"❌ **Error**: {provider_spec.deprecation_error}") + md_lines.append(":::danger") + md_lines.append(f"**Error**: {provider_spec.deprecation_error}") + md_lines.append(":::") + + return "\n".join(md_lines) + "\n" + + +def generate_index_docs(api_name: str, api_docstring: str | None, provider_entries: list) -> str: + """Generate MDX documentation for the index file.""" + # Create sidebar label for the API + sidebar_label = api_name.replace("_", " ").title() + + md_lines = [] + + # Add YAML frontmatter for index + md_lines.append("---") + if api_docstring: + clean_desc = api_docstring.strip().replace('"', '\\"') + md_lines.append(f'description: "{clean_desc}"') + md_lines.append(f"sidebar_label: {sidebar_label}") + md_lines.append(f"title: {api_name.title()}") + md_lines.append("---") + md_lines.append("") + + # Add main content + md_lines.append(f"# {api_name.title()}") + md_lines.append("") + md_lines.append("## Overview") + md_lines.append("") + + if api_docstring: + cleaned_docstring = api_docstring.strip() + md_lines.append(f"{cleaned_docstring}") + md_lines.append("") + + md_lines.append(f"This section contains documentation for all available providers for the **{api_name}** API.") + md_lines.append("") + + md_lines.append("## Providers") + md_lines.append("") + + # For Docusaurus, create a simple list of links instead of toctree + for entry in provider_entries: + provider_name = entry["display_name"] + filename = entry["filename"] + md_lines.append(f"- [{provider_name}](./{filename})") return "\n".join(md_lines) + "\n" @@ -272,41 +366,35 @@ def process_provider_registry(progress, change_tracker: ChangedPathTracker) -> N for api, providers in provider_registry.items(): api_name = api.value - doc_output_dir = REPO_ROOT / "docs" / "source" / "providers" / api_name + doc_output_dir = REPO_ROOT / "docs" / "docs" / "providers" / api_name doc_output_dir.mkdir(parents=True, exist_ok=True) change_tracker.add_paths(doc_output_dir) - index_content = [] - index_content.append(f"# {api_name.title()}\n") - index_content.append("## Overview\n") - api_docstring = get_api_docstring(api_name) - if api_docstring: - cleaned_docstring = api_docstring.strip() - index_content.append(f"{cleaned_docstring}\n") - - index_content.append( - f"This section contains documentation for all available providers for the **{api_name}** API.\n" - ) - - index_content.append("## Providers\n") - - toctree_entries = [] + provider_entries = [] for provider_type, provider in sorted(providers.items()): filename = provider_type.replace("::", "_").replace(":", "_") - provider_doc_file = doc_output_dir / f"{filename}.md" + provider_doc_file = doc_output_dir / f"{filename}.mdx" provider_docs = generate_provider_docs(progress, provider, api_name) provider_doc_file.write_text(provider_docs) change_tracker.add_paths(provider_doc_file) - toctree_entries.append(f"{filename}") - index_content.append(f"```{{toctree}}\n:maxdepth: 1\n\n{'\n'.join(toctree_entries)}\n```\n") + # Create display name for the index + display_name = provider_type.replace("::", " - ").replace("_", " ") + if display_name.startswith("inline - "): + display_name = display_name[9:].title() + else: + display_name = display_name.title() - index_file = doc_output_dir / "index.md" - index_file.write_text("\n".join(index_content)) + provider_entries.append({"filename": filename, "display_name": display_name}) + + # Generate index file with frontmatter + index_content = generate_index_docs(api_name, api_docstring, provider_entries) + index_file = doc_output_dir / "index.mdx" + index_file.write_text(index_content) change_tracker.add_paths(index_file) except Exception as e: From 05ff4c4420406853f1123bd6c8603104c44be2dd Mon Sep 17 00:00:00 2001 From: Alexey Rybak <50731695+reluctantfuturist@users.noreply.github.com> Date: Wed, 24 Sep 2025 14:03:41 -0700 Subject: [PATCH 139/150] docs: advanced_apis migration (#3532) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit # What does this PR do? - Migrates the `advanced_apis/`​ section of the docs to the new format ## Test Plan - Partial migration --- docs/docs/advanced_apis/evaluation.mdx | 163 ++++++++++ docs/docs/advanced_apis/post_training.mdx | 305 ++++++++++++++++++ docs/docs/advanced_apis/scoring.mdx | 193 +++++++++++ docs/source/advanced_apis/eval/index.md | 6 - .../eval/inline_meta-reference.md | 25 -- .../advanced_apis/eval/remote_nvidia.md | 23 -- .../advanced_apis/evaluation_concepts.md | 77 ----- docs/source/advanced_apis/index.md | 33 -- .../post_training/huggingface.md | 122 ------- .../advanced_apis/post_training/index.md | 7 - .../post_training/inline_huggingface.md | 40 --- .../post_training/inline_torchtune.md | 25 -- .../post_training/nvidia_nemo.md | 163 ---------- .../post_training/remote_nvidia.md | 32 -- .../advanced_apis/post_training/torchtune.md | 125 ------- docs/source/advanced_apis/scoring/index.md | 7 - .../advanced_apis/scoring/inline_basic.md | 17 - .../scoring/inline_braintrust.md | 23 -- .../scoring/inline_llm-as-judge.md | 17 - 19 files changed, 661 insertions(+), 742 deletions(-) create mode 100644 docs/docs/advanced_apis/evaluation.mdx create mode 100644 docs/docs/advanced_apis/post_training.mdx create mode 100644 docs/docs/advanced_apis/scoring.mdx delete mode 100644 docs/source/advanced_apis/eval/index.md delete mode 100644 docs/source/advanced_apis/eval/inline_meta-reference.md delete mode 100644 docs/source/advanced_apis/eval/remote_nvidia.md delete mode 100644 docs/source/advanced_apis/evaluation_concepts.md delete mode 100644 docs/source/advanced_apis/index.md delete mode 100644 docs/source/advanced_apis/post_training/huggingface.md delete mode 100644 docs/source/advanced_apis/post_training/index.md delete mode 100644 docs/source/advanced_apis/post_training/inline_huggingface.md delete mode 100644 docs/source/advanced_apis/post_training/inline_torchtune.md delete mode 100644 docs/source/advanced_apis/post_training/nvidia_nemo.md delete mode 100644 docs/source/advanced_apis/post_training/remote_nvidia.md delete mode 100644 docs/source/advanced_apis/post_training/torchtune.md delete mode 100644 docs/source/advanced_apis/scoring/index.md delete mode 100644 docs/source/advanced_apis/scoring/inline_basic.md delete mode 100644 docs/source/advanced_apis/scoring/inline_braintrust.md delete mode 100644 docs/source/advanced_apis/scoring/inline_llm-as-judge.md diff --git a/docs/docs/advanced_apis/evaluation.mdx b/docs/docs/advanced_apis/evaluation.mdx new file mode 100644 index 000000000..1efaa4c5c --- /dev/null +++ b/docs/docs/advanced_apis/evaluation.mdx @@ -0,0 +1,163 @@ +# Evaluation + +## Evaluation Concepts + +The Llama Stack Evaluation flow allows you to run evaluations on your GenAI application datasets or pre-registered benchmarks. + +We introduce a set of APIs in Llama Stack for supporting running evaluations of LLM applications: +- `/datasetio` + `/datasets` API +- `/scoring` + `/scoring_functions` API +- `/eval` + `/benchmarks` API + +This guide goes over the sets of APIs and developer experience flow of using Llama Stack to run evaluations for different use cases. Checkout our Colab notebook on working examples with evaluations [here](https://colab.research.google.com/drive/10CHyykee9j2OigaIcRv47BKG9mrNm0tJ?usp=sharing). + +The Evaluation APIs are associated with a set of Resources. Please visit the Resources section in our [Core Concepts](../concepts/index.mdx) guide for better high-level understanding. + +- **DatasetIO**: defines interface with datasets and data loaders. + - Associated with `Dataset` resource. +- **Scoring**: evaluate outputs of the system. + - Associated with `ScoringFunction` resource. We provide a suite of out-of-the box scoring functions and also the ability for you to add custom evaluators. These scoring functions are the core part of defining an evaluation task to output evaluation metrics. +- **Eval**: generate outputs (via Inference or Agents) and perform scoring. + - Associated with `Benchmark` resource. + +## Evaluation Providers + +Llama Stack provides multiple evaluation providers: + +- **Meta Reference** (`inline::meta-reference`) - Meta's reference implementation with multi-language support +- **NVIDIA** (`remote::nvidia`) - NVIDIA's evaluation platform integration + +### Meta Reference + +Meta's reference implementation of evaluation tasks with support for multiple languages and evaluation metrics. + +#### Configuration + +| Field | Type | Required | Default | Description | +|-------|------|----------|---------|-------------| +| `kvstore` | `RedisKVStoreConfig \| SqliteKVStoreConfig \| PostgresKVStoreConfig \| MongoDBKVStoreConfig` | No | sqlite | Key-value store configuration | + +#### Sample Configuration + +```yaml +kvstore: + type: sqlite + db_path: ${env.SQLITE_STORE_DIR:=~/.llama/dummy}/meta_reference_eval.db +``` + +#### Features + +- Multi-language evaluation support +- Comprehensive evaluation metrics +- Integration with various key-value stores (SQLite, Redis, PostgreSQL, MongoDB) +- Built-in support for popular benchmarks + +### NVIDIA + +NVIDIA's evaluation provider for running evaluation tasks on NVIDIA's platform. + +#### Configuration + +| Field | Type | Required | Default | Description | +|-------|------|----------|---------|-------------| +| `evaluator_url` | `str` | No | http://0.0.0.0:7331 | The url for accessing the evaluator service | + +#### Sample Configuration + +```yaml +evaluator_url: ${env.NVIDIA_EVALUATOR_URL:=http://localhost:7331} +``` + +#### Features + +- Integration with NVIDIA's evaluation platform +- Remote evaluation capabilities +- Scalable evaluation processing + +## Open-benchmark Eval + +### List of open-benchmarks Llama Stack support + +Llama stack pre-registers several popular open-benchmarks to easily evaluate model performance via CLI. + +The list of open-benchmarks we currently support: +- [MMLU-COT](https://arxiv.org/abs/2009.03300) (Measuring Massive Multitask Language Understanding): Benchmark designed to comprehensively evaluate the breadth and depth of a model's academic and professional understanding +- [GPQA-COT](https://arxiv.org/abs/2311.12022) (A Graduate-Level Google-Proof Q&A Benchmark): A challenging benchmark of 448 multiple-choice questions written by domain experts in biology, physics, and chemistry. +- [SimpleQA](https://openai.com/index/introducing-simpleqa/): Benchmark designed to access models to answer short, fact-seeking questions. +- [MMMU](https://arxiv.org/abs/2311.16502) (A Massive Multi-discipline Multimodal Understanding and Reasoning Benchmark for Expert AGI): Benchmark designed to evaluate multimodal models. + +You can follow this [contributing guide](../references/evals_reference/index.mdx#open-benchmark-contributing-guide) to add more open-benchmarks to Llama Stack + +### Run evaluation on open-benchmarks via CLI + +We have built-in functionality to run the supported open-benchmarks using llama-stack-client CLI + +#### Spin up Llama Stack server + +Spin up llama stack server with 'open-benchmark' template +``` +llama stack run llama_stack/distributions/open-benchmark/run.yaml + +``` + +#### Run eval CLI +There are 3 necessary inputs to run a benchmark eval +- `list of benchmark_ids`: The list of benchmark ids to run evaluation on +- `model-id`: The model id to evaluate on +- `output_dir`: Path to store the evaluate results +``` +llama-stack-client eval run-benchmark ... \ +--model_id \ +--output_dir +``` + +You can run +``` +llama-stack-client eval run-benchmark help +``` +to see the description of all the flags that eval run-benchmark has + +In the output log, you can find the file path that has your evaluation results. Open that file and you can see you aggregate evaluation results over there. + +## Usage Example + +Here's a basic example of using the evaluation API: + +```python +from llama_stack_client import LlamaStackClient + +client = LlamaStackClient(base_url="http://localhost:8321") + +# Register a dataset for evaluation +client.datasets.register( + purpose="evaluation", + source={ + "type": "uri", + "uri": "huggingface://datasets/llamastack/evaluation_dataset" + }, + dataset_id="my_eval_dataset" +) + +# Run evaluation +eval_result = client.eval.run_evaluation( + dataset_id="my_eval_dataset", + scoring_functions=["accuracy", "bleu"], + model_id="my_model" +) + +print(f"Evaluation completed: {eval_result}") +``` + +## Best Practices + +- **Choose appropriate providers**: Use Meta Reference for comprehensive evaluation, NVIDIA for platform-specific needs +- **Configure storage properly**: Ensure your key-value store configuration matches your performance requirements +- **Monitor evaluation progress**: Large evaluations can take time - implement proper monitoring +- **Use appropriate scoring functions**: Select scoring metrics that align with your evaluation goals + +## What's Next? + +- Check out our Colab notebook on working examples with running benchmark evaluations [here](https://colab.research.google.com/github/meta-llama/llama-stack/blob/main/docs/notebooks/Llama_Stack_Benchmark_Evals.ipynb#scrollTo=mxLCsP4MvFqP). +- Check out our [Building Applications - Evaluation](../building_applications/evals.mdx) guide for more details on how to use the Evaluation APIs to evaluate your applications. +- Check out our [Evaluation Reference](../references/evals_reference/index.mdx) for more details on the APIs. +- Explore the [Scoring](./scoring.mdx) documentation for available scoring functions. diff --git a/docs/docs/advanced_apis/post_training.mdx b/docs/docs/advanced_apis/post_training.mdx new file mode 100644 index 000000000..43359d741 --- /dev/null +++ b/docs/docs/advanced_apis/post_training.mdx @@ -0,0 +1,305 @@ +# Post-Training + +Post-training in Llama Stack allows you to fine-tune models using various providers and frameworks. This section covers all available post-training providers and how to use them effectively. + +## Overview + +Llama Stack provides multiple post-training providers: + +- **HuggingFace SFTTrainer** (`inline::huggingface`) - Fine-tuning using HuggingFace ecosystem +- **TorchTune** (`inline::torchtune`) - Fine-tuning using Meta's TorchTune framework +- **NVIDIA** (`remote::nvidia`) - Fine-tuning using NVIDIA's platform + +## HuggingFace SFTTrainer + +[HuggingFace SFTTrainer](https://huggingface.co/docs/trl/en/sft_trainer) is an inline post training provider for Llama Stack. It allows you to run supervised fine tuning on a variety of models using many datasets. + +### Features + +- Simple access through the post_training API +- Fully integrated with Llama Stack +- GPU support, CPU support, and MPS support (MacOS Metal Performance Shaders) + +### Configuration + +| Field | Type | Required | Default | Description | +|-------|------|----------|---------|-------------| +| `device` | `str` | No | cuda | | +| `distributed_backend` | `Literal['fsdp', 'deepspeed']` | No | | | +| `checkpoint_format` | `Literal['full_state', 'huggingface']` | No | huggingface | | +| `chat_template` | `str` | No | | +| `model_specific_config` | `dict` | No | `{'trust_remote_code': True, 'attn_implementation': 'sdpa'}` | | +| `max_seq_length` | `int` | No | 2048 | | +| `gradient_checkpointing` | `bool` | No | False | | +| `save_total_limit` | `int` | No | 3 | | +| `logging_steps` | `int` | No | 10 | | +| `warmup_ratio` | `float` | No | 0.1 | | +| `weight_decay` | `float` | No | 0.01 | | +| `dataloader_num_workers` | `int` | No | 4 | | +| `dataloader_pin_memory` | `bool` | No | True | | + +### Sample Configuration + +```yaml +checkpoint_format: huggingface +distributed_backend: null +device: cpu +``` + +### Setup + +You can access the HuggingFace trainer via the `starter` distribution: + +```bash +llama stack build --distro starter --image-type venv +llama stack run --image-type venv ~/.llama/distributions/starter/starter-run.yaml +``` + +### Usage Example + +```python +import time +import uuid + +from llama_stack_client.types import ( + post_training_supervised_fine_tune_params, + algorithm_config_param, +) + +def create_http_client(): + from llama_stack_client import LlamaStackClient + return LlamaStackClient(base_url="http://localhost:8321") + +client = create_http_client() + +# Example Dataset +client.datasets.register( + purpose="post-training/messages", + source={ + "type": "uri", + "uri": "huggingface://datasets/llamastack/simpleqa?split=train", + }, + dataset_id="simpleqa", +) + +training_config = post_training_supervised_fine_tune_params.TrainingConfig( + data_config=post_training_supervised_fine_tune_params.TrainingConfigDataConfig( + batch_size=32, + data_format="instruct", + dataset_id="simpleqa", + shuffle=True, + ), + gradient_accumulation_steps=1, + max_steps_per_epoch=0, + max_validation_steps=1, + n_epochs=4, +) + +algorithm_config = algorithm_config_param.LoraFinetuningConfig( + alpha=1, + apply_lora_to_mlp=True, + apply_lora_to_output=False, + lora_attn_modules=["q_proj"], + rank=1, + type="LoRA", +) + +job_uuid = f"test-job{uuid.uuid4()}" + +# Example Model +training_model = "ibm-granite/granite-3.3-8b-instruct" + +start_time = time.time() +response = client.post_training.supervised_fine_tune( + job_uuid=job_uuid, + logger_config={}, + model=training_model, + hyperparam_search_config={}, + training_config=training_config, + algorithm_config=algorithm_config, + checkpoint_dir="output", +) +print("Job: ", job_uuid) + +# Wait for the job to complete! +while True: + status = client.post_training.job.status(job_uuid=job_uuid) + if not status: + print("Job not found") + break + + print(status) + if status.status == "completed": + break + + print("Waiting for job to complete...") + time.sleep(5) + +end_time = time.time() +print("Job completed in", end_time - start_time, "seconds!") + +print("Artifacts:") +print(client.post_training.job.artifacts(job_uuid=job_uuid)) +``` + +## TorchTune + +[TorchTune](https://github.com/pytorch/torchtune) is an inline post training provider for Llama Stack. It provides a simple and efficient way to fine-tune language models using PyTorch. + +### Features + +- Simple access through the post_training API +- Fully integrated with Llama Stack +- GPU support and single device capabilities +- Support for LoRA + +### Configuration + +| Field | Type | Required | Default | Description | +|-------|------|----------|---------|-------------| +| `torch_seed` | `int \| None` | No | | | +| `checkpoint_format` | `Literal['meta', 'huggingface']` | No | meta | | + +### Sample Configuration + +```yaml +checkpoint_format: meta +``` + +### Setup + +You can access the TorchTune trainer by writing your own yaml pointing to the provider: + +```yaml +post_training: + - provider_id: torchtune + provider_type: inline::torchtune + config: {} +``` + +You can then build and run your own stack with this provider. + +### Usage Example + +```python +import time +import uuid + +from llama_stack_client.types import ( + post_training_supervised_fine_tune_params, + algorithm_config_param, +) + +def create_http_client(): + from llama_stack_client import LlamaStackClient + return LlamaStackClient(base_url="http://localhost:8321") + +client = create_http_client() + +# Example Dataset +client.datasets.register( + purpose="post-training/messages", + source={ + "type": "uri", + "uri": "huggingface://datasets/llamastack/simpleqa?split=train", + }, + dataset_id="simpleqa", +) + +training_config = post_training_supervised_fine_tune_params.TrainingConfig( + data_config=post_training_supervised_fine_tune_params.TrainingConfigDataConfig( + batch_size=32, + data_format="instruct", + dataset_id="simpleqa", + shuffle=True, + ), + gradient_accumulation_steps=1, + max_steps_per_epoch=0, + max_validation_steps=1, + n_epochs=4, +) + +algorithm_config = algorithm_config_param.LoraFinetuningConfig( + alpha=1, + apply_lora_to_mlp=True, + apply_lora_to_output=False, + lora_attn_modules=["q_proj"], + rank=1, + type="LoRA", +) + +job_uuid = f"test-job{uuid.uuid4()}" + +# Example Model +training_model = "meta-llama/Llama-2-7b-hf" + +start_time = time.time() +response = client.post_training.supervised_fine_tune( + job_uuid=job_uuid, + logger_config={}, + model=training_model, + hyperparam_search_config={}, + training_config=training_config, + algorithm_config=algorithm_config, + checkpoint_dir="output", +) +print("Job: ", job_uuid) + +# Wait for the job to complete! +while True: + status = client.post_training.job.status(job_uuid=job_uuid) + if not status: + print("Job not found") + break + + print(status) + if status.status == "completed": + break + + print("Waiting for job to complete...") + time.sleep(5) + +end_time = time.time() +print("Job completed in", end_time - start_time, "seconds!") + +print("Artifacts:") +print(client.post_training.job.artifacts(job_uuid=job_uuid)) +``` + +## NVIDIA + +NVIDIA's post-training provider for fine-tuning models on NVIDIA's platform. + +### Configuration + +| Field | Type | Required | Default | Description | +|-------|------|----------|---------|-------------| +| `api_key` | `str \| None` | No | | The NVIDIA API key. | +| `dataset_namespace` | `str \| None` | No | default | The NVIDIA dataset namespace. | +| `project_id` | `str \| None` | No | test-example-model@v1 | The NVIDIA project ID. | +| `customizer_url` | `str \| None` | No | | Base URL for the NeMo Customizer API | +| `timeout` | `int` | No | 300 | Timeout for the NVIDIA Post Training API | +| `max_retries` | `int` | No | 3 | Maximum number of retries for the NVIDIA Post Training API | +| `output_model_dir` | `str` | No | test-example-model@v1 | Directory to save the output model | + +### Sample Configuration + +```yaml +api_key: ${env.NVIDIA_API_KEY:=} +dataset_namespace: ${env.NVIDIA_DATASET_NAMESPACE:=default} +project_id: ${env.NVIDIA_PROJECT_ID:=test-project} +customizer_url: ${env.NVIDIA_CUSTOMIZER_URL:=http://nemo.test} +``` + +## Best Practices + +- **Choose the right provider**: Use HuggingFace for broader compatibility, TorchTune for Meta models, or NVIDIA for their ecosystem +- **Configure hardware appropriately**: Ensure your configuration matches your available hardware (CPU, GPU, MPS) +- **Monitor jobs**: Always monitor job status and handle completion appropriately +- **Use appropriate datasets**: Ensure your dataset format matches the expected input format for your chosen provider + +## Next Steps + +- Check out the [Building Applications - Fine-tuning](../building_applications/index.mdx) guide for application-level examples +- See the [Providers](../providers/post_training/index.mdx) section for detailed provider documentation +- Review the [API Reference](../api_reference/post_training.mdx) for complete API documentation diff --git a/docs/docs/advanced_apis/scoring.mdx b/docs/docs/advanced_apis/scoring.mdx new file mode 100644 index 000000000..15c09fa8a --- /dev/null +++ b/docs/docs/advanced_apis/scoring.mdx @@ -0,0 +1,193 @@ +# Scoring + +The Scoring API in Llama Stack allows you to evaluate outputs of your GenAI system using various scoring functions and metrics. This section covers all available scoring providers and their configuration. + +## Overview + +Llama Stack provides multiple scoring providers: + +- **Basic** (`inline::basic`) - Simple evaluation metrics and scoring functions +- **Braintrust** (`inline::braintrust`) - Advanced evaluation using the Braintrust platform +- **LLM-as-Judge** (`inline::llm-as-judge`) - Uses language models to evaluate responses + +The Scoring API is associated with `ScoringFunction` resources and provides a suite of out-of-the-box scoring functions. You can also add custom evaluators to meet specific evaluation needs. + +## Basic Scoring + +Basic scoring provider for simple evaluation metrics and scoring functions. This provider offers fundamental scoring capabilities without external dependencies. + +### Configuration + +No configuration required - this provider works out of the box. + +```yaml +{} +``` + +### Features + +- Simple evaluation metrics (accuracy, precision, recall, F1-score) +- String matching and similarity metrics +- Basic statistical scoring functions +- No external dependencies required +- Fast execution for standard metrics + +### Use Cases + +- Quick evaluation of basic accuracy metrics +- String similarity comparisons +- Statistical analysis of model outputs +- Development and testing scenarios + +## Braintrust + +Braintrust scoring provider for evaluation and scoring using the [Braintrust platform](https://braintrustdata.com/). Braintrust provides advanced evaluation capabilities and experiment tracking. + +### Configuration + +| Field | Type | Required | Default | Description | +|-------|------|----------|---------|-------------| +| `openai_api_key` | `str \| None` | No | | The OpenAI API Key for LLM-powered evaluations | + +### Sample Configuration + +```yaml +openai_api_key: ${env.OPENAI_API_KEY:=} +``` + +### Features + +- Advanced evaluation metrics +- Experiment tracking and comparison +- LLM-powered evaluation functions +- Integration with Braintrust's evaluation suite +- Detailed scoring analytics and insights + +### Use Cases + +- Production evaluation pipelines +- A/B testing of model versions +- Advanced scoring with custom metrics +- Detailed evaluation reporting and analysis + +## LLM-as-Judge + +LLM-as-judge scoring provider that uses language models to evaluate and score responses. This approach leverages the reasoning capabilities of large language models to assess quality, relevance, and other subjective metrics. + +### Configuration + +No configuration required - this provider works out of the box. + +```yaml +{} +``` + +### Features + +- Subjective quality evaluation using LLMs +- Flexible evaluation criteria definition +- Natural language evaluation explanations +- Support for complex evaluation scenarios +- Contextual understanding of responses + +### Use Cases + +- Evaluating response quality and relevance +- Assessing creativity and coherence +- Subjective metric evaluation +- Human-like judgment for complex tasks + +## Usage Examples + +### Basic Scoring Example + +```python +from llama_stack_client import LlamaStackClient + +client = LlamaStackClient(base_url="http://localhost:8321") + +# Register a basic accuracy scoring function +client.scoring_functions.register( + scoring_function_id="basic_accuracy", + provider_id="basic", + provider_scoring_function_id="accuracy" +) + +# Use the scoring function +result = client.scoring.score( + input_rows=[ + {"expected": "Paris", "actual": "Paris"}, + {"expected": "London", "actual": "Paris"} + ], + scoring_function_id="basic_accuracy" +) +print(f"Accuracy: {result.results[0].score}") +``` + +### LLM-as-Judge Example + +```python +# Register an LLM-as-judge scoring function +client.scoring_functions.register( + scoring_function_id="quality_judge", + provider_id="llm_judge", + provider_scoring_function_id="response_quality", + params={ + "criteria": "Evaluate response quality, relevance, and helpfulness", + "scale": "1-10" + } +) + +# Score responses using LLM judgment +result = client.scoring.score( + input_rows=[{ + "query": "What is machine learning?", + "response": "Machine learning is a subset of AI that enables computers to learn patterns from data..." + }], + scoring_function_id="quality_judge" +) +``` + +### Braintrust Integration Example + +```python +# Register a Braintrust scoring function +client.scoring_functions.register( + scoring_function_id="braintrust_eval", + provider_id="braintrust", + provider_scoring_function_id="semantic_similarity" +) + +# Run evaluation with Braintrust +result = client.scoring.score( + input_rows=[{ + "reference": "The capital of France is Paris", + "candidate": "Paris is the capital city of France" + }], + scoring_function_id="braintrust_eval" +) +``` + +## Best Practices + +- **Choose appropriate providers**: Use Basic for simple metrics, Braintrust for advanced analytics, LLM-as-Judge for subjective evaluation +- **Define clear criteria**: When using LLM-as-Judge, provide specific evaluation criteria and scales +- **Validate scoring functions**: Test your scoring functions with known examples before production use +- **Monitor performance**: Track scoring performance and adjust thresholds based on results +- **Combine multiple metrics**: Use different scoring providers together for comprehensive evaluation + +## Integration with Evaluation + +The Scoring API works closely with the [Evaluation](./evaluation.mdx) API to provide comprehensive evaluation workflows: + +1. **Datasets** are loaded via the DatasetIO API +2. **Evaluation** generates model outputs using the Eval API +3. **Scoring** evaluates the quality of outputs using various scoring functions +4. **Results** are aggregated and reported for analysis + +## Next Steps + +- Check out the [Evaluation](./evaluation.mdx) guide for running complete evaluations +- See the [Building Applications - Evaluation](../building_applications/evals.mdx) guide for application examples +- Review the [Evaluation Reference](../references/evals_reference.mdx) for comprehensive scoring function usage +- Explore the [Evaluation Concepts](../concepts/evaluation_concepts.mdx) for detailed conceptual information diff --git a/docs/source/advanced_apis/eval/index.md b/docs/source/advanced_apis/eval/index.md deleted file mode 100644 index 330380670..000000000 --- a/docs/source/advanced_apis/eval/index.md +++ /dev/null @@ -1,6 +0,0 @@ -# Eval Providers - -This section contains documentation for all available providers for the **eval** API. - -- [inline::meta-reference](inline_meta-reference.md) -- [remote::nvidia](remote_nvidia.md) \ No newline at end of file diff --git a/docs/source/advanced_apis/eval/inline_meta-reference.md b/docs/source/advanced_apis/eval/inline_meta-reference.md deleted file mode 100644 index 5bec89cfc..000000000 --- a/docs/source/advanced_apis/eval/inline_meta-reference.md +++ /dev/null @@ -1,25 +0,0 @@ ---- -orphan: true ---- - -# inline::meta-reference - -## Description - -Meta's reference implementation of evaluation tasks with support for multiple languages and evaluation metrics. - -## Configuration - -| Field | Type | Required | Default | Description | -|-------|------|----------|---------|-------------| -| `kvstore` | `utils.kvstore.config.RedisKVStoreConfig \| utils.kvstore.config.SqliteKVStoreConfig \| utils.kvstore.config.PostgresKVStoreConfig \| utils.kvstore.config.MongoDBKVStoreConfig` | No | sqlite | | - -## Sample Configuration - -```yaml -kvstore: - type: sqlite - db_path: ${env.SQLITE_STORE_DIR:=~/.llama/dummy}/meta_reference_eval.db - -``` - diff --git a/docs/source/advanced_apis/eval/remote_nvidia.md b/docs/source/advanced_apis/eval/remote_nvidia.md deleted file mode 100644 index ab91767d6..000000000 --- a/docs/source/advanced_apis/eval/remote_nvidia.md +++ /dev/null @@ -1,23 +0,0 @@ ---- -orphan: true ---- - -# remote::nvidia - -## Description - -NVIDIA's evaluation provider for running evaluation tasks on NVIDIA's platform. - -## Configuration - -| Field | Type | Required | Default | Description | -|-------|------|----------|---------|-------------| -| `evaluator_url` | `` | No | http://0.0.0.0:7331 | The url for accessing the evaluator service | - -## Sample Configuration - -```yaml -evaluator_url: ${env.NVIDIA_EVALUATOR_URL:=http://localhost:7331} - -``` - diff --git a/docs/source/advanced_apis/evaluation_concepts.md b/docs/source/advanced_apis/evaluation_concepts.md deleted file mode 100644 index 52ad53ece..000000000 --- a/docs/source/advanced_apis/evaluation_concepts.md +++ /dev/null @@ -1,77 +0,0 @@ -## Evaluation Concepts - -The Llama Stack Evaluation flow allows you to run evaluations on your GenAI application datasets or pre-registered benchmarks. - -We introduce a set of APIs in Llama Stack for supporting running evaluations of LLM applications. -- `/datasetio` + `/datasets` API -- `/scoring` + `/scoring_functions` API -- `/eval` + `/benchmarks` API - -This guide goes over the sets of APIs and developer experience flow of using Llama Stack to run evaluations for different use cases. Checkout our Colab notebook on working examples with evaluations [here](https://colab.research.google.com/drive/10CHyykee9j2OigaIcRv47BKG9mrNm0tJ?usp=sharing). - - -The Evaluation APIs are associated with a set of Resources. Please visit the Resources section in our [Core Concepts](../concepts/index.md) guide for better high-level understanding. - -- **DatasetIO**: defines interface with datasets and data loaders. - - Associated with `Dataset` resource. -- **Scoring**: evaluate outputs of the system. - - Associated with `ScoringFunction` resource. We provide a suite of out-of-the box scoring functions and also the ability for you to add custom evaluators. These scoring functions are the core part of defining an evaluation task to output evaluation metrics. -- **Eval**: generate outputs (via Inference or Agents) and perform scoring. - - Associated with `Benchmark` resource. - - -### Open-benchmark Eval - -#### List of open-benchmarks Llama Stack support - -Llama stack pre-registers several popular open-benchmarks to easily evaluate model perfomance via CLI. - -The list of open-benchmarks we currently support: -- [MMLU-COT](https://arxiv.org/abs/2009.03300) (Measuring Massive Multitask Language Understanding): Benchmark designed to comprehensively evaluate the breadth and depth of a model's academic and professional understanding -- [GPQA-COT](https://arxiv.org/abs/2311.12022) (A Graduate-Level Google-Proof Q&A Benchmark): A challenging benchmark of 448 multiple-choice questions written by domain experts in biology, physics, and chemistry. -- [SimpleQA](https://openai.com/index/introducing-simpleqa/): Benchmark designed to access models to answer short, fact-seeking questions. -- [MMMU](https://arxiv.org/abs/2311.16502) (A Massive Multi-discipline Multimodal Understanding and Reasoning Benchmark for Expert AGI)]: Benchmark designed to evaluate multimodal models. - - -You can follow this [contributing guide](../references/evals_reference/index.md#open-benchmark-contributing-guide) to add more open-benchmarks to Llama Stack - -#### Run evaluation on open-benchmarks via CLI - -We have built-in functionality to run the supported open-benckmarks using llama-stack-client CLI - -#### Spin up Llama Stack server - -Spin up llama stack server with 'open-benchmark' template -``` -llama stack run llama_stack/distributions/open-benchmark/run.yaml - -``` - -#### Run eval CLI -There are 3 necessary inputs to run a benchmark eval -- `list of benchmark_ids`: The list of benchmark ids to run evaluation on -- `model-id`: The model id to evaluate on -- `output_dir`: Path to store the evaluate results -``` -llama-stack-client eval run-benchmark ... \ ---model_id \ ---output_dir \ -``` - -You can run -``` -llama-stack-client eval run-benchmark help -``` -to see the description of all the flags that eval run-benchmark has - - -In the output log, you can find the file path that has your evaluation results. Open that file and you can see you aggregate -evaluation results over there. - - - -#### What's Next? - -- Check out our Colab notebook on working examples with running benchmark evaluations [here](https://colab.research.google.com/github/meta-llama/llama-stack/blob/main/docs/notebooks/Llama_Stack_Benchmark_Evals.ipynb#scrollTo=mxLCsP4MvFqP). -- Check out our [Building Applications - Evaluation](../building_applications/evals.md) guide for more details on how to use the Evaluation APIs to evaluate your applications. -- Check out our [Evaluation Reference](../references/evals_reference/index.md) for more details on the APIs. diff --git a/docs/source/advanced_apis/index.md b/docs/source/advanced_apis/index.md deleted file mode 100644 index b10672c29..000000000 --- a/docs/source/advanced_apis/index.md +++ /dev/null @@ -1,33 +0,0 @@ -# Advanced APIs - -## Post-training -Fine-tunes a model. - -```{toctree} -:maxdepth: 1 - -post_training/index -``` - -## Eval -Generates outputs (via Inference or Agents) and perform scoring. - -```{toctree} -:maxdepth: 1 - -eval/index -``` - -```{include} evaluation_concepts.md -:start-after: ## Evaluation Concepts -``` - -## Scoring -Evaluates the outputs of the system. - -```{toctree} -:maxdepth: 1 - -scoring/index -``` - diff --git a/docs/source/advanced_apis/post_training/huggingface.md b/docs/source/advanced_apis/post_training/huggingface.md deleted file mode 100644 index a7609d6da..000000000 --- a/docs/source/advanced_apis/post_training/huggingface.md +++ /dev/null @@ -1,122 +0,0 @@ ---- -orphan: true ---- -# HuggingFace SFTTrainer - -[HuggingFace SFTTrainer](https://huggingface.co/docs/trl/en/sft_trainer) is an inline post training provider for Llama Stack. It allows you to run supervised fine tuning on a variety of models using many datasets - -## Features - -- Simple access through the post_training API -- Fully integrated with Llama Stack -- GPU support, CPU support, and MPS support (MacOS Metal Performance Shaders) - -## Usage - -To use the HF SFTTrainer in your Llama Stack project, follow these steps: - -1. Configure your Llama Stack project to use this provider. -2. Kick off a SFT job using the Llama Stack post_training API. - -## Setup - -You can access the HuggingFace trainer via the `ollama` distribution: - -```bash -llama stack build --distro starter --image-type venv -llama stack run --image-type venv ~/.llama/distributions/ollama/ollama-run.yaml -``` - -## Run Training - -You can access the provider and the `supervised_fine_tune` method via the post_training API: - -```python -import time -import uuid - - -from llama_stack_client.types import ( - post_training_supervised_fine_tune_params, - algorithm_config_param, -) - - -def create_http_client(): - from llama_stack_client import LlamaStackClient - - return LlamaStackClient(base_url="http://localhost:8321") - - -client = create_http_client() - -# Example Dataset -client.datasets.register( - purpose="post-training/messages", - source={ - "type": "uri", - "uri": "huggingface://datasets/llamastack/simpleqa?split=train", - }, - dataset_id="simpleqa", -) - -training_config = post_training_supervised_fine_tune_params.TrainingConfig( - data_config=post_training_supervised_fine_tune_params.TrainingConfigDataConfig( - batch_size=32, - data_format="instruct", - dataset_id="simpleqa", - shuffle=True, - ), - gradient_accumulation_steps=1, - max_steps_per_epoch=0, - max_validation_steps=1, - n_epochs=4, -) - -algorithm_config = algorithm_config_param.LoraFinetuningConfig( # this config is also currently mandatory but should not be - alpha=1, - apply_lora_to_mlp=True, - apply_lora_to_output=False, - lora_attn_modules=["q_proj"], - rank=1, - type="LoRA", -) - -job_uuid = f"test-job{uuid.uuid4()}" - -# Example Model -training_model = "ibm-granite/granite-3.3-8b-instruct" - -start_time = time.time() -response = client.post_training.supervised_fine_tune( - job_uuid=job_uuid, - logger_config={}, - model=training_model, - hyperparam_search_config={}, - training_config=training_config, - algorithm_config=algorithm_config, - checkpoint_dir="output", -) -print("Job: ", job_uuid) - - -# Wait for the job to complete! -while True: - status = client.post_training.job.status(job_uuid=job_uuid) - if not status: - print("Job not found") - break - - print(status) - if status.status == "completed": - break - - print("Waiting for job to complete...") - time.sleep(5) - -end_time = time.time() -print("Job completed in", end_time - start_time, "seconds!") - -print("Artifacts:") -print(client.post_training.job.artifacts(job_uuid=job_uuid)) -``` diff --git a/docs/source/advanced_apis/post_training/index.md b/docs/source/advanced_apis/post_training/index.md deleted file mode 100644 index 35d10d14b..000000000 --- a/docs/source/advanced_apis/post_training/index.md +++ /dev/null @@ -1,7 +0,0 @@ -# Post_Training Providers - -This section contains documentation for all available providers for the **post_training** API. - -- [inline::huggingface](inline_huggingface.md) -- [inline::torchtune](inline_torchtune.md) -- [remote::nvidia](remote_nvidia.md) \ No newline at end of file diff --git a/docs/source/advanced_apis/post_training/inline_huggingface.md b/docs/source/advanced_apis/post_training/inline_huggingface.md deleted file mode 100644 index 6536b4f8c..000000000 --- a/docs/source/advanced_apis/post_training/inline_huggingface.md +++ /dev/null @@ -1,40 +0,0 @@ ---- -orphan: true ---- - -# inline::huggingface - -## Description - -HuggingFace-based post-training provider for fine-tuning models using the HuggingFace ecosystem. - -## Configuration - -| Field | Type | Required | Default | Description | -|-------|------|----------|---------|-------------| -| `device` | `` | No | cuda | | -| `distributed_backend` | `Literal['fsdp', 'deepspeed'` | No | | | -| `checkpoint_format` | `Literal['full_state', 'huggingface'` | No | huggingface | | -| `chat_template` | `` | No | | -| `model_specific_config` | `` | No | {'trust_remote_code': True, 'attn_implementation': 'sdpa'} | | -| `max_seq_length` | `` | No | 2048 | | -| `gradient_checkpointing` | `` | No | False | | -| `save_total_limit` | `` | No | 3 | | -| `logging_steps` | `` | No | 10 | | -| `warmup_ratio` | `` | No | 0.1 | | -| `weight_decay` | `` | No | 0.01 | | -| `dataloader_num_workers` | `` | No | 4 | | -| `dataloader_pin_memory` | `` | No | True | | - -## Sample Configuration - -```yaml -checkpoint_format: huggingface -distributed_backend: null -device: cpu - -``` - -[Find more detailed information here!](huggingface.md) - - diff --git a/docs/source/advanced_apis/post_training/inline_torchtune.md b/docs/source/advanced_apis/post_training/inline_torchtune.md deleted file mode 100644 index 617975b0d..000000000 --- a/docs/source/advanced_apis/post_training/inline_torchtune.md +++ /dev/null @@ -1,25 +0,0 @@ ---- -orphan: true ---- - -# inline::torchtune - -## Description - -TorchTune-based post-training provider for fine-tuning and optimizing models using Meta's TorchTune framework. - -## Configuration - -| Field | Type | Required | Default | Description | -|-------|------|----------|---------|-------------| -| `torch_seed` | `int \| None` | No | | | -| `checkpoint_format` | `Literal['meta', 'huggingface'` | No | meta | | - -## Sample Configuration - -```yaml -checkpoint_format: meta - -``` - -[Find more detailed information here!](torchtune.md) diff --git a/docs/source/advanced_apis/post_training/nvidia_nemo.md b/docs/source/advanced_apis/post_training/nvidia_nemo.md deleted file mode 100644 index 1a7adbe16..000000000 --- a/docs/source/advanced_apis/post_training/nvidia_nemo.md +++ /dev/null @@ -1,163 +0,0 @@ ---- -orphan: true ---- -# NVIDIA NEMO - -[NVIDIA NEMO](https://developer.nvidia.com/nemo-framework) is a remote post training provider for Llama Stack. It provides enterprise-grade fine-tuning capabilities through NVIDIA's NeMo Customizer service. - -## Features - -- Enterprise-grade fine-tuning capabilities -- Support for LoRA and SFT fine-tuning -- Integration with NVIDIA's NeMo Customizer service -- Support for various NVIDIA-optimized models -- Efficient training with NVIDIA hardware acceleration - -## Usage - -To use NVIDIA NEMO in your Llama Stack project, follow these steps: - -1. Configure your Llama Stack project to use this provider. -2. Set up your NVIDIA API credentials. -3. Kick off a fine-tuning job using the Llama Stack post_training API. - -## Setup - -You'll need to set the following environment variables: - -```bash -export NVIDIA_API_KEY="your-api-key" -export NVIDIA_DATASET_NAMESPACE="default" -export NVIDIA_CUSTOMIZER_URL="your-customizer-url" -export NVIDIA_PROJECT_ID="your-project-id" -export NVIDIA_OUTPUT_MODEL_DIR="your-output-model-dir" -``` - -## Run Training - -You can access the provider and the `supervised_fine_tune` method via the post_training API: - -```python -import time -import uuid - -from llama_stack_client.types import ( - post_training_supervised_fine_tune_params, - algorithm_config_param, -) - - -def create_http_client(): - from llama_stack_client import LlamaStackClient - - return LlamaStackClient(base_url="http://localhost:8321") - - -client = create_http_client() - -# Example Dataset -client.datasets.register( - purpose="post-training/messages", - source={ - "type": "uri", - "uri": "huggingface://datasets/llamastack/simpleqa?split=train", - }, - dataset_id="simpleqa", -) - -training_config = post_training_supervised_fine_tune_params.TrainingConfig( - data_config=post_training_supervised_fine_tune_params.TrainingConfigDataConfig( - batch_size=8, # Default batch size for NEMO - data_format="instruct", - dataset_id="simpleqa", - shuffle=True, - ), - n_epochs=50, # Default epochs for NEMO - optimizer_config=post_training_supervised_fine_tune_params.TrainingConfigOptimizerConfig( - lr=0.0001, # Default learning rate - weight_decay=0.01, # NEMO-specific parameter - ), - # NEMO-specific parameters - log_every_n_steps=None, - val_check_interval=0.25, - sequence_packing_enabled=False, - hidden_dropout=None, - attention_dropout=None, - ffn_dropout=None, -) - -algorithm_config = algorithm_config_param.LoraFinetuningConfig( - alpha=16, # Default alpha for NEMO - type="LoRA", -) - -job_uuid = f"test-job{uuid.uuid4()}" - -# Example Model - must be a supported NEMO model -training_model = "meta/llama-3.1-8b-instruct" - -start_time = time.time() -response = client.post_training.supervised_fine_tune( - job_uuid=job_uuid, - logger_config={}, - model=training_model, - hyperparam_search_config={}, - training_config=training_config, - algorithm_config=algorithm_config, - checkpoint_dir="output", -) -print("Job: ", job_uuid) - -# Wait for the job to complete! -while True: - status = client.post_training.job.status(job_uuid=job_uuid) - if not status: - print("Job not found") - break - - print(status) - if status.status == "completed": - break - - print("Waiting for job to complete...") - time.sleep(5) - -end_time = time.time() -print("Job completed in", end_time - start_time, "seconds!") - -print("Artifacts:") -print(client.post_training.job.artifacts(job_uuid=job_uuid)) -``` - -## Supported Models - -Currently supports the following models: -- meta/llama-3.1-8b-instruct -- meta/llama-3.2-1b-instruct - -## Supported Parameters - -### TrainingConfig -- n_epochs (default: 50) -- data_config -- optimizer_config -- log_every_n_steps -- val_check_interval (default: 0.25) -- sequence_packing_enabled (default: False) -- hidden_dropout (0.0-1.0) -- attention_dropout (0.0-1.0) -- ffn_dropout (0.0-1.0) - -### DataConfig -- dataset_id -- batch_size (default: 8) - -### OptimizerConfig -- lr (default: 0.0001) -- weight_decay (default: 0.01) - -### LoRA Config -- alpha (default: 16) -- type (must be "LoRA") - -Note: Some parameters from the standard Llama Stack API are not supported and will be ignored with a warning. diff --git a/docs/source/advanced_apis/post_training/remote_nvidia.md b/docs/source/advanced_apis/post_training/remote_nvidia.md deleted file mode 100644 index 9840fa3c4..000000000 --- a/docs/source/advanced_apis/post_training/remote_nvidia.md +++ /dev/null @@ -1,32 +0,0 @@ ---- -orphan: true ---- - -# remote::nvidia - -## Description - -NVIDIA's post-training provider for fine-tuning models on NVIDIA's platform. - -## Configuration - -| Field | Type | Required | Default | Description | -|-------|------|----------|---------|-------------| -| `api_key` | `str \| None` | No | | The NVIDIA API key. | -| `dataset_namespace` | `str \| None` | No | default | The NVIDIA dataset namespace. | -| `project_id` | `str \| None` | No | test-example-model@v1 | The NVIDIA project ID. | -| `customizer_url` | `str \| None` | No | | Base URL for the NeMo Customizer API | -| `timeout` | `` | No | 300 | Timeout for the NVIDIA Post Training API | -| `max_retries` | `` | No | 3 | Maximum number of retries for the NVIDIA Post Training API | -| `output_model_dir` | `` | No | test-example-model@v1 | Directory to save the output model | - -## Sample Configuration - -```yaml -api_key: ${env.NVIDIA_API_KEY:=} -dataset_namespace: ${env.NVIDIA_DATASET_NAMESPACE:=default} -project_id: ${env.NVIDIA_PROJECT_ID:=test-project} -customizer_url: ${env.NVIDIA_CUSTOMIZER_URL:=http://nemo.test} - -``` - diff --git a/docs/source/advanced_apis/post_training/torchtune.md b/docs/source/advanced_apis/post_training/torchtune.md deleted file mode 100644 index ef72505b1..000000000 --- a/docs/source/advanced_apis/post_training/torchtune.md +++ /dev/null @@ -1,125 +0,0 @@ ---- -orphan: true ---- -# TorchTune - -[TorchTune](https://github.com/pytorch/torchtune) is an inline post training provider for Llama Stack. It provides a simple and efficient way to fine-tune language models using PyTorch. - -## Features - -- Simple access through the post_training API -- Fully integrated with Llama Stack -- GPU support and single device capabilities. -- Support for LoRA - -## Usage - -To use TorchTune in your Llama Stack project, follow these steps: - -1. Configure your Llama Stack project to use this provider. -2. Kick off a fine-tuning job using the Llama Stack post_training API. - -## Setup - -You can access the TorchTune trainer by writing your own yaml pointing to the provider: - -```yaml -post_training: - - provider_id: torchtune - provider_type: inline::torchtune - config: {} -``` - -you can then build and run your own stack with this provider. - -## Run Training - -You can access the provider and the `supervised_fine_tune` method via the post_training API: - -```python -import time -import uuid - -from llama_stack_client.types import ( - post_training_supervised_fine_tune_params, - algorithm_config_param, -) - - -def create_http_client(): - from llama_stack_client import LlamaStackClient - - return LlamaStackClient(base_url="http://localhost:8321") - - -client = create_http_client() - -# Example Dataset -client.datasets.register( - purpose="post-training/messages", - source={ - "type": "uri", - "uri": "huggingface://datasets/llamastack/simpleqa?split=train", - }, - dataset_id="simpleqa", -) - -training_config = post_training_supervised_fine_tune_params.TrainingConfig( - data_config=post_training_supervised_fine_tune_params.TrainingConfigDataConfig( - batch_size=32, - data_format="instruct", - dataset_id="simpleqa", - shuffle=True, - ), - gradient_accumulation_steps=1, - max_steps_per_epoch=0, - max_validation_steps=1, - n_epochs=4, -) - -algorithm_config = algorithm_config_param.LoraFinetuningConfig( - alpha=1, - apply_lora_to_mlp=True, - apply_lora_to_output=False, - lora_attn_modules=["q_proj"], - rank=1, - type="LoRA", -) - -job_uuid = f"test-job{uuid.uuid4()}" - -# Example Model -training_model = "meta-llama/Llama-2-7b-hf" - -start_time = time.time() -response = client.post_training.supervised_fine_tune( - job_uuid=job_uuid, - logger_config={}, - model=training_model, - hyperparam_search_config={}, - training_config=training_config, - algorithm_config=algorithm_config, - checkpoint_dir="output", -) -print("Job: ", job_uuid) - -# Wait for the job to complete! -while True: - status = client.post_training.job.status(job_uuid=job_uuid) - if not status: - print("Job not found") - break - - print(status) - if status.status == "completed": - break - - print("Waiting for job to complete...") - time.sleep(5) - -end_time = time.time() -print("Job completed in", end_time - start_time, "seconds!") - -print("Artifacts:") -print(client.post_training.job.artifacts(job_uuid=job_uuid)) -``` diff --git a/docs/source/advanced_apis/scoring/index.md b/docs/source/advanced_apis/scoring/index.md deleted file mode 100644 index 3cf7af537..000000000 --- a/docs/source/advanced_apis/scoring/index.md +++ /dev/null @@ -1,7 +0,0 @@ -# Scoring Providers - -This section contains documentation for all available providers for the **scoring** API. - -- [inline::basic](inline_basic.md) -- [inline::braintrust](inline_braintrust.md) -- [inline::llm-as-judge](inline_llm-as-judge.md) \ No newline at end of file diff --git a/docs/source/advanced_apis/scoring/inline_basic.md b/docs/source/advanced_apis/scoring/inline_basic.md deleted file mode 100644 index b56b36013..000000000 --- a/docs/source/advanced_apis/scoring/inline_basic.md +++ /dev/null @@ -1,17 +0,0 @@ ---- -orphan: true ---- - -# inline::basic - -## Description - -Basic scoring provider for simple evaluation metrics and scoring functions. - -## Sample Configuration - -```yaml -{} - -``` - diff --git a/docs/source/advanced_apis/scoring/inline_braintrust.md b/docs/source/advanced_apis/scoring/inline_braintrust.md deleted file mode 100644 index d1278217c..000000000 --- a/docs/source/advanced_apis/scoring/inline_braintrust.md +++ /dev/null @@ -1,23 +0,0 @@ ---- -orphan: true ---- - -# inline::braintrust - -## Description - -Braintrust scoring provider for evaluation and scoring using the Braintrust platform. - -## Configuration - -| Field | Type | Required | Default | Description | -|-------|------|----------|---------|-------------| -| `openai_api_key` | `str \| None` | No | | The OpenAI API Key | - -## Sample Configuration - -```yaml -openai_api_key: ${env.OPENAI_API_KEY:=} - -``` - diff --git a/docs/source/advanced_apis/scoring/inline_llm-as-judge.md b/docs/source/advanced_apis/scoring/inline_llm-as-judge.md deleted file mode 100644 index c7fcddf37..000000000 --- a/docs/source/advanced_apis/scoring/inline_llm-as-judge.md +++ /dev/null @@ -1,17 +0,0 @@ ---- -orphan: true ---- - -# inline::llm-as-judge - -## Description - -LLM-as-judge scoring provider that uses language models to evaluate and score responses. - -## Sample Configuration - -```yaml -{} - -``` - From c71ce8df61ad9b58caf1c623cc93536c82a7ae1b Mon Sep 17 00:00:00 2001 From: Alexey Rybak <50731695+reluctantfuturist@users.noreply.github.com> Date: Wed, 24 Sep 2025 14:05:30 -0700 Subject: [PATCH 140/150] docs: concepts and building_applications migration (#3534) # What does this PR do? - Migrates the remaining documentation sections to the new documentation format ## Test Plan - Partial migration --- .../building_applications/agent.mdx} | 32 +- .../agent_execution_loop.mdx} | 64 ++- docs/docs/building_applications/evals.mdx | 256 ++++++++++++ docs/docs/building_applications/index.mdx | 83 ++++ .../docs/building_applications/playground.mdx | 299 +++++++++++++ .../building_applications/rag.mdx} | 185 +++++--- .../building_applications/rag.png | Bin .../responses_vs_agents.mdx} | 74 +++- docs/docs/building_applications/safety.mdx | 395 ++++++++++++++++++ docs/docs/building_applications/telemetry.mdx | 342 +++++++++++++++ .../building_applications/tools.mdx} | 156 +++++-- .../concepts/apis/api_leveling.mdx} | 9 +- .../concepts/apis/api_providers.mdx} | 9 +- .../concepts/apis/external.mdx} | 6 + .../apis.md => docs/concepts/apis/index.mdx} | 9 +- .../concepts/architecture.mdx} | 24 +- .../concepts/distributions.mdx} | 11 +- docs/docs/concepts/index.mdx | 43 ++ .../concepts/resources.mdx} | 15 +- docs/docs/contributing/index.mdx | 244 +++++++++++ .../contributing/new_api_provider.mdx} | 10 +- .../contributing/new_vector_database.mdx} | 12 +- .../contributing/testing/record-replay.mdx} | 12 +- docs/docs/deploying/aws_eks_deployment.mdx | 30 ++ docs/docs/deploying/index.mdx | 14 + .../deploying/kubernetes_deployment.mdx} | 127 +++--- .../distributions/building_distro.mdx} | 8 +- .../distributions/configuration.mdx} | 6 + .../distributions/customizing_run_yaml.mdx} | 8 +- .../distributions/eks/apply.sh | 0 .../distributions/eks/gp3-topology-aware.yaml | 0 .../distributions/importing_as_library.mdx} | 6 + docs/docs/distributions/index.mdx | 21 + .../distributions/k8s/apply.sh | 0 .../k8s/chroma-k8s.yaml.template | 0 .../k8s/hf-token-secret.yaml.template | 0 .../k8s/ingress-k8s.yaml.template | 0 .../k8s/postgres-k8s.yaml.template | 0 .../distributions/k8s/stack-configmap.yaml | 0 .../distributions/k8s/stack-k8s.yaml.template | 0 .../distributions/k8s/stack_run_config.yaml | 0 .../distributions/k8s/ui-k8s.yaml.template | 0 .../distributions/k8s/vllm-k8s.yaml.template | 0 .../k8s/vllm-safety-k8s.yaml.template | 0 .../distributions/list_of_distributions.mdx} | 7 + .../ondevice_distro/android_sdk.md | 0 .../distributions/ondevice_distro/ios_sdk.md | 0 .../remote_hosted_distro/index.mdx} | 0 .../remote_hosted_distro/watsonx.md | 0 .../self_hosted_distro/dell-tgi.md | 0 .../distributions/self_hosted_distro/dell.md | 0 .../self_hosted_distro/passthrough.md | 0 .../self_hosted_distro/starter.md | 0 .../starting_llama_stack_server.mdx} | 7 + .../getting_started/demo_script.py | 0 .../getting_started/detailed_tutorial.mdx} | 10 + .../getting_started/libraries.mdx} | 8 +- .../getting_started/quickstart.mdx} | 94 ++++- docs/docs/index.mdx | 101 +++++ .../references/evals_reference/index.mdx} | 51 +-- .../resources/eval-concept.png | Bin .../evals_reference/resources/eval-flow.png | Bin docs/docs/references/index.mdx | 12 + .../llama_cli_reference/download_models.md | 0 .../references/llama_cli_reference/index.md | 0 .../llama_stack_client_cli_reference.md | 0 .../references/python_sdk_reference/index.md | 0 docs/source/building_applications/evals.md | 125 ------ docs/source/building_applications/index.md | 33 -- .../building_applications/playground/index.md | 107 ----- docs/source/building_applications/safety.md | 17 - .../source/building_applications/telemetry.md | 143 ------- docs/source/concepts/index.md | 23 - docs/source/contributing/index.md | 39 -- docs/source/deploying/index.md | 4 - docs/source/distributions/index.md | 15 - .../self_hosted_distro/meta-reference-gpu.md | 125 ------ .../self_hosted_distro/nvidia.md | 171 -------- docs/source/getting_started/index.md | 13 - docs/source/index.md | 133 ------ docs/source/references/api_reference/index.md | 6 - docs/source/references/index.md | 18 - 82 files changed, 2535 insertions(+), 1237 deletions(-) rename docs/{source/building_applications/agent.md => docs/building_applications/agent.mdx} (70%) rename docs/{source/building_applications/agent_execution_loop.md => docs/building_applications/agent_execution_loop.mdx} (72%) create mode 100644 docs/docs/building_applications/evals.mdx create mode 100644 docs/docs/building_applications/index.mdx create mode 100644 docs/docs/building_applications/playground.mdx rename docs/{source/building_applications/rag.md => docs/building_applications/rag.mdx} (60%) rename docs/{source => docs}/building_applications/rag.png (100%) rename docs/{source/building_applications/responses_vs_agents.md => docs/building_applications/responses_vs_agents.mdx} (80%) create mode 100644 docs/docs/building_applications/safety.mdx create mode 100644 docs/docs/building_applications/telemetry.mdx rename docs/{source/building_applications/tools.md => docs/building_applications/tools.mdx} (66%) rename docs/{source/apis/api_leveling.md => docs/concepts/apis/api_leveling.mdx} (97%) rename docs/{source/concepts/api_providers.md => docs/concepts/apis/api_providers.mdx} (85%) rename docs/{source/apis/external.md => docs/concepts/apis/external.mdx} (98%) rename docs/{source/concepts/apis.md => docs/concepts/apis/index.mdx} (89%) rename docs/{source/concepts/architecture.md => docs/concepts/architecture.mdx} (85%) rename docs/{source/concepts/distributions.md => docs/concepts/distributions.mdx} (81%) create mode 100644 docs/docs/concepts/index.mdx rename docs/{source/concepts/resources.md => docs/concepts/resources.mdx} (85%) create mode 100644 docs/docs/contributing/index.mdx rename docs/{source/contributing/new_api_provider.md => docs/contributing/new_api_provider.mdx} (95%) rename docs/{source/contributing/new_vector_database.md => docs/contributing/new_vector_database.mdx} (95%) rename docs/{source/contributing/testing/record-replay.md => docs/contributing/testing/record-replay.mdx} (95%) create mode 100644 docs/docs/deploying/aws_eks_deployment.mdx create mode 100644 docs/docs/deploying/index.mdx rename docs/{source/deploying/kubernetes_deployment.md => docs/deploying/kubernetes_deployment.mdx} (51%) rename docs/{source/distributions/building_distro.md => docs/distributions/building_distro.mdx} (99%) rename docs/{source/distributions/configuration.md => docs/distributions/configuration.mdx} (99%) rename docs/{source/distributions/customizing_run_yaml.md => docs/distributions/customizing_run_yaml.mdx} (88%) rename docs/{source => docs}/distributions/eks/apply.sh (100%) rename docs/{source => docs}/distributions/eks/gp3-topology-aware.yaml (100%) rename docs/{source/distributions/importing_as_library.md => docs/distributions/importing_as_library.mdx} (86%) create mode 100644 docs/docs/distributions/index.mdx rename docs/{source => docs}/distributions/k8s/apply.sh (100%) rename docs/{source => docs}/distributions/k8s/chroma-k8s.yaml.template (100%) rename docs/{source => docs}/distributions/k8s/hf-token-secret.yaml.template (100%) rename docs/{source => docs}/distributions/k8s/ingress-k8s.yaml.template (100%) rename docs/{source => docs}/distributions/k8s/postgres-k8s.yaml.template (100%) rename docs/{source => docs}/distributions/k8s/stack-configmap.yaml (100%) rename docs/{source => docs}/distributions/k8s/stack-k8s.yaml.template (100%) rename docs/{source => docs}/distributions/k8s/stack_run_config.yaml (100%) rename docs/{source => docs}/distributions/k8s/ui-k8s.yaml.template (100%) rename docs/{source => docs}/distributions/k8s/vllm-k8s.yaml.template (100%) rename docs/{source => docs}/distributions/k8s/vllm-safety-k8s.yaml.template (100%) rename docs/{source/distributions/list_of_distributions.md => docs/distributions/list_of_distributions.mdx} (95%) rename docs/{source => docs}/distributions/ondevice_distro/android_sdk.md (100%) rename docs/{source => docs}/distributions/ondevice_distro/ios_sdk.md (100%) rename docs/{source/distributions/remote_hosted_distro/index.md => docs/distributions/remote_hosted_distro/index.mdx} (100%) rename docs/{source => docs}/distributions/remote_hosted_distro/watsonx.md (100%) rename docs/{source => docs}/distributions/self_hosted_distro/dell-tgi.md (100%) rename docs/{source => docs}/distributions/self_hosted_distro/dell.md (100%) rename docs/{source => docs}/distributions/self_hosted_distro/passthrough.md (100%) rename docs/{source => docs}/distributions/self_hosted_distro/starter.md (100%) rename docs/{source/distributions/starting_llama_stack_server.md => docs/distributions/starting_llama_stack_server.mdx} (84%) rename docs/{source => docs}/getting_started/demo_script.py (100%) rename docs/{source/getting_started/detailed_tutorial.md => docs/getting_started/detailed_tutorial.mdx} (99%) rename docs/{source/getting_started/libraries.md => docs/getting_started/libraries.mdx} (85%) rename docs/{source/getting_started/quickstart.md => docs/getting_started/quickstart.mdx} (65%) create mode 100644 docs/docs/index.mdx rename docs/{source/references/evals_reference/index.md => docs/references/evals_reference/index.mdx} (92%) rename docs/{source => docs}/references/evals_reference/resources/eval-concept.png (100%) rename docs/{source => docs}/references/evals_reference/resources/eval-flow.png (100%) create mode 100644 docs/docs/references/index.mdx rename docs/{source => docs}/references/llama_cli_reference/download_models.md (100%) rename docs/{source => docs}/references/llama_cli_reference/index.md (100%) rename docs/{source => docs}/references/llama_stack_client_cli_reference.md (100%) rename docs/{source => docs}/references/python_sdk_reference/index.md (100%) delete mode 100644 docs/source/building_applications/evals.md delete mode 100644 docs/source/building_applications/index.md delete mode 100644 docs/source/building_applications/playground/index.md delete mode 100644 docs/source/building_applications/safety.md delete mode 100644 docs/source/building_applications/telemetry.md delete mode 100644 docs/source/concepts/index.md delete mode 100644 docs/source/contributing/index.md delete mode 100644 docs/source/deploying/index.md delete mode 100644 docs/source/distributions/index.md delete mode 100644 docs/source/distributions/self_hosted_distro/meta-reference-gpu.md delete mode 100644 docs/source/distributions/self_hosted_distro/nvidia.md delete mode 100644 docs/source/getting_started/index.md delete mode 100644 docs/source/index.md delete mode 100644 docs/source/references/api_reference/index.md delete mode 100644 docs/source/references/index.md diff --git a/docs/source/building_applications/agent.md b/docs/docs/building_applications/agent.mdx similarity index 70% rename from docs/source/building_applications/agent.md rename to docs/docs/building_applications/agent.mdx index 6fcc46152..33e98ea8d 100644 --- a/docs/source/building_applications/agent.md +++ b/docs/docs/building_applications/agent.mdx @@ -1,9 +1,18 @@ +--- +title: Agents +description: Build powerful AI applications with the Llama Stack agent framework +sidebar_label: Agents +sidebar_position: 3 +--- + +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; + # Agents An Agent in Llama Stack is a powerful abstraction that allows you to build complex AI applications. -The Llama Stack agent framework is built on a modular architecture that allows for flexible and powerful AI -applications. This document explains the key components and how they work together. +The Llama Stack agent framework is built on a modular architecture that allows for flexible and powerful AI applications. This document explains the key components and how they work together. ## Core Concepts @@ -19,7 +28,6 @@ Agents are configured using the `AgentConfig` class, which includes: ```python from llama_stack_client import Agent - # Create the agent agent = Agent( llama_stack_client, @@ -46,6 +54,9 @@ Each interaction with an agent is called a "turn" and consists of: - **Steps**: The agent's internal processing (inference, tool execution, etc.) - **Output Message**: The agent's response + + + ```python from llama_stack_client import AgentEventLogger @@ -57,9 +68,9 @@ turn_response = agent.create_turn( for log in AgentEventLogger().log(turn_response): log.print() ``` -### Non-Streaming - + + ```python from rich.pretty import pprint @@ -78,6 +89,9 @@ print("Steps:") pprint(response.steps) ``` + + + ### 4. Steps Each turn consists of multiple steps that represent the agent's thought process: @@ -88,5 +102,11 @@ Each turn consists of multiple steps that represent the agent's thought process: ## Agent Execution Loop +Refer to the [Agent Execution Loop](./agent_execution_loop) for more details on what happens within an agent turn. -Refer to the [Agent Execution Loop](agent_execution_loop) for more details on what happens within an agent turn. +## Related Resources + +- **[Agent Execution Loop](./agent_execution_loop)** - Understanding the internal processing flow +- **[RAG (Retrieval Augmented Generation)](./rag)** - Building knowledge-enhanced agents +- **[Tools Integration](./tools)** - Extending agent capabilities with external tools +- **[Safety Guardrails](./safety)** - Implementing responsible AI practices diff --git a/docs/source/building_applications/agent_execution_loop.md b/docs/docs/building_applications/agent_execution_loop.mdx similarity index 72% rename from docs/source/building_applications/agent_execution_loop.md rename to docs/docs/building_applications/agent_execution_loop.mdx index d66448449..458e997da 100644 --- a/docs/source/building_applications/agent_execution_loop.md +++ b/docs/docs/building_applications/agent_execution_loop.mdx @@ -1,10 +1,18 @@ -## Agent Execution Loop +--- +title: Agent Execution Loop +description: Understanding the internal processing flow of Llama Stack agents +sidebar_label: Agent Execution Loop +sidebar_position: 4 +--- -Agents are the heart of Llama Stack applications. They combine inference, memory, safety, and tool usage into coherent -workflows. At its core, an agent follows a sophisticated execution loop that enables multi-step reasoning, tool usage, -and safety checks. +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; -### Steps in the Agent Workflow +# Agent Execution Loop + +Agents are the heart of Llama Stack applications. They combine inference, memory, safety, and tool usage into coherent workflows. At its core, an agent follows a sophisticated execution loop that enables multi-step reasoning, tool usage, and safety checks. + +## Steps in the Agent Workflow Each agent turn follows these key steps: @@ -17,7 +25,7 @@ Each agent turn follows these key steps: 3. **Inference Loop**: The agent enters its main execution loop: - The LLM receives a user prompt (with previous tool outputs) - - The LLM generates a response, potentially with [tool calls](tools) + - The LLM generates a response, potentially with [tool calls](./tools) - If tool calls are present: - Tool inputs are safety-checked - Tools are executed (e.g., web search, code execution) @@ -29,7 +37,9 @@ Each agent turn follows these key steps: 4. **Final Safety Check**: The agent's final response is screened through safety shields -```{mermaid} +## Execution Flow Diagram + +```mermaid sequenceDiagram participant U as User participant E as Executor @@ -70,12 +80,15 @@ sequenceDiagram Each step in this process can be monitored and controlled through configurations. -### Agent Execution Loop Example +## Agent Execution Example + Here's an example that demonstrates monitoring the agent's execution: + + + ```python from llama_stack_client import LlamaStackClient, Agent, AgentEventLogger -from rich.pretty import pprint # Replace host and port client = LlamaStackClient(base_url=f"http://{HOST}:{PORT}") @@ -120,6 +133,13 @@ response = agent.create_turn( # Monitor each step of execution for log in AgentEventLogger().log(response): log.print() +``` + + + + +```python +from rich.pretty import pprint # Using non-streaming API, the response contains input, steps, and output. response = agent.create_turn( @@ -131,9 +151,35 @@ response = agent.create_turn( } ], session_id=session_id, + stream=False, ) pprint(f"Input: {response.input_messages}") pprint(f"Output: {response.output_message.content}") pprint(f"Steps: {response.steps}") ``` + + + + +## Key Configuration Options + +### Loop Control +- **max_infer_iters**: Maximum number of inference iterations (default: 5) +- **max_tokens**: Token limit for responses +- **temperature**: Controls response randomness + +### Safety Configuration +- **input_shields**: Safety checks for user input +- **output_shields**: Safety checks for agent responses + +### Tool Integration +- **tools**: List of available tools for the agent +- **tool_choice**: Control over when tools are used + +## Related Resources + +- **[Agents](./agent)** - Understanding agent fundamentals +- **[Tools Integration](./tools)** - Adding capabilities to agents +- **[Safety Guardrails](./safety)** - Implementing safety measures +- **[RAG (Retrieval Augmented Generation)](./rag)** - Building knowledge-enhanced workflows diff --git a/docs/docs/building_applications/evals.mdx b/docs/docs/building_applications/evals.mdx new file mode 100644 index 000000000..899c75dd4 --- /dev/null +++ b/docs/docs/building_applications/evals.mdx @@ -0,0 +1,256 @@ +--- +title: Evaluations +description: Evaluate LLM applications with Llama Stack's comprehensive evaluation framework +sidebar_label: Evaluations +sidebar_position: 7 +--- + +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; + +This guide walks you through the process of evaluating an LLM application built using Llama Stack. For detailed API reference, check out the [Evaluation Reference](/docs/references/evals-reference) guide that covers the complete set of APIs and developer experience flow. + +:::tip[Interactive Examples] +Check out our [Colab notebook](https://colab.research.google.com/drive/10CHyykee9j2OigaIcRv47BKG9mrNm0tJ?usp=sharing) for working examples with evaluations, or try the [Getting Started notebook](https://colab.research.google.com/github/meta-llama/llama-stack/blob/main/docs/getting_started.ipynb). +::: + +## Application Evaluation Example + +[![Open In Colab](https://colab.research.google.com/assets/colab-badge.svg)](https://colab.research.google.com/github/meta-llama/llama-stack/blob/main/docs/getting_started.ipynb) + +Llama Stack offers a library of scoring functions and the `/scoring` API, allowing you to run evaluations on your pre-annotated AI application datasets. + +In this example, we will show you how to: +1. **Build an Agent** with Llama Stack +2. **Query the agent's sessions, turns, and steps** to analyze execution +3. **Evaluate the results** using scoring functions + +## Step-by-Step Evaluation Process + +### 1. Building a Search Agent + +First, let's create an agent that can search the web to answer questions: + +```python +from llama_stack_client import LlamaStackClient, Agent, AgentEventLogger + +client = LlamaStackClient(base_url=f"http://{HOST}:{PORT}") + +agent = Agent( + client, + model="meta-llama/Llama-3.3-70B-Instruct", + instructions="You are a helpful assistant. Use search tool to answer the questions.", + tools=["builtin::websearch"], +) + +# Test prompts for evaluation +user_prompts = [ + "Which teams played in the NBA Western Conference Finals of 2024. Search the web for the answer.", + "In which episode and season of South Park does Bill Cosby (BSM-471) first appear? Give me the number and title. Search the web for the answer.", + "What is the British-American kickboxer Andrew Tate's kickboxing name? Search the web for the answer.", +] + +session_id = agent.create_session("test-session") + +# Execute all prompts in the session +for prompt in user_prompts: + response = agent.create_turn( + messages=[ + { + "role": "user", + "content": prompt, + } + ], + session_id=session_id, + ) + + for log in AgentEventLogger().log(response): + log.print() +``` + +### 2. Query Agent Execution Steps + +Now, let's analyze the agent's execution steps to understand its performance: + + + + +```python +from rich.pretty import pprint + +# Query the agent's session to get detailed execution data +session_response = client.agents.session.retrieve( + session_id=session_id, + agent_id=agent.agent_id, +) + +pprint(session_response) +``` + + + + +```python +# Sanity check: Verify that all user prompts are followed by tool calls +num_tool_call = 0 +for turn in session_response.turns: + for step in turn.steps: + if ( + step.step_type == "tool_execution" + and step.tool_calls[0].tool_name == "brave_search" + ): + num_tool_call += 1 + +print( + f"{num_tool_call}/{len(session_response.turns)} user prompts are followed by a tool call to `brave_search`" +) +``` + + + + +### 3. Evaluate Agent Responses + +Now we'll evaluate the agent's responses using Llama Stack's scoring API: + + + + +```python +# Process agent execution history into evaluation rows +eval_rows = [] + +# Define expected answers for our test prompts +expected_answers = [ + "Dallas Mavericks and the Minnesota Timberwolves", + "Season 4, Episode 12", + "King Cobra", +] + +# Create evaluation dataset from agent responses +for i, turn in enumerate(session_response.turns): + eval_rows.append( + { + "input_query": turn.input_messages[0].content, + "generated_answer": turn.output_message.content, + "expected_answer": expected_answers[i], + } + ) + +pprint(eval_rows) +``` + + + + +```python +# Configure scoring parameters +scoring_params = { + "basic::subset_of": None, # Check if generated answer contains expected answer +} + +# Run evaluation using Llama Stack's scoring API +scoring_response = client.scoring.score( + input_rows=eval_rows, + scoring_functions=scoring_params +) + +pprint(scoring_response) + +# Analyze results +for i, result in enumerate(scoring_response.results): + print(f"Query {i+1}: {result.score}") + print(f" Generated: {eval_rows[i]['generated_answer'][:100]}...") + print(f" Expected: {expected_answers[i]}") + print(f" Score: {result.score}") + print() +``` + + + + +## Available Scoring Functions + +Llama Stack provides several built-in scoring functions: + +### Basic Scoring Functions +- **`basic::subset_of`**: Checks if the expected answer is contained in the generated response +- **`basic::exact_match`**: Performs exact string matching between expected and generated answers +- **`basic::regex_match`**: Uses regular expressions to match patterns in responses + +### Advanced Scoring Functions +- **`llm_as_judge::accuracy`**: Uses an LLM to judge response accuracy +- **`llm_as_judge::helpfulness`**: Evaluates how helpful the response is +- **`llm_as_judge::safety`**: Assesses response safety and appropriateness + +### Custom Scoring Functions +You can also create custom scoring functions for domain-specific evaluation needs. + +## Evaluation Workflow Best Practices + +### 🎯 **Dataset Preparation** +- Use diverse test cases that cover edge cases and common scenarios +- Include clear expected answers or success criteria +- Balance your dataset across different difficulty levels + +### 📊 **Metrics Selection** +- Choose appropriate scoring functions for your use case +- Combine multiple metrics for comprehensive evaluation +- Consider both automated and human evaluation metrics + +### 🔄 **Iterative Improvement** +- Run evaluations regularly during development +- Use evaluation results to identify areas for improvement +- Track performance changes over time + +### 📈 **Analysis & Reporting** +- Analyze failures to understand model limitations +- Generate comprehensive evaluation reports +- Share results with stakeholders for informed decision-making + +## Advanced Evaluation Scenarios + +### Batch Evaluation +For evaluating large datasets efficiently: + +```python +# Prepare large evaluation dataset +large_eval_dataset = [ + {"input_query": query, "expected_answer": answer} + for query, answer in zip(queries, expected_answers) +] + +# Run batch evaluation +batch_results = client.scoring.score( + input_rows=large_eval_dataset, + scoring_functions={ + "basic::subset_of": None, + "llm_as_judge::accuracy": {"judge_model": "meta-llama/Llama-3.3-70B-Instruct"}, + } +) +``` + +### Multi-Metric Evaluation +Combining different scoring approaches: + +```python +comprehensive_scoring = { + "exact_match": "basic::exact_match", + "subset_match": "basic::subset_of", + "llm_judge": "llm_as_judge::accuracy", + "safety_check": "llm_as_judge::safety", +} + +results = client.scoring.score( + input_rows=eval_rows, + scoring_functions=comprehensive_scoring +) +``` + +## Related Resources + +- **[Agents](./agent)** - Building agents for evaluation +- **[Tools Integration](./tools)** - Using tools in evaluated agents +- **[Evaluation Reference](/docs/references/evals-reference)** - Complete API reference for evaluations +- **[Getting Started Notebook](https://colab.research.google.com/github/meta-llama/llama-stack/blob/main/docs/getting_started.ipynb)** - Interactive examples +- **[Evaluation Examples](https://colab.research.google.com/drive/10CHyykee9j2OigaIcRv47BKG9mrNm0tJ?usp=sharing)** - Additional evaluation scenarios diff --git a/docs/docs/building_applications/index.mdx b/docs/docs/building_applications/index.mdx new file mode 100644 index 000000000..0b9cb20fb --- /dev/null +++ b/docs/docs/building_applications/index.mdx @@ -0,0 +1,83 @@ +--- +title: Building Applications +description: Comprehensive guides for building AI applications with Llama Stack +sidebar_label: Overview +sidebar_position: 5 +--- + +# AI Application Examples + +Llama Stack provides all the building blocks needed to create sophisticated AI applications. + +## Getting Started + +The best way to get started is to look at this comprehensive notebook which walks through the various APIs (from basic inference, to RAG agents) and how to use them. + +**📓 [Building AI Applications Notebook](https://github.com/meta-llama/llama-stack/blob/main/docs/getting_started.ipynb)** + +## Core Topics + +Here are the key topics that will help you build effective AI applications: + +### 🤖 **Agent Development** +- **[Agent Framework](./agent)** - Understand the components and design patterns of the Llama Stack agent framework +- **[Agent Execution Loop](./agent_execution_loop)** - How agents process information, make decisions, and execute actions +- **[Agents vs Responses API](./responses_vs_agents)** - Learn when to use each API for different use cases + +### 📚 **Knowledge Integration** +- **[RAG (Retrieval-Augmented Generation)](./rag)** - Enhance your agents with external knowledge through retrieval mechanisms + +### 🛠️ **Capabilities & Extensions** +- **[Tools](./tools)** - Extend your agents' capabilities by integrating with external tools and APIs + +### 📊 **Quality & Monitoring** +- **[Evaluations](./evals)** - Evaluate your agents' effectiveness and identify areas for improvement +- **[Telemetry](./telemetry)** - Monitor and analyze your agents' performance and behavior +- **[Safety](./safety)** - Implement guardrails and safety measures to ensure responsible AI behavior + +### 🎮 **Interactive Development** +- **[Playground](./playground)** - Interactive environment for testing and developing applications + +## Application Patterns + +### 🤖 **Conversational Agents** +Build intelligent chatbots and assistants that can: +- Maintain context across conversations +- Access external knowledge bases +- Execute actions through tool integrations +- Apply safety filters and guardrails + +### 📖 **RAG Applications** +Create knowledge-augmented applications that: +- Retrieve relevant information from documents +- Generate contextually accurate responses +- Handle large knowledge bases efficiently +- Provide source attribution + +### 🔧 **Tool-Enhanced Systems** +Develop applications that can: +- Search the web for real-time information +- Interact with databases and APIs +- Perform calculations and analysis +- Execute complex multi-step workflows + +### 🛡️ **Enterprise Applications** +Build production-ready systems with: +- Comprehensive safety measures +- Performance monitoring and analytics +- Scalable deployment configurations +- Evaluation and quality assurance + +## Next Steps + +1. **📖 Start with the Notebook** - Work through the complete tutorial +2. **🎯 Choose Your Pattern** - Pick the application type that matches your needs +3. **🏗️ Build Your Foundation** - Set up your [providers](/docs/providers/) and [distributions](/docs/distributions/) +4. **🚀 Deploy & Monitor** - Use our [deployment guides](/docs/deploying/) for production + +## Related Resources + +- **[Getting Started](/docs/getting-started/)** - Basic setup and concepts +- **[Providers](/docs/providers/)** - Available AI service providers +- **[Distributions](/docs/distributions/)** - Pre-configured deployment packages +- **[API Reference](/docs/api/)** - Complete API documentation diff --git a/docs/docs/building_applications/playground.mdx b/docs/docs/building_applications/playground.mdx new file mode 100644 index 000000000..d9d3ba275 --- /dev/null +++ b/docs/docs/building_applications/playground.mdx @@ -0,0 +1,299 @@ +--- +title: Llama Stack Playground +description: Interactive interface to explore and experiment with Llama Stack capabilities +sidebar_label: Playground +sidebar_position: 10 +--- + +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; + +# Llama Stack Playground + +:::note[Experimental Feature] +The Llama Stack Playground is currently experimental and subject to change. We welcome feedback and contributions to help improve it. +::: + +The Llama Stack Playground is a simple interface that aims to: +- **Showcase capabilities and concepts** of Llama Stack in an interactive environment +- **Demo end-to-end application code** to help users get started building their own applications +- **Provide a UI** to help users inspect and understand Llama Stack API providers and resources + +## Key Features + +### Interactive Playground Pages + +The playground provides interactive pages for users to explore Llama Stack API capabilities: + +#### Chatbot Interface + + + + + + +**Simple Chat Interface** +- Chat directly with Llama models through an intuitive interface +- Uses the `/inference/chat-completion` streaming API under the hood +- Real-time message streaming for responsive interactions +- Perfect for testing model capabilities and prompt engineering + + + + +**Document-Aware Conversations** +- Upload documents to create memory banks +- Chat with a RAG-enabled agent that can query your documents +- Uses Llama Stack's `/agents` API to create and manage RAG sessions +- Ideal for exploring knowledge-enhanced AI applications + + + + +#### Evaluation Interface + + + + + + +**Custom Dataset Evaluation** +- Upload your own evaluation datasets +- Run evaluations using available scoring functions +- Uses Llama Stack's `/scoring` API for flexible evaluation workflows +- Great for testing application performance on custom metrics + + + + + + +**Pre-registered Evaluation Tasks** +- Evaluate models or agents on pre-defined tasks +- Uses Llama Stack's `/eval` API for comprehensive evaluation +- Combines datasets and scoring functions for standardized testing + +**Setup Requirements:** +Register evaluation datasets and benchmarks first: + +```bash +# Register evaluation dataset +llama-stack-client datasets register \ + --dataset-id "mmlu" \ + --provider-id "huggingface" \ + --url "https://huggingface.co/datasets/llamastack/evals" \ + --metadata '{"path": "llamastack/evals", "name": "evals__mmlu__details", "split": "train"}' \ + --schema '{"input_query": {"type": "string"}, "expected_answer": {"type": "string"}, "chat_completion_input": {"type": "string"}}' + +# Register benchmark task +llama-stack-client benchmarks register \ + --eval-task-id meta-reference-mmlu \ + --provider-id meta-reference \ + --dataset-id mmlu \ + --scoring-functions basic::regex_parser_multiple_choice_answer +``` + + + + +#### Inspection Interface + + + + + + +**Provider Management** +- Inspect available Llama Stack API providers +- View provider configurations and capabilities +- Uses the `/providers` API for real-time provider information +- Essential for understanding your deployment's capabilities + + + + +**Resource Exploration** +- Inspect Llama Stack API resources including: + - **Models**: Available language models + - **Datasets**: Registered evaluation datasets + - **Memory Banks**: Vector databases and knowledge stores + - **Benchmarks**: Evaluation tasks and scoring functions + - **Shields**: Safety and content moderation tools +- Uses `//list` APIs for comprehensive resource visibility +- For detailed information about resources, see [Core Concepts](/docs/concepts) + + + + +## Getting Started + +### Quick Start Guide + + + + +**1. Start the Llama Stack API Server** + +```bash +# Build and run a distribution (example: together) +llama stack build --distro together --image-type venv +llama stack run together +``` + +**2. Start the Streamlit UI** + +```bash +# Launch the playground interface +uv run --with ".[ui]" streamlit run llama_stack.core/ui/app.py +``` + + + + +**Making the Most of the Playground:** + +- **Start with Chat**: Test basic model interactions and prompt engineering +- **Explore RAG**: Upload sample documents to see knowledge-enhanced responses +- **Try Evaluations**: Use the scoring interface to understand evaluation metrics +- **Inspect Resources**: Check what providers and resources are available +- **Experiment with Settings**: Adjust parameters to see how they affect results + + + + +### Available Distributions + +The playground works with any Llama Stack distribution. Popular options include: + + + + +```bash +llama stack build --distro together --image-type venv +llama stack run together +``` + +**Features:** +- Cloud-hosted models +- Fast inference +- Multiple model options + + + + +```bash +llama stack build --distro ollama --image-type venv +llama stack run ollama +``` + +**Features:** +- Local model execution +- Privacy-focused +- No internet required + + + + +```bash +llama stack build --distro meta-reference --image-type venv +llama stack run meta-reference +``` + +**Features:** +- Reference implementation +- All API features available +- Best for development + + + + +## Use Cases & Examples + +### Educational Use Cases +- **Learning Llama Stack**: Hands-on exploration of API capabilities +- **Prompt Engineering**: Interactive testing of different prompting strategies +- **RAG Experimentation**: Understanding how document retrieval affects responses +- **Evaluation Understanding**: See how different metrics evaluate model performance + +### Development Use Cases +- **Prototype Testing**: Quick validation of application concepts +- **API Exploration**: Understanding available endpoints and parameters +- **Integration Planning**: Seeing how different components work together +- **Demo Creation**: Showcasing Llama Stack capabilities to stakeholders + +### Research Use Cases +- **Model Comparison**: Side-by-side testing of different models +- **Evaluation Design**: Understanding how scoring functions work +- **Safety Testing**: Exploring shield effectiveness with different inputs +- **Performance Analysis**: Measuring model behavior across different scenarios + +## Best Practices + +### 🚀 **Getting Started** +- Begin with simple chat interactions to understand basic functionality +- Gradually explore more advanced features like RAG and evaluations +- Use the inspection tools to understand your deployment's capabilities + +### 🔧 **Development Workflow** +- Use the playground to prototype before writing application code +- Test different parameter settings interactively +- Validate evaluation approaches before implementing them programmatically + +### 📊 **Evaluation & Testing** +- Start with simple scoring functions before trying complex evaluations +- Use the playground to understand evaluation results before automation +- Test safety features with various input types + +### 🎯 **Production Preparation** +- Use playground insights to inform your production API usage +- Test edge cases and error conditions interactively +- Validate resource configurations before deployment + +## Related Resources + +- **[Getting Started Guide](/docs/getting-started)** - Complete setup and introduction +- **[Core Concepts](/docs/concepts)** - Understanding Llama Stack fundamentals +- **[Agents](./agent)** - Building intelligent agents +- **[RAG (Retrieval Augmented Generation)](./rag)** - Knowledge-enhanced applications +- **[Evaluations](./evals)** - Comprehensive evaluation framework +- **[API Reference](/docs/api-reference)** - Complete API documentation diff --git a/docs/source/building_applications/rag.md b/docs/docs/building_applications/rag.mdx similarity index 60% rename from docs/source/building_applications/rag.md rename to docs/docs/building_applications/rag.mdx index 9390c0310..5212616d2 100644 --- a/docs/source/building_applications/rag.md +++ b/docs/docs/building_applications/rag.mdx @@ -1,36 +1,49 @@ -## Retrieval Augmented Generation (RAG) +--- +title: Retrieval Augmented Generation (RAG) +description: Build knowledge-enhanced AI applications with external document retrieval +sidebar_label: RAG (Retrieval Augmented Generation) +sidebar_position: 2 +--- + +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; + +# Retrieval Augmented Generation (RAG) RAG enables your applications to reference and recall information from previous interactions or external documents. -Llama Stack organizes the APIs that enable RAG into three layers: -1. The lowermost APIs deal with raw storage and retrieval. These include Vector IO, KeyValue IO (coming soon) and Relational IO (also coming soon.). -2. The next is the "Rag Tool", a first-class tool as part of the [Tools API](tools.md) that allows you to ingest documents (from URLs, files, etc) with various chunking strategies and query them smartly. -3. Finally, it all comes together with the top-level ["Agents" API](agent.md) that allows you to create agents that can use the tools to answer questions, perform tasks, and more. +## Architecture Overview -RAG System +Llama Stack organizes the APIs that enable RAG into three layers: + +1. **Lower-Level APIs**: Deal with raw storage and retrieval. These include Vector IO, KeyValue IO (coming soon) and Relational IO (also coming soon) +2. **RAG Tool**: A first-class tool as part of the [Tools API](./tools) that allows you to ingest documents (from URLs, files, etc) with various chunking strategies and query them smartly +3. **Agents API**: The top-level [Agents API](./agent) that allows you to create agents that can use the tools to answer questions, perform tasks, and more + +![RAG System Architecture](/img/rag.png) The RAG system uses lower-level storage for different types of data: -* **Vector IO**: For semantic search and retrieval -* **Key-Value and Relational IO**: For structured data storage +- **Vector IO**: For semantic search and retrieval +- **Key-Value and Relational IO**: For structured data storage +:::info[Future Storage Types] We may add more storage types like Graph IO in the future. +::: -### Setting up Vector DBs +## Setting up Vector Databases -For this guide, we will use [Ollama](https://ollama.com/) as the inference provider. -Ollama is an LLM runtime that allows you to run Llama models locally. +For this guide, we will use [Ollama](https://ollama.com/) as the inference provider. Ollama is an LLM runtime that allows you to run Llama models locally. Here's how to set up a vector database for RAG: ```python -# Create http client +# Create HTTP client import os from llama_stack_client import LlamaStackClient client = LlamaStackClient(base_url=f"http://localhost:{os.environ['LLAMA_STACK_PORT']}") - -# Register a vector db +# Register a vector database vector_db_id = "my_documents" response = client.vector_dbs.register( vector_db_id=vector_db_id, @@ -40,9 +53,15 @@ response = client.vector_dbs.register( ) ``` -### Ingesting Documents -You can ingest documents into the vector database using two methods: directly inserting pre-chunked -documents or using the RAG Tool. +## Document Ingestion + +You can ingest documents into the vector database using two methods: directly inserting pre-chunked documents or using the RAG Tool. + +### Direct Document Insertion + + + + ```python # You can insert a pre-chunked document directly into the vector db chunks = [ @@ -58,10 +77,11 @@ chunks = [ client.vector_io.insert(vector_db_id=vector_db_id, chunks=chunks) ``` -#### Using Precomputed Embeddings -If you decide to precompute embeddings for your documents, you can insert them directly into the vector database by -including the embedding vectors in the chunk data. This is useful if you have a separate embedding service or if you -want to customize the ingestion process. + + + +If you decide to precompute embeddings for your documents, you can insert them directly into the vector database by including the embedding vectors in the chunk data. This is useful if you have a separate embedding service or if you want to customize the ingestion process. + ```python chunks_with_embeddings = [ { @@ -79,44 +99,53 @@ chunks_with_embeddings = [ ] client.vector_io.insert(vector_db_id=vector_db_id, chunks=chunks_with_embeddings) ``` -When providing precomputed embeddings, ensure the embedding dimension matches the embedding_dimension specified when -registering the vector database. -### Retrieval +:::warning[Embedding Dimensions] +When providing precomputed embeddings, ensure the embedding dimension matches the `embedding_dimension` specified when registering the vector database. +::: + + + + +### Document Retrieval + You can query the vector database to retrieve documents based on their embeddings. + ```python # You can then query for these chunks chunks_response = client.vector_io.query( - vector_db_id=vector_db_id, query="What do you know about..." + vector_db_id=vector_db_id, + query="What do you know about..." ) ``` -### Using the RAG Tool +## Using the RAG Tool -> **⚠️ DEPRECATION NOTICE**: The RAG Tool is being deprecated in favor of directly using the OpenAI-compatible Search -> API. We recommend migrating to the OpenAI APIs for better compatibility and future support. +:::danger[Deprecation Notice] +The RAG Tool is being deprecated in favor of directly using the OpenAI-compatible Search API. We recommend migrating to the OpenAI APIs for better compatibility and future support. +::: -A better way to ingest documents is to use the RAG Tool. This tool allows you to ingest documents from URLs, files, etc. -and automatically chunks them into smaller pieces. More examples for how to format a RAGDocument can be found in the -[appendix](#more-ragdocument-examples). +A better way to ingest documents is to use the RAG Tool. This tool allows you to ingest documents from URLs, files, etc. and automatically chunks them into smaller pieces. More examples for how to format a RAGDocument can be found in the [appendix](#more-ragdocument-examples). -#### OpenAI API Integration & Migration +### OpenAI API Integration & Migration The RAG tool has been updated to use OpenAI-compatible APIs. This provides several benefits: - **Files API Integration**: Documents are now uploaded using OpenAI's file upload endpoints - **Vector Stores API**: Vector storage operations use OpenAI's vector store format with configurable chunking strategies -- **Error Resilience:** When processing multiple documents, individual failures are logged but don't crash the operation. Failed documents are skipped while successful ones continue processing. +- **Error Resilience**: When processing multiple documents, individual failures are logged but don't crash the operation. Failed documents are skipped while successful ones continue processing. + +### Migration Path -**Migration Path:** We recommend migrating to the OpenAI-compatible Search API for: -1. **Better OpenAI Ecosystem Integration**: Direct compatibility with OpenAI tools and workflows including the Responses API -2**Future-Proof**: Continued support and feature development -3**Full OpenAI Compatibility**: Vector Stores, Files, and Search APIs are fully compatible with OpenAI's Responses API -The OpenAI APIs are used under the hood, so you can continue to use your existing RAG Tool code with minimal changes. -However, we recommend updating your code to use the new OpenAI-compatible APIs for better long-term support. If any -documents fail to process, they will be logged in the response but will not cause the entire operation to fail. +1. **Better OpenAI Ecosystem Integration**: Direct compatibility with OpenAI tools and workflows including the Responses API +2. **Future-Proof**: Continued support and feature development +3. **Full OpenAI Compatibility**: Vector Stores, Files, and Search APIs are fully compatible with OpenAI's Responses API + +The OpenAI APIs are used under the hood, so you can continue to use your existing RAG Tool code with minimal changes. However, we recommend updating your code to use the new OpenAI-compatible APIs for better long-term support. If any documents fail to process, they will be logged in the response but will not cause the entire operation to fail. + +### RAG Tool Example ```python from llama_stack_client import RAGDocument @@ -145,9 +174,12 @@ results = client.tool_runtime.rag_tool.query( ) ``` -You can configure how the RAG tool adds metadata to the context if you find it useful for your application. Simply add: +### Custom Context Configuration + +You can configure how the RAG tool adds metadata to the context if you find it useful for your application: + ```python -# Query documents +# Query documents with custom template results = client.tool_runtime.rag_tool.query( vector_db_ids=[vector_db_id], content="What do you know about...", @@ -156,10 +188,13 @@ results = client.tool_runtime.rag_tool.query( }, ) ``` -### Building RAG-Enhanced Agents + +## Building RAG-Enhanced Agents One of the most powerful patterns is combining agents with RAG capabilities. Here's a complete example: +### Agent with Knowledge Search + ```python from llama_stack_client import Agent @@ -185,7 +220,6 @@ agent = Agent( ) session_id = agent.create_session("rag_session") - # Ask questions about documents in the vector db, and the agent will query the db to answer the question. response = agent.create_turn( messages=[{"role": "user", "content": "How to optimize memory in PyTorch?"}], @@ -193,10 +227,14 @@ response = agent.create_turn( ) ``` -> **NOTE:** the `instructions` field in the `AgentConfig` can be used to guide the agent's behavior. It is important to experiment with different instructions to see what works best for your use case. +:::tip[Agent Instructions] +The `instructions` field in the `AgentConfig` can be used to guide the agent's behavior. It is important to experiment with different instructions to see what works best for your use case. +::: +### Document-Aware Conversations + +You can also pass documents along with the user's message and ask questions about them: -You can also pass documents along with the user's message and ask questions about them. ```python # Initial document ingestion response = agent.create_turn( @@ -219,7 +257,10 @@ response = agent.create_turn( ) ``` -You can print the response with below. +### Viewing Agent Responses + +You can print the response with the following: + ```python from llama_stack_client import AgentEventLogger @@ -227,32 +268,74 @@ for log in AgentEventLogger().log(response): log.print() ``` +## Vector Database Management + ### Unregistering Vector DBs If you need to clean up and unregister vector databases, you can do so as follows: + + + ```python # Unregister a specified vector database vector_db_id = "my_vector_db_id" print(f"Unregistering vector database: {vector_db_id}") client.vector_dbs.unregister(vector_db_id=vector_db_id) +``` + + +```python # Unregister all vector databases for vector_db_id in client.vector_dbs.list(): print(f"Unregistering vector database: {vector_db_id.identifier}") client.vector_dbs.unregister(vector_db_id=vector_db_id.identifier) ``` -### Appendix + + + +## Best Practices + +### 🎯 **Document Chunking** +- Use appropriate chunk sizes (512 tokens is often a good starting point) +- Consider overlap between chunks for better context preservation +- Experiment with different chunking strategies for your content type + +### 🔍 **Embedding Strategy** +- Choose embedding models that match your domain +- Consider the trade-off between embedding dimension and performance +- Test different embedding models for your specific use case + +### 📊 **Query Optimization** +- Use specific, well-formed queries for better retrieval +- Experiment with different search strategies +- Consider hybrid approaches (keyword + semantic search) + +### 🛡️ **Error Handling** +- Implement proper error handling for failed document processing +- Monitor ingestion success rates +- Have fallback strategies for retrieval failures + +## Appendix + +### More RAGDocument Examples + +Here are various ways to create RAGDocument objects for different content types: -#### More RAGDocument Examples ```python from llama_stack_client import RAGDocument import base64 +# File URI RAGDocument(document_id="num-0", content={"uri": "file://path/to/file"}) + +# Plain text RAGDocument(document_id="num-1", content="plain text") + +# Explicit text input RAGDocument( document_id="num-2", content={ @@ -260,6 +343,8 @@ RAGDocument( "text": "plain text input", }, # for inputs that should be treated as text explicitly ) + +# Image from URL RAGDocument( document_id="num-3", content={ @@ -267,6 +352,8 @@ RAGDocument( "image": {"url": {"uri": "https://mywebsite.com/image.jpg"}}, }, ) + +# Base64 encoded image B64_ENCODED_IMAGE = base64.b64encode( requests.get( "https://raw.githubusercontent.com/meta-llama/llama-stack/refs/heads/main/docs/_static/llama-stack.png" diff --git a/docs/source/building_applications/rag.png b/docs/docs/building_applications/rag.png similarity index 100% rename from docs/source/building_applications/rag.png rename to docs/docs/building_applications/rag.png diff --git a/docs/source/building_applications/responses_vs_agents.md b/docs/docs/building_applications/responses_vs_agents.mdx similarity index 80% rename from docs/source/building_applications/responses_vs_agents.md rename to docs/docs/building_applications/responses_vs_agents.mdx index 63ff69e4f..c04cd2ce8 100644 --- a/docs/source/building_applications/responses_vs_agents.md +++ b/docs/docs/building_applications/responses_vs_agents.mdx @@ -1,10 +1,20 @@ +--- +title: Agents vs OpenAI Responses API +description: Compare the Agents API and OpenAI Responses API for building AI applications with tool calling capabilities +sidebar_label: Agents vs Responses API +sidebar_position: 5 +--- + +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; + # Agents vs OpenAI Responses API Llama Stack (LLS) provides two different APIs for building AI applications with tool calling capabilities: the **Agents API** and the **OpenAI Responses API**. While both enable AI systems to use tools, and maintain full conversation history, they serve different use cases and have distinct characteristics. -```{note} - **Note:** For simple and basic inferencing, you may want to use the [Chat Completions API](../providers/openai.md#chat-completions) directly, before progressing to Agents or Responses API. -``` +:::note +**Note:** For simple and basic inferencing, you may want to use the [Chat Completions API](/docs/providers/openai-compatibility#chat-completions) directly, before progressing to Agents or Responses API. +::: ## Overview @@ -21,6 +31,8 @@ Additionally, Agents let you specify input/output shields whereas Responses do n Today the Agents and Responses APIs can be used independently depending on the use case. But, it is also productive to treat the APIs as complementary. It is not currently supported, but it is planned for the LLS Agents API to alternatively use the Responses API as its backend instead of the default Chat Completions API, i.e., enabling a combination of the safety features of Agents with the dynamic configuration and branching capabilities of Responses. +## Feature Comparison + | Feature | LLS Agents API | OpenAI Responses API | |---------|------------|---------------------| | **Conversation Management** | Linear persistent sessions | Can branch from any previous response ID | @@ -34,7 +46,10 @@ Let's compare how both APIs handle a research task where we need to: 2. Access different information sources dynamically 3. Continue the conversation based on search results -### Agents API: Session-based configuration with safety shields + + + +### Session-based Configuration with Safety Shields ```python # Create agent with static session configuration @@ -85,7 +100,10 @@ print(f"First result: {response1.output_message.content}") print(f"Optimization: {response2.output_message.content}") ``` -### Responses API: Dynamic per-call configuration with branching + + + +### Dynamic Per-call Configuration with Branching ```python # First response: Use web search for latest algorithms @@ -130,50 +148,74 @@ print(f"File search results: {response2.output_message.content}") print(f"Alternative web search: {response3.output_message.content}") ``` + + + Both APIs demonstrate distinct strengths that make them valuable on their own for different scenarios. The Agents API excels in providing structured, safety-conscious workflows with persistent session management, while the Responses API offers flexibility through dynamic configuration and OpenAI compatible tool patterns. ## Use Case Examples -### 1. **Research and Analysis with Safety Controls** +### 1. Research and Analysis with Safety Controls **Best Choice: Agents API** **Scenario:** You're building a research assistant for a financial institution that needs to analyze market data, execute code to process financial models, and search through internal compliance documents. The system must ensure all interactions are logged for regulatory compliance and protected by safety shields to prevent malicious code execution or data leaks. **Why Agents API?** The Agents API provides persistent session management for iterative research workflows, built-in safety shields to protect against malicious code in financial models, and structured execution logs (session/turn/step) required for regulatory compliance. The static tool configuration ensures consistent access to your knowledge base and code interpreter throughout the entire research session. -### 2. **Dynamic Information Gathering with Branching Exploration** +### 2. Dynamic Information Gathering with Branching Exploration **Best Choice: Responses API** **Scenario:** You're building a competitive intelligence tool that helps businesses research market trends. Users need to dynamically switch between web search for current market data and file search through uploaded industry reports. They also want to branch conversations to explore different market segments simultaneously and experiment with different models for various analysis types. **Why Responses API?** The Responses API's branching capability lets users explore multiple market segments from any research point. Dynamic per-call configuration allows switching between web search and file search as needed, while experimenting with different models (faster models for quick searches, more powerful models for deep analysis). The OpenAI-compatible tool patterns make integration straightforward. -### 3. **OpenAI Migration with Advanced Tool Capabilities** +### 3. OpenAI Migration with Advanced Tool Capabilities **Best Choice: Responses API** **Scenario:** You have an existing application built with OpenAI's Assistants API that uses file search and web search capabilities. You want to migrate to Llama Stack for better performance and cost control while maintaining the same tool calling patterns and adding new capabilities like dynamic vector store selection. **Why Responses API?** The Responses API provides full OpenAI tool compatibility (`web_search`, `file_search`) with identical syntax, making migration seamless. The dynamic per-call configuration enables advanced features like switching vector stores per query or changing models based on query complexity - capabilities that extend beyond basic OpenAI functionality while maintaining compatibility. -### 4. **Educational Programming Tutor** +### 4. Educational Programming Tutor **Best Choice: Agents API** **Scenario:** You're building a programming tutor that maintains student context across multiple sessions, safely executes code exercises, and tracks learning progress with audit trails for educators. **Why Agents API?** Persistent sessions remember student progress across multiple interactions, safety shields prevent malicious code execution while allowing legitimate programming exercises, and structured execution logs help educators track learning patterns. -### 5. **Advanced Software Debugging Assistant** +### 5. Advanced Software Debugging Assistant **Best Choice: Agents API with Responses Backend** **Scenario:** You're building a debugging assistant that helps developers troubleshoot complex issues. It needs to maintain context throughout a debugging session, safely execute diagnostic code, switch between different analysis tools dynamically, and branch conversations to explore multiple potential causes simultaneously. **Why Agents + Responses?** The Agent provides safety shields for code execution and session management for the overall debugging workflow. The underlying Responses API enables dynamic model selection and flexible tool configuration per query, while branching lets you explore different theories (memory leak vs. concurrency issue) from the same debugging point and compare results. -> **Note:** The ability to use Responses API as the backend for Agents is not yet implemented but is planned for a future release. Currently, Agents use Chat Completions API as their backend by default. +:::info[Future Enhancement] +The ability to use Responses API as the backend for Agents is not yet implemented but is planned for a future release. Currently, Agents use Chat Completions API as their backend by default. +::: -## For More Information +## Decision Framework -- **LLS Agents API**: For detailed information on creating and managing agents, see the [Agents documentation](agent.md) -- **OpenAI Responses API**: For information on using the OpenAI-compatible responses API, see the [OpenAI API documentation](https://platform.openai.com/docs/api-reference/responses) -- **Chat Completions API**: For the default backend API used by Agents, see the [Chat Completions providers documentation](../providers/openai.md#chat-completions) -- **Agent Execution Loop**: For understanding how agents process turns and steps in their execution, see the [Agent Execution Loop documentation](agent_execution_loop.md) +Use this framework to choose the right API for your use case: + +### Choose Agents API when: +- ✅ You need **safety shields** for input/output validation +- ✅ Your application requires **linear conversation flow** with persistent context +- ✅ You need **audit trails** and structured execution logs +- ✅ Your tool configuration is **static** throughout the session +- ✅ You're building **educational, financial, or enterprise** applications with compliance requirements + +### Choose Responses API when: +- ✅ You need **conversation branching** to explore multiple paths +- ✅ You want **dynamic per-call configuration** (models, tools, vector stores) +- ✅ You're **migrating from OpenAI** and want familiar tool patterns +- ✅ You need **OpenAI compatibility** for existing workflows +- ✅ Your application benefits from **flexible, experimental** interactions + +## Related Resources + +- **[Agents](./agent)** - Understanding the Agents API fundamentals +- **[Agent Execution Loop](./agent_execution_loop)** - How agents process turns and steps +- **[Tools Integration](./tools)** - Adding capabilities to both APIs +- **[OpenAI Compatibility](/docs/providers/openai-compatibility)** - Using OpenAI-compatible endpoints +- **[Safety Guardrails](./safety)** - Implementing safety measures in agents diff --git a/docs/docs/building_applications/safety.mdx b/docs/docs/building_applications/safety.mdx new file mode 100644 index 000000000..16fe5f6f8 --- /dev/null +++ b/docs/docs/building_applications/safety.mdx @@ -0,0 +1,395 @@ +--- +title: Safety Guardrails +description: Implement safety measures and content moderation in Llama Stack applications +sidebar_label: Safety +sidebar_position: 9 +--- + +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; + +# Safety Guardrails + +Safety is a critical component of any AI application. Llama Stack provides a comprehensive Shield system that can be applied at multiple touchpoints to ensure responsible AI behavior and content moderation. + +## Shield System Overview + +The Shield system in Llama Stack provides: +- **Content filtering** for both input and output messages +- **Multi-touchpoint protection** across your application flow +- **Configurable safety policies** tailored to your use case +- **Integration with agents** for automated safety enforcement + +## Basic Shield Usage + +### Registering a Safety Shield + + + + +```python +# Register a safety shield +shield_id = "content_safety" +client.shields.register( + shield_id=shield_id, + provider_shield_id="llama-guard-basic" +) +``` + + + + +```python +# Run content through shield manually +response = client.safety.run_shield( + shield_id=shield_id, + messages=[{"role": "user", "content": "User message here"}] +) + +if response.violation: + print(f"Safety violation detected: {response.violation.user_message}") + # Handle violation appropriately +else: + print("Content passed safety checks") +``` + + + + +## Agent Integration + +Shields can be automatically applied to agent interactions for seamless safety enforcement: + + + + +```python +from llama_stack_client import Agent + +# Create agent with input safety shields +agent = Agent( + client, + model="meta-llama/Llama-3.2-3B-Instruct", + instructions="You are a helpful assistant", + input_shields=["content_safety"], # Shield user inputs + tools=["builtin::websearch"], +) + +session_id = agent.create_session("safe_session") + +# All user inputs will be automatically screened +response = agent.create_turn( + messages=[{"role": "user", "content": "Tell me about AI safety"}], + session_id=session_id, +) +``` + + + + +```python +# Create agent with output safety shields +agent = Agent( + client, + model="meta-llama/Llama-3.2-3B-Instruct", + instructions="You are a helpful assistant", + output_shields=["content_safety"], # Shield agent outputs + tools=["builtin::websearch"], +) + +session_id = agent.create_session("safe_session") + +# All agent responses will be automatically screened +response = agent.create_turn( + messages=[{"role": "user", "content": "Help me with my research"}], + session_id=session_id, +) +``` + + + + +```python +# Create agent with comprehensive safety coverage +agent = Agent( + client, + model="meta-llama/Llama-3.2-3B-Instruct", + instructions="You are a helpful assistant", + input_shields=["content_safety"], # Screen user inputs + output_shields=["content_safety"], # Screen agent outputs + tools=["builtin::websearch"], +) + +session_id = agent.create_session("fully_protected_session") + +# Both input and output are automatically protected +response = agent.create_turn( + messages=[{"role": "user", "content": "Research question here"}], + session_id=session_id, +) +``` + + + + +## Available Shield Types + +### Llama Guard Shields + +Llama Guard provides state-of-the-art content safety classification: + + + + +```python +# Basic Llama Guard for general content safety +client.shields.register( + shield_id="llama_guard_basic", + provider_shield_id="llama-guard-basic" +) +``` + +**Use Cases:** +- General content moderation +- Harmful content detection +- Basic safety compliance + + + + +```python +# Advanced Llama Guard with custom categories +client.shields.register( + shield_id="llama_guard_advanced", + provider_shield_id="llama-guard-advanced", + config={ + "categories": [ + "violence", "hate_speech", "sexual_content", + "self_harm", "illegal_activity" + ], + "threshold": 0.8 + } +) +``` + +**Use Cases:** +- Fine-tuned safety policies +- Domain-specific content filtering +- Enterprise compliance requirements + + + + +### Custom Safety Shields + +Create domain-specific safety shields for specialized use cases: + +```python +# Register custom safety shield +client.shields.register( + shield_id="financial_compliance", + provider_shield_id="custom-financial-shield", + config={ + "detect_pii": True, + "financial_advice_warning": True, + "regulatory_compliance": "FINRA" + } +) +``` + +## Safety Response Handling + +When safety violations are detected, handle them appropriately: + + + + +```python +response = client.safety.run_shield( + shield_id="content_safety", + messages=[{"role": "user", "content": "Potentially harmful content"}] +) + +if response.violation: + violation = response.violation + print(f"Violation Type: {violation.violation_type}") + print(f"User Message: {violation.user_message}") + print(f"Metadata: {violation.metadata}") + + # Log the violation for audit purposes + logger.warning(f"Safety violation detected: {violation.violation_type}") + + # Provide appropriate user feedback + return "I can't help with that request. Please try asking something else." +``` + + + + +```python +def handle_safety_response(safety_response, user_message): + """Advanced safety response handling with logging and user feedback""" + + if not safety_response.violation: + return {"safe": True, "message": "Content passed safety checks"} + + violation = safety_response.violation + + # Log violation details + audit_log = { + "timestamp": datetime.now().isoformat(), + "violation_type": violation.violation_type, + "original_message": user_message, + "shield_response": violation.user_message, + "metadata": violation.metadata + } + logger.warning(f"Safety violation: {audit_log}") + + # Determine appropriate response based on violation type + if violation.violation_type == "hate_speech": + user_feedback = "I can't engage with content that contains hate speech. Let's keep our conversation respectful." + elif violation.violation_type == "violence": + user_feedback = "I can't provide information that could promote violence. How else can I help you today?" + else: + user_feedback = "I can't help with that request. Please try asking something else." + + return { + "safe": False, + "user_feedback": user_feedback, + "violation_details": audit_log + } + +# Usage +safety_result = handle_safety_response(response, user_input) +if not safety_result["safe"]: + return safety_result["user_feedback"] +``` + + + + +## Safety Configuration Best Practices + +### 🛡️ **Multi-Layer Protection** +- Use both input and output shields for comprehensive coverage +- Combine multiple shield types for different threat categories +- Implement fallback mechanisms when shields fail + +### 📊 **Monitoring & Auditing** +- Log all safety violations for compliance and analysis +- Monitor false positive rates to tune shield sensitivity +- Track safety metrics across different use cases + +### ⚙️ **Configuration Management** +- Use environment-specific safety configurations +- Implement A/B testing for shield effectiveness +- Regularly update shield models and policies + +### 🔧 **Integration Patterns** +- Integrate shields early in the development process +- Test safety measures with adversarial inputs +- Provide clear user feedback for violations + +## Advanced Safety Scenarios + +### Context-Aware Safety + +```python +# Safety shields that consider conversation context +agent = Agent( + client, + model="meta-llama/Llama-3.2-3B-Instruct", + instructions="You are a healthcare assistant", + input_shields=["medical_safety"], + output_shields=["medical_safety"], + # Context helps shields make better decisions + safety_context={ + "domain": "healthcare", + "user_type": "patient", + "compliance_level": "HIPAA" + } +) +``` + +### Dynamic Shield Selection + +```python +def select_shield_for_user(user_profile): + """Select appropriate safety shield based on user context""" + if user_profile.age < 18: + return "child_safety_shield" + elif user_profile.context == "enterprise": + return "enterprise_compliance_shield" + else: + return "general_safety_shield" + +# Use dynamic shield selection +shield_id = select_shield_for_user(current_user) +response = client.safety.run_shield( + shield_id=shield_id, + messages=messages +) +``` + +## Compliance and Regulations + +### Industry-Specific Safety + + + + +```python +# Healthcare-specific safety configuration +client.shields.register( + shield_id="hipaa_compliance", + provider_shield_id="healthcare-safety-shield", + config={ + "detect_phi": True, # Protected Health Information + "medical_advice_warning": True, + "regulatory_framework": "HIPAA" + } +) +``` + + + + +```python +# Financial services safety configuration +client.shields.register( + shield_id="finra_compliance", + provider_shield_id="financial-safety-shield", + config={ + "detect_financial_advice": True, + "investment_disclaimers": True, + "regulatory_framework": "FINRA" + } +) +``` + + + + +```python +# Educational platform safety for minors +client.shields.register( + shield_id="coppa_compliance", + provider_shield_id="educational-safety-shield", + config={ + "child_protection": True, + "educational_content_only": True, + "regulatory_framework": "COPPA" + } +) +``` + + + + +## Related Resources + +- **[Agents](./agent)** - Integrating safety shields with intelligent agents +- **[Agent Execution Loop](./agent_execution_loop)** - Understanding safety in the execution flow +- **[Evaluations](./evals)** - Evaluating safety shield effectiveness +- **[Telemetry](./telemetry)** - Monitoring safety violations and metrics +- **[Llama Guard Documentation](https://github.com/meta-llama/PurpleLlama/tree/main/Llama-Guard3)** - Advanced safety model details diff --git a/docs/docs/building_applications/telemetry.mdx b/docs/docs/building_applications/telemetry.mdx new file mode 100644 index 000000000..6a255e702 --- /dev/null +++ b/docs/docs/building_applications/telemetry.mdx @@ -0,0 +1,342 @@ +--- +title: Telemetry +description: Monitor and observe Llama Stack applications with comprehensive telemetry capabilities +sidebar_label: Telemetry +sidebar_position: 8 +--- + +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; + +# Telemetry + +The Llama Stack telemetry system provides comprehensive tracing, metrics, and logging capabilities. It supports multiple sink types including OpenTelemetry, SQLite, and Console output for complete observability of your AI applications. + +## Event Types + +The telemetry system supports three main types of events: + + + + +Free-form log messages with severity levels for general application logging: + +```python +unstructured_log_event = UnstructuredLogEvent( + message="This is a log message", + severity=LogSeverity.INFO +) +``` + + + + +Numerical measurements with units for tracking performance and usage: + +```python +metric_event = MetricEvent( + metric="my_metric", + value=10, + unit="count" +) +``` + + + + +System events like span start/end that provide structured operation tracking: + +```python +structured_log_event = SpanStartPayload( + name="my_span", + parent_span_id="parent_span_id" +) +``` + + + + +## Spans and Traces + +- **Spans**: Represent individual operations with timing information and hierarchical relationships +- **Traces**: Collections of related spans that form a complete request flow across your application + +This hierarchical structure allows you to understand the complete execution path of requests through your Llama Stack application. + +## Automatic Metrics Generation + +Llama Stack automatically generates metrics during inference operations. These metrics are aggregated at the **inference request level** and provide insights into token usage and model performance. + +### Available Metrics + +The following metrics are automatically generated for each inference request: + +| Metric Name | Type | Unit | Description | Labels | +|-------------|------|------|-------------|--------| +| `llama_stack_prompt_tokens_total` | Counter | `tokens` | Number of tokens in the input prompt | `model_id`, `provider_id` | +| `llama_stack_completion_tokens_total` | Counter | `tokens` | Number of tokens in the generated response | `model_id`, `provider_id` | +| `llama_stack_tokens_total` | Counter | `tokens` | Total tokens used (prompt + completion) | `model_id`, `provider_id` | + +### Metric Generation Flow + +1. **Token Counting**: During inference operations (chat completion, completion, etc.), the system counts tokens in both input prompts and generated responses +2. **Metric Construction**: For each request, `MetricEvent` objects are created with the token counts +3. **Telemetry Logging**: Metrics are sent to the configured telemetry sinks +4. **OpenTelemetry Export**: When OpenTelemetry is enabled, metrics are exposed as standard OpenTelemetry counters + +### Metric Aggregation Level + +All metrics are generated and aggregated at the **inference request level**. This means: + +- Each individual inference request generates its own set of metrics +- Metrics are not pre-aggregated across multiple requests +- Aggregation (sums, averages, etc.) can be performed by your observability tools (Prometheus, Grafana, etc.) +- Each metric includes labels for `model_id` and `provider_id` to enable filtering and grouping + +### Example Metric Event + +```python +MetricEvent( + trace_id="1234567890abcdef", + span_id="abcdef1234567890", + metric="total_tokens", + value=150, + timestamp=1703123456.789, + unit="tokens", + attributes={ + "model_id": "meta-llama/Llama-3.2-3B-Instruct", + "provider_id": "tgi" + }, +) +``` + +## Telemetry Sinks + +Choose from multiple sink types based on your observability needs: + + + + +Send events to an OpenTelemetry Collector for integration with observability platforms: + +**Use Cases:** +- Visualizing traces in tools like Jaeger +- Collecting metrics for Prometheus +- Integration with enterprise observability stacks + +**Features:** +- Standard OpenTelemetry format +- Compatible with all OpenTelemetry collectors +- Supports both traces and metrics + + + + +Store events in a local SQLite database for direct querying: + +**Use Cases:** +- Local development and debugging +- Custom analytics and reporting +- Offline analysis of application behavior + +**Features:** +- Direct SQL querying capabilities +- Persistent local storage +- No external dependencies + + + + +Print events to the console for immediate debugging: + +**Use Cases:** +- Development and testing +- Quick debugging sessions +- Simple logging without external tools + +**Features:** +- Immediate output visibility +- No setup required +- Human-readable format + + + + +## Configuration + +### Meta-Reference Provider + +Currently, only the meta-reference provider is implemented. It can be configured to send events to multiple sink types: + +```yaml +telemetry: + - provider_id: meta-reference + provider_type: inline::meta-reference + config: + service_name: "llama-stack-service" + sinks: ['console', 'sqlite', 'otel_trace', 'otel_metric'] + otel_exporter_otlp_endpoint: "http://localhost:4318" + sqlite_db_path: "/path/to/telemetry.db" +``` + +### Environment Variables + +Configure telemetry behavior using environment variables: + +- **`OTEL_EXPORTER_OTLP_ENDPOINT`**: OpenTelemetry Collector endpoint (default: `http://localhost:4318`) +- **`OTEL_SERVICE_NAME`**: Service name for telemetry (default: empty string) +- **`TELEMETRY_SINKS`**: Comma-separated list of sinks (default: `console,sqlite`) + +## Visualization with Jaeger + +The `otel_trace` sink works with any service compatible with the OpenTelemetry collector. Traces and metrics use separate endpoints but can share the same collector. + +### Starting Jaeger + +Start a Jaeger instance with OTLP HTTP endpoint at 4318 and the Jaeger UI at 16686: + +```bash +docker run --pull always --rm --name jaeger \ + -p 16686:16686 -p 4318:4318 \ + jaegertracing/jaeger:2.1.0 +``` + +Once running, you can visualize traces by navigating to [http://localhost:16686/](http://localhost:16686/). + +## Querying Metrics + +When using the OpenTelemetry sink, metrics are exposed in standard format and can be queried through various tools: + + + + +Example Prometheus queries for analyzing token usage: + +```promql +# Total tokens used across all models +sum(llama_stack_tokens_total) + +# Tokens per model +sum by (model_id) (llama_stack_tokens_total) + +# Average tokens per request over 5 minutes +rate(llama_stack_tokens_total[5m]) + +# Token usage by provider +sum by (provider_id) (llama_stack_tokens_total) +``` + + + + +Create dashboards using Prometheus as a data source: + +- **Token Usage Over Time**: Line charts showing token consumption trends +- **Model Performance**: Comparison of different models by token efficiency +- **Provider Analysis**: Breakdown of usage across different providers +- **Request Patterns**: Understanding peak usage times and patterns + + + + +Forward metrics to other observability systems: + +- Export to multiple backends simultaneously +- Apply transformations and filtering +- Integrate with existing monitoring infrastructure + + + + +## SQLite Querying + +The `sqlite` sink allows you to query traces without an external system. This is particularly useful for development and custom analytics. + +### Example Queries + +```sql +-- Query recent traces +SELECT * FROM traces WHERE timestamp > datetime('now', '-1 hour'); + +-- Analyze span durations +SELECT name, AVG(duration_ms) as avg_duration +FROM spans +GROUP BY name +ORDER BY avg_duration DESC; + +-- Find slow operations +SELECT * FROM spans +WHERE duration_ms > 1000 +ORDER BY duration_ms DESC; +``` + +:::tip[Advanced Analytics] +Refer to the [Getting Started notebook](https://github.com/meta-llama/llama-stack/blob/main/docs/getting_started.ipynb) for more examples on querying traces and spans programmatically. +::: + +## Best Practices + +### 🔍 **Monitoring Strategy** +- Use OpenTelemetry for production environments +- Combine multiple sinks for development (console + SQLite) +- Set up alerts on key metrics like token usage and error rates + +### 📊 **Metrics Analysis** +- Track token usage trends to optimize costs +- Monitor response times across different models +- Analyze usage patterns to improve resource allocation + +### 🚨 **Alerting & Debugging** +- Set up alerts for unusual token consumption spikes +- Use trace data to debug performance issues +- Monitor error rates and failure patterns + +### 🔧 **Configuration Management** +- Use environment variables for flexible deployment +- Configure appropriate retention policies for SQLite +- Ensure proper network access to OpenTelemetry collectors + +## Integration Examples + +### Basic Telemetry Setup + +```python +from llama_stack_client import LlamaStackClient + +# Client with telemetry headers +client = LlamaStackClient( + base_url="http://localhost:8000", + extra_headers={ + "X-Telemetry-Service": "my-ai-app", + "X-Telemetry-Version": "1.0.0" + } +) + +# All API calls will be automatically traced +response = client.inference.chat_completion( + model="meta-llama/Llama-3.2-3B-Instruct", + messages=[{"role": "user", "content": "Hello!"}] +) +``` + +### Custom Telemetry Context + +```python +# Add custom span attributes for better tracking +with tracer.start_as_current_span("custom_operation") as span: + span.set_attribute("user_id", "user123") + span.set_attribute("operation_type", "chat_completion") + + response = client.inference.chat_completion( + model="meta-llama/Llama-3.2-3B-Instruct", + messages=[{"role": "user", "content": "Hello!"}] + ) +``` + +## Related Resources + +- **[Agents](./agent)** - Monitoring agent execution with telemetry +- **[Evaluations](./evals)** - Using telemetry data for performance evaluation +- **[Getting Started Notebook](https://github.com/meta-llama/llama-stack/blob/main/docs/getting_started.ipynb)** - Telemetry examples and queries +- **[OpenTelemetry Documentation](https://opentelemetry.io/)** - Comprehensive observability framework +- **[Jaeger Documentation](https://www.jaegertracing.io/)** - Distributed tracing visualization diff --git a/docs/source/building_applications/tools.md b/docs/docs/building_applications/tools.mdx similarity index 66% rename from docs/source/building_applications/tools.md rename to docs/docs/building_applications/tools.mdx index 8a54290ed..be60a1639 100644 --- a/docs/source/building_applications/tools.md +++ b/docs/docs/building_applications/tools.mdx @@ -1,6 +1,17 @@ +--- +title: Tools +description: Extend agent capabilities with external tools and function calling +sidebar_label: Tools +sidebar_position: 6 +--- + +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; + # Tools Tools are functions that can be invoked by an agent to perform tasks. They are organized into tool groups and registered with specific providers. Each tool group represents a collection of related tools from a single provider. They are organized into groups so that state can be externalized: the collection operates on the same state typically. + An example of this would be a "db_access" tool group that contains tools for interacting with a database. "list_tables", "query_table", "insert_row" could be examples of tools in this group. Tools are treated as any other resource in llama stack like models. You can register them, have providers for them etc. @@ -9,18 +20,15 @@ When instantiating an agent, you can provide it a list of tool groups that it ha Refer to the [Building AI Applications](https://github.com/meta-llama/llama-stack/blob/main/docs/getting_started.ipynb) notebook for more examples on how to use tools. -## Server-side vs. client-side tool execution +## Server-side vs. Client-side Tool Execution -Llama Stack allows you to use both server-side and client-side tools. With server-side tools, `agent.create_turn` can perform execution of the tool calls emitted by the model -transparently giving the user the final answer desired. If client-side tools are provided, the tool call is sent back to the user for execution -and optional continuation using the `agent.resume_turn` method. +Llama Stack allows you to use both server-side and client-side tools. With server-side tools, `agent.create_turn` can perform execution of the tool calls emitted by the model transparently giving the user the final answer desired. If client-side tools are provided, the tool call is sent back to the user for execution and optional continuation using the `agent.resume_turn` method. - -### Server-side tools +## Server-side Tools Llama Stack provides built-in providers for some common tools. These include web search, math, and RAG capabilities. -#### Web Search +### Web Search You have three providers to execute the web search tool calls generated by a model: Brave Search, Bing Search, and Tavily Search. @@ -39,25 +47,26 @@ The tool requires an API key which can be provided either in the configuration o {"_api_key": } ``` - -#### Math +### Math The WolframAlpha tool provides access to computational knowledge through the WolframAlpha API. ```python client.toolgroups.register( - toolgroup_id="builtin::wolfram_alpha", provider_id="wolfram-alpha" + toolgroup_id="builtin::wolfram_alpha", + provider_id="wolfram-alpha" ) ``` Example usage: ```python result = client.tool_runtime.invoke_tool( - tool_name="wolfram_alpha", args={"query": "solve x^2 + 2x + 1 = 0"} + tool_name="wolfram_alpha", + args={"query": "solve x^2 + 2x + 1 = 0"} ) ``` -#### RAG +### RAG The RAG tool enables retrieval of context from various types of memory banks (vector, key-value, keyword, and graph). @@ -75,16 +84,13 @@ Features: - Configurable query generation - Context retrieval with token limits - -```{note} +:::note[Default Configuration] By default, llama stack run.yaml defines toolgroups for web search, wolfram alpha and rag, that are provided by tavily-search, wolfram-alpha and rag providers. -``` +::: ## Model Context Protocol (MCP) -[MCP](https://github.com/modelcontextprotocol) is an upcoming, popular standard for tool discovery and execution. It is a protocol that allows tools to be dynamically discovered -from an MCP endpoint and can be used to extend the agent's capabilities. - +[MCP](https://github.com/modelcontextprotocol) is an upcoming, popular standard for tool discovery and execution. It is a protocol that allows tools to be dynamically discovered from an MCP endpoint and can be used to extend the agent's capabilities. ### Using Remote MCP Servers @@ -98,8 +104,7 @@ client.toolgroups.register( ) ``` -Note that most of the more useful MCP servers need you to authenticate with them. Many of them use OAuth2.0 for authentication. You can provide authorization headers to send to the MCP server -using the "Provider Data" abstraction provided by Llama Stack. When making an agent call, +Note that most of the more useful MCP servers need you to authenticate with them. Many of them use OAuth2.0 for authentication. You can provide authorization headers to send to the MCP server using the "Provider Data" abstraction provided by Llama Stack. When making an agent call, ```python agent = Agent( @@ -120,20 +125,26 @@ agent = Agent( agent.create_turn(...) ``` -### Running your own MCP server +### Running Your Own MCP Server Here's an example of how to run a simple MCP server that exposes a File System as a set of tools to the Llama Stack agent. + + + ```shell -# start your MCP server +# Start your MCP server mkdir /tmp/content touch /tmp/content/foo touch /tmp/content/bar npx -y supergateway --port 8000 --stdio 'npx -y @modelcontextprotocol/server-filesystem /tmp/content' ``` -Then register the MCP server as a tool group, + + + ```python +# Register the MCP server as a tool group client.toolgroups.register( toolgroup_id="mcp::filesystem", provider_id="model-context-protocol", @@ -141,12 +152,12 @@ client.toolgroups.register( ) ``` - + + ## Adding Custom (Client-side) Tools -When you want to use tools other than the built-in tools, you just need to implement a python function with a docstring. The content of the docstring will be used to describe the tool and the parameters and passed -along to the generative model. +When you want to use tools other than the built-in tools, you just need to implement a python function with a docstring. The content of the docstring will be used to describe the tool and the parameters and passed along to the generative model. ```python # Example tool definition @@ -158,9 +169,13 @@ def my_tool(input: int) -> int: """ return input * 2 ``` -> **NOTE:** We employ python docstrings to describe the tool and the parameters. It is important to document the tool and the parameters so that the model can use the tool correctly. It is recommended to experiment with different docstrings to see how they affect the model's behavior. + +:::tip[Documentation Best Practices] +We employ python docstrings to describe the tool and the parameters. It is important to document the tool and the parameters so that the model can use the tool correctly. It is recommended to experiment with different docstrings to see how they affect the model's behavior. +::: Once defined, simply pass the tool to the agent config. `Agent` will take care of the rest (calling the model with the tool definition, executing the tool, and returning the result to the model for the next iteration). + ```python # Example agent config with client provided tools agent = Agent(client, ..., tools=[my_tool]) @@ -168,14 +183,14 @@ agent = Agent(client, ..., tools=[my_tool]) Refer to [llama-stack-apps](https://github.com/meta-llama/llama-stack-apps/blob/main/examples/agents/e2e_loop_with_client_tools.py) for an example of how to use client provided tools. - ## Tool Invocation Tools can be invoked using the `invoke_tool` method: ```python result = client.tool_runtime.invoke_tool( - tool_name="web_search", kwargs={"query": "What is the capital of France?"} + tool_name="web_search", + kwargs={"query": "What is the capital of France?"} ) ``` @@ -196,7 +211,13 @@ all_tools = client.tools.list_tools() group_tools = client.tools.list_tools(toolgroup_id="search_tools") ``` -## Simple Example 2: Using an Agent with the Web Search Tool +## Complete Examples + +### Web Search Agent + + + + 1. Start by registering a Tavily API key at [Tavily](https://tavily.com/). 2. [Optional] Provide the API key directly to the Llama Stack server ```bash @@ -205,7 +226,10 @@ export TAVILY_SEARCH_API_KEY="your key" ```bash --env TAVILY_SEARCH_API_KEY=${TAVILY_SEARCH_API_KEY} ``` -3. Run the following script. + + + + ```python from llama_stack_client.lib.agents.agent import Agent from llama_stack_client.types.agent_create_params import AgentConfig @@ -240,7 +264,14 @@ for log in EventLogger().log(response): log.print() ``` -## Simple Example3: Using an Agent with the WolframAlpha Tool + + + +### WolframAlpha Math Agent + + + + 1. Start by registering for a WolframAlpha API key at [WolframAlpha Developer Portal](https://developer.wolframalpha.com/access). 2. Provide the API key either when starting the Llama Stack server: ```bash @@ -253,12 +284,57 @@ for log in EventLogger().log(response): provider_data={"wolfram_alpha_api_key": wolfram_api_key}, ) ``` -3. Configure the tools in the Agent by setting `tools=["builtin::wolfram_alpha"]`. -4. Example user query: - ```python - response = agent.create_turn( - messages=[{"role": "user", "content": "Solve x^2 + 2x + 1 = 0 using WolframAlpha"}], - session_id=session_id, - ) - ``` + + + + +```python +# Configure the tools in the Agent by setting tools=["builtin::wolfram_alpha"] +agent = Agent( + client, + model="meta-llama/Llama-3.2-3B-Instruct", + instructions="You are a mathematical assistant that can solve complex equations.", + tools=["builtin::wolfram_alpha"], +) + +session_id = agent.create_session("math-session") + +# Example user query +response = agent.create_turn( + messages=[{"role": "user", "content": "Solve x^2 + 2x + 1 = 0 using WolframAlpha"}], + session_id=session_id, +) ``` + + + + +## Best Practices + +### 🛠️ **Tool Selection** +- Use **server-side tools** for production applications requiring reliability and security +- Use **client-side tools** for development, prototyping, or specialized integrations +- Combine multiple tool types for comprehensive functionality + +### 📝 **Documentation** +- Write clear, detailed docstrings for custom tools +- Include parameter descriptions and expected return types +- Test tool descriptions with the model to ensure proper usage + +### 🔐 **Security** +- Store API keys securely using environment variables or secure configuration +- Use the `X-LlamaStack-Provider-Data` header for dynamic authentication +- Validate tool inputs and outputs for security + +### 🔄 **Error Handling** +- Implement proper error handling in custom tools +- Use structured error responses with meaningful messages +- Monitor tool performance and reliability + +## Related Resources + +- **[Agents](./agent)** - Building intelligent agents with tools +- **[RAG (Retrieval Augmented Generation)](./rag)** - Using knowledge retrieval tools +- **[Agent Execution Loop](./agent_execution_loop)** - Understanding tool execution flow +- **[Building AI Applications Notebook](https://github.com/meta-llama/llama-stack/blob/main/docs/getting_started.ipynb)** - Comprehensive examples +- **[Llama Stack Apps Examples](https://github.com/meta-llama/llama-stack-apps)** - Real-world tool implementations diff --git a/docs/source/apis/api_leveling.md b/docs/docs/concepts/apis/api_leveling.mdx similarity index 97% rename from docs/source/apis/api_leveling.md rename to docs/docs/concepts/apis/api_leveling.mdx index bb012030f..e3e118d0f 100644 --- a/docs/source/apis/api_leveling.md +++ b/docs/docs/concepts/apis/api_leveling.mdx @@ -1,3 +1,10 @@ +--- +title: API Stability Leveling +description: Understanding API stability levels and versioning in Llama Stack +sidebar_label: API Stability +sidebar_position: 4 +--- + # Llama Stack API Stability Leveling In order to provide a stable experience in Llama Stack, the various APIs need different stability levels indicating the level of support, backwards compatability, and overall production readiness. @@ -91,4 +98,4 @@ The testing of each stable API is already outlined in [issue #3237](https://gith ### New APIs going forward -Any subsequently introduced APIs should be introduced as `/v1alpha` \ No newline at end of file +Any subsequently introduced APIs should be introduced as `/v1alpha` diff --git a/docs/source/concepts/api_providers.md b/docs/docs/concepts/apis/api_providers.mdx similarity index 85% rename from docs/source/concepts/api_providers.md rename to docs/docs/concepts/apis/api_providers.mdx index 6e6502c0c..5f0fe2ac7 100644 --- a/docs/source/concepts/api_providers.md +++ b/docs/docs/concepts/apis/api_providers.mdx @@ -1,4 +1,11 @@ -## API Providers +--- +title: API Providers +description: Understanding remote vs inline provider implementations +sidebar_label: API Providers +sidebar_position: 2 +--- + +# API Providers The goal of Llama Stack is to build an ecosystem where users can easily swap out different implementations for the same API. Examples for these include: - LLM inference providers (e.g., Fireworks, Together, AWS Bedrock, Groq, Cerebras, SambaNova, vLLM, etc.), diff --git a/docs/source/apis/external.md b/docs/docs/concepts/apis/external.mdx similarity index 98% rename from docs/source/apis/external.md rename to docs/docs/concepts/apis/external.mdx index 5831990b0..722e8226c 100644 --- a/docs/source/apis/external.md +++ b/docs/docs/concepts/apis/external.mdx @@ -1,3 +1,9 @@ +--- +title: External APIs +description: Understanding external APIs in Llama Stack +sidebar_label: External APIs +sidebar_position: 4 +--- # External APIs Llama Stack supports external APIs that live outside of the main codebase. This allows you to: diff --git a/docs/source/concepts/apis.md b/docs/docs/concepts/apis/index.mdx similarity index 89% rename from docs/source/concepts/apis.md rename to docs/docs/concepts/apis/index.mdx index f8f73a928..6e699d137 100644 --- a/docs/source/concepts/apis.md +++ b/docs/docs/concepts/apis/index.mdx @@ -1,4 +1,11 @@ -## APIs +--- +title: APIs +description: Available REST APIs and planned capabilities in Llama Stack +sidebar_label: APIs +sidebar_position: 1 +--- + +# APIs A Llama Stack API is described as a collection of REST endpoints. We currently support the following APIs: diff --git a/docs/source/concepts/architecture.md b/docs/docs/concepts/architecture.mdx similarity index 85% rename from docs/source/concepts/architecture.md rename to docs/docs/concepts/architecture.mdx index 50cc62c7c..8e9738416 100644 --- a/docs/source/concepts/architecture.md +++ b/docs/docs/concepts/architecture.mdx @@ -1,15 +1,19 @@ -## Llama Stack architecture +--- +title: Llama Stack Architecture +description: Understanding Llama Stack's service-oriented design and benefits +sidebar_label: Architecture +sidebar_position: 2 +--- + +# Llama Stack architecture Llama Stack allows you to build different layers of distributions for your AI workloads using various SDKs and API providers. -```{image} ../../_static/llama-stack.png -:alt: Llama Stack -:width: 400px -``` +Llama Stack -### Benefits of Llama stack +## Benefits of Llama stack -#### Current challenges in custom AI applications +### Current challenges in custom AI applications Building production AI applications today requires solving multiple challenges: @@ -32,7 +36,7 @@ Building production AI applications today requires solving multiple challenges: - Different providers have different APIs and abstractions. - Changing providers requires significant code changes. -#### Our Solution: A Universal Stack +### Our Solution: A Universal Stack Llama Stack addresses these challenges through a service-oriented, API-first approach: @@ -59,7 +63,7 @@ Llama Stack addresses these challenges through a service-oriented, API-first app - Ecosystem offers tailored infrastructure, software, and services for deploying a variety of models. -### Our Philosophy +## Our Philosophy - **Service-Oriented**: REST APIs enforce clean interfaces and enable seamless transitions across different environments. - **Composability**: Every component is independent but works together seamlessly @@ -67,4 +71,4 @@ Llama Stack addresses these challenges through a service-oriented, API-first app - **Turnkey Solutions**: Easy to deploy built in solutions for popular deployment scenarios -With Llama Stack, you can focus on building your application while we handle the infrastructure complexity, essential capabilities, and provider integrations. \ No newline at end of file +With Llama Stack, you can focus on building your application while we handle the infrastructure complexity, essential capabilities, and provider integrations. diff --git a/docs/source/concepts/distributions.md b/docs/docs/concepts/distributions.mdx similarity index 81% rename from docs/source/concepts/distributions.md rename to docs/docs/concepts/distributions.mdx index 8c63914d1..3b911ed7c 100644 --- a/docs/source/concepts/distributions.md +++ b/docs/docs/concepts/distributions.mdx @@ -1,4 +1,11 @@ -## Distributions +--- +title: Distributions +description: Pre-packaged provider configurations for different deployment scenarios +sidebar_label: Distributions +sidebar_position: 5 +--- + +# Distributions While there is a lot of flexibility to mix-and-match providers, often users will work with a specific set of providers (hardware support, contractual obligations, etc.) We therefore need to provide a _convenient shorthand_ for such collections. We call this shorthand a **Llama Stack Distribution** or a **Distro**. One can think of it as specific pre-packaged versions of the Llama Stack. Here are some examples: @@ -6,4 +13,4 @@ While there is a lot of flexibility to mix-and-match providers, often users will **Locally Hosted Distro**: You may want to run Llama Stack on your own hardware. Typically though, you still need to use Inference via an external service. You can use providers like HuggingFace TGI, Fireworks, Together, etc. for this purpose. Or you may have access to GPUs and can run a [vLLM](https://github.com/vllm-project/vllm) or [NVIDIA NIM](https://build.nvidia.com/nim?filters=nimType%3Anim_type_run_anywhere&q=llama) instance. If you "just" have a regular desktop machine, you can use [Ollama](https://ollama.com/) for inference. To provide convenient quick access to these options, we provide a number of such pre-configured locally-hosted Distros. -**On-device Distro**: To run Llama Stack directly on an edge device (mobile phone or a tablet), we provide Distros for [iOS](../distributions/ondevice_distro/ios_sdk.md) and [Android](../distributions/ondevice_distro/android_sdk.md) +**On-device Distro**: To run Llama Stack directly on an edge device (mobile phone or a tablet), we provide Distros for [iOS](/docs/distributions/ondevice_distro/ios_sdk) and [Android](/docs/distributions/ondevice_distro/android_sdk) diff --git a/docs/docs/concepts/index.mdx b/docs/docs/concepts/index.mdx new file mode 100644 index 000000000..d76a0c039 --- /dev/null +++ b/docs/docs/concepts/index.mdx @@ -0,0 +1,43 @@ +# Core Concepts + +Given Llama Stack's service-oriented philosophy, a few concepts and workflows arise which may not feel completely natural in the LLM landscape, especially if you are coming with a background in other frameworks. + +## Documentation Structure + +This section covers the fundamental concepts of Llama Stack: + +- **[Architecture](./architecture.md)** - Learn about Llama Stack's architectural design and principles +- **[APIs](./apis/index.mdx)** - Understanding the core APIs and their stability levels + - [API Overview](./apis/index.mdx) - Core APIs available in Llama Stack + - [API Providers](./apis/api_providers.mdx) - How providers implement APIs + - [API Stability Leveling](./apis/api_leveling.mdx) - API stability and versioning +- **[Distributions](./distributions.md)** - Pre-configured deployment packages +- **[Resources](./resources.md)** - Understanding Llama Stack resources and their lifecycle +- **[External Integration](./external.md)** - Integrating with external services and providers + +## Getting Started + +If you're new to Llama Stack, we recommend starting with: + +1. **[Architecture](./architecture.md)** - Understand the overall system design +2. **[APIs](./apis/index.mdx)** - Learn about the available APIs and their purpose +3. **[Distributions](./distributions.md)** - Choose a pre-configured setup for your use case + +Each concept builds upon the previous ones to give you a comprehensive understanding of how Llama Stack works and how to use it effectively.--- +title: Core Concepts +description: Understanding Llama Stack's service-oriented philosophy and key concepts +sidebar_label: Overview +sidebar_position: 1 +--- + +# Core Concepts + +Given Llama Stack's service-oriented philosophy, a few concepts and workflows arise which may not feel completely natural in the LLM landscape, especially if you are coming with a background in other frameworks. + +This section covers the key concepts you need to understand to work effectively with Llama Stack: + +- **[Architecture](./architecture)** - Llama Stack's service-oriented design and benefits +- **[APIs](./apis)** - Available REST APIs and planned capabilities +- **[API Providers](./api_providers)** - Remote vs inline provider implementations +- **[Distributions](./distributions)** - Pre-packaged provider configurations +- **[Resources](./resources)** - Resource federation and registration diff --git a/docs/source/concepts/resources.md b/docs/docs/concepts/resources.mdx similarity index 85% rename from docs/source/concepts/resources.md rename to docs/docs/concepts/resources.mdx index 0cdc9a227..323902a4a 100644 --- a/docs/source/concepts/resources.md +++ b/docs/docs/concepts/resources.mdx @@ -1,4 +1,11 @@ -## Resources +--- +title: Resources +description: Resource federation and registration in Llama Stack +sidebar_label: Resources +sidebar_position: 6 +--- + +# Resources Some of these APIs are associated with a set of **Resources**. Here is the mapping of APIs to resources: @@ -12,8 +19,8 @@ Some of these APIs are associated with a set of **Resources**. Here is the mappi Furthermore, we allow these resources to be **federated** across multiple providers. For example, you may have some Llama models served by Fireworks while others are served by AWS Bedrock. Regardless, they will all work seamlessly with the same uniform Inference API provided by Llama Stack. -```{admonition} Registering Resources -:class: tip +:::tip Registering Resources Given this architecture, it is necessary for the Stack to know which provider to use for a given resource. This means you need to explicitly _register_ resources (including models) before you can use them with the associated APIs. -``` + +::: diff --git a/docs/docs/contributing/index.mdx b/docs/docs/contributing/index.mdx new file mode 100644 index 000000000..8b3f86b03 --- /dev/null +++ b/docs/docs/contributing/index.mdx @@ -0,0 +1,244 @@ +# Contributing to Llama Stack +We want to make contributing to this project as easy and transparent as +possible. + +## Set up your development environment + +We use [uv](https://github.com/astral-sh/uv) to manage python dependencies and virtual environments. +You can install `uv` by following this [guide](https://docs.astral.sh/uv/getting-started/installation/). + +You can install the dependencies by running: + +```bash +cd llama-stack +uv sync --group dev +uv pip install -e . +source .venv/bin/activate +``` + +```{note} +You can use a specific version of Python with `uv` by adding the `--python ` flag (e.g. `--python 3.12`). +Otherwise, `uv` will automatically select a Python version according to the `requires-python` section of the `pyproject.toml`. +For more info, see the [uv docs around Python versions](https://docs.astral.sh/uv/concepts/python-versions/). +``` + +Note that you can create a dotenv file `.env` that includes necessary environment variables: +``` +LLAMA_STACK_BASE_URL=http://localhost:8321 +LLAMA_STACK_CLIENT_LOG=debug +LLAMA_STACK_PORT=8321 +LLAMA_STACK_CONFIG= +TAVILY_SEARCH_API_KEY= +BRAVE_SEARCH_API_KEY= +``` + +And then use this dotenv file when running client SDK tests via the following: +```bash +uv run --env-file .env -- pytest -v tests/integration/inference/test_text_inference.py --text-model=meta-llama/Llama-3.1-8B-Instruct +``` + +### Pre-commit Hooks + +We use [pre-commit](https://pre-commit.com/) to run linting and formatting checks on your code. You can install the pre-commit hooks by running: + +```bash +uv run pre-commit install +``` + +After that, pre-commit hooks will run automatically before each commit. + +Alternatively, if you don't want to install the pre-commit hooks, you can run the checks manually by running: + +```bash +uv run pre-commit run --all-files +``` + +```{caution} +Before pushing your changes, make sure that the pre-commit hooks have passed successfully. +``` + +## Discussions -> Issues -> Pull Requests + +We actively welcome your pull requests. However, please read the following. This is heavily inspired by [Ghostty](https://github.com/ghostty-org/ghostty/blob/main/CONTRIBUTING.md). + +If in doubt, please open a [discussion](https://github.com/meta-llama/llama-stack/discussions); we can always convert that to an issue later. + +### Issues +We use GitHub issues to track public bugs. Please ensure your description is +clear and has sufficient instructions to be able to reproduce the issue. + +Meta has a [bounty program](http://facebook.com/whitehat/info) for the safe +disclosure of security bugs. In those cases, please go through the process +outlined on that page and do not file a public issue. + +### Contributor License Agreement ("CLA") +In order to accept your pull request, we need you to submit a CLA. You only need +to do this once to work on any of Meta's open source projects. + +Complete your CLA here: + +**I'd like to contribute!** + +If you are new to the project, start by looking at the issues tagged with "good first issue". If you're interested +leave a comment on the issue and a triager will assign it to you. + +Please avoid picking up too many issues at once. This helps you stay focused and ensures that others in the community also have opportunities to contribute. +- Try to work on only 1–2 issues at a time, especially if you’re still getting familiar with the codebase. +- Before taking an issue, check if it’s already assigned or being actively discussed. +- If you’re blocked or can’t continue with an issue, feel free to unassign yourself or leave a comment so others can step in. + +**I have a bug!** + +1. Search the issue tracker and discussions for similar issues. +2. If you don't have steps to reproduce, open a discussion. +3. If you have steps to reproduce, open an issue. + +**I have an idea for a feature!** + +1. Open a discussion. + +**I've implemented a feature!** + +1. If there is an issue for the feature, open a pull request. +2. If there is no issue, open a discussion and link to your branch. + +**I have a question!** + +1. Open a discussion or use [Discord](https://discord.gg/llama-stack). + + +**Opening a Pull Request** + +1. Fork the repo and create your branch from `main`. +2. If you've changed APIs, update the documentation. +3. Ensure the test suite passes. +4. Make sure your code lints using `pre-commit`. +5. If you haven't already, complete the Contributor License Agreement ("CLA"). +6. Ensure your pull request follows the [conventional commits format](https://www.conventionalcommits.org/en/v1.0.0/). +7. Ensure your pull request follows the [coding style](#coding-style). + + +Please keep pull requests (PRs) small and focused. If you have a large set of changes, consider splitting them into logically grouped, smaller PRs to facilitate review and testing. + +```{tip} +As a general guideline: +- Experienced contributors should try to keep no more than 5 open PRs at a time. +- New contributors are encouraged to have only one open PR at a time until they’re familiar with the codebase and process. +``` + +## Repository guidelines + +### Coding Style + +* Comments should provide meaningful insights into the code. Avoid filler comments that simply + describe the next step, as they create unnecessary clutter, same goes for docstrings. +* Prefer comments to clarify surprising behavior and/or relationships between parts of the code + rather than explain what the next line of code does. +* Catching exceptions, prefer using a specific exception type rather than a broad catch-all like + `Exception`. +* Error messages should be prefixed with "Failed to ..." +* 4 spaces for indentation rather than tab +* When using `# noqa` to suppress a style or linter warning, include a comment explaining the + justification for bypassing the check. +* When using `# type: ignore` to suppress a mypy warning, include a comment explaining the + justification for bypassing the check. +* Don't use unicode characters in the codebase. ASCII-only is preferred for compatibility or + readability reasons. +* Providers configuration class should be Pydantic Field class. It should have a `description` field + that describes the configuration. These descriptions will be used to generate the provider + documentation. +* When possible, use keyword arguments only when calling functions. +* Llama Stack utilizes [custom Exception classes](llama_stack/apis/common/errors.py) for certain Resources that should be used where applicable. + +### License +By contributing to Llama, you agree that your contributions will be licensed +under the LICENSE file in the root directory of this source tree. + +## Common Tasks + +Some tips about common tasks you work on while contributing to Llama Stack: + +### Using `llama stack build` + +Building a stack image will use the production version of the `llama-stack` and `llama-stack-client` packages. If you are developing with a llama-stack repository checked out and need your code to be reflected in the stack image, set `LLAMA_STACK_DIR` and `LLAMA_STACK_CLIENT_DIR` to the appropriate checked out directories when running any of the `llama` CLI commands. + +Example: +```bash +cd work/ +git clone https://github.com/meta-llama/llama-stack.git +git clone https://github.com/meta-llama/llama-stack-client-python.git +cd llama-stack +LLAMA_STACK_DIR=$(pwd) LLAMA_STACK_CLIENT_DIR=../llama-stack-client-python llama stack build --distro <...> +``` + +### Updating distribution configurations + +If you have made changes to a provider's configuration in any form (introducing a new config key, or +changing models, etc.), you should run `./scripts/distro_codegen.py` to re-generate various YAML +files as well as the documentation. You should not change `docs/source/.../distributions/` files +manually as they are auto-generated. + +### Updating the provider documentation + +If you have made changes to a provider's configuration, you should run `./scripts/provider_codegen.py` +to re-generate the documentation. You should not change `docs/source/.../providers/` files manually +as they are auto-generated. +Note that the provider "description" field will be used to generate the provider documentation. + +### Building the Documentation + +If you are making changes to the documentation at [https://llamastack.github.io/latest/](https://llamastack.github.io/latest/), you can use the following command to build the documentation and preview your changes. You will need [Sphinx](https://www.sphinx-doc.org/en/master/) and the readthedocs theme. + +```bash +# This rebuilds the documentation pages. +uv run --group docs make -C docs/ html + +# This will start a local server (usually at http://127.0.0.1:8000) that automatically rebuilds and refreshes when you make changes to the documentation. +uv run --group docs sphinx-autobuild docs/source docs/build/html --write-all +``` + +### Update API Documentation + +If you modify or add new API endpoints, update the API documentation accordingly. You can do this by running the following command: + +```bash +uv run ./docs/openapi_generator/run_openapi_generator.sh +``` + +The generated API documentation will be available in `docs/_static/`. Make sure to review the changes before committing. + +## Adding a New Provider + +See: +- [Adding a New API Provider Page](new_api_provider.md) which describes how to add new API providers to the Stack. +- [Vector Database Page](new_vector_database.md) which describes how to add a new vector databases with Llama Stack. +- [External Provider Page](../providers/external/index.md) which describes how to add external providers to the Stack. + +```{toctree} +:maxdepth: 1 +:hidden: + +new_api_provider +new_vector_database +``` + +## Testing + + +```{include} ../../../tests/README.md +``` + +## Advanced Topics + +For developers who need deeper understanding of the testing system internals: + +```{toctree} +:maxdepth: 1 + +testing/record-replay +``` + +### Benchmarking + +```{include} ../../../benchmarking/k8s-benchmark/README.md +``` diff --git a/docs/source/contributing/new_api_provider.md b/docs/docs/contributing/new_api_provider.mdx similarity index 95% rename from docs/source/contributing/new_api_provider.md rename to docs/docs/contributing/new_api_provider.mdx index 9a7a62a38..9d9e4653a 100644 --- a/docs/source/contributing/new_api_provider.md +++ b/docs/docs/contributing/new_api_provider.mdx @@ -1,4 +1,12 @@ -# Adding a New API Provider +--- +title: Adding a New API Provider +description: Guide for adding new API providers to Llama Stack +sidebar_label: New API Provider +sidebar_position: 2 +--- + +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; This guide will walk you through the process of adding a new API provider to Llama Stack. diff --git a/docs/source/contributing/new_vector_database.md b/docs/docs/contributing/new_vector_database.mdx similarity index 95% rename from docs/source/contributing/new_vector_database.md rename to docs/docs/contributing/new_vector_database.mdx index 83c0f55bc..040cee6d3 100644 --- a/docs/source/contributing/new_vector_database.md +++ b/docs/docs/contributing/new_vector_database.mdx @@ -1,4 +1,12 @@ -# Adding a New Vector Database +--- +title: Adding a New Vector Database +description: Guide for adding new vector database providers to Llama Stack +sidebar_label: New Vector Database +sidebar_position: 3 +--- + +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; This guide will walk you through the process of adding a new vector database to Llama Stack. @@ -72,4 +80,4 @@ InlineProviderSpec( - `uv add new_pip_package --group test` 5. **Update Documentation**: Please update the documentation for end users - Generate the provider documentation by running {repopath}`./scripts/provider_codegen.py`. - - Update the autogenerated content in the registry/vector_io.py file with information about your provider. Please see other providers for examples. \ No newline at end of file + - Update the autogenerated content in the registry/vector_io.py file with information about your provider. Please see other providers for examples. diff --git a/docs/source/contributing/testing/record-replay.md b/docs/docs/contributing/testing/record-replay.mdx similarity index 95% rename from docs/source/contributing/testing/record-replay.md rename to docs/docs/contributing/testing/record-replay.mdx index 7b0f345b0..47803c150 100644 --- a/docs/source/contributing/testing/record-replay.md +++ b/docs/docs/contributing/testing/record-replay.mdx @@ -1,3 +1,13 @@ +--- +title: Record-Replay Testing System +description: Understanding how Llama Stack captures and replays API interactions for testing +sidebar_label: Record-Replay System +sidebar_position: 4 +--- + +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; + # Record-Replay System Understanding how Llama Stack captures and replays API interactions for testing. @@ -228,4 +238,4 @@ Loose hashing (normalizing whitespace, rounding floats) seems convenient but hid - **SQLite** - Fast indexed lookups without loading response bodies - **Hybrid** - Best of both worlds for different use cases -This system provides reliable, fast testing against real AI APIs while maintaining the ability to debug issues when they arise. \ No newline at end of file +This system provides reliable, fast testing against real AI APIs while maintaining the ability to debug issues when they arise. diff --git a/docs/docs/deploying/aws_eks_deployment.mdx b/docs/docs/deploying/aws_eks_deployment.mdx new file mode 100644 index 000000000..fa107ea9c --- /dev/null +++ b/docs/docs/deploying/aws_eks_deployment.mdx @@ -0,0 +1,30 @@ +--- +title: AWS EKS Deployment Guide +description: Deploy Llama Stack on AWS EKS +sidebar_label: AWS EKS Deployment +sidebar_position: 3 +--- + +## AWS EKS Deployment + +### Prerequisites + +- Set up an [EKS cluster](https://docs.aws.amazon.com/eks/latest/userguide/getting-started.html) +- Create a [GitHub OAuth app](https://docs.github.com/en/apps/oauth-apps/building-oauth-apps/creating-an-oauth-app) +- Set authorization callback URL to `http:///api/auth/callback/` + +### Automated Deployment + +```bash +export HF_TOKEN= +export GITHUB_CLIENT_ID= +export GITHUB_CLIENT_SECRET= +export LLAMA_STACK_UI_URL= + +cd docs/source/distributions/eks +./apply.sh +``` + +This script will: +- Set up default storage class for AWS EKS +- Deploy Llama Stack server in Kubernetes pods and services diff --git a/docs/docs/deploying/index.mdx b/docs/docs/deploying/index.mdx new file mode 100644 index 000000000..eaa0e2612 --- /dev/null +++ b/docs/docs/deploying/index.mdx @@ -0,0 +1,14 @@ +--- +title: Deploying Llama Stack +description: Production deployment guides for Llama Stack in various environments +sidebar_label: Overview +sidebar_position: 1 +--- + +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; + +# Deploying Llama Stack + +[**→ Kubernetes Deployment Guide**](./kubernetes_deployment.mdx) +[**→ AWS EKS Deployment Guide**](./aws_eks_deployment.mdx) diff --git a/docs/source/deploying/kubernetes_deployment.md b/docs/docs/deploying/kubernetes_deployment.mdx similarity index 51% rename from docs/source/deploying/kubernetes_deployment.md rename to docs/docs/deploying/kubernetes_deployment.mdx index 4bdd87b24..b50926455 100644 --- a/docs/source/deploying/kubernetes_deployment.md +++ b/docs/docs/deploying/kubernetes_deployment.mdx @@ -1,27 +1,39 @@ -## Kubernetes Deployment Guide +--- +title: Kubernetes Deployment Guide +description: Deploy Llama Stack on Kubernetes clusters with vLLM inference service +sidebar_label: Kubernetes +sidebar_position: 2 +--- -Instead of starting the Llama Stack and vLLM servers locally. We can deploy them in a Kubernetes cluster. +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; -### Prerequisites -In this guide, we'll use a local [Kind](https://kind.sigs.k8s.io/) cluster and a vLLM inference service in the same cluster for demonstration purposes. +# Kubernetes Deployment Guide -Note: You can also deploy the Llama Stack server in an AWS EKS cluster. See [Deploying Llama Stack Server in AWS EKS](#deploying-llama-stack-server-in-aws-eks) for more details. +Deploy Llama Stack and vLLM servers in a Kubernetes cluster instead of running them locally. This guide covers both local development with Kind and production deployment on AWS EKS. -First, create a local Kubernetes cluster via Kind: +## Prerequisites -``` +### Local Kubernetes Setup + +Create a local Kubernetes cluster via Kind: + +```bash kind create cluster --image kindest/node:v1.32.0 --name llama-stack-test ``` -First set your hugging face token as an environment variable. -``` +Set your Hugging Face token: + +```bash export HF_TOKEN=$(echo -n "your-hf-token" | base64) ``` -Now create a Kubernetes PVC and Secret for downloading and storing Hugging Face model: +## Quick Deployment -``` -cat <$tmp_dir/Containerfile.llama-stack-run-k8s </api/auth/callback/` - - -Run the following script to deploy the Llama Stack server: -``` -export HF_TOKEN= -export GITHUB_CLIENT_ID= -export GITHUB_CLIENT_SECRET= -export LLAMA_STACK_UI_URL= - -cd docs/source/distributions/eks -./apply.sh +**Check pod status:** +```bash +kubectl get pods -l app.kubernetes.io/name=vllm +kubectl logs -l app.kubernetes.io/name=vllm ``` -This script will: +**Test service connectivity:** +```bash +kubectl run -it --rm debug --image=curlimages/curl --restart=Never -- curl http://vllm-server:8000/v1/models +``` -- Set up a default storage class for AWS EKS -- Deploy the Llama Stack server in a Kubernetes Pod and Service \ No newline at end of file +## Related Resources + +- **[Deployment Overview](./index)** - Overview of deployment options +- **[Distributions](/docs/distributions)** - Understanding Llama Stack distributions +- **[Configuration](/docs/distributions/configuration)** - Detailed configuration options diff --git a/docs/source/distributions/building_distro.md b/docs/docs/distributions/building_distro.mdx similarity index 99% rename from docs/source/distributions/building_distro.md rename to docs/docs/distributions/building_distro.mdx index 24098708f..90cac7363 100644 --- a/docs/source/distributions/building_distro.md +++ b/docs/docs/distributions/building_distro.mdx @@ -1,5 +1,9 @@ -# Build your own Distribution - +--- +title: Building Custom Distributions +description: Building a Llama Stack distribution from scratch +sidebar_label: Build your own Distribution +sidebar_position: 3 +--- This guide will walk you through the steps to get started with building a Llama Stack distribution from scratch with your choice of API providers. diff --git a/docs/source/distributions/configuration.md b/docs/docs/distributions/configuration.mdx similarity index 99% rename from docs/source/distributions/configuration.md rename to docs/docs/distributions/configuration.mdx index 452c3d95f..73a4837a1 100644 --- a/docs/source/distributions/configuration.md +++ b/docs/docs/distributions/configuration.mdx @@ -1,3 +1,9 @@ +--- +title: Configuring a "Stack" +description: Configuring a "Stack" +sidebar_label: Configuring a "Stack" +sidebar_position: 6 +--- # Configuring a "Stack" The Llama Stack runtime configuration is specified as a YAML file. Here is a simplified version of an example configuration file for the Ollama distribution: diff --git a/docs/source/distributions/customizing_run_yaml.md b/docs/docs/distributions/customizing_run_yaml.mdx similarity index 88% rename from docs/source/distributions/customizing_run_yaml.md rename to docs/docs/distributions/customizing_run_yaml.mdx index 10067bab7..513712f81 100644 --- a/docs/source/distributions/customizing_run_yaml.md +++ b/docs/docs/distributions/customizing_run_yaml.mdx @@ -1,3 +1,9 @@ +--- +title: Customizing run.yaml +description: Customizing run.yaml files for Llama Stack templates +sidebar_label: Customizing run.yaml +sidebar_position: 4 +--- # Customizing run.yaml Files The `run.yaml` files generated by Llama Stack templates are **starting points** designed to be customized for your specific needs. They are not meant to be used as-is in production environments. @@ -37,4 +43,4 @@ your-project/ └── README.md ``` -The goal is to take the generated template and adapt it to your specific infrastructure and operational needs. \ No newline at end of file +The goal is to take the generated template and adapt it to your specific infrastructure and operational needs. diff --git a/docs/source/distributions/eks/apply.sh b/docs/docs/distributions/eks/apply.sh similarity index 100% rename from docs/source/distributions/eks/apply.sh rename to docs/docs/distributions/eks/apply.sh diff --git a/docs/source/distributions/eks/gp3-topology-aware.yaml b/docs/docs/distributions/eks/gp3-topology-aware.yaml similarity index 100% rename from docs/source/distributions/eks/gp3-topology-aware.yaml rename to docs/docs/distributions/eks/gp3-topology-aware.yaml diff --git a/docs/source/distributions/importing_as_library.md b/docs/docs/distributions/importing_as_library.mdx similarity index 86% rename from docs/source/distributions/importing_as_library.md rename to docs/docs/distributions/importing_as_library.mdx index 9993be227..b87bb80a4 100644 --- a/docs/source/distributions/importing_as_library.md +++ b/docs/docs/distributions/importing_as_library.mdx @@ -1,3 +1,9 @@ +--- +title: Using Llama Stack as a Library +description: How to use Llama Stack as a Python library instead of running a server +sidebar_label: Importing as Library +sidebar_position: 5 +--- # Using Llama Stack as a Library ## Setup Llama Stack without a Server diff --git a/docs/docs/distributions/index.mdx b/docs/docs/distributions/index.mdx new file mode 100644 index 000000000..97be14910 --- /dev/null +++ b/docs/docs/distributions/index.mdx @@ -0,0 +1,21 @@ +--- +title: Distributions Overview +description: Pre-packaged sets of Llama Stack components for different deployment scenarios +sidebar_label: Overview +sidebar_position: 1 +--- + +# Distributions Overview + +A distribution is a pre-packaged set of Llama Stack components that can be deployed together. + +This section provides an overview of the distributions available in Llama Stack. + +## Distribution Guides + +- **[Available Distributions](./list_of_distributions)** - Complete list and comparison of all distributions +- **[Building Custom Distributions](./building_distro)** - Create your own distribution from scratch +- **[Customizing Configuration](./customizing_run_yaml)** - Customize run.yaml for your needs +- **[Starting Llama Stack Server](./starting_llama_stack_server)** - How to run distributions +- **[Importing as Library](./importing_as_library)** - Use distributions in your code +- **[Configuration Reference](./configuration)** - Configuration file format details diff --git a/docs/source/distributions/k8s/apply.sh b/docs/docs/distributions/k8s/apply.sh similarity index 100% rename from docs/source/distributions/k8s/apply.sh rename to docs/docs/distributions/k8s/apply.sh diff --git a/docs/source/distributions/k8s/chroma-k8s.yaml.template b/docs/docs/distributions/k8s/chroma-k8s.yaml.template similarity index 100% rename from docs/source/distributions/k8s/chroma-k8s.yaml.template rename to docs/docs/distributions/k8s/chroma-k8s.yaml.template diff --git a/docs/source/distributions/k8s/hf-token-secret.yaml.template b/docs/docs/distributions/k8s/hf-token-secret.yaml.template similarity index 100% rename from docs/source/distributions/k8s/hf-token-secret.yaml.template rename to docs/docs/distributions/k8s/hf-token-secret.yaml.template diff --git a/docs/source/distributions/k8s/ingress-k8s.yaml.template b/docs/docs/distributions/k8s/ingress-k8s.yaml.template similarity index 100% rename from docs/source/distributions/k8s/ingress-k8s.yaml.template rename to docs/docs/distributions/k8s/ingress-k8s.yaml.template diff --git a/docs/source/distributions/k8s/postgres-k8s.yaml.template b/docs/docs/distributions/k8s/postgres-k8s.yaml.template similarity index 100% rename from docs/source/distributions/k8s/postgres-k8s.yaml.template rename to docs/docs/distributions/k8s/postgres-k8s.yaml.template diff --git a/docs/source/distributions/k8s/stack-configmap.yaml b/docs/docs/distributions/k8s/stack-configmap.yaml similarity index 100% rename from docs/source/distributions/k8s/stack-configmap.yaml rename to docs/docs/distributions/k8s/stack-configmap.yaml diff --git a/docs/source/distributions/k8s/stack-k8s.yaml.template b/docs/docs/distributions/k8s/stack-k8s.yaml.template similarity index 100% rename from docs/source/distributions/k8s/stack-k8s.yaml.template rename to docs/docs/distributions/k8s/stack-k8s.yaml.template diff --git a/docs/source/distributions/k8s/stack_run_config.yaml b/docs/docs/distributions/k8s/stack_run_config.yaml similarity index 100% rename from docs/source/distributions/k8s/stack_run_config.yaml rename to docs/docs/distributions/k8s/stack_run_config.yaml diff --git a/docs/source/distributions/k8s/ui-k8s.yaml.template b/docs/docs/distributions/k8s/ui-k8s.yaml.template similarity index 100% rename from docs/source/distributions/k8s/ui-k8s.yaml.template rename to docs/docs/distributions/k8s/ui-k8s.yaml.template diff --git a/docs/source/distributions/k8s/vllm-k8s.yaml.template b/docs/docs/distributions/k8s/vllm-k8s.yaml.template similarity index 100% rename from docs/source/distributions/k8s/vllm-k8s.yaml.template rename to docs/docs/distributions/k8s/vllm-k8s.yaml.template diff --git a/docs/source/distributions/k8s/vllm-safety-k8s.yaml.template b/docs/docs/distributions/k8s/vllm-safety-k8s.yaml.template similarity index 100% rename from docs/source/distributions/k8s/vllm-safety-k8s.yaml.template rename to docs/docs/distributions/k8s/vllm-safety-k8s.yaml.template diff --git a/docs/source/distributions/list_of_distributions.md b/docs/docs/distributions/list_of_distributions.mdx similarity index 95% rename from docs/source/distributions/list_of_distributions.md rename to docs/docs/distributions/list_of_distributions.mdx index ee01c92c4..7e8f56a16 100644 --- a/docs/source/distributions/list_of_distributions.md +++ b/docs/docs/distributions/list_of_distributions.mdx @@ -1,3 +1,10 @@ +--- +title: Available Distributions +description: List of available distributions for Llama Stack +sidebar_label: Available Distributions +sidebar_position: 2 +--- + # Available Distributions Llama Stack provides several pre-configured distributions to help you get started quickly. Choose the distribution that best fits your hardware and use case. diff --git a/docs/source/distributions/ondevice_distro/android_sdk.md b/docs/docs/distributions/ondevice_distro/android_sdk.md similarity index 100% rename from docs/source/distributions/ondevice_distro/android_sdk.md rename to docs/docs/distributions/ondevice_distro/android_sdk.md diff --git a/docs/source/distributions/ondevice_distro/ios_sdk.md b/docs/docs/distributions/ondevice_distro/ios_sdk.md similarity index 100% rename from docs/source/distributions/ondevice_distro/ios_sdk.md rename to docs/docs/distributions/ondevice_distro/ios_sdk.md diff --git a/docs/source/distributions/remote_hosted_distro/index.md b/docs/docs/distributions/remote_hosted_distro/index.mdx similarity index 100% rename from docs/source/distributions/remote_hosted_distro/index.md rename to docs/docs/distributions/remote_hosted_distro/index.mdx diff --git a/docs/source/distributions/remote_hosted_distro/watsonx.md b/docs/docs/distributions/remote_hosted_distro/watsonx.md similarity index 100% rename from docs/source/distributions/remote_hosted_distro/watsonx.md rename to docs/docs/distributions/remote_hosted_distro/watsonx.md diff --git a/docs/source/distributions/self_hosted_distro/dell-tgi.md b/docs/docs/distributions/self_hosted_distro/dell-tgi.md similarity index 100% rename from docs/source/distributions/self_hosted_distro/dell-tgi.md rename to docs/docs/distributions/self_hosted_distro/dell-tgi.md diff --git a/docs/source/distributions/self_hosted_distro/dell.md b/docs/docs/distributions/self_hosted_distro/dell.md similarity index 100% rename from docs/source/distributions/self_hosted_distro/dell.md rename to docs/docs/distributions/self_hosted_distro/dell.md diff --git a/docs/source/distributions/self_hosted_distro/passthrough.md b/docs/docs/distributions/self_hosted_distro/passthrough.md similarity index 100% rename from docs/source/distributions/self_hosted_distro/passthrough.md rename to docs/docs/distributions/self_hosted_distro/passthrough.md diff --git a/docs/source/distributions/self_hosted_distro/starter.md b/docs/docs/distributions/self_hosted_distro/starter.md similarity index 100% rename from docs/source/distributions/self_hosted_distro/starter.md rename to docs/docs/distributions/self_hosted_distro/starter.md diff --git a/docs/source/distributions/starting_llama_stack_server.md b/docs/docs/distributions/starting_llama_stack_server.mdx similarity index 84% rename from docs/source/distributions/starting_llama_stack_server.md rename to docs/docs/distributions/starting_llama_stack_server.mdx index 1a26694a6..8ca1ca3ce 100644 --- a/docs/source/distributions/starting_llama_stack_server.md +++ b/docs/docs/distributions/starting_llama_stack_server.mdx @@ -1,3 +1,10 @@ +--- +title: Starting a Llama Stack Server +description: Different ways to run Llama Stack servers - as library, container, or Kubernetes deployment +sidebar_label: Starting Llama Stack Server +sidebar_position: 7 +--- + # Starting a Llama Stack Server You can run a Llama Stack server in one of the following ways: diff --git a/docs/source/getting_started/demo_script.py b/docs/docs/getting_started/demo_script.py similarity index 100% rename from docs/source/getting_started/demo_script.py rename to docs/docs/getting_started/demo_script.py diff --git a/docs/source/getting_started/detailed_tutorial.md b/docs/docs/getting_started/detailed_tutorial.mdx similarity index 99% rename from docs/source/getting_started/detailed_tutorial.md rename to docs/docs/getting_started/detailed_tutorial.mdx index 77a899c48..5bf009efe 100644 --- a/docs/source/getting_started/detailed_tutorial.md +++ b/docs/docs/getting_started/detailed_tutorial.mdx @@ -1,3 +1,13 @@ +--- +title: Detailed Tutorial +description: Complete guide to using Llama Stack server and client SDK to build AI agents +sidebar_label: Detailed Tutorial +sidebar_position: 3 +--- + +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; + ## Detailed Tutorial In this guide, we'll walk through how you can use the Llama Stack (server and client SDK) to test a simple agent. diff --git a/docs/source/getting_started/libraries.md b/docs/docs/getting_started/libraries.mdx similarity index 85% rename from docs/source/getting_started/libraries.md rename to docs/docs/getting_started/libraries.mdx index a54a9b8d3..7cbb792b4 100644 --- a/docs/source/getting_started/libraries.md +++ b/docs/docs/getting_started/libraries.mdx @@ -1,3 +1,9 @@ +--- +description: We have a number of client-side SDKs available for different languages. +sidebar_label: Libraries +sidebar_position: 2 +title: Libraries (SDKs) +--- ## Libraries (SDKs) We have a number of client-side SDKs available for different languages. @@ -7,4 +13,4 @@ We have a number of client-side SDKs available for different languages. | Python | [llama-stack-client-python](https://github.com/meta-llama/llama-stack-client-python) | [![PyPI version](https://img.shields.io/pypi/v/llama_stack_client.svg)](https://pypi.org/project/llama_stack_client/) | Swift | [llama-stack-client-swift](https://github.com/meta-llama/llama-stack-client-swift/tree/latest-release) | [![Swift Package Index](https://img.shields.io/endpoint?url=https%3A%2F%2Fswiftpackageindex.com%2Fapi%2Fpackages%2Fmeta-llama%2Fllama-stack-client-swift%2Fbadge%3Ftype%3Dswift-versions)](https://swiftpackageindex.com/meta-llama/llama-stack-client-swift) | Node | [llama-stack-client-node](https://github.com/meta-llama/llama-stack-client-node) | [![NPM version](https://img.shields.io/npm/v/llama-stack-client.svg)](https://npmjs.org/package/llama-stack-client) -| Kotlin | [llama-stack-client-kotlin](https://github.com/meta-llama/llama-stack-client-kotlin/tree/latest-release) | [![Maven version](https://img.shields.io/maven-central/v/com.llama.llamastack/llama-stack-client-kotlin)](https://central.sonatype.com/artifact/com.llama.llamastack/llama-stack-client-kotlin) \ No newline at end of file +| Kotlin | [llama-stack-client-kotlin](https://github.com/meta-llama/llama-stack-client-kotlin/tree/latest-release) | [![Maven version](https://img.shields.io/maven-central/v/com.llama.llamastack/llama-stack-client-kotlin)](https://central.sonatype.com/artifact/com.llama.llamastack/llama-stack-client-kotlin) diff --git a/docs/source/getting_started/quickstart.md b/docs/docs/getting_started/quickstart.mdx similarity index 65% rename from docs/source/getting_started/quickstart.md rename to docs/docs/getting_started/quickstart.mdx index 0136a7fba..fbc86cc2e 100644 --- a/docs/source/getting_started/quickstart.md +++ b/docs/docs/getting_started/quickstart.mdx @@ -1,4 +1,9 @@ -## Quickstart +--- +description: environments. +sidebar_label: Quickstart +sidebar_position: 1 +title: Quickstart +--- Get started with Llama Stack in minutes! @@ -6,7 +11,7 @@ Llama Stack is a stateful service with REST APIs to support the seamless transit environments. You can build and test using a local server first and deploy to a hosted endpoint for production. In this guide, we'll walk through how to build a RAG application locally using Llama Stack with [Ollama](https://ollama.com/) -as the inference [provider](../providers/inference/index) for a Llama Model. +as the inference [provider](/docs/providers/inference) for a Llama Model. **💡 Notebook Version:** You can also follow this quickstart guide in a Jupyter notebook format: [quick_start.ipynb](https://github.com/meta-llama/llama-stack/blob/main/docs/quick_start.ipynb) @@ -27,8 +32,75 @@ OLLAMA_URL=http://localhost:11434 \ #### Step 3: Run the demo Now open up a new terminal and copy the following script into a file named `demo_script.py`. -```{literalinclude} ./demo_script.py -:language: python +```python title="demo_script.py" +# Copyright (c) Meta Platforms, Inc. and affiliates. +# All rights reserved. +# +# This source code is licensed under the terms described in the LICENSE file in +# the root directory of this source tree. + +from llama_stack_client import Agent, AgentEventLogger, RAGDocument, LlamaStackClient + +vector_db_id = "my_demo_vector_db" +client = LlamaStackClient(base_url="http://localhost:8321") + +models = client.models.list() + +# Select the first LLM and first embedding models +model_id = next(m for m in models if m.model_type == "llm").identifier +embedding_model_id = ( + em := next(m for m in models if m.model_type == "embedding") +).identifier +embedding_dimension = em.metadata["embedding_dimension"] + +vector_db = client.vector_dbs.register( + vector_db_id=vector_db_id, + embedding_model=embedding_model_id, + embedding_dimension=embedding_dimension, + provider_id="faiss", +) +vector_db_id = vector_db.identifier +source = "https://www.paulgraham.com/greatwork.html" +print("rag_tool> Ingesting document:", source) +document = RAGDocument( + document_id="document_1", + content=source, + mime_type="text/html", + metadata={}, +) +client.tool_runtime.rag_tool.insert( + documents=[document], + vector_db_id=vector_db_id, + chunk_size_in_tokens=100, +) +agent = Agent( + client, + model=model_id, + instructions="You are a helpful assistant", + tools=[ + { + "name": "builtin::rag/knowledge_search", + "args": {"vector_db_ids": [vector_db_id]}, + } + ], +) + +prompt = "How do you do great work?" +print("prompt>", prompt) + +use_stream = True +response = agent.create_turn( + messages=[{"role": "user", "content": prompt}], + session_id=agent.create_session("rag_session"), + stream=use_stream, +) + +# Only call `AgentEventLogger().log(response)` for streaming responses. +if use_stream: + for log in AgentEventLogger().log(response): + log.print() +else: + print(response) ``` We will use `uv` to run the script ``` @@ -59,19 +131,19 @@ Ultimately, great work is about making a meaningful contribution and leaving a l ``` Congratulations! You've successfully built your first RAG application using Llama Stack! 🎉🥳 -```{admonition} HuggingFace access -:class: tip +:::tip HuggingFace access If you are getting a **401 Client Error** from HuggingFace for the **all-MiniLM-L6-v2** model, try setting **HF_TOKEN** to a valid HuggingFace token in your environment -``` + +::: ### Next Steps Now you're ready to dive deeper into Llama Stack! -- Explore the [Detailed Tutorial](./detailed_tutorial.md). +- Explore the [Detailed Tutorial](/docs/detailed_tutorial). - Try the [Getting Started Notebook](https://github.com/meta-llama/llama-stack/blob/main/docs/getting_started.ipynb). - Browse more [Notebooks on GitHub](https://github.com/meta-llama/llama-stack/tree/main/docs/notebooks). -- Learn about Llama Stack [Concepts](../concepts/index.md). -- Discover how to [Build Llama Stacks](../distributions/index.md). -- Refer to our [References](../references/index.md) for details on the Llama CLI and Python SDK. +- Learn about Llama Stack [Concepts](/docs/concepts). +- Discover how to [Build Llama Stacks](/docs/distributions). +- Refer to our [References](/docs/references) for details on the Llama CLI and Python SDK. - Check out the [llama-stack-apps](https://github.com/meta-llama/llama-stack-apps/tree/main/examples) repository for example applications and tutorials. diff --git a/docs/docs/index.mdx b/docs/docs/index.mdx new file mode 100644 index 000000000..21e895d3f --- /dev/null +++ b/docs/docs/index.mdx @@ -0,0 +1,101 @@ +--- +sidebar_position: 1 +title: Welcome to Llama Stack +description: Llama Stack is the open-source framework for building generative AI applications +sidebar_label: Intro +tags: + - getting-started + - overview +--- + +# Welcome to Llama Stack + +Llama Stack is the open-source framework for building generative AI applications. + +:::tip Llama 4 is here! + +Check out [Getting Started with Llama 4](https://colab.research.google.com/github/meta-llama/llama-stack/blob/main/docs/getting_started_llama4.ipynb) + +::: + +:::tip News + +Llama Stack is now available! See the [release notes](https://github.com/meta-llama/llama-stack/releases) for more details. + +::: + + +## What is Llama Stack? + +Llama Stack defines and standardizes the core building blocks needed to bring generative AI applications to market. It provides a unified set of APIs with implementations from leading service providers, enabling seamless transitions between development and production environments. More specifically, it provides: + +- **Unified API layer** for Inference, RAG, Agents, Tools, Safety, Evals, and Telemetry. +- **Plugin architecture** to support the rich ecosystem of implementations of the different APIs in different environments like local development, on-premises, cloud, and mobile. +- **Prepackaged verified distributions** which offer a one-stop solution for developers to get started quickly and reliably in any environment +- **Multiple developer interfaces** like CLI and SDKs for Python, Node, iOS, and Android +- **Standalone applications** as examples for how to build production-grade AI applications with Llama Stack + +Llama Stack + +Our goal is to provide pre-packaged implementations (aka "distributions") which can be run in a variety of deployment environments. LlamaStack can assist you in your entire app development lifecycle - start iterating on local, mobile or desktop and seamlessly transition to on-prem or public cloud deployments. At every point in this transition, the same set of APIs and the same developer experience is available. + +## How does Llama Stack work? + +Llama Stack consists of a server (with multiple pluggable API providers) and Client SDKs meant to be used in your applications. The server can be run in a variety of environments, including local (inline) development, on-premises, and cloud. The client SDKs are available for Python, Swift, Node, and Kotlin. + +## Quick Links + +- Ready to build? Check out the [Getting Started Guide](https://llama-stack.readthedocs.io/en/latest/getting_started/index.html) to get started. +- Want to contribute? See the [Contributing Guide](https://github.com/meta-llama/llama-stack/blob/main/CONTRIBUTING.md). +- Explore [Example Applications](https://github.com/meta-llama/llama-stack-apps) built with Llama Stack. + +## Rich Ecosystem Support + +Llama Stack provides adapters for popular providers across all API categories: + +- **Inference**: Meta Reference, Ollama, Fireworks, Together, NVIDIA, vLLM, AWS Bedrock, OpenAI, Anthropic, and more +- **Vector Databases**: FAISS, Chroma, Milvus, Postgres, Weaviate, Qdrant, and others +- **Safety**: Llama Guard, Prompt Guard, Code Scanner, AWS Bedrock +- **Training & Evaluation**: HuggingFace, TorchTune, NVIDIA NEMO + +:::info Provider Details +For complete provider compatibility and setup instructions, see our [Providers Documentation](https://llama-stack.readthedocs.io/en/latest/providers/index.html). +::: + +## Get Started Today + +

diff --git a/docs/source/references/evals_reference/index.md b/docs/docs/references/evals_reference/index.mdx similarity index 92% rename from docs/source/references/evals_reference/index.md rename to docs/docs/references/evals_reference/index.mdx index 9a5ed2f1b..0ec555e66 100644 --- a/docs/source/references/evals_reference/index.md +++ b/docs/docs/references/evals_reference/index.mdx @@ -9,12 +9,11 @@ We introduce a set of APIs in Llama Stack for supporting running evaluations of This guide goes over the sets of APIs and developer experience flow of using Llama Stack to run evaluations for different use cases. Checkout our Colab notebook on working examples with evaluations [here](https://colab.research.google.com/drive/10CHyykee9j2OigaIcRv47BKG9mrNm0tJ?usp=sharing). - ## Evaluation Concepts -The Evaluation APIs are associated with a set of Resources as shown in the following diagram. Please visit the Resources section in our [Core Concepts](../../concepts/index.md) guide for better high-level understanding. +The Evaluation APIs are associated with a set of Resources as shown in the following diagram. Please visit the Resources section in our [Core Concepts](../concepts/) guide for better high-level understanding. -![Eval Concepts](./resources/eval-concept.png) +![Eval Concepts](/img/eval-concept.png) - **DatasetIO**: defines interface with datasets and data loaders. - Associated with `Dataset` resource. @@ -23,7 +22,6 @@ The Evaluation APIs are associated with a set of Resources as shown in the follo - **Eval**: generate outputs (via Inference or Agents) and perform scoring. - Associated with `Benchmark` resource. - ## Evaluation Examples Walkthrough [![Open In Colab](https://colab.research.google.com/assets/colab-badge.svg)](https://colab.research.google.com/github/meta-llama/llama-stack/blob/main/docs/notebooks/Llama_Stack_Benchmark_Evals.ipynb) @@ -156,7 +154,6 @@ response = client.eval.evaluate_rows( pprint(response) ``` - ### 2. Agentic Evaluation - In this example, we will demonstrate how to evaluate a agent candidate served by Llama Stack via `/agent` API. - We will continue to use the SimpleQA dataset we used in previous example. @@ -202,7 +199,7 @@ pprint(response) Llama Stack offers a library of scoring functions and the `/scoring` API, allowing you to run evaluations on your pre-annotated AI application datasets. -In this example, we will work with an example RAG dataset you have built previously, label with an annotation, and use LLM-As-Judge with custom judge prompt for scoring. Please checkout our [Llama Stack Playground](../../building_applications/playground/index.md) for an interactive interface to upload datasets and run scorings. +In this example, we will work with an example RAG dataset you have built previously, label with an annotation, and use LLM-As-Judge with custom judge prompt for scoring. Please checkout our [Llama Stack Playground](../building_applications/playground) for an interactive interface to upload datasets and run scorings. ```python judge_model_id = "meta-llama/Llama-3.1-405B-Instruct-FP8" @@ -268,29 +265,27 @@ response = client.scoring.score( ## Running Evaluations via CLI The following examples give the quick steps to start running evaluations using the llama-stack-client CLI. -#### Benchmark Evaluation CLI +### Benchmark Evaluation CLI There are 3 necessary input for running a benchmark eval - `list of benchmark_ids`: The list of benchmark ids to run evaluation on - `model-id`: The model id to evaluate on -- `utput_dir`: Path to store the evaluate results -``` +- `output_dir`: Path to store the evaluate results + +```bash llama-stack-client eval run-benchmark ... \ --model_id \ --output_dir \ ``` You can run -``` +```bash llama-stack-client eval run-benchmark help ``` -to see the description of all the flags to run benckmark eval +to see the description of all the flags to run benchmark eval +In the output log, you can find the path to the file that has your evaluation results. Open that file and you can see your aggregate evaluation results over there. -In the output log, you can find the path to the file that has your evaluation results. Open that file and you can see you aggrgate -evaluation results over there. - - -#### Application Evaluation CLI +### Application Evaluation CLI Usage: For running application evals, you will already have available datasets in hand from your application. You will need to specify: - `scoring-fn-id`: List of ScoringFunction identifiers you wish to use to run on your application. - `Dataset` used for evaluation: @@ -298,21 +293,19 @@ Usage: For running application evals, you will already have available datasets i - (2) `--dataset-id`: pre-registered dataset in Llama Stack - (Optional) `--scoring-params-config`: optionally parameterize scoring functions with custom params (e.g. `judge_prompt`, `judge_model`, `parsing_regexes`). - -``` +```bash llama-stack-client eval run_scoring ... --dataset-path \ --output-dir ./ ``` -#### Defining BenchmarkConfig +### Defining BenchmarkConfig The `BenchmarkConfig` are user specified config to define: 1. `EvalCandidate` to run generation on: - `ModelCandidate`: The model will be used for generation through LlamaStack /inference API. - `AgentCandidate`: The agentic system specified by AgentConfig will be used for generation through LlamaStack /agents API. 2. Optionally scoring function params to allow customization of scoring function behaviour. This is useful to parameterize generic scoring functions such as LLMAsJudge with custom `judge_model` / `judge_prompt`. - **Example BenchmarkConfig** ```json { @@ -340,29 +333,25 @@ The `BenchmarkConfig` are user specified config to define: } ``` - ## Open-benchmark Contributing Guide ### Create the new dataset for your new benchmark An eval open-benchmark essentially contains 2 parts: - `raw data`: The raw dataset associated with the benchmark. You typically need to search the original paper that introduces the benchmark and find the canonical dataset (usually hosted on huggingface) -- `prompt template`: How to ask the candidate model to generate the answer (prompt template plays a critical role to the evaluation results). Tyically, you can find the reference prompt template associated with the benchmark in benchmarks author's repo ([exmaple](https://github.com/idavidrein/gpqa/blob/main/prompts/chain_of_thought.txt)) or some other popular open source repos ([example](https://github.com/openai/simple-evals/blob/0a6e8f62e52bc5ae915f752466be3af596caf392/common.py#L14)) +- `prompt template`: How to ask the candidate model to generate the answer (prompt template plays a critical role to the evaluation results). Typically, you can find the reference prompt template associated with the benchmark in benchmarks author's repo ([example](https://github.com/idavidrein/gpqa/blob/main/prompts/chain_of_thought.txt)) or some other popular open source repos ([example](https://github.com/openai/simple-evals/blob/0a6e8f62e52bc5ae915f752466be3af596caf392/common.py#L14)) -To create new open-benmark in llama stack, you need to combine the prompt template and the raw data into the `chat_completion_input` column in the evaluation dataset. +To create new open-benchmark in llama stack, you need to combine the prompt template and the raw data into the `chat_completion_input` column in the evaluation dataset. -Llama stack enforeces the evaluate dataset schema to contain at least 3 columns: +Llama stack enforces the evaluate dataset schema to contain at least 3 columns: - `chat_completion_input`: The actual input to the model to run the generation for eval - `input_query`: The raw input from the raw dataset without the prompt template -- `expected_answer`: The ground truth for scoring functions to calcalate the score from. - +- `expected_answer`: The ground truth for scoring functions to calculate the score from. You need to write a script [example convert script](https://gist.github.com/yanxi0830/118e9c560227d27132a7fd10e2c92840) to convert the benchmark raw dataset to llama stack format eval dataset and update the dataset to huggingface [example benchmark dataset](https://huggingface.co/datasets/llamastack/mmmu) - ### Find scoring function for your new benchmark The purpose of scoring function is to calculate the score for each example based on candidate model generation result and expected_answer. It also aggregates the scores from all the examples and generate the final evaluate results. - Firstly, you can see if the existing [llama stack scoring functions](https://github.com/meta-llama/llama-stack/tree/main/llama_stack/providers/inline/scoring) can fulfill your need. If not, you need to write a new scoring function based on what benchmark author / other open source repo describe. ### Add new benchmark into template @@ -373,17 +362,15 @@ Secondly, you need to add the new benchmark you just created under the `benchmar - `dataset_id`: identifier of the dataset associated with your benchmark - `scoring_functions`: scoring function to calculate the score based on generation results and expected_answer - ### Test the new benchmark Spin up llama stack server with 'open-benchmark' templates -``` +```bash llama stack run llama_stack/distributions/open-benchmark/run.yaml - ``` Run eval benchmark CLI with your new benchmark id -``` +```bash llama-stack-client eval run-benchmark \ --model_id \ --output_dir \ diff --git a/docs/source/references/evals_reference/resources/eval-concept.png b/docs/docs/references/evals_reference/resources/eval-concept.png similarity index 100% rename from docs/source/references/evals_reference/resources/eval-concept.png rename to docs/docs/references/evals_reference/resources/eval-concept.png diff --git a/docs/source/references/evals_reference/resources/eval-flow.png b/docs/docs/references/evals_reference/resources/eval-flow.png similarity index 100% rename from docs/source/references/evals_reference/resources/eval-flow.png rename to docs/docs/references/evals_reference/resources/eval-flow.png diff --git a/docs/docs/references/index.mdx b/docs/docs/references/index.mdx new file mode 100644 index 000000000..9bf41b6d5 --- /dev/null +++ b/docs/docs/references/index.mdx @@ -0,0 +1,12 @@ +--- +title: References +description: Reference documentation for Llama Stack +sidebar_label: Overview +sidebar_position: 1 +--- + +# References + +- [Python SDK Reference](python_sdk_reference/index) +- [Llama CLI](llama_cli_reference/index) for building and running your Llama Stack server +- [Llama Stack Client CLI](llama_stack_client_cli_reference) for interacting with your Llama Stack server diff --git a/docs/source/references/llama_cli_reference/download_models.md b/docs/docs/references/llama_cli_reference/download_models.md similarity index 100% rename from docs/source/references/llama_cli_reference/download_models.md rename to docs/docs/references/llama_cli_reference/download_models.md diff --git a/docs/source/references/llama_cli_reference/index.md b/docs/docs/references/llama_cli_reference/index.md similarity index 100% rename from docs/source/references/llama_cli_reference/index.md rename to docs/docs/references/llama_cli_reference/index.md diff --git a/docs/source/references/llama_stack_client_cli_reference.md b/docs/docs/references/llama_stack_client_cli_reference.md similarity index 100% rename from docs/source/references/llama_stack_client_cli_reference.md rename to docs/docs/references/llama_stack_client_cli_reference.md diff --git a/docs/source/references/python_sdk_reference/index.md b/docs/docs/references/python_sdk_reference/index.md similarity index 100% rename from docs/source/references/python_sdk_reference/index.md rename to docs/docs/references/python_sdk_reference/index.md diff --git a/docs/source/building_applications/evals.md b/docs/source/building_applications/evals.md deleted file mode 100644 index ded62cebb..000000000 --- a/docs/source/building_applications/evals.md +++ /dev/null @@ -1,125 +0,0 @@ -# Evaluations - -The Llama Stack provides a set of APIs in Llama Stack for supporting running evaluations of LLM applications. -- `/datasetio` + `/datasets` API -- `/scoring` + `/scoring_functions` API -- `/eval` + `/benchmarks` API - - - -This guides walks you through the process of evaluating an LLM application built using Llama Stack. Checkout the [Evaluation Reference](../references/evals_reference/index.md) guide goes over the sets of APIs and developer experience flow of using Llama Stack to run evaluations for benchmark and application use cases. Checkout our Colab notebook on working examples with evaluations [here](https://colab.research.google.com/drive/10CHyykee9j2OigaIcRv47BKG9mrNm0tJ?usp=sharing). - - -## Application Evaluation - -[![Open In Colab](https://colab.research.google.com/assets/colab-badge.svg)](https://colab.research.google.com/github/meta-llama/llama-stack/blob/main/docs/getting_started.ipynb) - -Llama Stack offers a library of scoring functions and the `/scoring` API, allowing you to run evaluations on your pre-annotated AI application datasets. - -In this example, we will show you how to: -1. Build an Agent with Llama Stack -2. Query the agent's sessions, turns, and steps -3. Evaluate the results. - -##### Building a Search Agent -```python -from llama_stack_client import LlamaStackClient, Agent, AgentEventLogger - -client = LlamaStackClient(base_url=f"http://{HOST}:{PORT}") - -agent = Agent( - client, - model="meta-llama/Llama-3.3-70B-Instruct", - instructions="You are a helpful assistant. Use search tool to answer the questions. ", - tools=["builtin::websearch"], -) -user_prompts = [ - "Which teams played in the NBA Western Conference Finals of 2024. Search the web for the answer.", - "In which episode and season of South Park does Bill Cosby (BSM-471) first appear? Give me the number and title. Search the web for the answer.", - "What is the British-American kickboxer Andrew Tate's kickboxing name? Search the web for the answer.", -] - -session_id = agent.create_session("test-session") - -for prompt in user_prompts: - response = agent.create_turn( - messages=[ - { - "role": "user", - "content": prompt, - } - ], - session_id=session_id, - ) - - for log in AgentEventLogger().log(response): - log.print() -``` - - -##### Query Agent Execution Steps - -Now, let's look deeper into the agent's execution steps and see if how well our agent performs. -```python -# query the agents session -from rich.pretty import pprint - -session_response = client.agents.session.retrieve( - session_id=session_id, - agent_id=agent.agent_id, -) - -pprint(session_response) -``` - -As a sanity check, we will first check if all user prompts is followed by a tool call to `brave_search`. -```python -num_tool_call = 0 -for turn in session_response.turns: - for step in turn.steps: - if ( - step.step_type == "tool_execution" - and step.tool_calls[0].tool_name == "brave_search" - ): - num_tool_call += 1 - -print( - f"{num_tool_call}/{len(session_response.turns)} user prompts are followed by a tool call to `brave_search`" -) -``` - -##### Evaluate Agent Responses -Now, we want to evaluate the agent's responses to the user prompts. - -1. First, we will process the agent's execution history into a list of rows that can be used for evaluation. -2. Next, we will label the rows with the expected answer. -3. Finally, we will use the `/scoring` API to score the agent's responses. - -```python -eval_rows = [] - -expected_answers = [ - "Dallas Mavericks and the Minnesota Timberwolves", - "Season 4, Episode 12", - "King Cobra", -] - -for i, turn in enumerate(session_response.turns): - eval_rows.append( - { - "input_query": turn.input_messages[0].content, - "generated_answer": turn.output_message.content, - "expected_answer": expected_answers[i], - } - ) - -pprint(eval_rows) - -scoring_params = { - "basic::subset_of": None, -} -scoring_response = client.scoring.score( - input_rows=eval_rows, scoring_functions=scoring_params -) -pprint(scoring_response) -``` diff --git a/docs/source/building_applications/index.md b/docs/source/building_applications/index.md deleted file mode 100644 index fddd957ed..000000000 --- a/docs/source/building_applications/index.md +++ /dev/null @@ -1,33 +0,0 @@ -# AI Application Examples - -Llama Stack provides all the building blocks needed to create sophisticated AI applications. - -The best way to get started is to look at this notebook which walks through the various APIs (from basic inference, to RAG agents) and how to use them. - -**Notebook**: [Building AI Applications](https://github.com/meta-llama/llama-stack/blob/main/docs/getting_started.ipynb) - -Here are some key topics that will help you build effective agents: - -- **[RAG (Retrieval-Augmented Generation)](rag)**: Learn how to enhance your agents with external knowledge through retrieval mechanisms. -- **[Agent](agent)**: Understand the components and design patterns of the Llama Stack agent framework. -- **[Agent Execution Loop](agent_execution_loop)**: Understand how agents process information, make decisions, and execute actions in a continuous loop. -- **[Agents vs Responses API](responses_vs_agents)**: Learn the differences between the Agents API and Responses API, and when to use each one. -- **[Tools](tools)**: Extend your agents' capabilities by integrating with external tools and APIs. -- **[Evals](evals)**: Evaluate your agents' effectiveness and identify areas for improvement. -- **[Telemetry](telemetry)**: Monitor and analyze your agents' performance and behavior. -- **[Safety](safety)**: Implement guardrails and safety measures to ensure responsible AI behavior. - -```{toctree} -:hidden: -:maxdepth: 1 - -rag -agent -agent_execution_loop -responses_vs_agents -tools -evals -telemetry -safety -playground/index -``` \ No newline at end of file diff --git a/docs/source/building_applications/playground/index.md b/docs/source/building_applications/playground/index.md deleted file mode 100644 index 2390c422f..000000000 --- a/docs/source/building_applications/playground/index.md +++ /dev/null @@ -1,107 +0,0 @@ -## Llama Stack Playground - -```{note} -The Llama Stack Playground is currently experimental and subject to change. We welcome feedback and contributions to help improve it. -``` - -The Llama Stack Playground is an simple interface which aims to: -- Showcase **capabilities** and **concepts** of Llama Stack in an interactive environment -- Demo **end-to-end** application code to help users get started to build their own applications -- Provide an **UI** to help users inspect and understand Llama Stack API providers and resources - -### Key Features - -#### Playground -Interactive pages for users to play with and explore Llama Stack API capabilities. - -##### Chatbot -```{eval-rst} -.. video:: https://github.com/user-attachments/assets/8d2ef802-5812-4a28-96e1-316038c84cbf - :autoplay: - :playsinline: - :muted: - :loop: - :width: 100% -``` -- **Chat**: Chat with Llama models. - - This page is a simple chatbot that allows you to chat with Llama models. Under the hood, it uses the `/inference/chat-completion` streaming API to send messages to the model and receive responses. -- **RAG**: Uploading documents to memory_banks and chat with RAG agent - - This page allows you to upload documents as a `memory_bank` and then chat with a RAG agent to query information about the uploaded documents. - - Under the hood, it uses Llama Stack's `/agents` API to define and create a RAG agent and chat with it in a session. - -##### Evaluations -```{eval-rst} -.. video:: https://github.com/user-attachments/assets/6cc1659f-eba4-49ca-a0a5-7c243557b4f5 - :autoplay: - :playsinline: - :muted: - :loop: - :width: 100% -``` -- **Evaluations (Scoring)**: Run evaluations on your AI application datasets. - - This page demonstrates the flow evaluation API to run evaluations on your custom AI application datasets. You may upload your own evaluation datasets and run evaluations using available scoring functions. - - Under the hood, it uses Llama Stack's `/scoring` API to run evaluations on selected scoring functions. - -```{eval-rst} -.. video:: https://github.com/user-attachments/assets/345845c7-2a2b-4095-960a-9ae40f6a93cf - :autoplay: - :playsinline: - :muted: - :loop: - :width: 100% -``` -- **Evaluations (Generation + Scoring)**: Use pre-registered evaluation tasks to evaluate an model or agent candidate - - This page demonstrates the flow for evaluation API to evaluate an model or agent candidate on pre-defined evaluation tasks. An evaluation task is a combination of dataset and scoring functions. - - Under the hood, it uses Llama Stack's `/eval` API to run generations and scorings on specified evaluation configs. - - In order to run this page, you may need to register evaluation tasks and datasets as resources first through the following commands. - ```bash - $ llama-stack-client datasets register \ - --dataset-id "mmlu" \ - --provider-id "huggingface" \ - --url "https://huggingface.co/datasets/llamastack/evals" \ - --metadata '{"path": "llamastack/evals", "name": "evals__mmlu__details", "split": "train"}' \ - --schema '{"input_query": {"type": "string"}, "expected_answer": {"type": "string"}, "chat_completion_input": {"type": "string"}}' - ``` - - ```bash - $ llama-stack-client benchmarks register \ - --eval-task-id meta-reference-mmlu \ - --provider-id meta-reference \ - --dataset-id mmlu \ - --scoring-functions basic::regex_parser_multiple_choice_answer - ``` - - -##### Inspect -```{eval-rst} -.. video:: https://github.com/user-attachments/assets/01d52b2d-92af-4e3a-b623-a9b8ba22ba99 - :autoplay: - :playsinline: - :muted: - :loop: - :width: 100% -``` -- **API Providers**: Inspect Llama Stack API providers - - This page allows you to inspect Llama Stack API providers and resources. - - Under the hood, it uses Llama Stack's `/providers` API to get information about the providers. - -- **API Resources**: Inspect Llama Stack API resources - - This page allows you to inspect Llama Stack API resources (`models`, `datasets`, `memory_banks`, `benchmarks`, `shields`). - - Under the hood, it uses Llama Stack's `//list` API to get information about each resources. - - Please visit [Core Concepts](../../concepts/index.md) for more details about the resources. - -### Starting the Llama Stack Playground - -To start the Llama Stack Playground, run the following commands: - -1. Start up the Llama Stack API server - -```bash -llama stack build --distro together --image-type venv -llama stack run together -``` - -2. Start Streamlit UI -```bash -uv run --with ".[ui]" streamlit run llama_stack.core/ui/app.py -``` diff --git a/docs/source/building_applications/safety.md b/docs/source/building_applications/safety.md deleted file mode 100644 index 30afe7ad2..000000000 --- a/docs/source/building_applications/safety.md +++ /dev/null @@ -1,17 +0,0 @@ -## Safety Guardrails - -Safety is a critical component of any AI application. Llama Stack provides a Shield system that can be applied at multiple touchpoints: - -```python -# Register a safety shield -shield_id = "content_safety" -client.shields.register(shield_id=shield_id, provider_shield_id="llama-guard-basic") - -# Run content through shield -response = client.safety.run_shield( - shield_id=shield_id, messages=[{"role": "user", "content": "User message here"}] -) - -if response.violation: - print(f"Safety violation detected: {response.violation.user_message}") -``` diff --git a/docs/source/building_applications/telemetry.md b/docs/source/building_applications/telemetry.md deleted file mode 100644 index d93242f75..000000000 --- a/docs/source/building_applications/telemetry.md +++ /dev/null @@ -1,143 +0,0 @@ -## Telemetry - -The Llama Stack telemetry system provides comprehensive tracing, metrics, and logging capabilities. It supports multiple sink types including OpenTelemetry, SQLite, and Console output. - -### Events -The telemetry system supports three main types of events: - -- **Unstructured Log Events**: Free-form log messages with severity levels -```python -unstructured_log_event = UnstructuredLogEvent( - message="This is a log message", severity=LogSeverity.INFO -) -``` -- **Metric Events**: Numerical measurements with units -```python -metric_event = MetricEvent(metric="my_metric", value=10, unit="count") -``` -- **Structured Log Events**: System events like span start/end. Extensible to add more structured log types. -```python -structured_log_event = SpanStartPayload(name="my_span", parent_span_id="parent_span_id") -``` - -### Spans and Traces -- **Spans**: Represent operations with timing and hierarchical relationships -- **Traces**: Collection of related spans forming a complete request flow - -### Metrics - -Llama Stack automatically generates metrics during inference operations. These metrics are aggregated at the **inference request level** and provide insights into token usage and model performance. - -#### Available Metrics - -The following metrics are automatically generated for each inference request: - -| Metric Name | Type | Unit | Description | Labels | -|-------------|------|------|-------------|--------| -| `llama_stack_prompt_tokens_total` | Counter | `tokens` | Number of tokens in the input prompt | `model_id`, `provider_id` | -| `llama_stack_completion_tokens_total` | Counter | `tokens` | Number of tokens in the generated response | `model_id`, `provider_id` | -| `llama_stack_tokens_total` | Counter | `tokens` | Total tokens used (prompt + completion) | `model_id`, `provider_id` | - -#### Metric Generation Flow - -1. **Token Counting**: During inference operations (chat completion, completion, etc.), the system counts tokens in both input prompts and generated responses -2. **Metric Construction**: For each request, `MetricEvent` objects are created with the token counts -3. **Telemetry Logging**: Metrics are sent to the configured telemetry sinks -4. **OpenTelemetry Export**: When OpenTelemetry is enabled, metrics are exposed as standard OpenTelemetry counters - -#### Metric Aggregation Level - -All metrics are generated and aggregated at the **inference request level**. This means: - -- Each individual inference request generates its own set of metrics -- Metrics are not pre-aggregated across multiple requests -- Aggregation (sums, averages, etc.) can be performed by your observability tools (Prometheus, Grafana, etc.) -- Each metric includes labels for `model_id` and `provider_id` to enable filtering and grouping - -#### Example Metric Event - -```python -MetricEvent( - trace_id="1234567890abcdef", - span_id="abcdef1234567890", - metric="total_tokens", - value=150, - timestamp=1703123456.789, - unit="tokens", - attributes={"model_id": "meta-llama/Llama-3.2-3B-Instruct", "provider_id": "tgi"}, -) -``` - -#### Querying Metrics - -When using the OpenTelemetry sink, metrics are exposed in standard OpenTelemetry format and can be queried through: - -- **Prometheus**: Scrape metrics from the OpenTelemetry Collector's metrics endpoint -- **Grafana**: Create dashboards using Prometheus as a data source -- **OpenTelemetry Collector**: Forward metrics to other observability systems - -Example Prometheus queries: -```promql -# Total tokens used across all models -sum(llama_stack_tokens_total) - -# Tokens per model -sum by (model_id) (llama_stack_tokens_total) - -# Average tokens per request -rate(llama_stack_tokens_total[5m]) -``` - -### Sinks -- **OpenTelemetry**: Send events to an OpenTelemetry Collector. This is useful for visualizing traces in a tool like Jaeger and collecting metrics for Prometheus. -- **SQLite**: Store events in a local SQLite database. This is needed if you want to query the events later through the Llama Stack API. -- **Console**: Print events to the console. - -### Providers - -#### Meta-Reference Provider -Currently, only the meta-reference provider is implemented. It can be configured to send events to multiple sink types: -1) OpenTelemetry Collector (traces and metrics) -2) SQLite (traces only) -3) Console (all events) - -#### Configuration - -Here's an example that sends telemetry signals to all sink types. Your configuration might use only one or a subset. - -```yaml - telemetry: - - provider_id: meta-reference - provider_type: inline::meta-reference - config: - service_name: "llama-stack-service" - sinks: ['console', 'sqlite', 'otel_trace', 'otel_metric'] - otel_exporter_otlp_endpoint: "http://localhost:4318" - sqlite_db_path: "/path/to/telemetry.db" -``` - -**Environment Variables:** -- `OTEL_EXPORTER_OTLP_ENDPOINT`: OpenTelemetry Collector endpoint (default: `http://localhost:4318`) -- `OTEL_SERVICE_NAME`: Service name for telemetry (default: empty string) -- `TELEMETRY_SINKS`: Comma-separated list of sinks (default: `console,sqlite`) - -### Jaeger to visualize traces - -The `otel_trace` sink works with any service compatible with the OpenTelemetry collector. Traces and metrics use separate endpoints but can share the same collector. - -Start a Jaeger instance with the OTLP HTTP endpoint at 4318 and the Jaeger UI at 16686 using the following command: - -```bash -$ docker run --pull always --rm --name jaeger \ - -p 16686:16686 -p 4318:4318 \ - jaegertracing/jaeger:2.1.0 -``` - -Once the Jaeger instance is running, you can visualize traces by navigating to http://localhost:16686/. - -### Querying Traces Stored in SQLite - -The `sqlite` sink allows you to query traces without an external system. Here are some example -queries. Refer to the notebook at [Llama Stack Building AI -Applications](https://github.com/meta-llama/llama-stack/blob/main/docs/getting_started.ipynb) for -more examples on how to query traces and spans. diff --git a/docs/source/concepts/index.md b/docs/source/concepts/index.md deleted file mode 100644 index a483132b8..000000000 --- a/docs/source/concepts/index.md +++ /dev/null @@ -1,23 +0,0 @@ -# Core Concepts - -Given Llama Stack's service-oriented philosophy, a few concepts and workflows arise which may not feel completely natural in the LLM landscape, especially if you are coming with a background in other frameworks. - -```{include} architecture.md -:start-after: ## Llama Stack architecture -``` - -```{include} apis.md -:start-after: ## APIs -``` - -```{include} api_providers.md -:start-after: ## API Providers -``` - -```{include} distributions.md -:start-after: ## Distributions -``` - -```{include} resources.md -:start-after: ## Resources -``` diff --git a/docs/source/contributing/index.md b/docs/source/contributing/index.md deleted file mode 100644 index 71c3bd5a6..000000000 --- a/docs/source/contributing/index.md +++ /dev/null @@ -1,39 +0,0 @@ - -```{include} ../../../CONTRIBUTING.md -``` - -## Adding a New Provider - -See: -- [Adding a New API Provider Page](new_api_provider.md) which describes how to add new API providers to the Stack. -- [Vector Database Page](new_vector_database.md) which describes how to add a new vector databases with Llama Stack. -- [External Provider Page](../providers/external/index.md) which describes how to add external providers to the Stack. - -```{toctree} -:maxdepth: 1 -:hidden: - -new_api_provider -new_vector_database -``` - -## Testing - - -```{include} ../../../tests/README.md -``` - -## Advanced Topics - -For developers who need deeper understanding of the testing system internals: - -```{toctree} -:maxdepth: 1 - -testing/record-replay -``` - -### Benchmarking - -```{include} ../../../benchmarking/k8s-benchmark/README.md -``` diff --git a/docs/source/deploying/index.md b/docs/source/deploying/index.md deleted file mode 100644 index 73b5bf4f5..000000000 --- a/docs/source/deploying/index.md +++ /dev/null @@ -1,4 +0,0 @@ -# Deployment Examples - -```{include} kubernetes_deployment.md -``` \ No newline at end of file diff --git a/docs/source/distributions/index.md b/docs/source/distributions/index.md deleted file mode 100644 index 2a702c282..000000000 --- a/docs/source/distributions/index.md +++ /dev/null @@ -1,15 +0,0 @@ -# Distributions Overview - -A distribution is a pre-packaged set of Llama Stack components that can be deployed together. - -This section provides an overview of the distributions available in Llama Stack. - -```{toctree} -:maxdepth: 3 -list_of_distributions -building_distro -customizing_run_yaml -starting_llama_stack_server -importing_as_library -configuration -``` diff --git a/docs/source/distributions/self_hosted_distro/meta-reference-gpu.md b/docs/source/distributions/self_hosted_distro/meta-reference-gpu.md deleted file mode 100644 index 84b85b91c..000000000 --- a/docs/source/distributions/self_hosted_distro/meta-reference-gpu.md +++ /dev/null @@ -1,125 +0,0 @@ ---- -orphan: true ---- - -# Meta Reference GPU Distribution - -```{toctree} -:maxdepth: 2 -:hidden: - -self -``` - -The `llamastack/distribution-meta-reference-gpu` distribution consists of the following provider configurations: - -| API | Provider(s) | -|-----|-------------| -| agents | `inline::meta-reference` | -| datasetio | `remote::huggingface`, `inline::localfs` | -| eval | `inline::meta-reference` | -| inference | `inline::meta-reference` | -| safety | `inline::llama-guard` | -| scoring | `inline::basic`, `inline::llm-as-judge`, `inline::braintrust` | -| telemetry | `inline::meta-reference` | -| tool_runtime | `remote::brave-search`, `remote::tavily-search`, `inline::rag-runtime`, `remote::model-context-protocol` | -| vector_io | `inline::faiss`, `remote::chromadb`, `remote::pgvector` | - - -Note that you need access to nvidia GPUs to run this distribution. This distribution is not compatible with CPU-only machines or machines with AMD GPUs. - -### Environment Variables - -The following environment variables can be configured: - -- `LLAMA_STACK_PORT`: Port for the Llama Stack distribution server (default: `8321`) -- `INFERENCE_MODEL`: Inference model loaded into the Meta Reference server (default: `meta-llama/Llama-3.2-3B-Instruct`) -- `INFERENCE_CHECKPOINT_DIR`: Directory containing the Meta Reference model checkpoint (default: `null`) -- `SAFETY_MODEL`: Name of the safety (Llama-Guard) model to use (default: `meta-llama/Llama-Guard-3-1B`) -- `SAFETY_CHECKPOINT_DIR`: Directory containing the Llama-Guard model checkpoint (default: `null`) - - -## Prerequisite: Downloading Models - -Please use `llama model list --downloaded` to check that you have llama model checkpoints downloaded in `~/.llama` before proceeding. See [installation guide](../../references/llama_cli_reference/download_models.md) here to download the models. Run `llama model list` to see the available models to download, and `llama model download` to download the checkpoints. - -``` -$ llama model list --downloaded -┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━┳━━━━━━━━━━━━━━━━━━━━━┓ -┃ Model ┃ Size ┃ Modified Time ┃ -┡━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━╇━━━━━━━━━━━━━━━━━━━━━┩ -│ Llama3.2-1B-Instruct:int4-qlora-eo8 │ 1.53 GB │ 2025-02-26 11:22:28 │ -├─────────────────────────────────────────┼──────────┼─────────────────────┤ -│ Llama3.2-1B │ 2.31 GB │ 2025-02-18 21:48:52 │ -├─────────────────────────────────────────┼──────────┼─────────────────────┤ -│ Prompt-Guard-86M │ 0.02 GB │ 2025-02-26 11:29:28 │ -├─────────────────────────────────────────┼──────────┼─────────────────────┤ -│ Llama3.2-3B-Instruct:int4-spinquant-eo8 │ 3.69 GB │ 2025-02-26 11:37:41 │ -├─────────────────────────────────────────┼──────────┼─────────────────────┤ -│ Llama3.2-3B │ 5.99 GB │ 2025-02-18 21:51:26 │ -├─────────────────────────────────────────┼──────────┼─────────────────────┤ -│ Llama3.1-8B │ 14.97 GB │ 2025-02-16 10:36:37 │ -├─────────────────────────────────────────┼──────────┼─────────────────────┤ -│ Llama3.2-1B-Instruct:int4-spinquant-eo8 │ 1.51 GB │ 2025-02-26 11:35:02 │ -├─────────────────────────────────────────┼──────────┼─────────────────────┤ -│ Llama-Guard-3-1B │ 2.80 GB │ 2025-02-26 11:20:46 │ -├─────────────────────────────────────────┼──────────┼─────────────────────┤ -│ Llama-Guard-3-1B:int4 │ 0.43 GB │ 2025-02-26 11:33:33 │ -└─────────────────────────────────────────┴──────────┴─────────────────────┘ -``` - -## Running the Distribution - -You can do this via venv or Docker which has a pre-built image. - -### Via Docker - -This method allows you to get started quickly without having to build the distribution code. - -```bash -LLAMA_STACK_PORT=8321 -docker run \ - -it \ - --pull always \ - --gpu all \ - -p $LLAMA_STACK_PORT:$LLAMA_STACK_PORT \ - -v ~/.llama:/root/.llama \ - llamastack/distribution-meta-reference-gpu \ - --port $LLAMA_STACK_PORT \ - --env INFERENCE_MODEL=meta-llama/Llama-3.2-3B-Instruct -``` - -If you are using Llama Stack Safety / Shield APIs, use: - -```bash -docker run \ - -it \ - --pull always \ - --gpu all \ - -p $LLAMA_STACK_PORT:$LLAMA_STACK_PORT \ - -v ~/.llama:/root/.llama \ - llamastack/distribution-meta-reference-gpu \ - --port $LLAMA_STACK_PORT \ - --env INFERENCE_MODEL=meta-llama/Llama-3.2-3B-Instruct \ - --env SAFETY_MODEL=meta-llama/Llama-Guard-3-1B -``` - -### Via venv - -Make sure you have done `uv pip install llama-stack` and have the Llama Stack CLI available. - -```bash -llama stack build --distro meta-reference-gpu --image-type venv -llama stack run distributions/meta-reference-gpu/run.yaml \ - --port 8321 \ - --env INFERENCE_MODEL=meta-llama/Llama-3.2-3B-Instruct -``` - -If you are using Llama Stack Safety / Shield APIs, use: - -```bash -llama stack run distributions/meta-reference-gpu/run-with-safety.yaml \ - --port 8321 \ - --env INFERENCE_MODEL=meta-llama/Llama-3.2-3B-Instruct \ - --env SAFETY_MODEL=meta-llama/Llama-Guard-3-1B -``` diff --git a/docs/source/distributions/self_hosted_distro/nvidia.md b/docs/source/distributions/self_hosted_distro/nvidia.md deleted file mode 100644 index d4f070075..000000000 --- a/docs/source/distributions/self_hosted_distro/nvidia.md +++ /dev/null @@ -1,171 +0,0 @@ ---- -orphan: true ---- - -# NVIDIA Distribution - -The `llamastack/distribution-nvidia` distribution consists of the following provider configurations. - -| API | Provider(s) | -|-----|-------------| -| agents | `inline::meta-reference` | -| datasetio | `inline::localfs`, `remote::nvidia` | -| eval | `remote::nvidia` | -| files | `inline::localfs` | -| inference | `remote::nvidia` | -| post_training | `remote::nvidia` | -| safety | `remote::nvidia` | -| scoring | `inline::basic` | -| telemetry | `inline::meta-reference` | -| tool_runtime | `inline::rag-runtime` | -| vector_io | `inline::faiss` | - - -### Environment Variables - -The following environment variables can be configured: - -- `NVIDIA_API_KEY`: NVIDIA API Key (default: ``) -- `NVIDIA_APPEND_API_VERSION`: Whether to append the API version to the base_url (default: `True`) -- `NVIDIA_DATASET_NAMESPACE`: NVIDIA Dataset Namespace (default: `default`) -- `NVIDIA_PROJECT_ID`: NVIDIA Project ID (default: `test-project`) -- `NVIDIA_CUSTOMIZER_URL`: NVIDIA Customizer URL (default: `https://customizer.api.nvidia.com`) -- `NVIDIA_OUTPUT_MODEL_DIR`: NVIDIA Output Model Directory (default: `test-example-model@v1`) -- `GUARDRAILS_SERVICE_URL`: URL for the NeMo Guardrails Service (default: `http://0.0.0.0:7331`) -- `NVIDIA_GUARDRAILS_CONFIG_ID`: NVIDIA Guardrail Configuration ID (default: `self-check`) -- `NVIDIA_EVALUATOR_URL`: URL for the NeMo Evaluator Service (default: `http://0.0.0.0:7331`) -- `INFERENCE_MODEL`: Inference model (default: `Llama3.1-8B-Instruct`) -- `SAFETY_MODEL`: Name of the model to use for safety (default: `meta/llama-3.1-8b-instruct`) - -### Models - -The following models are available by default: - -- `meta/llama3-8b-instruct ` -- `meta/llama3-70b-instruct ` -- `meta/llama-3.1-8b-instruct ` -- `meta/llama-3.1-70b-instruct ` -- `meta/llama-3.1-405b-instruct ` -- `meta/llama-3.2-1b-instruct ` -- `meta/llama-3.2-3b-instruct ` -- `meta/llama-3.2-11b-vision-instruct ` -- `meta/llama-3.2-90b-vision-instruct ` -- `meta/llama-3.3-70b-instruct ` -- `nvidia/vila ` -- `nvidia/llama-3.2-nv-embedqa-1b-v2 ` -- `nvidia/nv-embedqa-e5-v5 ` -- `nvidia/nv-embedqa-mistral-7b-v2 ` -- `snowflake/arctic-embed-l ` - - -## Prerequisites -### NVIDIA API Keys - -Make sure you have access to a NVIDIA API Key. You can get one by visiting [https://build.nvidia.com/](https://build.nvidia.com/). Use this key for the `NVIDIA_API_KEY` environment variable. - -### Deploy NeMo Microservices Platform -The NVIDIA NeMo microservices platform supports end-to-end microservice deployment of a complete AI flywheel on your Kubernetes cluster through the NeMo Microservices Helm Chart. Please reference the [NVIDIA NeMo Microservices documentation](https://docs.nvidia.com/nemo/microservices/latest/about/index.html) for platform prerequisites and instructions to install and deploy the platform. - -## Supported Services -Each Llama Stack API corresponds to a specific NeMo microservice. The core microservices (Customizer, Evaluator, Guardrails) are exposed by the same endpoint. The platform components (Data Store) are each exposed by separate endpoints. - -### Inference: NVIDIA NIM -NVIDIA NIM is used for running inference with registered models. There are two ways to access NVIDIA NIMs: - 1. Hosted (default): Preview APIs hosted at https://integrate.api.nvidia.com (Requires an API key) - 2. Self-hosted: NVIDIA NIMs that run on your own infrastructure. - -The deployed platform includes the NIM Proxy microservice, which is the service that provides to access your NIMs (for example, to run inference on a model). Set the `NVIDIA_BASE_URL` environment variable to use your NVIDIA NIM Proxy deployment. - -### Datasetio API: NeMo Data Store -The NeMo Data Store microservice serves as the default file storage solution for the NeMo microservices platform. It exposts APIs compatible with the Hugging Face Hub client (`HfApi`), so you can use the client to interact with Data Store. The `NVIDIA_DATASETS_URL` environment variable should point to your NeMo Data Store endpoint. - -See the {repopath}`NVIDIA Datasetio docs::llama_stack/providers/remote/datasetio/nvidia/README.md` for supported features and example usage. - -### Eval API: NeMo Evaluator -The NeMo Evaluator microservice supports evaluation of LLMs. Launching an Evaluation job with NeMo Evaluator requires an Evaluation Config (an object that contains metadata needed by the job). A Llama Stack Benchmark maps to an Evaluation Config, so registering a Benchmark creates an Evaluation Config in NeMo Evaluator. The `NVIDIA_EVALUATOR_URL` environment variable should point to your NeMo Microservices endpoint. - -See the {repopath}`NVIDIA Eval docs::llama_stack/providers/remote/eval/nvidia/README.md` for supported features and example usage. - -### Post-Training API: NeMo Customizer -The NeMo Customizer microservice supports fine-tuning models. You can reference {repopath}`this list of supported models::llama_stack/providers/remote/post_training/nvidia/models.py` that can be fine-tuned using Llama Stack. The `NVIDIA_CUSTOMIZER_URL` environment variable should point to your NeMo Microservices endpoint. - -See the {repopath}`NVIDIA Post-Training docs::llama_stack/providers/remote/post_training/nvidia/README.md` for supported features and example usage. - -### Safety API: NeMo Guardrails -The NeMo Guardrails microservice sits between your application and the LLM, and adds checks and content moderation to a model. The `GUARDRAILS_SERVICE_URL` environment variable should point to your NeMo Microservices endpoint. - -See the {repopath}`NVIDIA Safety docs::llama_stack/providers/remote/safety/nvidia/README.md` for supported features and example usage. - -## Deploying models -In order to use a registered model with the Llama Stack APIs, ensure the corresponding NIM is deployed to your environment. For example, you can use the NIM Proxy microservice to deploy `meta/llama-3.2-1b-instruct`. - -Note: For improved inference speeds, we need to use NIM with `fast_outlines` guided decoding system (specified in the request body). This is the default if you deployed the platform with the NeMo Microservices Helm Chart. -```sh -# URL to NeMo NIM Proxy service -export NEMO_URL="http://nemo.test" - -curl --location "$NEMO_URL/v1/deployment/model-deployments" \ - -H 'accept: application/json' \ - -H 'Content-Type: application/json' \ - -d '{ - "name": "llama-3.2-1b-instruct", - "namespace": "meta", - "config": { - "model": "meta/llama-3.2-1b-instruct", - "nim_deployment": { - "image_name": "nvcr.io/nim/meta/llama-3.2-1b-instruct", - "image_tag": "1.8.3", - "pvc_size": "25Gi", - "gpu": 1, - "additional_envs": { - "NIM_GUIDED_DECODING_BACKEND": "fast_outlines" - } - } - } - }' -``` -This NIM deployment should take approximately 10 minutes to go live. [See the docs](https://docs.nvidia.com/nemo/microservices/latest/get-started/tutorials/deploy-nims.html) for more information on how to deploy a NIM and verify it's available for inference. - -You can also remove a deployed NIM to free up GPU resources, if needed. -```sh -export NEMO_URL="http://nemo.test" - -curl -X DELETE "$NEMO_URL/v1/deployment/model-deployments/meta/llama-3.1-8b-instruct" -``` - -## Running Llama Stack with NVIDIA - -You can do this via venv (build code), or Docker which has a pre-built image. - -### Via Docker - -This method allows you to get started quickly without having to build the distribution code. - -```bash -LLAMA_STACK_PORT=8321 -docker run \ - -it \ - --pull always \ - -p $LLAMA_STACK_PORT:$LLAMA_STACK_PORT \ - -v ./run.yaml:/root/my-run.yaml \ - llamastack/distribution-nvidia \ - --config /root/my-run.yaml \ - --port $LLAMA_STACK_PORT \ - --env NVIDIA_API_KEY=$NVIDIA_API_KEY -``` - -### Via venv - -If you've set up your local development environment, you can also build the image using your local virtual environment. - -```bash -INFERENCE_MODEL=meta-llama/Llama-3.1-8B-Instruct -llama stack build --distro nvidia --image-type venv -llama stack run ./run.yaml \ - --port 8321 \ - --env NVIDIA_API_KEY=$NVIDIA_API_KEY \ - --env INFERENCE_MODEL=$INFERENCE_MODEL -``` - -## Example Notebooks -For examples of how to use the NVIDIA Distribution to run inference, fine-tune, evaluate, and run safety checks on your LLMs, you can reference the example notebooks in {repopath}`docs/notebooks/nvidia`. diff --git a/docs/source/getting_started/index.md b/docs/source/getting_started/index.md deleted file mode 100644 index e941534c2..000000000 --- a/docs/source/getting_started/index.md +++ /dev/null @@ -1,13 +0,0 @@ -# Getting Started - -```{include} quickstart.md -:start-after: ## Quickstart -``` - -```{include} libraries.md -:start-after: ## Libraries (SDKs) -``` - -```{include} detailed_tutorial.md -:start-after: ## Detailed Tutorial -``` diff --git a/docs/source/index.md b/docs/source/index.md deleted file mode 100644 index c824ce94a..000000000 --- a/docs/source/index.md +++ /dev/null @@ -1,133 +0,0 @@ -# Llama Stack -Welcome to Llama Stack, the open-source framework for building generative AI applications. -```{admonition} Llama 4 is here! -:class: tip - -Check out [Getting Started with Llama 4](https://colab.research.google.com/github/meta-llama/llama-stack/blob/main/docs/getting_started_llama4.ipynb) -``` -```{admonition} News -:class: tip - -Llama Stack {{ llama_stack_version }} is now available! See the {{ llama_stack_version_link }} for more details. -``` - - -## What is Llama Stack? - -Llama Stack defines and standardizes the core building blocks needed to bring generative AI applications to market. It provides a unified set of APIs with implementations from leading service providers, enabling seamless transitions between development and production environments. More specifically, it provides - -- **Unified API layer** for Inference, RAG, Agents, Tools, Safety, Evals, and Telemetry. -- **Plugin architecture** to support the rich ecosystem of implementations of the different APIs in different environments like local development, on-premises, cloud, and mobile. -- **Prepackaged verified distributions** which offer a one-stop solution for developers to get started quickly and reliably in any environment -- **Multiple developer interfaces** like CLI and SDKs for Python, Node, iOS, and Android -- **Standalone applications** as examples for how to build production-grade AI applications with Llama Stack - -```{image} ../_static/llama-stack.png -:alt: Llama Stack -:width: 400px -``` - -Our goal is to provide pre-packaged implementations (aka "distributions") which can be run in a variety of deployment environments. LlamaStack can assist you in your entire app development lifecycle - start iterating on local, mobile or desktop and seamlessly transition to on-prem or public cloud deployments. At every point in this transition, the same set of APIs and the same developer experience is available. - -## How does Llama Stack work? -Llama Stack consists of a [server](./distributions/index.md) (with multiple pluggable API [providers](./providers/index.md)) and Client SDKs (see below) meant to -be used in your applications. The server can be run in a variety of environments, including local (inline) -development, on-premises, and cloud. The client SDKs are available for Python, Swift, Node, and -Kotlin. - -## Quick Links - -- Ready to build? Check out the [Quick Start](getting_started/index) to get started. -- Want to contribute? See the [Contributing](contributing/index) guide. - -## Supported Llama Stack Implementations - -A number of "adapters" are available for some popular Inference and Vector Store providers. For other APIs (particularly Safety and Agents), we provide *reference implementations* you can use to get started. We expect this list to grow over time. We are slowly onboarding more providers to the ecosystem as we get more confidence in the APIs. - -**Inference API** -| **Provider** | **Environments** | -| :----: | :----: | -| Meta Reference | Single Node | -| Ollama | Single Node | -| Fireworks | Hosted | -| Together | Hosted | -| NVIDIA NIM | Hosted and Single Node | -| vLLM | Hosted and Single Node | -| TGI | Hosted and Single Node | -| AWS Bedrock | Hosted | -| Cerebras | Hosted | -| Groq | Hosted | -| SambaNova | Hosted | -| PyTorch ExecuTorch | On-device iOS, Android | -| OpenAI | Hosted | -| Anthropic | Hosted | -| Gemini | Hosted | -| WatsonX | Hosted | - -**Agents API** -| **Provider** | **Environments** | -| :----: | :----: | -| Meta Reference | Single Node | -| Fireworks | Hosted | -| Together | Hosted | -| PyTorch ExecuTorch | On-device iOS | - -**Vector IO API** -| **Provider** | **Environments** | -| :----: | :----: | -| FAISS | Single Node | -| SQLite-Vec | Single Node | -| Chroma | Hosted and Single Node | -| Milvus | Hosted and Single Node | -| Postgres (PGVector) | Hosted and Single Node | -| Weaviate | Hosted | -| Qdrant | Hosted and Single Node | - -**Safety API** -| **Provider** | **Environments** | -| :----: | :----: | -| Llama Guard | Depends on Inference Provider | -| Prompt Guard | Single Node | -| Code Scanner | Single Node | -| AWS Bedrock | Hosted | - -**Post Training API** -| **Provider** | **Environments** | -| :----: | :----: | -| Meta Reference | Single Node | -| HuggingFace | Single Node | -| TorchTune | Single Node | -| NVIDIA NEMO | Hosted | - -**Eval API** -| **Provider** | **Environments** | -| :----: | :----: | -| Meta Reference | Single Node | -| NVIDIA NEMO | Hosted | - -**Telemetry API** -| **Provider** | **Environments** | -| :----: | :----: | -| Meta Reference | Single Node | - -**Tool Runtime API** -| **Provider** | **Environments** | -| :----: | :----: | -| Brave Search | Hosted | -| RAG Runtime | Single Node | - -```{toctree} -:hidden: -:maxdepth: 3 - -self -getting_started/index -concepts/index -providers/index -distributions/index -advanced_apis/index -building_applications/index -deploying/index -contributing/index -references/index -``` diff --git a/docs/source/references/api_reference/index.md b/docs/source/references/api_reference/index.md deleted file mode 100644 index f93c73ea3..000000000 --- a/docs/source/references/api_reference/index.md +++ /dev/null @@ -1,6 +0,0 @@ -{.hide-title} -# API Reference - -```{raw} html - :file: ../../../_static/llama-stack-spec.html -``` diff --git a/docs/source/references/index.md b/docs/source/references/index.md deleted file mode 100644 index 51e3dd0ba..000000000 --- a/docs/source/references/index.md +++ /dev/null @@ -1,18 +0,0 @@ -# References - -- [API Reference](api_reference/index) for the Llama Stack API specification -- [Python SDK Reference](python_sdk_reference/index) -- [Llama CLI](llama_cli_reference/index) for building and running your Llama Stack server -- [Llama Stack Client CLI](llama_stack_client_cli_reference) for interacting with your Llama Stack server - -```{toctree} -:maxdepth: 1 -:hidden: - -api_reference/index -python_sdk_reference/index -llama_cli_reference/index -llama_stack_client_cli_reference -llama_cli_reference/download_models -evals_reference/index -``` From 610526d6d7e6fe5ed1ae39d8f2f86673c4717b68 Mon Sep 17 00:00:00 2001 From: Alexey Rybak <50731695+reluctantfuturist@users.noreply.github.com> Date: Wed, 24 Sep 2025 14:08:50 -0700 Subject: [PATCH 141/150] docs: static content migration (#3535) # What does this PR do? - Migrates static content from Sphinx to Docusaurus ## Test Plan --- docs/_static/css/my_theme.css | 136 --------- docs/_static/js/detect_theme.js | 32 -- docs/_static/js/horizontal_nav.js | 44 --- docs/_static/js/keyboard_shortcuts.js | 14 - docs/source/conf.py | 156 ---------- .../resources => static/img}/eval-concept.png | Bin .../resources => static/img}/eval-flow.png | Bin .../img}/rag.png | Bin docs/{_static => static}/llama-stack-logo.png | Bin docs/{_static => static}/llama-stack.png | Bin .../read_time_comparison_sqlite-vec-faiss.png | Bin ...write_time_comparison_sqlite-vec-faiss.png | Bin .../write_time_sequence_sqlite-vec-faiss.png | Bin docs/{_static => static}/remote_or_local.gif | Bin docs/{_static => static}/safety_system.webp | Bin .../src/components/HomepageFeatures/index.js | 64 ++++ .../HomepageFeatures/styles.module.css | 11 + docs/static/src/css/custom.css | 191 ++++++++++++ docs/static/src/pages/index.js | 163 ++++++++++ docs/static/src/pages/index.module.css | 283 ++++++++++++++++++ docs/static/src/pages/markdown-page.md | 7 + 21 files changed, 719 insertions(+), 382 deletions(-) delete mode 100644 docs/_static/css/my_theme.css delete mode 100644 docs/_static/js/detect_theme.js delete mode 100644 docs/_static/js/horizontal_nav.js delete mode 100644 docs/_static/js/keyboard_shortcuts.js delete mode 100644 docs/source/conf.py rename docs/{docs/references/evals_reference/resources => static/img}/eval-concept.png (100%) rename docs/{docs/references/evals_reference/resources => static/img}/eval-flow.png (100%) rename docs/{docs/building_applications => static/img}/rag.png (100%) rename docs/{_static => static}/llama-stack-logo.png (100%) rename docs/{_static => static}/llama-stack.png (100%) rename docs/{_static => static}/providers/vector_io/read_time_comparison_sqlite-vec-faiss.png (100%) rename docs/{_static => static}/providers/vector_io/write_time_comparison_sqlite-vec-faiss.png (100%) rename docs/{_static => static}/providers/vector_io/write_time_sequence_sqlite-vec-faiss.png (100%) rename docs/{_static => static}/remote_or_local.gif (100%) rename docs/{_static => static}/safety_system.webp (100%) create mode 100644 docs/static/src/components/HomepageFeatures/index.js create mode 100644 docs/static/src/components/HomepageFeatures/styles.module.css create mode 100644 docs/static/src/css/custom.css create mode 100644 docs/static/src/pages/index.js create mode 100644 docs/static/src/pages/index.module.css create mode 100644 docs/static/src/pages/markdown-page.md diff --git a/docs/_static/css/my_theme.css b/docs/_static/css/my_theme.css deleted file mode 100644 index 7dcd97c9b..000000000 --- a/docs/_static/css/my_theme.css +++ /dev/null @@ -1,136 +0,0 @@ -@import url("theme.css"); - -/* Horizontal Navigation Bar */ -.horizontal-nav { - background-color: #ffffff; - border-bottom: 1px solid #e5e5e5; - padding: 0; - position: fixed; - top: 0; - left: 0; - right: 0; - z-index: 1050; - height: 50px; - box-shadow: 0 2px 4px rgba(0,0,0,0.1); -} - -[data-theme="dark"] .horizontal-nav { - background-color: #1a1a1a; - border-bottom: 1px solid #333; -} - -.horizontal-nav .nav-container { - max-width: 1200px; - margin: 0 auto; - display: flex; - align-items: center; - justify-content: space-between; - padding: 0 20px; - height: 100%; -} - -.horizontal-nav .nav-brand { - font-size: 18px; - font-weight: 600; - color: #333; - text-decoration: none; -} - -[data-theme="dark"] .horizontal-nav .nav-brand { - color: #fff; -} - -.horizontal-nav .nav-links { - display: flex; - align-items: center; - gap: 30px; - list-style: none; - margin: 0; - padding: 0; -} - -.horizontal-nav .nav-links a { - color: #666; - text-decoration: none; - font-size: 14px; - font-weight: 500; - padding: 8px 12px; - border-radius: 6px; - transition: all 0.2s ease; -} - -.horizontal-nav .nav-links a:hover, -.horizontal-nav .nav-links a.active { - color: #333; - background-color: #f5f5f5; -} - -.horizontal-nav .nav-links a.active { - font-weight: 600; -} - -[data-theme="dark"] .horizontal-nav .nav-links a { - color: #ccc; -} - -[data-theme="dark"] .horizontal-nav .nav-links a:hover, -[data-theme="dark"] .horizontal-nav .nav-links a.active { - color: #fff; - background-color: #333; -} - -.horizontal-nav .nav-links .github-link { - display: flex; - align-items: center; - gap: 6px; -} - -.horizontal-nav .nav-links .github-icon { - width: 16px; - height: 16px; - fill: currentColor; -} - -/* Adjust main content to account for fixed nav */ -.wy-nav-side { - top: 50px; - height: calc(100vh - 50px); -} - -.wy-nav-content-wrap { - margin-top: 50px; -} - -.wy-nav-content { - max-width: 90%; -} - -.wy-nav-side { - /* background: linear-gradient(45deg, #2980B9, #16A085); */ - background: linear-gradient(90deg, #332735, #1b263c); -} - -.wy-side-nav-search { - background-color: transparent !important; -} - -.hide-title h1 { - display: none; -} - -h2, h3, h4 { - font-weight: normal; -} -html[data-theme="dark"] .rst-content div[class^="highlight"] { - background-color: #0b0b0b; -} -pre { - white-space: pre-wrap !important; - word-break: break-all; -} - -[data-theme="dark"] .mermaid { - background-color: #f4f4f6 !important; - border-radius: 6px; - padding: 0.5em; - } diff --git a/docs/_static/js/detect_theme.js b/docs/_static/js/detect_theme.js deleted file mode 100644 index 712565ef7..000000000 --- a/docs/_static/js/detect_theme.js +++ /dev/null @@ -1,32 +0,0 @@ -document.addEventListener("DOMContentLoaded", function () { - const prefersDark = window.matchMedia("(prefers-color-scheme: dark)").matches; - const htmlElement = document.documentElement; - - // Check if theme is saved in localStorage - const savedTheme = localStorage.getItem("sphinx-rtd-theme"); - - if (savedTheme) { - // Use the saved theme preference - htmlElement.setAttribute("data-theme", savedTheme); - document.body.classList.toggle("dark", savedTheme === "dark"); - } else { - // Fall back to system preference - const theme = prefersDark ? "dark" : "light"; - htmlElement.setAttribute("data-theme", theme); - document.body.classList.toggle("dark", theme === "dark"); - // Save initial preference - localStorage.setItem("sphinx-rtd-theme", theme); - } - - // Listen for theme changes from the existing toggle - const observer = new MutationObserver(function(mutations) { - mutations.forEach(function(mutation) { - if (mutation.attributeName === "data-theme") { - const currentTheme = htmlElement.getAttribute("data-theme"); - localStorage.setItem("sphinx-rtd-theme", currentTheme); - } - }); - }); - - observer.observe(htmlElement, { attributes: true }); -}); diff --git a/docs/_static/js/horizontal_nav.js b/docs/_static/js/horizontal_nav.js deleted file mode 100644 index c2384f9d5..000000000 --- a/docs/_static/js/horizontal_nav.js +++ /dev/null @@ -1,44 +0,0 @@ -// Horizontal Navigation Bar for Llama Stack Documentation -document.addEventListener('DOMContentLoaded', function() { - // Create the horizontal navigation HTML - const navHTML = ` - - `; - - // Insert the navigation at the beginning of the body - document.body.insertAdjacentHTML('afterbegin', navHTML); - - // Update navigation links based on current page - updateActiveNav(); -}); - -function updateActiveNav() { - const currentPath = window.location.pathname; - const navLinks = document.querySelectorAll('.horizontal-nav .nav-links a'); - - navLinks.forEach(link => { - // Remove any existing active classes - link.classList.remove('active'); - - // Add active class based on current path - if (currentPath === '/' && link.getAttribute('href') === '/') { - link.classList.add('active'); - } else if (currentPath.includes('/references/api_reference/') && link.getAttribute('href').includes('api_reference')) { - link.classList.add('active'); - } - }); -} diff --git a/docs/_static/js/keyboard_shortcuts.js b/docs/_static/js/keyboard_shortcuts.js deleted file mode 100644 index 81d0b7c65..000000000 --- a/docs/_static/js/keyboard_shortcuts.js +++ /dev/null @@ -1,14 +0,0 @@ -document.addEventListener('keydown', function(event) { - // command+K or ctrl+K - if ((event.metaKey || event.ctrlKey) && event.key === 'k') { - event.preventDefault(); - document.querySelector('.search-input, .search-field, input[name="q"]').focus(); - } - - // forward slash - if (event.key === '/' && - !event.target.matches('input, textarea, select')) { - event.preventDefault(); - document.querySelector('.search-input, .search-field, input[name="q"]').focus(); - } -}); diff --git a/docs/source/conf.py b/docs/source/conf.py deleted file mode 100644 index 0cbddef31..000000000 --- a/docs/source/conf.py +++ /dev/null @@ -1,156 +0,0 @@ -# Copyright (c) Meta Platforms, Inc. and affiliates. -# All rights reserved. -# -# This source code is licensed under the terms described in the LICENSE file in -# the root directory of this source tree. - -# Configuration file for the Sphinx documentation builder. -# -# For the full list of built-in configuration values, see the documentation: -# https://www.sphinx-doc.org/en/master/usage/configuration.html - -# -- Project information ----------------------------------------------------- -# https://www.sphinx-doc.org/en/master/usage/configuration.html#project-information - -import json -from datetime import datetime -from pathlib import Path - -import requests -from docutils import nodes - -# Read version from pyproject.toml -with Path(__file__).parent.parent.parent.joinpath("pyproject.toml").open("rb") as f: - pypi_url = "https://pypi.org/pypi/llama-stack/json" - headers = { - 'User-Agent': 'pip/23.0.1 (python 3.11)', # Mimic pip's user agent - 'Accept': 'application/json' - } - version_tag = json.loads(requests.get(pypi_url, headers=headers).text)["info"]["version"] - print(f"{version_tag=}") - - # generate the full link including text and url here - llama_stack_version_url = ( - f"https://github.com/meta-llama/llama-stack/releases/tag/v{version_tag}" - ) - llama_stack_version_link = f"release notes" - -project = "llama-stack" -copyright = f"{datetime.now().year}, Meta" -author = "Meta" - -# -- General configuration --------------------------------------------------- -# https://www.sphinx-doc.org/en/master/usage/configuration.html#general-configuration - -extensions = [ - "myst_parser", - "sphinx_copybutton", - "sphinx_design", - "sphinx_rtd_theme", - "sphinx_rtd_dark_mode", - "sphinx_tabs.tabs", - "sphinxcontrib.redoc", - "sphinxcontrib.mermaid", - "sphinxcontrib.video", - "sphinx_reredirects" -] - -redirects = { - "providers/post_training/index": "../../advanced_apis/post_training/index.html", - "providers/eval/index": "../../advanced_apis/eval/index.html", - "providers/scoring/index": "../../advanced_apis/scoring/index.html", - "playground/index": "../../building_applications/playground/index.html", - "openai/index": "../../providers/index.html#openai-api-compatibility", - "introduction/index": "../concepts/index.html#llama-stack-architecture" -} - -myst_enable_extensions = ["colon_fence"] - -html_theme = "sphinx_rtd_theme" -html_use_relative_paths = True -templates_path = ["_templates"] -exclude_patterns = ["_build", "Thumbs.db", ".DS_Store"] - -myst_enable_extensions = [ - "amsmath", - "attrs_inline", - "attrs_block", - "colon_fence", - "deflist", - "dollarmath", - "fieldlist", - "html_admonition", - "html_image", - # "linkify", - "replacements", - "smartquotes", - "strikethrough", - "substitution", - "tasklist", -] - -myst_substitutions = { - "docker_hub": "https://hub.docker.com/repository/docker/llamastack", - "llama_stack_version": version_tag, - "llama_stack_version_link": llama_stack_version_link, -} - -suppress_warnings = ["myst.header"] - -# Copy button settings -copybutton_prompt_text = "$ " # for bash prompts -copybutton_prompt_is_regexp = True -copybutton_remove_prompts = True -copybutton_line_continuation_character = "\\" - -# Source suffix -source_suffix = { - ".rst": "restructuredtext", - ".md": "markdown", -} - -# -- Options for HTML output ------------------------------------------------- -# https://www.sphinx-doc.org/en/master/usage/configuration.html#options-for-html-output - -# html_theme = "alabaster" -html_theme_options = { - "canonical_url": "https://github.com/meta-llama/llama-stack", - "collapse_navigation": False, - # "style_nav_header_background": "#c3c9d4", - 'display_version': True, - 'version_selector': True, -} - -default_dark_mode = False - -html_static_path = ["../_static"] -# html_logo = "../_static/llama-stack-logo.png" -# html_style = "../_static/css/my_theme.css" - - -def setup(app): - app.add_css_file("css/my_theme.css") - app.add_js_file("js/detect_theme.js") - app.add_js_file("js/horizontal_nav.js") - app.add_js_file("js/keyboard_shortcuts.js") - - def dockerhub_role(name, rawtext, text, lineno, inliner, options={}, content=[]): - url = f"https://hub.docker.com/r/llamastack/{text}" - node = nodes.reference(rawtext, text, refuri=url, **options) - return [node], [] - - def repopath_role(name, rawtext, text, lineno, inliner, options={}, content=[]): - parts = text.split("::") - if len(parts) == 2: - link_text = parts[0] - url_path = parts[1] - else: - link_text = text - url_path = text - - url = f"https://github.com/meta-llama/llama-stack/tree/main/{url_path}" - node = nodes.reference(rawtext, link_text, refuri=url, **options) - return [node], [] - - app.add_role("dockerhub", dockerhub_role) - app.add_role("repopath", repopath_role) diff --git a/docs/docs/references/evals_reference/resources/eval-concept.png b/docs/static/img/eval-concept.png similarity index 100% rename from docs/docs/references/evals_reference/resources/eval-concept.png rename to docs/static/img/eval-concept.png diff --git a/docs/docs/references/evals_reference/resources/eval-flow.png b/docs/static/img/eval-flow.png similarity index 100% rename from docs/docs/references/evals_reference/resources/eval-flow.png rename to docs/static/img/eval-flow.png diff --git a/docs/docs/building_applications/rag.png b/docs/static/img/rag.png similarity index 100% rename from docs/docs/building_applications/rag.png rename to docs/static/img/rag.png diff --git a/docs/_static/llama-stack-logo.png b/docs/static/llama-stack-logo.png similarity index 100% rename from docs/_static/llama-stack-logo.png rename to docs/static/llama-stack-logo.png diff --git a/docs/_static/llama-stack.png b/docs/static/llama-stack.png similarity index 100% rename from docs/_static/llama-stack.png rename to docs/static/llama-stack.png diff --git a/docs/_static/providers/vector_io/read_time_comparison_sqlite-vec-faiss.png b/docs/static/providers/vector_io/read_time_comparison_sqlite-vec-faiss.png similarity index 100% rename from docs/_static/providers/vector_io/read_time_comparison_sqlite-vec-faiss.png rename to docs/static/providers/vector_io/read_time_comparison_sqlite-vec-faiss.png diff --git a/docs/_static/providers/vector_io/write_time_comparison_sqlite-vec-faiss.png b/docs/static/providers/vector_io/write_time_comparison_sqlite-vec-faiss.png similarity index 100% rename from docs/_static/providers/vector_io/write_time_comparison_sqlite-vec-faiss.png rename to docs/static/providers/vector_io/write_time_comparison_sqlite-vec-faiss.png diff --git a/docs/_static/providers/vector_io/write_time_sequence_sqlite-vec-faiss.png b/docs/static/providers/vector_io/write_time_sequence_sqlite-vec-faiss.png similarity index 100% rename from docs/_static/providers/vector_io/write_time_sequence_sqlite-vec-faiss.png rename to docs/static/providers/vector_io/write_time_sequence_sqlite-vec-faiss.png diff --git a/docs/_static/remote_or_local.gif b/docs/static/remote_or_local.gif similarity index 100% rename from docs/_static/remote_or_local.gif rename to docs/static/remote_or_local.gif diff --git a/docs/_static/safety_system.webp b/docs/static/safety_system.webp similarity index 100% rename from docs/_static/safety_system.webp rename to docs/static/safety_system.webp diff --git a/docs/static/src/components/HomepageFeatures/index.js b/docs/static/src/components/HomepageFeatures/index.js new file mode 100644 index 000000000..78f410ba6 --- /dev/null +++ b/docs/static/src/components/HomepageFeatures/index.js @@ -0,0 +1,64 @@ +import React from 'react'; +import clsx from 'clsx'; +import styles from './styles.module.css'; + +const FeatureList = [ + { + title: 'Easy to Use', + Svg: require('@site/static/img/undraw_docusaurus_mountain.svg').default, + description: ( + <> + Docusaurus was designed from the ground up to be easily installed and + used to get your website up and running quickly. + + ), + }, + { + title: 'Focus on What Matters', + Svg: require('@site/static/img/undraw_docusaurus_tree.svg').default, + description: ( + <> + Docusaurus lets you focus on your docs, and we'll do the chores. Go + ahead and move your docs into the docs directory. + + ), + }, + { + title: 'Powered by React', + Svg: require('@site/static/img/undraw_docusaurus_react.svg').default, + description: ( + <> + Extend or customize your website layout by reusing React. Docusaurus can + be extended while reusing the same header and footer. + + ), + }, +]; + +function Feature({Svg, title, description}) { + return ( +
+
+ +
+
+

{title}

+

{description}

+
+
+ ); +} + +export default function HomepageFeatures() { + return ( +
+
+
+ {FeatureList.map((props, idx) => ( + + ))} +
+
+
+ ); +} diff --git a/docs/static/src/components/HomepageFeatures/styles.module.css b/docs/static/src/components/HomepageFeatures/styles.module.css new file mode 100644 index 000000000..b248eb2e5 --- /dev/null +++ b/docs/static/src/components/HomepageFeatures/styles.module.css @@ -0,0 +1,11 @@ +.features { + display: flex; + align-items: center; + padding: 2rem 0; + width: 100%; +} + +.featureSvg { + height: 200px; + width: 200px; +} diff --git a/docs/static/src/css/custom.css b/docs/static/src/css/custom.css new file mode 100644 index 000000000..0e4d95b9b --- /dev/null +++ b/docs/static/src/css/custom.css @@ -0,0 +1,191 @@ +/** + * Any CSS included here will be global. The classic template + * bundles Infima by default. Infima is a CSS framework designed to + * work well for content-centric websites. + */ + +/* You can override the default Infima variables here. */ +:root { + /* Llama Stack Original Theme - Based on llamastack.github.io */ + --ifm-color-primary: #4a4a68; + --ifm-color-primary-dark: #3a3a52; + --ifm-color-primary-darker: #332735; + --ifm-color-primary-darkest: #2b2129; + --ifm-color-primary-light: #5a5a7e; + --ifm-color-primary-lighter: #6a6a94; + --ifm-color-primary-lightest: #8080aa; + + /* Additional theme colors */ + --ifm-color-secondary: #1b263c; + --ifm-color-info: #2980b9; + --ifm-color-success: #16a085; + --ifm-color-warning: #f39c12; + --ifm-color-danger: #e74c3c; + + /* Background colors */ + --ifm-background-color: #ffffff; + --ifm-background-surface-color: #f8f9fa; + + /* Code and syntax highlighting */ + --ifm-code-font-size: 95%; + --ifm-pre-background: #1b263c; + --ifm-pre-color: #e1e5e9; + --docusaurus-highlighted-code-line-bg: rgba(51, 39, 53, 0.1); + + /* Link colors */ + --ifm-link-color: var(--ifm-color-primary); + --ifm-link-hover-color: var(--ifm-color-primary-darker); + + /* Navbar */ + --ifm-navbar-background-color: rgba(255, 255, 255, 0.95); + --ifm-navbar-shadow: 0 2px 4px rgba(0, 0, 0, 0.1); + + /* Hero section gradient - matching original theme */ + --hero-gradient: linear-gradient(90deg, #332735 0%, #1b263c 100%); + + /* OpenAPI method colors */ + --openapi-code-blue: #2980b9; + --openapi-code-green: #16a085; + --openapi-code-orange: #f39c12; + --openapi-code-red: #e74c3c; + --openapi-code-purple: #332735; +} + +/* For readability concerns, you should choose a lighter palette in dark mode. */ +[data-theme='dark'] { + /* Dark theme primary colors - lighter versions of original theme */ + --ifm-color-primary: #8080aa; + --ifm-color-primary-dark: #6a6a94; + --ifm-color-primary-darker: #5a5a7e; + --ifm-color-primary-darkest: #4a4a68; + --ifm-color-primary-light: #9090ba; + --ifm-color-primary-lighter: #a0a0ca; + --ifm-color-primary-lightest: #b0b0da; + + /* Dark theme background colors */ + --ifm-background-color: #1a1a1a; + --ifm-background-surface-color: #2a2a2a; + + /* Dark theme navbar */ + --ifm-navbar-background-color: rgba(26, 26, 26, 0.95); + + /* Dark theme code highlighting */ + --docusaurus-highlighted-code-line-bg: rgba(51, 39, 53, 0.3); + + /* Dark theme text colors */ + --ifm-font-color-base: #e1e5e9; + --ifm-font-color-secondary: #a0a6ac; +} + +/* Sidebar Method labels */ +.api-method>.menu__link { + align-items: center; + justify-content: start; +} + +.api-method>.menu__link::before { + width: 50px; + height: 20px; + font-size: 12px; + line-height: 20px; + text-transform: uppercase; + font-weight: 600; + border-radius: 0.25rem; + border: 1px solid; + margin-right: var(--ifm-spacing-horizontal); + text-align: center; + flex-shrink: 0; + border-color: transparent; + color: white; +} + +.get>.menu__link::before { + content: "get"; + background-color: var(--ifm-color-primary); +} + +.put>.menu__link::before { + content: "put"; + background-color: var(--openapi-code-blue); +} + +.post>.menu__link::before { + content: "post"; + background-color: var(--openapi-code-green); +} + +.delete>.menu__link::before { + content: "del"; + background-color: var(--openapi-code-red); +} + +.patch>.menu__link::before { + content: "patch"; + background-color: var(--openapi-code-orange); +} + +.footer--dark { + --ifm-footer-link-color: #ffffff; + --ifm-footer-title-color: #ffffff; +} + +.footer--dark .footer__link-item { + color: #ffffff; +} + +.footer--dark .footer__title { + color: #ffffff; +} + +/* OpenAPI theme fixes for light mode readability */ +/* Version badge fixes */ +.openapi__version-badge, +.theme-doc-version-badge, +[class*="version-badge"], +[class*="versionBadge"] { + background-color: #ffffff !important; + color: #333333 !important; + border: 1px solid #d1d5db !important; +} + +/* OpenAPI method badges in light mode */ +.openapi__method-badge, +[class*="method-badge"] { + color: #ffffff !important; +} + +/* Button fixes for light mode */ +.openapi__button, +.theme-api-docs-demo-panel button, +[class*="api-docs"] button, +button[class*="button"], +.openapi-explorer__response-schema button, +.openapi-tabs__operation button { + color: #ffffff !important; +} + +.openapi__button:hover, +.theme-api-docs-demo-panel button:hover, +[class*="api-docs"] button:hover, +button[class*="button"]:hover, +.openapi-explorer__response-schema button:hover, +.openapi-tabs__operation button:hover { + color: #ffffff !important; +} + +/* Navigation buttons (Next/Previous) */ +.pagination-nav__link, +.pagination-nav__label { + color: #333333 !important; +} + +.pagination-nav__link--next, +.pagination-nav__link--prev { + background-color: #ffffff !important; + border: 1px solid #d1d5db !important; +} + +.pagination-nav__link--next:hover, +.pagination-nav__link--prev:hover { + background-color: #f3f4f6 !important; +} diff --git a/docs/static/src/pages/index.js b/docs/static/src/pages/index.js new file mode 100644 index 000000000..fe14e920c --- /dev/null +++ b/docs/static/src/pages/index.js @@ -0,0 +1,163 @@ +import React from 'react'; +import clsx from 'clsx'; +import Layout from '@theme/Layout'; +import Link from '@docusaurus/Link'; +import useDocusaurusContext from '@docusaurus/useDocusaurusContext'; +import styles from './index.module.css'; + +function HomepageHeader() { + const {siteConfig} = useDocusaurusContext(); + return ( +
+
+
+

Build AI Applications with Llama Stack

+

+ Unified APIs for Inference, RAG, Agents, Tools, Safety, and Telemetry +

+
+ + 🚀 Get Started + + + 📚 API Reference + +
+
+
+
+ ); +} + +function QuickStart() { + return ( +
+
+
+
+

Quick Start

+

+ Get up and running with Llama Stack in just a few commands. Build your first RAG application locally. +

+
+
{`# Install uv and start Ollama
+ollama run llama3.2:3b --keepalive 60m
+
+# Run Llama Stack server
+OLLAMA_URL=http://localhost:11434 \\
+  uv run --with llama-stack \\
+  llama stack build --distro starter \\
+  --image-type venv --run
+
+# Try the Python SDK
+from llama_stack_client import LlamaStackClient
+
+client = LlamaStackClient(
+  base_url="http://localhost:8321"
+)
+
+response = client.inference.chat_completion(
+  model="Llama3.2-3B-Instruct",
+  messages=[{
+    "role": "user",
+    "content": "What is machine learning?"
+  }]
+)`}
+
+
+
+

Why Llama Stack?

+
+
+
🔗
+
+

Unified APIs

+

One consistent interface for all your AI needs - inference, safety, agents, and more.

+
+
+
+
🔄
+
+

Provider Flexibility

+

Swap between providers without code changes. Start local, deploy anywhere.

+
+
+
+
🛡️
+
+

Production Ready

+

Built-in safety, monitoring, and evaluation tools for enterprise applications.

+
+
+
+
📱
+
+

Multi-Platform

+

SDKs for Python, Node.js, iOS, Android, and REST APIs for any language.

+
+
+
+
+
+
+
+ ); +} + +function CommunityLinks() { + return ( +
+
+
+

Join the Community

+

+ Connect with developers building the future of AI applications +

+ +
+
+
+ ); +} + +export default function Home() { + const {siteConfig} = useDocusaurusContext(); + return ( + + +
+ + +
+
+ ); +} diff --git a/docs/static/src/pages/index.module.css b/docs/static/src/pages/index.module.css new file mode 100644 index 000000000..c3681653b --- /dev/null +++ b/docs/static/src/pages/index.module.css @@ -0,0 +1,283 @@ +/** + * CSS files with the .module.css suffix will be treated as CSS modules + * and scoped locally. + */ + +.heroBanner { + padding: 4rem 0; + text-align: center; + position: relative; + overflow: hidden; + background: var(--hero-gradient); + color: white; + display: flex; + align-items: center; +} + +.heroBanner::before { + content: ''; + position: absolute; + top: 0; + left: 0; + right: 0; + bottom: 0; + background: radial-gradient(circle at 30% 20%, rgba(255, 255, 255, 0.1) 0%, transparent 50%), + radial-gradient(circle at 70% 80%, rgba(255, 255, 255, 0.05) 0%, transparent 50%); + pointer-events: none; +} + +.heroContent { + max-width: 800px; + margin: 0 auto; +} + +.heroLogo { + height: 48px; + width: auto; + margin-bottom: 1.5rem; +} + +.heroTitle { + font-size: 2.8rem; + font-weight: 700; + margin-bottom: 1rem; + line-height: 1.2; +} + +.heroSubtitle { + font-size: 1.1rem; + font-weight: 400; + margin-bottom: 2rem; + opacity: 0.9; + line-height: 1.5; + max-width: 600px; + margin-left: auto; + margin-right: auto; +} + +.buttons { + display: flex; + align-items: center; + justify-content: center; + gap: 1rem; +} + +.heroBanner .getStartedButton { + background: white; + color: #332735; + border: 2px solid white; + font-weight: 600; + transition: all 0.3s ease; +} + +.heroBanner .getStartedButton:hover { + background: rgba(255, 255, 255, 0.9); + color: #2b2129; + border-color: rgba(255, 255, 255, 0.9); + transform: translateY(-2px); + box-shadow: 0 8px 25px rgba(0, 0, 0, 0.15); +} + +.heroBanner .apiButton { + background: transparent; + color: white; + border: 2px solid white; + font-weight: 600; + transition: all 0.3s ease; +} + +.heroBanner .apiButton:hover { + background: white; + border-color: white; + color: #332735; + transform: translateY(-2px); +} + +/* Quick Start Section */ +.quickStart { + padding: 4rem 0; + background: var(--ifm-background-color); +} + +.sectionTitle { + font-size: 2rem; + font-weight: 600; + margin-bottom: 0.75rem; + color: var(--ifm-color-emphasis-800); +} + +.sectionDescription { + font-size: 1rem; + color: var(--ifm-color-emphasis-600); + margin-bottom: 1.5rem; + line-height: 1.5; +} + +.codeBlock { + background: var(--ifm-color-gray-900); + border-radius: 8px; + padding: 1.5rem; + margin-top: 1.5rem; + box-shadow: 0 2px 10px rgba(0, 0, 0, 0.1); +} + +.codeBlock pre { + margin: 0; + padding: 0; + background: none; + border: none; +} + +.codeBlock code { + color: var(--ifm-color-gray-100); + font-family: 'Fira Code', 'Consolas', 'Monaco', monospace; + font-size: 0.9rem; + line-height: 1.6; +} + +/* Features */ +.features { + display: flex; + flex-direction: column; + gap: 1rem; + margin-top: 1.5rem; +} + +.feature { + display: flex; + align-items: flex-start; + gap: 1rem; + padding: 1rem; + border-radius: 8px; + background: var(--ifm-color-gray-50); + border: 1px solid var(--ifm-color-gray-200); + transition: all 0.2s ease; +} + +.feature:hover { + transform: translateY(-2px); + box-shadow: 0 8px 25px rgba(0, 0, 0, 0.1); + border-color: var(--ifm-color-primary-lighter); +} + +.featureIcon { + font-size: 2rem; + width: 3rem; + height: 3rem; + display: flex; + align-items: center; + justify-content: center; + background: var(--ifm-color-primary-lightest); + border-radius: 50%; + flex-shrink: 0; +} + +.feature h4 { + margin: 0 0 0.5rem 0; + font-size: 1.1rem; + font-weight: 600; + color: var(--ifm-color-emphasis-800); +} + +.feature p { + margin: 0; + color: var(--ifm-color-emphasis-600); + line-height: 1.5; +} + +/* Community Section */ +.community { + padding: 3rem 0; + background: var(--ifm-color-gray-50); + border-top: 1px solid var(--ifm-color-gray-200); +} + +.communityContent { + text-align: center; + max-width: 600px; + margin: 0 auto; +} + +.communityLinks { + display: flex; + justify-content: center; + gap: 1rem; + margin-top: 2rem; +} + +.communityButton { + display: flex; + align-items: center; + gap: 0.5rem; + font-weight: 600; + transition: all 0.3s ease; +} + +.communityButton:hover { + transform: translateY(-2px); + box-shadow: 0 8px 25px rgba(0, 0, 0, 0.1); +} + +.communityIcon { + font-size: 1.2rem; +} + +/* Responsive Design */ +@media screen and (max-width: 996px) { + .heroBanner { + padding: 3rem 2rem; + } + + .heroTitle { + font-size: 2.2rem; + } + + .heroSubtitle { + font-size: 1rem; + } + + .buttons { + flex-direction: column; + gap: 1rem; + } + + .quickStart { + padding: 3rem 0; + } + + .sectionTitle { + font-size: 1.75rem; + } + + .communityLinks { + flex-direction: column; + align-items: center; + } + + .communityButton { + width: 200px; + justify-content: center; + } +} + +@media screen and (max-width: 768px) { + .heroLogo { + height: 40px; + } + + .heroTitle { + font-size: 1.8rem; + } + + .codeBlock { + padding: 1rem; + } + + .codeBlock code { + font-size: 0.8rem; + } + + .feature { + padding: 0.75rem; + } +} diff --git a/docs/static/src/pages/markdown-page.md b/docs/static/src/pages/markdown-page.md new file mode 100644 index 000000000..9756c5b66 --- /dev/null +++ b/docs/static/src/pages/markdown-page.md @@ -0,0 +1,7 @@ +--- +title: Markdown page example +--- + +# Markdown page example + +You don't need React to write simple standalone pages. From aebd728c816bf0b452b6c7d7bed8f8e910b1ba24 Mon Sep 17 00:00:00 2001 From: Alexey Rybak <50731695+reluctantfuturist@users.noreply.github.com> Date: Wed, 24 Sep 2025 14:11:30 -0700 Subject: [PATCH 142/150] docs: docusaurus setup (#3541) # What does this PR do? - Docusaurus server setup - Deprecates Sphinx build pipeline - Deprecates remaining references to Readthedocs - MDX compile errors and broken links to be addressed in follow-up PRs ## Test Plan ``` npm install npm gen-api-docs all npm run build ``` --- .github/workflows/README.md | 1 - .github/workflows/update-readthedocs.yml | 70 - .gitignore | 1 - .readthedocs.yaml | 25 - CONTRIBUTING.md | 14 +- docs/Makefile | 20 - docs/README.md | 11 +- docs/conftest.py | 24 - docs/contbuild.sh | 7 - docs/docs/contributing/index.mdx | 14 +- docs/docs/index.mdx | 14 +- docs/docusaurus.config.ts | 230 + docs/getting_started.ipynb | 2 +- docs/make.bat | 35 - .../Alpha_Llama_Stack_Post_Training.ipynb | 2 +- docs/package-lock.json | 22087 ++++++++++++++++ docs/package.json | 44 + docs/sidebars.ts | 342 + docs/src/components/HomepageFeatures/index.js | 64 + .../HomepageFeatures/styles.module.css | 11 + docs/src/css/custom.css | 191 + docs/src/pages/index.js | 163 + docs/src/pages/index.module.css | 283 + docs/src/pages/markdown-page.md | 7 + docs/tsconfig.json | 7 + 25 files changed, 23461 insertions(+), 208 deletions(-) delete mode 100644 .github/workflows/update-readthedocs.yml delete mode 100644 .readthedocs.yaml delete mode 100644 docs/Makefile delete mode 100644 docs/conftest.py delete mode 100644 docs/contbuild.sh create mode 100644 docs/docusaurus.config.ts delete mode 100644 docs/make.bat create mode 100644 docs/package-lock.json create mode 100644 docs/package.json create mode 100644 docs/sidebars.ts create mode 100644 docs/src/components/HomepageFeatures/index.js create mode 100644 docs/src/components/HomepageFeatures/styles.module.css create mode 100644 docs/src/css/custom.css create mode 100644 docs/src/pages/index.js create mode 100644 docs/src/pages/index.module.css create mode 100644 docs/src/pages/markdown-page.md create mode 100644 docs/tsconfig.json diff --git a/.github/workflows/README.md b/.github/workflows/README.md index 059bb873f..7c9d2bffd 100644 --- a/.github/workflows/README.md +++ b/.github/workflows/README.md @@ -21,4 +21,3 @@ Llama Stack uses GitHub Actions for Continuous Integration (CI). Below is a tabl | Test External API and Providers | [test-external.yml](test-external.yml) | Test the External API and Provider mechanisms | | UI Tests | [ui-unit-tests.yml](ui-unit-tests.yml) | Run the UI test suite | | Unit Tests | [unit-tests.yml](unit-tests.yml) | Run the unit test suite | -| Update ReadTheDocs | [update-readthedocs.yml](update-readthedocs.yml) | Update the Llama Stack ReadTheDocs site | diff --git a/.github/workflows/update-readthedocs.yml b/.github/workflows/update-readthedocs.yml deleted file mode 100644 index e12f0adf8..000000000 --- a/.github/workflows/update-readthedocs.yml +++ /dev/null @@ -1,70 +0,0 @@ -name: Update ReadTheDocs - -run-name: Update the Llama Stack ReadTheDocs site - -on: - workflow_dispatch: - inputs: - branch: - description: 'RTD version to update' - required: false - default: 'latest' - push: - branches: - - main - paths: - - 'docs/**' - - 'pyproject.toml' - - '.github/workflows/update-readthedocs.yml' - tags: - - '*' - pull_request: - branches: - - main - paths: - - 'docs/**' - - 'pyproject.toml' - - '.github/workflows/update-readthedocs.yml' - -concurrency: - group: ${{ github.workflow }}-${{ github.ref == 'refs/heads/main' && github.run_id || github.ref }} - cancel-in-progress: true - -jobs: - update-readthedocs: - runs-on: ubuntu-latest - env: - TOKEN: ${{ secrets.READTHEDOCS_TOKEN }} - steps: - - name: Checkout repository - uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0 - - - name: Install dependencies - uses: ./.github/actions/setup-runner - - - name: Build HTML - run: | - cd docs - uv run make html - - - name: Trigger ReadTheDocs build - if: github.event_name != 'pull_request' - run: | - if [ -z "$TOKEN" ]; then - echo "READTHEDOCS_TOKEN is not set" - exit 1 - fi - - response=$(curl -X POST \ - -H "Content-Type: application/json" \ - -d "{ - \"token\": \"$TOKEN\", - \"version\": \"$GITHUB_REF_NAME\" - }" \ - https://readthedocs.org/api/v2/webhook/llama-stack/289768/) - - echo "Response: $response" - if [ $(echo $response | jq -r '.build_triggered') != 'true' ]; then - echo "Failed to trigger ReadTheDocs build" - exit 1 - fi diff --git a/.gitignore b/.gitignore index b516d4dd9..ca210db9a 100644 --- a/.gitignore +++ b/.gitignore @@ -18,7 +18,6 @@ Package.resolved .venv/ .vscode _build -docs/src # Sample tool-calling datasets generated by NVIDIA notebooks docs/notebooks/nvidia/tool_calling/sample_data/ pyrightconfig.json diff --git a/.readthedocs.yaml b/.readthedocs.yaml deleted file mode 100644 index 461977a6c..000000000 --- a/.readthedocs.yaml +++ /dev/null @@ -1,25 +0,0 @@ -# .readthedocs.yaml -# Read the Docs configuration file -# See https://docs.readthedocs.io/en/stable/config-file/v2.html for details - -# Required -version: 2 - -# Build documentation in the "docs/" directory with Sphinx -sphinx: - configuration: docs/source/conf.py - -# Set the OS, Python version and other tools you might need -build: - os: ubuntu-22.04 - tools: - python: "3.12" - jobs: - pre_create_environment: - - asdf plugin add uv - - asdf install uv latest - - asdf global uv latest - create_environment: - - uv venv "${READTHEDOCS_VIRTUALENV_PATH}" - install: - - UV_PROJECT_ENVIRONMENT="${READTHEDOCS_VIRTUALENV_PATH}" uv sync --frozen --group docs diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 14690924d..da0ba5717 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -187,14 +187,16 @@ Note that the provider "description" field will be used to generate the provider ### Building the Documentation -If you are making changes to the documentation at [https://llamastack.github.io/latest/](https://llamastack.github.io/latest/), you can use the following command to build the documentation and preview your changes. You will need [Sphinx](https://www.sphinx-doc.org/en/master/) and the readthedocs theme. +If you are making changes to the documentation at [https://llamastack.github.io/](https://llamastack.github.io/), you can use the following command to build the documentation and preview your changes. ```bash -# This rebuilds the documentation pages. -uv run --group docs make -C docs/ html +# This rebuilds the documentation pages and the OpenAPI spec. +npm install +npm run gen-api-docs all +npm run build -# This will start a local server (usually at http://127.0.0.1:8000) that automatically rebuilds and refreshes when you make changes to the documentation. -uv run --group docs sphinx-autobuild docs/source docs/build/html --write-all +# This will start a local server (usually at http://127.0.0.1:3000). +npm run serve ``` ### Update API Documentation @@ -205,4 +207,4 @@ If you modify or add new API endpoints, update the API documentation accordingly uv run ./docs/openapi_generator/run_openapi_generator.sh ``` -The generated API documentation will be available in `docs/_static/`. Make sure to review the changes before committing. +The generated API schema will be available in `docs/static/`. Make sure to review the changes before committing. diff --git a/docs/Makefile b/docs/Makefile deleted file mode 100644 index 92dd33a1a..000000000 --- a/docs/Makefile +++ /dev/null @@ -1,20 +0,0 @@ -# Minimal makefile for Sphinx documentation -# - -# You can set these variables from the command line, and also -# from the environment for the first two. -SPHINXOPTS ?= -SPHINXBUILD ?= sphinx-build -SOURCEDIR = source -BUILDDIR = _build - -# Put it first so that "make" without argument is like "make help". -help: - @$(SPHINXBUILD) -M help "$(SOURCEDIR)" "$(BUILDDIR)" $(SPHINXOPTS) $(O) - -.PHONY: help Makefile - -# Catch-all target: route all unknown targets to Sphinx using the new -# "make mode" option. $(O) is meant as a shortcut for $(SPHINXOPTS). -%: Makefile - @$(SPHINXBUILD) -M $@ "$(SOURCEDIR)" "$(BUILDDIR)" $(SPHINXOPTS) $(O) diff --git a/docs/README.md b/docs/README.md index 2e03dd80b..1847e49d8 100644 --- a/docs/README.md +++ b/docs/README.md @@ -1,14 +1,17 @@ # Llama Stack Documentation -Here's a collection of comprehensive guides, examples, and resources for building AI applications with Llama Stack. For the complete documentation, visit our [Github page](https://llamastack.github.io/latest/getting_started/index.html). +Here's a collection of comprehensive guides, examples, and resources for building AI applications with Llama Stack. For the complete documentation, visit our [Github page](https://llamastack.github.io/getting_started/quickstart). ## Render locally -From the llama-stack root directory, run the following command to render the docs locally: +From the llama-stack `docs/` directory, run the following commands to render the docs locally: ```bash -uv run --group docs sphinx-autobuild docs/source docs/build/html --write-all +npm install +npm run gen-api-docs all +npm run build +npm run serve ``` -You can open up the docs in your browser at http://localhost:8000 +You can open up the docs in your browser at http://localhost:3000 ## Content diff --git a/docs/conftest.py b/docs/conftest.py deleted file mode 100644 index ab4d7e998..000000000 --- a/docs/conftest.py +++ /dev/null @@ -1,24 +0,0 @@ -# Copyright (c) Meta Platforms, Inc. and affiliates. -# All rights reserved. -# -# This source code is licensed under the terms described in the LICENSE file in -# the root directory of this source tree. - -import os -import time - - -def pytest_collection_modifyitems(items): - for item in items: - item.name = item.name.replace(' ', '_') - - -def pytest_runtest_teardown(item): - interval_seconds = os.getenv("LLAMA_STACK_TEST_INTERVAL_SECONDS") - if interval_seconds: - time.sleep(float(interval_seconds)) - - -def pytest_configure(config): - config.option.tbstyle = "short" - config.option.disable_warnings = True diff --git a/docs/contbuild.sh b/docs/contbuild.sh deleted file mode 100644 index c3687a3c8..000000000 --- a/docs/contbuild.sh +++ /dev/null @@ -1,7 +0,0 @@ -# Copyright (c) Meta Platforms, Inc. and affiliates. -# All rights reserved. -# -# This source code is licensed under the terms described in the LICENSE file in -# the root directory of this source tree. - -sphinx-autobuild --write-all source build/html --watch source/ diff --git a/docs/docs/contributing/index.mdx b/docs/docs/contributing/index.mdx index 8b3f86b03..7f50a058e 100644 --- a/docs/docs/contributing/index.mdx +++ b/docs/docs/contributing/index.mdx @@ -187,14 +187,16 @@ Note that the provider "description" field will be used to generate the provider ### Building the Documentation -If you are making changes to the documentation at [https://llamastack.github.io/latest/](https://llamastack.github.io/latest/), you can use the following command to build the documentation and preview your changes. You will need [Sphinx](https://www.sphinx-doc.org/en/master/) and the readthedocs theme. +If you are making changes to the documentation at [https://llamastack.github.io/](https://llamastack.github.io/), you can use the following command to build the documentation and preview your changes. ```bash -# This rebuilds the documentation pages. -uv run --group docs make -C docs/ html +# This rebuilds the documentation pages and the OpenAPI spec. +npm install +npm run gen-api-docs all +npm run build -# This will start a local server (usually at http://127.0.0.1:8000) that automatically rebuilds and refreshes when you make changes to the documentation. -uv run --group docs sphinx-autobuild docs/source docs/build/html --write-all +# This will start a local server (usually at http://127.0.0.1:3000). +npm run serve ``` ### Update API Documentation @@ -205,7 +207,7 @@ If you modify or add new API endpoints, update the API documentation accordingly uv run ./docs/openapi_generator/run_openapi_generator.sh ``` -The generated API documentation will be available in `docs/_static/`. Make sure to review the changes before committing. +The generated API schema will be available in `docs/static/`. Make sure to review the changes before committing. ## Adding a New Provider diff --git a/docs/docs/index.mdx b/docs/docs/index.mdx index 21e895d3f..bed931fe7 100644 --- a/docs/docs/index.mdx +++ b/docs/docs/index.mdx @@ -45,9 +45,9 @@ Llama Stack consists of a server (with multiple pluggable API providers) and Cli ## Quick Links -- Ready to build? Check out the [Getting Started Guide](https://llama-stack.readthedocs.io/en/latest/getting_started/index.html) to get started. -- Want to contribute? See the [Contributing Guide](https://github.com/meta-llama/llama-stack/blob/main/CONTRIBUTING.md). -- Explore [Example Applications](https://github.com/meta-llama/llama-stack-apps) built with Llama Stack. +- Ready to build? Check out the [Getting Started Guide](https://llama-stack.github.io/getting_started/quickstart) to get started. +- Want to contribute? See the [Contributing Guide](https://github.com/llamastack/llama-stack/blob/main/CONTRIBUTING.md). +- Explore [Example Applications](https://github.com/llamastack/llama-stack-apps) built with Llama Stack. ## Rich Ecosystem Support @@ -59,13 +59,13 @@ Llama Stack provides adapters for popular providers across all API categories: - **Training & Evaluation**: HuggingFace, TorchTune, NVIDIA NEMO :::info Provider Details -For complete provider compatibility and setup instructions, see our [Providers Documentation](https://llama-stack.readthedocs.io/en/latest/providers/index.html). +For complete provider compatibility and setup instructions, see our [Providers Documentation](https://llamastack.github.io/providers/). ::: ## Get Started Today
- 🚀 Quick Start Guide - 📚 Example Apps - NUL 2>NUL -if errorlevel 9009 ( - echo. - echo.The 'sphinx-build' command was not found. Make sure you have Sphinx - echo.installed, then set the SPHINXBUILD environment variable to point - echo.to the full path of the 'sphinx-build' executable. Alternatively you - echo.may add the Sphinx directory to PATH. - echo. - echo.If you don't have Sphinx installed, grab it from - echo.https://www.sphinx-doc.org/ - exit /b 1 -) - -if "%1" == "" goto help - -%SPHINXBUILD% -M %1 %SOURCEDIR% %BUILDDIR% %SPHINXOPTS% %O% -goto end - -:help -%SPHINXBUILD% -M help %SOURCEDIR% %BUILDDIR% %SPHINXOPTS% %O% - -:end -popd diff --git a/docs/notebooks/Alpha_Llama_Stack_Post_Training.ipynb b/docs/notebooks/Alpha_Llama_Stack_Post_Training.ipynb index 554dc5759..b5fe0d8d9 100644 --- a/docs/notebooks/Alpha_Llama_Stack_Post_Training.ipynb +++ b/docs/notebooks/Alpha_Llama_Stack_Post_Training.ipynb @@ -14,7 +14,7 @@ "We will also showcase how to leverage existing Llama stack [inference APIs](https://github.com/meta-llama/llama-stack/blob/main/llama_stack/apis/inference/inference.py) (ollama as provider) to get the new model's output and the [eval APIs](https://github.com/meta-llama/llama-stack/blob/main/llama_stack/apis/eval/eval.py) to help you better measure the new model performance. We hope the flywheel of post-training -> eval -> inference can greatly empower agentic apps development.\n", "\n", "\n", - "- Read more about Llama Stack: https://llamastack.github.io/latest/index.html\n", + "- Read more about Llama Stack: https://llamastack.github.io/\n", "- Read more about post training APIs definition: https://github.com/meta-llama/llama-stack/blob/main/llama_stack/apis/post_training/post_training.py\n", "\n", "\n", diff --git a/docs/package-lock.json b/docs/package-lock.json new file mode 100644 index 000000000..aa133c935 --- /dev/null +++ b/docs/package-lock.json @@ -0,0 +1,22087 @@ +{ + "name": "docusaurus-template-openapi-docs", + "version": "4.3.7", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "docusaurus-template-openapi-docs", + "version": "4.3.7", + "dependencies": { + "@docusaurus/core": "3.8.1", + "@docusaurus/preset-classic": "3.8.1", + "@easyops-cn/docusaurus-search-local": "^0.52.1", + "@mdx-js/react": "^3.0.0", + "clsx": "^2.0.0", + "docusaurus-plugin-openapi-docs": "4.3.7", + "docusaurus-theme-openapi-docs": "4.3.7", + "prism-react-renderer": "^2.3.0", + "react": "^19.0.0", + "react-dom": "^19.0.0" + } + }, + "node_modules/@algolia/abtesting": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/@algolia/abtesting/-/abtesting-1.3.0.tgz", + "integrity": "sha512-KqPVLdVNfoJzX5BKNGM9bsW8saHeyax8kmPFXul5gejrSPN3qss7PgsFH5mMem7oR8tvjvNkia97ljEYPYCN8Q==", + "license": "MIT", + "dependencies": { + "@algolia/client-common": "5.37.0", + "@algolia/requester-browser-xhr": "5.37.0", + "@algolia/requester-fetch": "5.37.0", + "@algolia/requester-node-http": "5.37.0" + }, + "engines": { + "node": ">= 14.0.0" + } + }, + "node_modules/@algolia/autocomplete-core": { + "version": "1.17.9", + "resolved": "https://registry.npmjs.org/@algolia/autocomplete-core/-/autocomplete-core-1.17.9.tgz", + "integrity": "sha512-O7BxrpLDPJWWHv/DLA9DRFWs+iY1uOJZkqUwjS5HSZAGcl0hIVCQ97LTLewiZmZ402JYUrun+8NqFP+hCknlbQ==", + "license": "MIT", + "dependencies": { + "@algolia/autocomplete-plugin-algolia-insights": "1.17.9", + "@algolia/autocomplete-shared": "1.17.9" + } + }, + "node_modules/@algolia/autocomplete-plugin-algolia-insights": { + "version": "1.17.9", + "resolved": "https://registry.npmjs.org/@algolia/autocomplete-plugin-algolia-insights/-/autocomplete-plugin-algolia-insights-1.17.9.tgz", + "integrity": "sha512-u1fEHkCbWF92DBeB/KHeMacsjsoI0wFhjZtlCq2ddZbAehshbZST6Hs0Avkc0s+4UyBGbMDnSuXHLuvRWK5iDQ==", + "license": "MIT", + "dependencies": { + "@algolia/autocomplete-shared": "1.17.9" + }, + "peerDependencies": { + "search-insights": ">= 1 < 3" + } + }, + "node_modules/@algolia/autocomplete-preset-algolia": { + "version": "1.17.9", + "resolved": "https://registry.npmjs.org/@algolia/autocomplete-preset-algolia/-/autocomplete-preset-algolia-1.17.9.tgz", + "integrity": "sha512-Na1OuceSJeg8j7ZWn5ssMu/Ax3amtOwk76u4h5J4eK2Nx2KB5qt0Z4cOapCsxot9VcEN11ADV5aUSlQF4RhGjQ==", + "license": "MIT", + "dependencies": { + "@algolia/autocomplete-shared": "1.17.9" + }, + "peerDependencies": { + "@algolia/client-search": ">= 4.9.1 < 6", + "algoliasearch": ">= 4.9.1 < 6" + } + }, + "node_modules/@algolia/autocomplete-shared": { + "version": "1.17.9", + "resolved": "https://registry.npmjs.org/@algolia/autocomplete-shared/-/autocomplete-shared-1.17.9.tgz", + "integrity": "sha512-iDf05JDQ7I0b7JEA/9IektxN/80a2MZ1ToohfmNS3rfeuQnIKI3IJlIafD0xu4StbtQTghx9T3Maa97ytkXenQ==", + "license": "MIT", + "peerDependencies": { + "@algolia/client-search": ">= 4.9.1 < 6", + "algoliasearch": ">= 4.9.1 < 6" + } + }, + "node_modules/@algolia/client-abtesting": { + "version": "5.37.0", + "resolved": "https://registry.npmjs.org/@algolia/client-abtesting/-/client-abtesting-5.37.0.tgz", + "integrity": "sha512-Dp2Zq+x9qQFnuiQhVe91EeaaPxWBhzwQ6QnznZQnH9C1/ei3dvtmAFfFeaTxM6FzfJXDLvVnaQagTYFTQz3R5g==", + "license": "MIT", + "dependencies": { + "@algolia/client-common": "5.37.0", + "@algolia/requester-browser-xhr": "5.37.0", + "@algolia/requester-fetch": "5.37.0", + "@algolia/requester-node-http": "5.37.0" + }, + "engines": { + "node": ">= 14.0.0" + } + }, + "node_modules/@algolia/client-analytics": { + "version": "5.37.0", + "resolved": "https://registry.npmjs.org/@algolia/client-analytics/-/client-analytics-5.37.0.tgz", + "integrity": "sha512-wyXODDOluKogTuZxRII6mtqhAq4+qUR3zIUJEKTiHLe8HMZFxfUEI4NO2qSu04noXZHbv/sRVdQQqzKh12SZuQ==", + "license": "MIT", + "dependencies": { + "@algolia/client-common": "5.37.0", + "@algolia/requester-browser-xhr": "5.37.0", + "@algolia/requester-fetch": "5.37.0", + "@algolia/requester-node-http": "5.37.0" + }, + "engines": { + "node": ">= 14.0.0" + } + }, + "node_modules/@algolia/client-common": { + "version": "5.37.0", + "resolved": "https://registry.npmjs.org/@algolia/client-common/-/client-common-5.37.0.tgz", + "integrity": "sha512-GylIFlPvLy9OMgFG8JkonIagv3zF+Dx3H401Uo2KpmfMVBBJiGfAb9oYfXtplpRMZnZPxF5FnkWaI/NpVJMC+g==", + "license": "MIT", + "engines": { + "node": ">= 14.0.0" + } + }, + "node_modules/@algolia/client-insights": { + "version": "5.37.0", + "resolved": "https://registry.npmjs.org/@algolia/client-insights/-/client-insights-5.37.0.tgz", + "integrity": "sha512-T63afO2O69XHKw2+F7mfRoIbmXWGzgpZxgOFAdP3fR4laid7pWBt20P4eJ+Zn23wXS5kC9P2K7Bo3+rVjqnYiw==", + "license": "MIT", + "dependencies": { + "@algolia/client-common": "5.37.0", + "@algolia/requester-browser-xhr": "5.37.0", + "@algolia/requester-fetch": "5.37.0", + "@algolia/requester-node-http": "5.37.0" + }, + "engines": { + "node": ">= 14.0.0" + } + }, + "node_modules/@algolia/client-personalization": { + "version": "5.37.0", + "resolved": "https://registry.npmjs.org/@algolia/client-personalization/-/client-personalization-5.37.0.tgz", + "integrity": "sha512-1zOIXM98O9zD8bYDCJiUJRC/qNUydGHK/zRK+WbLXrW1SqLFRXECsKZa5KoG166+o5q5upk96qguOtE8FTXDWQ==", + "license": "MIT", + "dependencies": { + "@algolia/client-common": "5.37.0", + "@algolia/requester-browser-xhr": "5.37.0", + "@algolia/requester-fetch": "5.37.0", + "@algolia/requester-node-http": "5.37.0" + }, + "engines": { + "node": ">= 14.0.0" + } + }, + "node_modules/@algolia/client-query-suggestions": { + "version": "5.37.0", + "resolved": "https://registry.npmjs.org/@algolia/client-query-suggestions/-/client-query-suggestions-5.37.0.tgz", + "integrity": "sha512-31Nr2xOLBCYVal+OMZn1rp1H4lPs1914Tfr3a34wU/nsWJ+TB3vWjfkUUuuYhWoWBEArwuRzt3YNLn0F/KRVkg==", + "license": "MIT", + "dependencies": { + "@algolia/client-common": "5.37.0", + "@algolia/requester-browser-xhr": "5.37.0", + "@algolia/requester-fetch": "5.37.0", + "@algolia/requester-node-http": "5.37.0" + }, + "engines": { + "node": ">= 14.0.0" + } + }, + "node_modules/@algolia/client-search": { + "version": "5.37.0", + "resolved": "https://registry.npmjs.org/@algolia/client-search/-/client-search-5.37.0.tgz", + "integrity": "sha512-DAFVUvEg+u7jUs6BZiVz9zdaUebYULPiQ4LM2R4n8Nujzyj7BZzGr2DCd85ip4p/cx7nAZWKM8pLcGtkTRTdsg==", + "license": "MIT", + "dependencies": { + "@algolia/client-common": "5.37.0", + "@algolia/requester-browser-xhr": "5.37.0", + "@algolia/requester-fetch": "5.37.0", + "@algolia/requester-node-http": "5.37.0" + }, + "engines": { + "node": ">= 14.0.0" + } + }, + "node_modules/@algolia/events": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/@algolia/events/-/events-4.0.1.tgz", + "integrity": "sha512-FQzvOCgoFXAbf5Y6mYozw2aj5KCJoA3m4heImceldzPSMbdyS4atVjJzXKMsfX3wnZTFYwkkt8/z8UesLHlSBQ==", + "license": "MIT" + }, + "node_modules/@algolia/ingestion": { + "version": "1.37.0", + "resolved": "https://registry.npmjs.org/@algolia/ingestion/-/ingestion-1.37.0.tgz", + "integrity": "sha512-pkCepBRRdcdd7dTLbFddnu886NyyxmhgqiRcHHaDunvX03Ij4WzvouWrQq7B7iYBjkMQrLS8wQqSP0REfA4W8g==", + "license": "MIT", + "dependencies": { + "@algolia/client-common": "5.37.0", + "@algolia/requester-browser-xhr": "5.37.0", + "@algolia/requester-fetch": "5.37.0", + "@algolia/requester-node-http": "5.37.0" + }, + "engines": { + "node": ">= 14.0.0" + } + }, + "node_modules/@algolia/monitoring": { + "version": "1.37.0", + "resolved": "https://registry.npmjs.org/@algolia/monitoring/-/monitoring-1.37.0.tgz", + "integrity": "sha512-fNw7pVdyZAAQQCJf1cc/ih4fwrRdQSgKwgor4gchsI/Q/ss9inmC6bl/69jvoRSzgZS9BX4elwHKdo0EfTli3w==", + "license": "MIT", + "dependencies": { + "@algolia/client-common": "5.37.0", + "@algolia/requester-browser-xhr": "5.37.0", + "@algolia/requester-fetch": "5.37.0", + "@algolia/requester-node-http": "5.37.0" + }, + "engines": { + "node": ">= 14.0.0" + } + }, + "node_modules/@algolia/recommend": { + "version": "5.37.0", + "resolved": "https://registry.npmjs.org/@algolia/recommend/-/recommend-5.37.0.tgz", + "integrity": "sha512-U+FL5gzN2ldx3TYfQO5OAta2TBuIdabEdFwD5UVfWPsZE5nvOKkc/6BBqP54Z/adW/34c5ZrvvZhlhNTZujJXQ==", + "license": "MIT", + "dependencies": { + "@algolia/client-common": "5.37.0", + "@algolia/requester-browser-xhr": "5.37.0", + "@algolia/requester-fetch": "5.37.0", + "@algolia/requester-node-http": "5.37.0" + }, + "engines": { + "node": ">= 14.0.0" + } + }, + "node_modules/@algolia/requester-browser-xhr": { + "version": "5.37.0", + "resolved": "https://registry.npmjs.org/@algolia/requester-browser-xhr/-/requester-browser-xhr-5.37.0.tgz", + "integrity": "sha512-Ao8GZo8WgWFABrU7iq+JAftXV0t+UcOtCDL4mzHHZ+rQeTTf1TZssr4d0vIuoqkVNnKt9iyZ7T4lQff4ydcTrw==", + "license": "MIT", + "dependencies": { + "@algolia/client-common": "5.37.0" + }, + "engines": { + "node": ">= 14.0.0" + } + }, + "node_modules/@algolia/requester-fetch": { + "version": "5.37.0", + "resolved": "https://registry.npmjs.org/@algolia/requester-fetch/-/requester-fetch-5.37.0.tgz", + "integrity": "sha512-H7OJOXrFg5dLcGJ22uxx8eiFId0aB9b0UBhoOi4SMSuDBe6vjJJ/LeZyY25zPaSvkXNBN3vAM+ad6M0h6ha3AA==", + "license": "MIT", + "dependencies": { + "@algolia/client-common": "5.37.0" + }, + "engines": { + "node": ">= 14.0.0" + } + }, + "node_modules/@algolia/requester-node-http": { + "version": "5.37.0", + "resolved": "https://registry.npmjs.org/@algolia/requester-node-http/-/requester-node-http-5.37.0.tgz", + "integrity": "sha512-npZ9aeag4SGTx677eqPL3rkSPlQrnzx/8wNrl1P7GpWq9w/eTmRbOq+wKrJ2r78idlY0MMgmY/mld2tq6dc44g==", + "license": "MIT", + "dependencies": { + "@algolia/client-common": "5.37.0" + }, + "engines": { + "node": ">= 14.0.0" + } + }, + "node_modules/@apidevtools/json-schema-ref-parser": { + "version": "11.9.3", + "resolved": "https://registry.npmjs.org/@apidevtools/json-schema-ref-parser/-/json-schema-ref-parser-11.9.3.tgz", + "integrity": "sha512-60vepv88RwcJtSHrD6MjIL6Ta3SOYbgfnkHb+ppAVK+o9mXprRtulx7VlRl3lN3bbvysAfCS7WMVfhUYemB0IQ==", + "license": "MIT", + "dependencies": { + "@jsdevtools/ono": "^7.1.3", + "@types/json-schema": "^7.0.15", + "js-yaml": "^4.1.0" + }, + "engines": { + "node": ">= 16" + }, + "funding": { + "url": "https://github.com/sponsors/philsturgeon" + } + }, + "node_modules/@babel/code-frame": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.27.1.tgz", + "integrity": "sha512-cjQ7ZlQ0Mv3b47hABuTevyTuYN4i+loJKGeV9flcCgIK37cCXRh+L1bd3iBHlynerhQ7BhCkn2BPbQUL+rGqFg==", + "license": "MIT", + "dependencies": { + "@babel/helper-validator-identifier": "^7.27.1", + "js-tokens": "^4.0.0", + "picocolors": "^1.1.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/compat-data": { + "version": "7.28.4", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.28.4.tgz", + "integrity": "sha512-YsmSKC29MJwf0gF8Rjjrg5LQCmyh+j/nD8/eP7f+BeoQTKYqs9RoWbjGOdy0+1Ekr68RJZMUOPVQaQisnIo4Rw==", + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/core": { + "version": "7.28.4", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.28.4.tgz", + "integrity": "sha512-2BCOP7TN8M+gVDj7/ht3hsaO/B/n5oDbiAyyvnRlNOs+u1o+JWNYTQrmpuNp1/Wq2gcFrI01JAW+paEKDMx/CA==", + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.27.1", + "@babel/generator": "^7.28.3", + "@babel/helper-compilation-targets": "^7.27.2", + "@babel/helper-module-transforms": "^7.28.3", + "@babel/helpers": "^7.28.4", + "@babel/parser": "^7.28.4", + "@babel/template": "^7.27.2", + "@babel/traverse": "^7.28.4", + "@babel/types": "^7.28.4", + "@jridgewell/remapping": "^2.3.5", + "convert-source-map": "^2.0.0", + "debug": "^4.1.0", + "gensync": "^1.0.0-beta.2", + "json5": "^2.2.3", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/babel" + } + }, + "node_modules/@babel/core/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/@babel/generator": { + "version": "7.28.3", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.28.3.tgz", + "integrity": "sha512-3lSpxGgvnmZznmBkCRnVREPUFJv2wrv9iAoFDvADJc0ypmdOxdUtcLeBgBJ6zE0PMeTKnxeQzyk0xTBq4Ep7zw==", + "license": "MIT", + "dependencies": { + "@babel/parser": "^7.28.3", + "@babel/types": "^7.28.2", + "@jridgewell/gen-mapping": "^0.3.12", + "@jridgewell/trace-mapping": "^0.3.28", + "jsesc": "^3.0.2" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-annotate-as-pure": { + "version": "7.27.3", + "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.27.3.tgz", + "integrity": "sha512-fXSwMQqitTGeHLBC08Eq5yXz2m37E4pJX1qAU1+2cNedz/ifv/bVXft90VeSav5nFO61EcNgwr0aJxbyPaWBPg==", + "license": "MIT", + "dependencies": { + "@babel/types": "^7.27.3" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-compilation-targets": { + "version": "7.27.2", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.27.2.tgz", + "integrity": "sha512-2+1thGUUWWjLTYTHZWK1n8Yga0ijBz1XAhUXcKy81rd5g6yh7hGqMp45v7cadSbEHc9G3OTv45SyneRN3ps4DQ==", + "license": "MIT", + "dependencies": { + "@babel/compat-data": "^7.27.2", + "@babel/helper-validator-option": "^7.27.1", + "browserslist": "^4.24.0", + "lru-cache": "^5.1.1", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-compilation-targets/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/@babel/helper-create-class-features-plugin": { + "version": "7.28.3", + "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.28.3.tgz", + "integrity": "sha512-V9f6ZFIYSLNEbuGA/92uOvYsGCJNsuA8ESZ4ldc09bWk/j8H8TKiPw8Mk1eG6olpnO0ALHJmYfZvF4MEE4gajg==", + "license": "MIT", + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.27.3", + "@babel/helper-member-expression-to-functions": "^7.27.1", + "@babel/helper-optimise-call-expression": "^7.27.1", + "@babel/helper-replace-supers": "^7.27.1", + "@babel/helper-skip-transparent-expression-wrappers": "^7.27.1", + "@babel/traverse": "^7.28.3", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-create-class-features-plugin/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/@babel/helper-create-regexp-features-plugin": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.27.1.tgz", + "integrity": "sha512-uVDC72XVf8UbrH5qQTc18Agb8emwjTiZrQE11Nv3CuBEZmVvTwwE9CBUEvHku06gQCAyYf8Nv6ja1IN+6LMbxQ==", + "license": "MIT", + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.27.1", + "regexpu-core": "^6.2.0", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-create-regexp-features-plugin/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/@babel/helper-define-polyfill-provider": { + "version": "0.6.5", + "resolved": "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.6.5.tgz", + "integrity": "sha512-uJnGFcPsWQK8fvjgGP5LZUZZsYGIoPeRjSF5PGwrelYgq7Q15/Ft9NGFp1zglwgIv//W0uG4BevRuSJRyylZPg==", + "license": "MIT", + "dependencies": { + "@babel/helper-compilation-targets": "^7.27.2", + "@babel/helper-plugin-utils": "^7.27.1", + "debug": "^4.4.1", + "lodash.debounce": "^4.0.8", + "resolve": "^1.22.10" + }, + "peerDependencies": { + "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" + } + }, + "node_modules/@babel/helper-globals": { + "version": "7.28.0", + "resolved": "https://registry.npmjs.org/@babel/helper-globals/-/helper-globals-7.28.0.tgz", + "integrity": "sha512-+W6cISkXFa1jXsDEdYA8HeevQT/FULhxzR99pxphltZcVaugps53THCeiWA8SguxxpSp3gKPiuYfSWopkLQ4hw==", + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-member-expression-to-functions": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.27.1.tgz", + "integrity": "sha512-E5chM8eWjTp/aNoVpcbfM7mLxu9XGLWYise2eBKGQomAk/Mb4XoxyqXTZbuTohbsl8EKqdlMhnDI2CCLfcs9wA==", + "license": "MIT", + "dependencies": { + "@babel/traverse": "^7.27.1", + "@babel/types": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-imports": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.27.1.tgz", + "integrity": "sha512-0gSFWUPNXNopqtIPQvlD5WgXYI5GY2kP2cCvoT8kczjbfcfuIljTbcWrulD1CIPIX2gt1wghbDy08yE1p+/r3w==", + "license": "MIT", + "dependencies": { + "@babel/traverse": "^7.27.1", + "@babel/types": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-transforms": { + "version": "7.28.3", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.28.3.tgz", + "integrity": "sha512-gytXUbs8k2sXS9PnQptz5o0QnpLL51SwASIORY6XaBKF88nsOT0Zw9szLqlSGQDP/4TljBAD5y98p2U1fqkdsw==", + "license": "MIT", + "dependencies": { + "@babel/helper-module-imports": "^7.27.1", + "@babel/helper-validator-identifier": "^7.27.1", + "@babel/traverse": "^7.28.3" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-optimise-call-expression": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.27.1.tgz", + "integrity": "sha512-URMGH08NzYFhubNSGJrpUEphGKQwMQYBySzat5cAByY1/YgIRkULnIy3tAMeszlL/so2HbeilYloUmSpd7GdVw==", + "license": "MIT", + "dependencies": { + "@babel/types": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-plugin-utils": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.27.1.tgz", + "integrity": "sha512-1gn1Up5YXka3YYAHGKpbideQ5Yjf1tDa9qYcgysz+cNCXukyLl6DjPXhD3VRwSb8c0J9tA4b2+rHEZtc6R0tlw==", + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-remap-async-to-generator": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.27.1.tgz", + "integrity": "sha512-7fiA521aVw8lSPeI4ZOD3vRFkoqkJcS+z4hFo82bFSH/2tNd6eJ5qCVMS5OzDmZh/kaHQeBaeyxK6wljcPtveA==", + "license": "MIT", + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.27.1", + "@babel/helper-wrap-function": "^7.27.1", + "@babel/traverse": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-replace-supers": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.27.1.tgz", + "integrity": "sha512-7EHz6qDZc8RYS5ElPoShMheWvEgERonFCs7IAonWLLUTXW59DP14bCZt89/GKyreYn8g3S83m21FelHKbeDCKA==", + "license": "MIT", + "dependencies": { + "@babel/helper-member-expression-to-functions": "^7.27.1", + "@babel/helper-optimise-call-expression": "^7.27.1", + "@babel/traverse": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-skip-transparent-expression-wrappers": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.27.1.tgz", + "integrity": "sha512-Tub4ZKEXqbPjXgWLl2+3JpQAYBJ8+ikpQ2Ocj/q/r0LwE3UhENh7EUabyHjz2kCEsrRY83ew2DQdHluuiDQFzg==", + "license": "MIT", + "dependencies": { + "@babel/traverse": "^7.27.1", + "@babel/types": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-string-parser": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.27.1.tgz", + "integrity": "sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA==", + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-identifier": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.27.1.tgz", + "integrity": "sha512-D2hP9eA+Sqx1kBZgzxZh0y1trbuU+JoDkiEwqhQ36nodYqJwyEIhPSdMNd7lOm/4io72luTPWH20Yda0xOuUow==", + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-option": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.27.1.tgz", + "integrity": "sha512-YvjJow9FxbhFFKDSuFnVCe2WxXk1zWc22fFePVNEaWJEu8IrZVlda6N0uHwzZrUM1il7NC9Mlp4MaJYbYd9JSg==", + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-wrap-function": { + "version": "7.28.3", + "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.28.3.tgz", + "integrity": "sha512-zdf983tNfLZFletc0RRXYrHrucBEg95NIFMkn6K9dbeMYnsgHaSBGcQqdsCSStG2PYwRre0Qc2NNSCXbG+xc6g==", + "license": "MIT", + "dependencies": { + "@babel/template": "^7.27.2", + "@babel/traverse": "^7.28.3", + "@babel/types": "^7.28.2" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helpers": { + "version": "7.28.4", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.28.4.tgz", + "integrity": "sha512-HFN59MmQXGHVyYadKLVumYsA9dBFun/ldYxipEjzA4196jpLZd8UjEEBLkbEkvfYreDqJhZxYAWFPtrfhNpj4w==", + "license": "MIT", + "dependencies": { + "@babel/template": "^7.27.2", + "@babel/types": "^7.28.4" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/parser": { + "version": "7.28.4", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.28.4.tgz", + "integrity": "sha512-yZbBqeM6TkpP9du/I2pUZnJsRMGGvOuIrhjzC1AwHwW+6he4mni6Bp/m8ijn0iOuZuPI2BfkCoSRunpyjnrQKg==", + "license": "MIT", + "dependencies": { + "@babel/types": "^7.28.4" + }, + "bin": { + "parser": "bin/babel-parser.js" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@babel/plugin-bugfix-firefox-class-in-computed-class-key": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-firefox-class-in-computed-class-key/-/plugin-bugfix-firefox-class-in-computed-class-key-7.27.1.tgz", + "integrity": "sha512-QPG3C9cCVRQLxAVwmefEmwdTanECuUBMQZ/ym5kiw3XKCGA7qkuQLcjWWHcrD/GKbn/WmJwaezfuuAOcyKlRPA==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/traverse": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/plugin-bugfix-safari-class-field-initializer-scope": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-safari-class-field-initializer-scope/-/plugin-bugfix-safari-class-field-initializer-scope-7.27.1.tgz", + "integrity": "sha512-qNeq3bCKnGgLkEXUuFry6dPlGfCdQNZbn7yUAPCInwAJHMU7THJfrBSozkcWq5sNM6RcF3S8XyQL2A52KNR9IA==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.27.1.tgz", + "integrity": "sha512-g4L7OYun04N1WyqMNjldFwlfPCLVkgB54A/YCXICZYBsvJJE3kByKv9c9+R/nAfmIfjl2rKYLNyMHboYbZaWaA==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.27.1.tgz", + "integrity": "sha512-oO02gcONcD5O1iTLi/6frMJBIwWEHceWGSGqrpCmEL8nogiS6J9PBlE48CaK20/Jx1LuRml9aDftLgdjXT8+Cw==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/helper-skip-transparent-expression-wrappers": "^7.27.1", + "@babel/plugin-transform-optional-chaining": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.13.0" + } + }, + "node_modules/@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly": { + "version": "7.28.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly/-/plugin-bugfix-v8-static-class-fields-redefine-readonly-7.28.3.tgz", + "integrity": "sha512-b6YTX108evsvE4YgWyQ921ZAFFQm3Bn+CA3+ZXlNVnPhx+UfsVURoPjfGAPCjBgrqo30yX/C2nZGX96DxvR9Iw==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/traverse": "^7.28.3" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/plugin-proposal-private-property-in-object": { + "version": "7.21.0-placeholder-for-preset-env.2", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.21.0-placeholder-for-preset-env.2.tgz", + "integrity": "sha512-SOSkfJDddaM7mak6cPEpswyTRnuRltl429hMraQEglW+OkovnCzsiszTmsrlY//qLFjCpQDFRvjdm2wA5pPm9w==", + "license": "MIT", + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-dynamic-import": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-dynamic-import/-/plugin-syntax-dynamic-import-7.8.3.tgz", + "integrity": "sha512-5gdGbFon+PszYzqs83S3E5mpi7/y/8M9eC90MRTZfduQOYW76ig6SOSPNe41IG5LoP3FGBn2N0RjVDSQiS94kQ==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-import-assertions": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-assertions/-/plugin-syntax-import-assertions-7.27.1.tgz", + "integrity": "sha512-UT/Jrhw57xg4ILHLFnzFpPDlMbcdEicaAtjPQpbj9wa8T4r5KVWCimHcL/460g8Ht0DMxDyjsLgiWSkVjnwPFg==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-import-attributes": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-attributes/-/plugin-syntax-import-attributes-7.27.1.tgz", + "integrity": "sha512-oFT0FrKHgF53f4vOsZGi2Hh3I35PfSmVs4IBFLFj4dnafP+hIWDLg3VyKmUHfLoLHlyxY4C7DGtmHuJgn+IGww==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-jsx": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.27.1.tgz", + "integrity": "sha512-y8YTNIeKoyhGd9O0Jiyzyyqk8gdjnumGTQPsz0xOZOQ2RmkVJeZ1vmmfIvFEKqucBG6axJGBZDE/7iI5suUI/w==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-typescript": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.27.1.tgz", + "integrity": "sha512-xfYCBMxveHrRMnAWl1ZlPXOZjzkN82THFvLhQhFXFt81Z5HnN+EtUkZhv/zcKpmT3fzmWZB0ywiBrbC3vogbwQ==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-unicode-sets-regex": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-unicode-sets-regex/-/plugin-syntax-unicode-sets-regex-7.18.6.tgz", + "integrity": "sha512-727YkEAPwSIQTv5im8QHz3upqp92JTWhidIC81Tdx4VJYIte/VndKf1qKrfnnhPLiPghStWfvC/iFaMCQu7Nqg==", + "license": "MIT", + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.18.6", + "@babel/helper-plugin-utils": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/plugin-transform-arrow-functions": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.27.1.tgz", + "integrity": "sha512-8Z4TGic6xW70FKThA5HYEKKyBpOOsucTOD1DjU3fZxDg+K3zBJcXMFnt/4yQiZnf5+MiOMSXQ9PaEK/Ilh1DeA==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-async-generator-functions": { + "version": "7.28.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-generator-functions/-/plugin-transform-async-generator-functions-7.28.0.tgz", + "integrity": "sha512-BEOdvX4+M765icNPZeidyADIvQ1m1gmunXufXxvRESy/jNNyfovIqUyE7MVgGBjWktCoJlzvFA1To2O4ymIO3Q==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/helper-remap-async-to-generator": "^7.27.1", + "@babel/traverse": "^7.28.0" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-async-to-generator": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.27.1.tgz", + "integrity": "sha512-NREkZsZVJS4xmTr8qzE5y8AfIPqsdQfRuUiLRTEzb7Qii8iFWCyDKaUV2c0rCuh4ljDZ98ALHP/PetiBV2nddA==", + "license": "MIT", + "dependencies": { + "@babel/helper-module-imports": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/helper-remap-async-to-generator": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-block-scoped-functions": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.27.1.tgz", + "integrity": "sha512-cnqkuOtZLapWYZUYM5rVIdv1nXYuFVIltZ6ZJ7nIj585QsjKM5dhL2Fu/lICXZ1OyIAFc7Qy+bvDAtTXqGrlhg==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-block-scoping": { + "version": "7.28.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.28.4.tgz", + "integrity": "sha512-1yxmvN0MJHOhPVmAsmoW5liWwoILobu/d/ShymZmj867bAdxGbehIrew1DuLpw2Ukv+qDSSPQdYW1dLNE7t11A==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-class-properties": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-properties/-/plugin-transform-class-properties-7.27.1.tgz", + "integrity": "sha512-D0VcalChDMtuRvJIu3U/fwWjf8ZMykz5iZsg77Nuj821vCKI3zCyRLwRdWbsuJ/uRwZhZ002QtCqIkwC/ZkvbA==", + "license": "MIT", + "dependencies": { + "@babel/helper-create-class-features-plugin": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-class-static-block": { + "version": "7.28.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-static-block/-/plugin-transform-class-static-block-7.28.3.tgz", + "integrity": "sha512-LtPXlBbRoc4Njl/oh1CeD/3jC+atytbnf/UqLoqTDcEYGUPj022+rvfkbDYieUrSj3CaV4yHDByPE+T2HwfsJg==", + "license": "MIT", + "dependencies": { + "@babel/helper-create-class-features-plugin": "^7.28.3", + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.12.0" + } + }, + "node_modules/@babel/plugin-transform-classes": { + "version": "7.28.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.28.4.tgz", + "integrity": "sha512-cFOlhIYPBv/iBoc+KS3M6et2XPtbT2HiCRfBXWtfpc9OAyostldxIf9YAYB6ypURBBbx+Qv6nyrLzASfJe+hBA==", + "license": "MIT", + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.27.3", + "@babel/helper-compilation-targets": "^7.27.2", + "@babel/helper-globals": "^7.28.0", + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/helper-replace-supers": "^7.27.1", + "@babel/traverse": "^7.28.4" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-computed-properties": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.27.1.tgz", + "integrity": "sha512-lj9PGWvMTVksbWiDT2tW68zGS/cyo4AkZ/QTp0sQT0mjPopCmrSkzxeXkznjqBxzDI6TclZhOJbBmbBLjuOZUw==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/template": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-destructuring": { + "version": "7.28.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.28.0.tgz", + "integrity": "sha512-v1nrSMBiKcodhsyJ4Gf+Z0U/yawmJDBOTpEB3mcQY52r9RIyPneGyAS/yM6seP/8I+mWI3elOMtT5dB8GJVs+A==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/traverse": "^7.28.0" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-dotall-regex": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.27.1.tgz", + "integrity": "sha512-gEbkDVGRvjj7+T1ivxrfgygpT7GUd4vmODtYpbs0gZATdkX8/iSnOtZSxiZnsgm1YjTgjI6VKBGSJJevkrclzw==", + "license": "MIT", + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-duplicate-keys": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.27.1.tgz", + "integrity": "sha512-MTyJk98sHvSs+cvZ4nOauwTTG1JeonDjSGvGGUNHreGQns+Mpt6WX/dVzWBHgg+dYZhkC4X+zTDfkTU+Vy9y7Q==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-duplicate-named-capturing-groups-regex": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-named-capturing-groups-regex/-/plugin-transform-duplicate-named-capturing-groups-regex-7.27.1.tgz", + "integrity": "sha512-hkGcueTEzuhB30B3eJCbCYeCaaEQOmQR0AdvzpD4LoN0GXMWzzGSuRrxR2xTnCrvNbVwK9N6/jQ92GSLfiZWoQ==", + "license": "MIT", + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/plugin-transform-dynamic-import": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dynamic-import/-/plugin-transform-dynamic-import-7.27.1.tgz", + "integrity": "sha512-MHzkWQcEmjzzVW9j2q8LGjwGWpG2mjwaaB0BNQwst3FIjqsg8Ct/mIZlvSPJvfi9y2AC8mi/ktxbFVL9pZ1I4A==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-explicit-resource-management": { + "version": "7.28.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-explicit-resource-management/-/plugin-transform-explicit-resource-management-7.28.0.tgz", + "integrity": "sha512-K8nhUcn3f6iB+P3gwCv/no7OdzOZQcKchW6N389V6PD8NUWKZHzndOd9sPDVbMoBsbmjMqlB4L9fm+fEFNVlwQ==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/plugin-transform-destructuring": "^7.28.0" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-exponentiation-operator": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.27.1.tgz", + "integrity": "sha512-uspvXnhHvGKf2r4VVtBpeFnuDWsJLQ6MF6lGJLC89jBR1uoVeqM416AZtTuhTezOfgHicpJQmoD5YUakO/YmXQ==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-export-namespace-from": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-export-namespace-from/-/plugin-transform-export-namespace-from-7.27.1.tgz", + "integrity": "sha512-tQvHWSZ3/jH2xuq/vZDy0jNn+ZdXJeM8gHvX4lnJmsc3+50yPlWdZXIc5ay+umX+2/tJIqHqiEqcJvxlmIvRvQ==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-for-of": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.27.1.tgz", + "integrity": "sha512-BfbWFFEJFQzLCQ5N8VocnCtA8J1CLkNTe2Ms2wocj75dd6VpiqS5Z5quTYcUoo4Yq+DN0rtikODccuv7RU81sw==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/helper-skip-transparent-expression-wrappers": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-function-name": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.27.1.tgz", + "integrity": "sha512-1bQeydJF9Nr1eBCMMbC+hdwmRlsv5XYOMu03YSWFwNs0HsAmtSxxF1fyuYPqemVldVyFmlCU7w8UE14LupUSZQ==", + "license": "MIT", + "dependencies": { + "@babel/helper-compilation-targets": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/traverse": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-json-strings": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-json-strings/-/plugin-transform-json-strings-7.27.1.tgz", + "integrity": "sha512-6WVLVJiTjqcQauBhn1LkICsR2H+zm62I3h9faTDKt1qP4jn2o72tSvqMwtGFKGTpojce0gJs+76eZ2uCHRZh0Q==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-literals": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.27.1.tgz", + "integrity": "sha512-0HCFSepIpLTkLcsi86GG3mTUzxV5jpmbv97hTETW3yzrAij8aqlD36toB1D0daVFJM8NK6GvKO0gslVQmm+zZA==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-logical-assignment-operators": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-logical-assignment-operators/-/plugin-transform-logical-assignment-operators-7.27.1.tgz", + "integrity": "sha512-SJvDs5dXxiae4FbSL1aBJlG4wvl594N6YEVVn9e3JGulwioy6z3oPjx/sQBO3Y4NwUu5HNix6KJ3wBZoewcdbw==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-member-expression-literals": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.27.1.tgz", + "integrity": "sha512-hqoBX4dcZ1I33jCSWcXrP+1Ku7kdqXf1oeah7ooKOIiAdKQ+uqftgCFNOSzA5AMS2XIHEYeGFg4cKRCdpxzVOQ==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-modules-amd": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.27.1.tgz", + "integrity": "sha512-iCsytMg/N9/oFq6n+gFTvUYDZQOMK5kEdeYxmxt91fcJGycfxVP9CnrxoliM0oumFERba2i8ZtwRUCMhvP1LnA==", + "license": "MIT", + "dependencies": { + "@babel/helper-module-transforms": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-modules-commonjs": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.27.1.tgz", + "integrity": "sha512-OJguuwlTYlN0gBZFRPqwOGNWssZjfIUdS7HMYtN8c1KmwpwHFBwTeFZrg9XZa+DFTitWOW5iTAG7tyCUPsCCyw==", + "license": "MIT", + "dependencies": { + "@babel/helper-module-transforms": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-modules-systemjs": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.27.1.tgz", + "integrity": "sha512-w5N1XzsRbc0PQStASMksmUeqECuzKuTJer7kFagK8AXgpCMkeDMO5S+aaFb7A51ZYDF7XI34qsTX+fkHiIm5yA==", + "license": "MIT", + "dependencies": { + "@babel/helper-module-transforms": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/helper-validator-identifier": "^7.27.1", + "@babel/traverse": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-modules-umd": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.27.1.tgz", + "integrity": "sha512-iQBE/xC5BV1OxJbp6WG7jq9IWiD+xxlZhLrdwpPkTX3ydmXdvoCpyfJN7acaIBZaOqTfr76pgzqBJflNbeRK+w==", + "license": "MIT", + "dependencies": { + "@babel/helper-module-transforms": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-named-capturing-groups-regex": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.27.1.tgz", + "integrity": "sha512-SstR5JYy8ddZvD6MhV0tM/j16Qds4mIpJTOd1Yu9J9pJjH93bxHECF7pgtc28XvkzTD6Pxcm/0Z73Hvk7kb3Ng==", + "license": "MIT", + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/plugin-transform-new-target": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.27.1.tgz", + "integrity": "sha512-f6PiYeqXQ05lYq3TIfIDu/MtliKUbNwkGApPUvyo6+tc7uaR4cPjPe7DFPr15Uyycg2lZU6btZ575CuQoYh7MQ==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-nullish-coalescing-operator": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-nullish-coalescing-operator/-/plugin-transform-nullish-coalescing-operator-7.27.1.tgz", + "integrity": "sha512-aGZh6xMo6q9vq1JGcw58lZ1Z0+i0xB2x0XaauNIUXd6O1xXc3RwoWEBlsTQrY4KQ9Jf0s5rgD6SiNkaUdJegTA==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-numeric-separator": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-numeric-separator/-/plugin-transform-numeric-separator-7.27.1.tgz", + "integrity": "sha512-fdPKAcujuvEChxDBJ5c+0BTaS6revLV7CJL08e4m3de8qJfNIuCc2nc7XJYOjBoTMJeqSmwXJ0ypE14RCjLwaw==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-object-rest-spread": { + "version": "7.28.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-rest-spread/-/plugin-transform-object-rest-spread-7.28.4.tgz", + "integrity": "sha512-373KA2HQzKhQCYiRVIRr+3MjpCObqzDlyrM6u4I201wL8Mp2wHf7uB8GhDwis03k2ti8Zr65Zyyqs1xOxUF/Ew==", + "license": "MIT", + "dependencies": { + "@babel/helper-compilation-targets": "^7.27.2", + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/plugin-transform-destructuring": "^7.28.0", + "@babel/plugin-transform-parameters": "^7.27.7", + "@babel/traverse": "^7.28.4" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-object-super": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.27.1.tgz", + "integrity": "sha512-SFy8S9plRPbIcxlJ8A6mT/CxFdJx/c04JEctz4jf8YZaVS2px34j7NXRrlGlHkN/M2gnpL37ZpGRGVFLd3l8Ng==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/helper-replace-supers": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-optional-catch-binding": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-catch-binding/-/plugin-transform-optional-catch-binding-7.27.1.tgz", + "integrity": "sha512-txEAEKzYrHEX4xSZN4kJ+OfKXFVSWKB2ZxM9dpcE3wT7smwkNmXo5ORRlVzMVdJbD+Q8ILTgSD7959uj+3Dm3Q==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-optional-chaining": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-chaining/-/plugin-transform-optional-chaining-7.27.1.tgz", + "integrity": "sha512-BQmKPPIuc8EkZgNKsv0X4bPmOoayeu4F1YCwx2/CfmDSXDbp7GnzlUH+/ul5VGfRg1AoFPsrIThlEBj2xb4CAg==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/helper-skip-transparent-expression-wrappers": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-parameters": { + "version": "7.27.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.27.7.tgz", + "integrity": "sha512-qBkYTYCb76RRxUM6CcZA5KRu8K4SM8ajzVeUgVdMVO9NN9uI/GaVmBg/WKJJGnNokV9SY8FxNOVWGXzqzUidBg==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-private-methods": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-methods/-/plugin-transform-private-methods-7.27.1.tgz", + "integrity": "sha512-10FVt+X55AjRAYI9BrdISN9/AQWHqldOeZDUoLyif1Kn05a56xVBXb8ZouL8pZ9jem8QpXaOt8TS7RHUIS+GPA==", + "license": "MIT", + "dependencies": { + "@babel/helper-create-class-features-plugin": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-private-property-in-object": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-property-in-object/-/plugin-transform-private-property-in-object-7.27.1.tgz", + "integrity": "sha512-5J+IhqTi1XPa0DXF83jYOaARrX+41gOewWbkPyjMNRDqgOCqdffGh8L3f/Ek5utaEBZExjSAzcyjmV9SSAWObQ==", + "license": "MIT", + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.27.1", + "@babel/helper-create-class-features-plugin": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-property-literals": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.27.1.tgz", + "integrity": "sha512-oThy3BCuCha8kDZ8ZkgOg2exvPYUlprMukKQXI1r1pJ47NCvxfkEy8vK+r/hT9nF0Aa4H1WUPZZjHTFtAhGfmQ==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-react-constant-elements": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-constant-elements/-/plugin-transform-react-constant-elements-7.27.1.tgz", + "integrity": "sha512-edoidOjl/ZxvYo4lSBOQGDSyToYVkTAwyVoa2tkuYTSmjrB1+uAedoL5iROVLXkxH+vRgA7uP4tMg2pUJpZ3Ug==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-react-display-name": { + "version": "7.28.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-display-name/-/plugin-transform-react-display-name-7.28.0.tgz", + "integrity": "sha512-D6Eujc2zMxKjfa4Zxl4GHMsmhKKZ9VpcqIchJLvwTxad9zWIYulwYItBovpDOoNLISpcZSXoDJ5gaGbQUDqViA==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-react-jsx": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.27.1.tgz", + "integrity": "sha512-2KH4LWGSrJIkVf5tSiBFYuXDAoWRq2MMwgivCf+93dd0GQi8RXLjKA/0EvRnVV5G0hrHczsquXuD01L8s6dmBw==", + "license": "MIT", + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.27.1", + "@babel/helper-module-imports": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/plugin-syntax-jsx": "^7.27.1", + "@babel/types": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-react-jsx-development": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-development/-/plugin-transform-react-jsx-development-7.27.1.tgz", + "integrity": "sha512-ykDdF5yI4f1WrAolLqeF3hmYU12j9ntLQl/AOG1HAS21jxyg1Q0/J/tpREuYLfatGdGmXp/3yS0ZA76kOlVq9Q==", + "license": "MIT", + "dependencies": { + "@babel/plugin-transform-react-jsx": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-react-pure-annotations": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-pure-annotations/-/plugin-transform-react-pure-annotations-7.27.1.tgz", + "integrity": "sha512-JfuinvDOsD9FVMTHpzA/pBLisxpv1aSf+OIV8lgH3MuWrks19R27e6a6DipIg4aX1Zm9Wpb04p8wljfKrVSnPA==", + "license": "MIT", + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-regenerator": { + "version": "7.28.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.28.4.tgz", + "integrity": "sha512-+ZEdQlBoRg9m2NnzvEeLgtvBMO4tkFBw5SQIUgLICgTrumLoU7lr+Oghi6km2PFj+dbUt2u1oby2w3BDO9YQnA==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-regexp-modifiers": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regexp-modifiers/-/plugin-transform-regexp-modifiers-7.27.1.tgz", + "integrity": "sha512-TtEciroaiODtXvLZv4rmfMhkCv8jx3wgKpL68PuiPh2M4fvz5jhsA7697N1gMvkvr/JTF13DrFYyEbY9U7cVPA==", + "license": "MIT", + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/plugin-transform-reserved-words": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.27.1.tgz", + "integrity": "sha512-V2ABPHIJX4kC7HegLkYoDpfg9PVmuWy/i6vUM5eGK22bx4YVFD3M5F0QQnWQoDs6AGsUWTVOopBiMFQgHaSkVw==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-runtime": { + "version": "7.28.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.28.3.tgz", + "integrity": "sha512-Y6ab1kGqZ0u42Zv/4a7l0l72n9DKP/MKoKWaUSBylrhNZO2prYuqFOLbn5aW5SIFXwSH93yfjbgllL8lxuGKLg==", + "license": "MIT", + "dependencies": { + "@babel/helper-module-imports": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1", + "babel-plugin-polyfill-corejs2": "^0.4.14", + "babel-plugin-polyfill-corejs3": "^0.13.0", + "babel-plugin-polyfill-regenerator": "^0.6.5", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-runtime/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/@babel/plugin-transform-shorthand-properties": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.27.1.tgz", + "integrity": "sha512-N/wH1vcn4oYawbJ13Y/FxcQrWk63jhfNa7jef0ih7PHSIHX2LB7GWE1rkPrOnka9kwMxb6hMl19p7lidA+EHmQ==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-spread": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.27.1.tgz", + "integrity": "sha512-kpb3HUqaILBJcRFVhFUs6Trdd4mkrzcGXss+6/mxUd273PfbWqSDHRzMT2234gIg2QYfAjvXLSquP1xECSg09Q==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/helper-skip-transparent-expression-wrappers": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-sticky-regex": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.27.1.tgz", + "integrity": "sha512-lhInBO5bi/Kowe2/aLdBAawijx+q1pQzicSgnkB6dUPc1+RC8QmJHKf2OjvU+NZWitguJHEaEmbV6VWEouT58g==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-template-literals": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.27.1.tgz", + "integrity": "sha512-fBJKiV7F2DxZUkg5EtHKXQdbsbURW3DZKQUWphDum0uRP6eHGGa/He9mc0mypL680pb+e/lDIthRohlv8NCHkg==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-typeof-symbol": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.27.1.tgz", + "integrity": "sha512-RiSILC+nRJM7FY5srIyc4/fGIwUhyDuuBSdWn4y6yT6gm652DpCHZjIipgn6B7MQ1ITOUnAKWixEUjQRIBIcLw==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-typescript": { + "version": "7.28.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.28.0.tgz", + "integrity": "sha512-4AEiDEBPIZvLQaWlc9liCavE0xRM0dNca41WtBeM3jgFptfUOSG9z0uteLhq6+3rq+WB6jIvUwKDTpXEHPJ2Vg==", + "license": "MIT", + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.27.3", + "@babel/helper-create-class-features-plugin": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/helper-skip-transparent-expression-wrappers": "^7.27.1", + "@babel/plugin-syntax-typescript": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-unicode-escapes": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.27.1.tgz", + "integrity": "sha512-Ysg4v6AmF26k9vpfFuTZg8HRfVWzsh1kVfowA23y9j/Gu6dOuahdUVhkLqpObp3JIv27MLSii6noRnuKN8H0Mg==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-unicode-property-regex": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-property-regex/-/plugin-transform-unicode-property-regex-7.27.1.tgz", + "integrity": "sha512-uW20S39PnaTImxp39O5qFlHLS9LJEmANjMG7SxIhap8rCHqu0Ik+tLEPX5DKmHn6CsWQ7j3lix2tFOa5YtL12Q==", + "license": "MIT", + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-unicode-regex": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.27.1.tgz", + "integrity": "sha512-xvINq24TRojDuyt6JGtHmkVkrfVV3FPT16uytxImLeBZqW3/H52yN+kM1MGuyPkIQxrzKwPHs5U/MP3qKyzkGw==", + "license": "MIT", + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-unicode-sets-regex": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-sets-regex/-/plugin-transform-unicode-sets-regex-7.27.1.tgz", + "integrity": "sha512-EtkOujbc4cgvb0mlpQefi4NTPBzhSIevblFevACNLUspmrALgmEBdL/XfnyyITfd8fKBZrZys92zOWcik7j9Tw==", + "license": "MIT", + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/preset-env": { + "version": "7.28.3", + "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.28.3.tgz", + "integrity": "sha512-ROiDcM+GbYVPYBOeCR6uBXKkQpBExLl8k9HO1ygXEyds39j+vCCsjmj7S8GOniZQlEs81QlkdJZe76IpLSiqpg==", + "license": "MIT", + "dependencies": { + "@babel/compat-data": "^7.28.0", + "@babel/helper-compilation-targets": "^7.27.2", + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/helper-validator-option": "^7.27.1", + "@babel/plugin-bugfix-firefox-class-in-computed-class-key": "^7.27.1", + "@babel/plugin-bugfix-safari-class-field-initializer-scope": "^7.27.1", + "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": "^7.27.1", + "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "^7.27.1", + "@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly": "^7.28.3", + "@babel/plugin-proposal-private-property-in-object": "7.21.0-placeholder-for-preset-env.2", + "@babel/plugin-syntax-import-assertions": "^7.27.1", + "@babel/plugin-syntax-import-attributes": "^7.27.1", + "@babel/plugin-syntax-unicode-sets-regex": "^7.18.6", + "@babel/plugin-transform-arrow-functions": "^7.27.1", + "@babel/plugin-transform-async-generator-functions": "^7.28.0", + "@babel/plugin-transform-async-to-generator": "^7.27.1", + "@babel/plugin-transform-block-scoped-functions": "^7.27.1", + "@babel/plugin-transform-block-scoping": "^7.28.0", + "@babel/plugin-transform-class-properties": "^7.27.1", + "@babel/plugin-transform-class-static-block": "^7.28.3", + "@babel/plugin-transform-classes": "^7.28.3", + "@babel/plugin-transform-computed-properties": "^7.27.1", + "@babel/plugin-transform-destructuring": "^7.28.0", + "@babel/plugin-transform-dotall-regex": "^7.27.1", + "@babel/plugin-transform-duplicate-keys": "^7.27.1", + "@babel/plugin-transform-duplicate-named-capturing-groups-regex": "^7.27.1", + "@babel/plugin-transform-dynamic-import": "^7.27.1", + "@babel/plugin-transform-explicit-resource-management": "^7.28.0", + "@babel/plugin-transform-exponentiation-operator": "^7.27.1", + "@babel/plugin-transform-export-namespace-from": "^7.27.1", + "@babel/plugin-transform-for-of": "^7.27.1", + "@babel/plugin-transform-function-name": "^7.27.1", + "@babel/plugin-transform-json-strings": "^7.27.1", + "@babel/plugin-transform-literals": "^7.27.1", + "@babel/plugin-transform-logical-assignment-operators": "^7.27.1", + "@babel/plugin-transform-member-expression-literals": "^7.27.1", + "@babel/plugin-transform-modules-amd": "^7.27.1", + "@babel/plugin-transform-modules-commonjs": "^7.27.1", + "@babel/plugin-transform-modules-systemjs": "^7.27.1", + "@babel/plugin-transform-modules-umd": "^7.27.1", + "@babel/plugin-transform-named-capturing-groups-regex": "^7.27.1", + "@babel/plugin-transform-new-target": "^7.27.1", + "@babel/plugin-transform-nullish-coalescing-operator": "^7.27.1", + "@babel/plugin-transform-numeric-separator": "^7.27.1", + "@babel/plugin-transform-object-rest-spread": "^7.28.0", + "@babel/plugin-transform-object-super": "^7.27.1", + "@babel/plugin-transform-optional-catch-binding": "^7.27.1", + "@babel/plugin-transform-optional-chaining": "^7.27.1", + "@babel/plugin-transform-parameters": "^7.27.7", + "@babel/plugin-transform-private-methods": "^7.27.1", + "@babel/plugin-transform-private-property-in-object": "^7.27.1", + "@babel/plugin-transform-property-literals": "^7.27.1", + "@babel/plugin-transform-regenerator": "^7.28.3", + "@babel/plugin-transform-regexp-modifiers": "^7.27.1", + "@babel/plugin-transform-reserved-words": "^7.27.1", + "@babel/plugin-transform-shorthand-properties": "^7.27.1", + "@babel/plugin-transform-spread": "^7.27.1", + "@babel/plugin-transform-sticky-regex": "^7.27.1", + "@babel/plugin-transform-template-literals": "^7.27.1", + "@babel/plugin-transform-typeof-symbol": "^7.27.1", + "@babel/plugin-transform-unicode-escapes": "^7.27.1", + "@babel/plugin-transform-unicode-property-regex": "^7.27.1", + "@babel/plugin-transform-unicode-regex": "^7.27.1", + "@babel/plugin-transform-unicode-sets-regex": "^7.27.1", + "@babel/preset-modules": "0.1.6-no-external-plugins", + "babel-plugin-polyfill-corejs2": "^0.4.14", + "babel-plugin-polyfill-corejs3": "^0.13.0", + "babel-plugin-polyfill-regenerator": "^0.6.5", + "core-js-compat": "^3.43.0", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/preset-env/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/@babel/preset-modules": { + "version": "0.1.6-no-external-plugins", + "resolved": "https://registry.npmjs.org/@babel/preset-modules/-/preset-modules-0.1.6-no-external-plugins.tgz", + "integrity": "sha512-HrcgcIESLm9aIR842yhJ5RWan/gebQUJ6E/E5+rf0y9o6oj7w0Br+sWuL6kEQ/o/AdfvR1Je9jG18/gnpwjEyA==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.0.0", + "@babel/types": "^7.4.4", + "esutils": "^2.0.2" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0 || ^8.0.0-0 <8.0.0" + } + }, + "node_modules/@babel/preset-react": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/preset-react/-/preset-react-7.27.1.tgz", + "integrity": "sha512-oJHWh2gLhU9dW9HHr42q0cI0/iHHXTLGe39qvpAZZzagHy0MzYLCnCVV0symeRvzmjHyVU7mw2K06E6u/JwbhA==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/helper-validator-option": "^7.27.1", + "@babel/plugin-transform-react-display-name": "^7.27.1", + "@babel/plugin-transform-react-jsx": "^7.27.1", + "@babel/plugin-transform-react-jsx-development": "^7.27.1", + "@babel/plugin-transform-react-pure-annotations": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/preset-typescript": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/preset-typescript/-/preset-typescript-7.27.1.tgz", + "integrity": "sha512-l7WfQfX0WK4M0v2RudjuQK4u99BS6yLHYEmdtVPP7lKV013zr9DygFuWNlnbvQ9LR+LS0Egz/XAvGx5U9MX0fQ==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/helper-validator-option": "^7.27.1", + "@babel/plugin-syntax-jsx": "^7.27.1", + "@babel/plugin-transform-modules-commonjs": "^7.27.1", + "@babel/plugin-transform-typescript": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/runtime": { + "version": "7.28.4", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.28.4.tgz", + "integrity": "sha512-Q/N6JNWvIvPnLDvjlE1OUBLPQHH6l3CltCEsHIujp45zQUSSh8K+gHnaEX45yAT1nyngnINhvWtzN+Nb9D8RAQ==", + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/runtime-corejs3": { + "version": "7.28.4", + "resolved": "https://registry.npmjs.org/@babel/runtime-corejs3/-/runtime-corejs3-7.28.4.tgz", + "integrity": "sha512-h7iEYiW4HebClDEhtvFObtPmIvrd1SSfpI9EhOeKk4CtIK/ngBWFpuhCzhdmRKtg71ylcue+9I6dv54XYO1epQ==", + "license": "MIT", + "dependencies": { + "core-js-pure": "^3.43.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/template": { + "version": "7.27.2", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.27.2.tgz", + "integrity": "sha512-LPDZ85aEJyYSd18/DkjNh4/y1ntkE5KwUHWTiqgRxruuZL2F1yuHligVHLvcHY2vMHXttKFpJn6LwfI7cw7ODw==", + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.27.1", + "@babel/parser": "^7.27.2", + "@babel/types": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/traverse": { + "version": "7.28.4", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.28.4.tgz", + "integrity": "sha512-YEzuboP2qvQavAcjgQNVgsvHIDv6ZpwXvcvjmyySP2DIMuByS/6ioU5G9pYrWHM6T2YDfc7xga9iNzYOs12CFQ==", + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.27.1", + "@babel/generator": "^7.28.3", + "@babel/helper-globals": "^7.28.0", + "@babel/parser": "^7.28.4", + "@babel/template": "^7.27.2", + "@babel/types": "^7.28.4", + "debug": "^4.3.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/types": { + "version": "7.28.4", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.28.4.tgz", + "integrity": "sha512-bkFqkLhh3pMBUQQkpVgWDWq/lqzc2678eUyDlTBhRqhCHFguYYGM0Efga7tYk4TogG/3x0EEl66/OQ+WGbWB/Q==", + "license": "MIT", + "dependencies": { + "@babel/helper-string-parser": "^7.27.1", + "@babel/helper-validator-identifier": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@colors/colors": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/@colors/colors/-/colors-1.5.0.tgz", + "integrity": "sha512-ooWCrlZP11i8GImSjTHYHLkvFDP48nS4+204nGb1RiX/WXYHmJA2III9/e2DWVabCESdW7hBAEzHRqUn9OUVvQ==", + "license": "MIT", + "optional": true, + "engines": { + "node": ">=0.1.90" + } + }, + "node_modules/@csstools/cascade-layer-name-parser": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@csstools/cascade-layer-name-parser/-/cascade-layer-name-parser-2.0.5.tgz", + "integrity": "sha512-p1ko5eHgV+MgXFVa4STPKpvPxr6ReS8oS2jzTukjR74i5zJNyWO1ZM1m8YKBXnzDKWfBN1ztLYlHxbVemDD88A==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT", + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@csstools/css-parser-algorithms": "^3.0.5", + "@csstools/css-tokenizer": "^3.0.4" + } + }, + "node_modules/@csstools/color-helpers": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/@csstools/color-helpers/-/color-helpers-5.1.0.tgz", + "integrity": "sha512-S11EXWJyy0Mz5SYvRmY8nJYTFFd1LCNV+7cXyAgQtOOuzb4EsgfqDufL+9esx72/eLhsRdGZwaldu/h+E4t4BA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "engines": { + "node": ">=18" + } + }, + "node_modules/@csstools/css-calc": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/@csstools/css-calc/-/css-calc-2.1.4.tgz", + "integrity": "sha512-3N8oaj+0juUw/1H3YwmDDJXCgTB1gKU6Hc/bB502u9zR0q2vd786XJH9QfrKIEgFlZmhZiq6epXl4rHqhzsIgQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT", + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@csstools/css-parser-algorithms": "^3.0.5", + "@csstools/css-tokenizer": "^3.0.4" + } + }, + "node_modules/@csstools/css-color-parser": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@csstools/css-color-parser/-/css-color-parser-3.1.0.tgz", + "integrity": "sha512-nbtKwh3a6xNVIp/VRuXV64yTKnb1IjTAEEh3irzS+HkKjAOYLTGNb9pmVNntZ8iVBHcWDA2Dof0QtPgFI1BaTA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT", + "dependencies": { + "@csstools/color-helpers": "^5.1.0", + "@csstools/css-calc": "^2.1.4" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@csstools/css-parser-algorithms": "^3.0.5", + "@csstools/css-tokenizer": "^3.0.4" + } + }, + "node_modules/@csstools/css-parser-algorithms": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/@csstools/css-parser-algorithms/-/css-parser-algorithms-3.0.5.tgz", + "integrity": "sha512-DaDeUkXZKjdGhgYaHNJTV9pV7Y9B3b644jCLs9Upc3VeNGg6LWARAT6O+Q+/COo+2gg/bM5rhpMAtf70WqfBdQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT", + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@csstools/css-tokenizer": "^3.0.4" + } + }, + "node_modules/@csstools/css-tokenizer": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@csstools/css-tokenizer/-/css-tokenizer-3.0.4.tgz", + "integrity": "sha512-Vd/9EVDiu6PPJt9yAh6roZP6El1xHrdvIVGjyBsHR0RYwNHgL7FJPyIIW4fANJNG6FtyZfvlRPpFI4ZM/lubvw==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT", + "engines": { + "node": ">=18" + } + }, + "node_modules/@csstools/media-query-list-parser": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/@csstools/media-query-list-parser/-/media-query-list-parser-4.0.3.tgz", + "integrity": "sha512-HAYH7d3TLRHDOUQK4mZKf9k9Ph/m8Akstg66ywKR4SFAigjs3yBiUeZtFxywiTm5moZMAp/5W/ZuFnNXXYLuuQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT", + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@csstools/css-parser-algorithms": "^3.0.5", + "@csstools/css-tokenizer": "^3.0.4" + } + }, + "node_modules/@csstools/postcss-alpha-function": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@csstools/postcss-alpha-function/-/postcss-alpha-function-1.0.1.tgz", + "integrity": "sha512-isfLLwksH3yHkFXfCI2Gcaqg7wGGHZZwunoJzEZk0yKYIokgre6hYVFibKL3SYAoR1kBXova8LB+JoO5vZzi9w==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "dependencies": { + "@csstools/css-color-parser": "^3.1.0", + "@csstools/css-parser-algorithms": "^3.0.5", + "@csstools/css-tokenizer": "^3.0.4", + "@csstools/postcss-progressive-custom-properties": "^4.2.1", + "@csstools/utilities": "^2.0.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/@csstools/postcss-cascade-layers": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/@csstools/postcss-cascade-layers/-/postcss-cascade-layers-5.0.2.tgz", + "integrity": "sha512-nWBE08nhO8uWl6kSAeCx4im7QfVko3zLrtgWZY4/bP87zrSPpSyN/3W3TDqz1jJuH+kbKOHXg5rJnK+ZVYcFFg==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "dependencies": { + "@csstools/selector-specificity": "^5.0.0", + "postcss-selector-parser": "^7.0.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/@csstools/postcss-cascade-layers/node_modules/@csstools/selector-specificity": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/@csstools/selector-specificity/-/selector-specificity-5.0.0.tgz", + "integrity": "sha512-PCqQV3c4CoVm3kdPhyeZ07VmBRdH2EpMFA/pd9OASpOEC3aXNGoqPDAZ80D0cLpMBxnmk0+yNhGsEx31hq7Gtw==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss-selector-parser": "^7.0.0" + } + }, + "node_modules/@csstools/postcss-cascade-layers/node_modules/postcss-selector-parser": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.1.0.tgz", + "integrity": "sha512-8sLjZwK0R+JlxlYcTuVnyT2v+htpdrjDOKuMcOVdYjt52Lh8hWRYpxBPoKx/Zg+bcjc3wx6fmQevMmUztS/ccA==", + "license": "MIT", + "dependencies": { + "cssesc": "^3.0.0", + "util-deprecate": "^1.0.2" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@csstools/postcss-color-function": { + "version": "4.0.12", + "resolved": "https://registry.npmjs.org/@csstools/postcss-color-function/-/postcss-color-function-4.0.12.tgz", + "integrity": "sha512-yx3cljQKRaSBc2hfh8rMZFZzChaFgwmO2JfFgFr1vMcF3C/uyy5I4RFIBOIWGq1D+XbKCG789CGkG6zzkLpagA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "dependencies": { + "@csstools/css-color-parser": "^3.1.0", + "@csstools/css-parser-algorithms": "^3.0.5", + "@csstools/css-tokenizer": "^3.0.4", + "@csstools/postcss-progressive-custom-properties": "^4.2.1", + "@csstools/utilities": "^2.0.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/@csstools/postcss-color-function-display-p3-linear": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@csstools/postcss-color-function-display-p3-linear/-/postcss-color-function-display-p3-linear-1.0.1.tgz", + "integrity": "sha512-E5qusdzhlmO1TztYzDIi8XPdPoYOjoTY6HBYBCYSj+Gn4gQRBlvjgPQXzfzuPQqt8EhkC/SzPKObg4Mbn8/xMg==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "dependencies": { + "@csstools/css-color-parser": "^3.1.0", + "@csstools/css-parser-algorithms": "^3.0.5", + "@csstools/css-tokenizer": "^3.0.4", + "@csstools/postcss-progressive-custom-properties": "^4.2.1", + "@csstools/utilities": "^2.0.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/@csstools/postcss-color-mix-function": { + "version": "3.0.12", + "resolved": "https://registry.npmjs.org/@csstools/postcss-color-mix-function/-/postcss-color-mix-function-3.0.12.tgz", + "integrity": "sha512-4STERZfCP5Jcs13P1U5pTvI9SkgLgfMUMhdXW8IlJWkzOOOqhZIjcNhWtNJZes2nkBDsIKJ0CJtFtuaZ00moag==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "dependencies": { + "@csstools/css-color-parser": "^3.1.0", + "@csstools/css-parser-algorithms": "^3.0.5", + "@csstools/css-tokenizer": "^3.0.4", + "@csstools/postcss-progressive-custom-properties": "^4.2.1", + "@csstools/utilities": "^2.0.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/@csstools/postcss-color-mix-variadic-function-arguments": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@csstools/postcss-color-mix-variadic-function-arguments/-/postcss-color-mix-variadic-function-arguments-1.0.2.tgz", + "integrity": "sha512-rM67Gp9lRAkTo+X31DUqMEq+iK+EFqsidfecmhrteErxJZb6tUoJBVQca1Vn1GpDql1s1rD1pKcuYzMsg7Z1KQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "dependencies": { + "@csstools/css-color-parser": "^3.1.0", + "@csstools/css-parser-algorithms": "^3.0.5", + "@csstools/css-tokenizer": "^3.0.4", + "@csstools/postcss-progressive-custom-properties": "^4.2.1", + "@csstools/utilities": "^2.0.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/@csstools/postcss-content-alt-text": { + "version": "2.0.8", + "resolved": "https://registry.npmjs.org/@csstools/postcss-content-alt-text/-/postcss-content-alt-text-2.0.8.tgz", + "integrity": "sha512-9SfEW9QCxEpTlNMnpSqFaHyzsiRpZ5J5+KqCu1u5/eEJAWsMhzT40qf0FIbeeglEvrGRMdDzAxMIz3wqoGSb+Q==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "dependencies": { + "@csstools/css-parser-algorithms": "^3.0.5", + "@csstools/css-tokenizer": "^3.0.4", + "@csstools/postcss-progressive-custom-properties": "^4.2.1", + "@csstools/utilities": "^2.0.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/@csstools/postcss-contrast-color-function": { + "version": "2.0.12", + "resolved": "https://registry.npmjs.org/@csstools/postcss-contrast-color-function/-/postcss-contrast-color-function-2.0.12.tgz", + "integrity": "sha512-YbwWckjK3qwKjeYz/CijgcS7WDUCtKTd8ShLztm3/i5dhh4NaqzsbYnhm4bjrpFpnLZ31jVcbK8YL77z3GBPzA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "dependencies": { + "@csstools/css-color-parser": "^3.1.0", + "@csstools/css-parser-algorithms": "^3.0.5", + "@csstools/css-tokenizer": "^3.0.4", + "@csstools/postcss-progressive-custom-properties": "^4.2.1", + "@csstools/utilities": "^2.0.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/@csstools/postcss-exponential-functions": { + "version": "2.0.9", + "resolved": "https://registry.npmjs.org/@csstools/postcss-exponential-functions/-/postcss-exponential-functions-2.0.9.tgz", + "integrity": "sha512-abg2W/PI3HXwS/CZshSa79kNWNZHdJPMBXeZNyPQFbbj8sKO3jXxOt/wF7juJVjyDTc6JrvaUZYFcSBZBhaxjw==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "dependencies": { + "@csstools/css-calc": "^2.1.4", + "@csstools/css-parser-algorithms": "^3.0.5", + "@csstools/css-tokenizer": "^3.0.4" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/@csstools/postcss-font-format-keywords": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@csstools/postcss-font-format-keywords/-/postcss-font-format-keywords-4.0.0.tgz", + "integrity": "sha512-usBzw9aCRDvchpok6C+4TXC57btc4bJtmKQWOHQxOVKen1ZfVqBUuCZ/wuqdX5GHsD0NRSr9XTP+5ID1ZZQBXw==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "dependencies": { + "@csstools/utilities": "^2.0.0", + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/@csstools/postcss-gamut-mapping": { + "version": "2.0.11", + "resolved": "https://registry.npmjs.org/@csstools/postcss-gamut-mapping/-/postcss-gamut-mapping-2.0.11.tgz", + "integrity": "sha512-fCpCUgZNE2piVJKC76zFsgVW1apF6dpYsqGyH8SIeCcM4pTEsRTWTLCaJIMKFEundsCKwY1rwfhtrio04RJ4Dw==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "dependencies": { + "@csstools/css-color-parser": "^3.1.0", + "@csstools/css-parser-algorithms": "^3.0.5", + "@csstools/css-tokenizer": "^3.0.4" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/@csstools/postcss-gradients-interpolation-method": { + "version": "5.0.12", + "resolved": "https://registry.npmjs.org/@csstools/postcss-gradients-interpolation-method/-/postcss-gradients-interpolation-method-5.0.12.tgz", + "integrity": "sha512-jugzjwkUY0wtNrZlFeyXzimUL3hN4xMvoPnIXxoZqxDvjZRiSh+itgHcVUWzJ2VwD/VAMEgCLvtaJHX+4Vj3Ow==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "dependencies": { + "@csstools/css-color-parser": "^3.1.0", + "@csstools/css-parser-algorithms": "^3.0.5", + "@csstools/css-tokenizer": "^3.0.4", + "@csstools/postcss-progressive-custom-properties": "^4.2.1", + "@csstools/utilities": "^2.0.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/@csstools/postcss-hwb-function": { + "version": "4.0.12", + "resolved": "https://registry.npmjs.org/@csstools/postcss-hwb-function/-/postcss-hwb-function-4.0.12.tgz", + "integrity": "sha512-mL/+88Z53KrE4JdePYFJAQWFrcADEqsLprExCM04GDNgHIztwFzj0Mbhd/yxMBngq0NIlz58VVxjt5abNs1VhA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "dependencies": { + "@csstools/css-color-parser": "^3.1.0", + "@csstools/css-parser-algorithms": "^3.0.5", + "@csstools/css-tokenizer": "^3.0.4", + "@csstools/postcss-progressive-custom-properties": "^4.2.1", + "@csstools/utilities": "^2.0.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/@csstools/postcss-ic-unit": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/@csstools/postcss-ic-unit/-/postcss-ic-unit-4.0.4.tgz", + "integrity": "sha512-yQ4VmossuOAql65sCPppVO1yfb7hDscf4GseF0VCA/DTDaBc0Wtf8MTqVPfjGYlT5+2buokG0Gp7y0atYZpwjg==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "dependencies": { + "@csstools/postcss-progressive-custom-properties": "^4.2.1", + "@csstools/utilities": "^2.0.0", + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/@csstools/postcss-initial": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/@csstools/postcss-initial/-/postcss-initial-2.0.1.tgz", + "integrity": "sha512-L1wLVMSAZ4wovznquK0xmC7QSctzO4D0Is590bxpGqhqjboLXYA16dWZpfwImkdOgACdQ9PqXsuRroW6qPlEsg==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/@csstools/postcss-is-pseudo-class": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/@csstools/postcss-is-pseudo-class/-/postcss-is-pseudo-class-5.0.3.tgz", + "integrity": "sha512-jS/TY4SpG4gszAtIg7Qnf3AS2pjcUM5SzxpApOrlndMeGhIbaTzWBzzP/IApXoNWEW7OhcjkRT48jnAUIFXhAQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "dependencies": { + "@csstools/selector-specificity": "^5.0.0", + "postcss-selector-parser": "^7.0.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/@csstools/postcss-is-pseudo-class/node_modules/@csstools/selector-specificity": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/@csstools/selector-specificity/-/selector-specificity-5.0.0.tgz", + "integrity": "sha512-PCqQV3c4CoVm3kdPhyeZ07VmBRdH2EpMFA/pd9OASpOEC3aXNGoqPDAZ80D0cLpMBxnmk0+yNhGsEx31hq7Gtw==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss-selector-parser": "^7.0.0" + } + }, + "node_modules/@csstools/postcss-is-pseudo-class/node_modules/postcss-selector-parser": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.1.0.tgz", + "integrity": "sha512-8sLjZwK0R+JlxlYcTuVnyT2v+htpdrjDOKuMcOVdYjt52Lh8hWRYpxBPoKx/Zg+bcjc3wx6fmQevMmUztS/ccA==", + "license": "MIT", + "dependencies": { + "cssesc": "^3.0.0", + "util-deprecate": "^1.0.2" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@csstools/postcss-light-dark-function": { + "version": "2.0.11", + "resolved": "https://registry.npmjs.org/@csstools/postcss-light-dark-function/-/postcss-light-dark-function-2.0.11.tgz", + "integrity": "sha512-fNJcKXJdPM3Lyrbmgw2OBbaioU7yuKZtiXClf4sGdQttitijYlZMD5K7HrC/eF83VRWRrYq6OZ0Lx92leV2LFA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "dependencies": { + "@csstools/css-parser-algorithms": "^3.0.5", + "@csstools/css-tokenizer": "^3.0.4", + "@csstools/postcss-progressive-custom-properties": "^4.2.1", + "@csstools/utilities": "^2.0.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/@csstools/postcss-logical-float-and-clear": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@csstools/postcss-logical-float-and-clear/-/postcss-logical-float-and-clear-3.0.0.tgz", + "integrity": "sha512-SEmaHMszwakI2rqKRJgE+8rpotFfne1ZS6bZqBoQIicFyV+xT1UF42eORPxJkVJVrH9C0ctUgwMSn3BLOIZldQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/@csstools/postcss-logical-overflow": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@csstools/postcss-logical-overflow/-/postcss-logical-overflow-2.0.0.tgz", + "integrity": "sha512-spzR1MInxPuXKEX2csMamshR4LRaSZ3UXVaRGjeQxl70ySxOhMpP2252RAFsg8QyyBXBzuVOOdx1+bVO5bPIzA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/@csstools/postcss-logical-overscroll-behavior": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@csstools/postcss-logical-overscroll-behavior/-/postcss-logical-overscroll-behavior-2.0.0.tgz", + "integrity": "sha512-e/webMjoGOSYfqLunyzByZj5KKe5oyVg/YSbie99VEaSDE2kimFm0q1f6t/6Jo+VVCQ/jbe2Xy+uX+C4xzWs4w==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/@csstools/postcss-logical-resize": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@csstools/postcss-logical-resize/-/postcss-logical-resize-3.0.0.tgz", + "integrity": "sha512-DFbHQOFW/+I+MY4Ycd/QN6Dg4Hcbb50elIJCfnwkRTCX05G11SwViI5BbBlg9iHRl4ytB7pmY5ieAFk3ws7yyg==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/@csstools/postcss-logical-viewport-units": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@csstools/postcss-logical-viewport-units/-/postcss-logical-viewport-units-3.0.4.tgz", + "integrity": "sha512-q+eHV1haXA4w9xBwZLKjVKAWn3W2CMqmpNpZUk5kRprvSiBEGMgrNH3/sJZ8UA3JgyHaOt3jwT9uFa4wLX4EqQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "dependencies": { + "@csstools/css-tokenizer": "^3.0.4", + "@csstools/utilities": "^2.0.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/@csstools/postcss-media-minmax": { + "version": "2.0.9", + "resolved": "https://registry.npmjs.org/@csstools/postcss-media-minmax/-/postcss-media-minmax-2.0.9.tgz", + "integrity": "sha512-af9Qw3uS3JhYLnCbqtZ9crTvvkR+0Se+bBqSr7ykAnl9yKhk6895z9rf+2F4dClIDJWxgn0iZZ1PSdkhrbs2ig==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT", + "dependencies": { + "@csstools/css-calc": "^2.1.4", + "@csstools/css-parser-algorithms": "^3.0.5", + "@csstools/css-tokenizer": "^3.0.4", + "@csstools/media-query-list-parser": "^4.0.3" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/@csstools/postcss-media-queries-aspect-ratio-number-values": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/@csstools/postcss-media-queries-aspect-ratio-number-values/-/postcss-media-queries-aspect-ratio-number-values-3.0.5.tgz", + "integrity": "sha512-zhAe31xaaXOY2Px8IYfoVTB3wglbJUVigGphFLj6exb7cjZRH9A6adyE22XfFK3P2PzwRk0VDeTJmaxpluyrDg==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "dependencies": { + "@csstools/css-parser-algorithms": "^3.0.5", + "@csstools/css-tokenizer": "^3.0.4", + "@csstools/media-query-list-parser": "^4.0.3" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/@csstools/postcss-nested-calc": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@csstools/postcss-nested-calc/-/postcss-nested-calc-4.0.0.tgz", + "integrity": "sha512-jMYDdqrQQxE7k9+KjstC3NbsmC063n1FTPLCgCRS2/qHUbHM0mNy9pIn4QIiQGs9I/Bg98vMqw7mJXBxa0N88A==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "dependencies": { + "@csstools/utilities": "^2.0.0", + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/@csstools/postcss-normalize-display-values": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@csstools/postcss-normalize-display-values/-/postcss-normalize-display-values-4.0.0.tgz", + "integrity": "sha512-HlEoG0IDRoHXzXnkV4in47dzsxdsjdz6+j7MLjaACABX2NfvjFS6XVAnpaDyGesz9gK2SC7MbNwdCHusObKJ9Q==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/@csstools/postcss-oklab-function": { + "version": "4.0.12", + "resolved": "https://registry.npmjs.org/@csstools/postcss-oklab-function/-/postcss-oklab-function-4.0.12.tgz", + "integrity": "sha512-HhlSmnE1NKBhXsTnNGjxvhryKtO7tJd1w42DKOGFD6jSHtYOrsJTQDKPMwvOfrzUAk8t7GcpIfRyM7ssqHpFjg==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "dependencies": { + "@csstools/css-color-parser": "^3.1.0", + "@csstools/css-parser-algorithms": "^3.0.5", + "@csstools/css-tokenizer": "^3.0.4", + "@csstools/postcss-progressive-custom-properties": "^4.2.1", + "@csstools/utilities": "^2.0.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/@csstools/postcss-progressive-custom-properties": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/@csstools/postcss-progressive-custom-properties/-/postcss-progressive-custom-properties-4.2.1.tgz", + "integrity": "sha512-uPiiXf7IEKtUQXsxu6uWtOlRMXd2QWWy5fhxHDnPdXKCQckPP3E34ZgDoZ62r2iT+UOgWsSbM4NvHE5m3mAEdw==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/@csstools/postcss-random-function": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/@csstools/postcss-random-function/-/postcss-random-function-2.0.1.tgz", + "integrity": "sha512-q+FQaNiRBhnoSNo+GzqGOIBKoHQ43lYz0ICrV+UudfWnEF6ksS6DsBIJSISKQT2Bvu3g4k6r7t0zYrk5pDlo8w==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "dependencies": { + "@csstools/css-calc": "^2.1.4", + "@csstools/css-parser-algorithms": "^3.0.5", + "@csstools/css-tokenizer": "^3.0.4" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/@csstools/postcss-relative-color-syntax": { + "version": "3.0.12", + "resolved": "https://registry.npmjs.org/@csstools/postcss-relative-color-syntax/-/postcss-relative-color-syntax-3.0.12.tgz", + "integrity": "sha512-0RLIeONxu/mtxRtf3o41Lq2ghLimw0w9ByLWnnEVuy89exmEEq8bynveBxNW3nyHqLAFEeNtVEmC1QK9MZ8Huw==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "dependencies": { + "@csstools/css-color-parser": "^3.1.0", + "@csstools/css-parser-algorithms": "^3.0.5", + "@csstools/css-tokenizer": "^3.0.4", + "@csstools/postcss-progressive-custom-properties": "^4.2.1", + "@csstools/utilities": "^2.0.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/@csstools/postcss-scope-pseudo-class": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/@csstools/postcss-scope-pseudo-class/-/postcss-scope-pseudo-class-4.0.1.tgz", + "integrity": "sha512-IMi9FwtH6LMNuLea1bjVMQAsUhFxJnyLSgOp/cpv5hrzWmrUYU5fm0EguNDIIOHUqzXode8F/1qkC/tEo/qN8Q==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "dependencies": { + "postcss-selector-parser": "^7.0.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/@csstools/postcss-scope-pseudo-class/node_modules/postcss-selector-parser": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.1.0.tgz", + "integrity": "sha512-8sLjZwK0R+JlxlYcTuVnyT2v+htpdrjDOKuMcOVdYjt52Lh8hWRYpxBPoKx/Zg+bcjc3wx6fmQevMmUztS/ccA==", + "license": "MIT", + "dependencies": { + "cssesc": "^3.0.0", + "util-deprecate": "^1.0.2" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@csstools/postcss-sign-functions": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/@csstools/postcss-sign-functions/-/postcss-sign-functions-1.1.4.tgz", + "integrity": "sha512-P97h1XqRPcfcJndFdG95Gv/6ZzxUBBISem0IDqPZ7WMvc/wlO+yU0c5D/OCpZ5TJoTt63Ok3knGk64N+o6L2Pg==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "dependencies": { + "@csstools/css-calc": "^2.1.4", + "@csstools/css-parser-algorithms": "^3.0.5", + "@csstools/css-tokenizer": "^3.0.4" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/@csstools/postcss-stepped-value-functions": { + "version": "4.0.9", + "resolved": "https://registry.npmjs.org/@csstools/postcss-stepped-value-functions/-/postcss-stepped-value-functions-4.0.9.tgz", + "integrity": "sha512-h9btycWrsex4dNLeQfyU3y3w40LMQooJWFMm/SK9lrKguHDcFl4VMkncKKoXi2z5rM9YGWbUQABI8BT2UydIcA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "dependencies": { + "@csstools/css-calc": "^2.1.4", + "@csstools/css-parser-algorithms": "^3.0.5", + "@csstools/css-tokenizer": "^3.0.4" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/@csstools/postcss-text-decoration-shorthand": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/@csstools/postcss-text-decoration-shorthand/-/postcss-text-decoration-shorthand-4.0.3.tgz", + "integrity": "sha512-KSkGgZfx0kQjRIYnpsD7X2Om9BUXX/Kii77VBifQW9Ih929hK0KNjVngHDH0bFB9GmfWcR9vJYJJRvw/NQjkrA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "dependencies": { + "@csstools/color-helpers": "^5.1.0", + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/@csstools/postcss-trigonometric-functions": { + "version": "4.0.9", + "resolved": "https://registry.npmjs.org/@csstools/postcss-trigonometric-functions/-/postcss-trigonometric-functions-4.0.9.tgz", + "integrity": "sha512-Hnh5zJUdpNrJqK9v1/E3BbrQhaDTj5YiX7P61TOvUhoDHnUmsNNxcDAgkQ32RrcWx9GVUvfUNPcUkn8R3vIX6A==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "dependencies": { + "@csstools/css-calc": "^2.1.4", + "@csstools/css-parser-algorithms": "^3.0.5", + "@csstools/css-tokenizer": "^3.0.4" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/@csstools/postcss-unset-value": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@csstools/postcss-unset-value/-/postcss-unset-value-4.0.0.tgz", + "integrity": "sha512-cBz3tOCI5Fw6NIFEwU3RiwK6mn3nKegjpJuzCndoGq3BZPkUjnsq7uQmIeMNeMbMk7YD2MfKcgCpZwX5jyXqCA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/@csstools/utilities": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@csstools/utilities/-/utilities-2.0.0.tgz", + "integrity": "sha512-5VdOr0Z71u+Yp3ozOx8T11N703wIFGVRgOWbOZMKgglPJsWA54MRIoMNVMa7shUToIhx5J8vX4sOZgD2XiihiQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/@discoveryjs/json-ext": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/@discoveryjs/json-ext/-/json-ext-0.5.7.tgz", + "integrity": "sha512-dBVuXR082gk3jsFp7Rd/JI4kytwGHecnCoTtXFb7DB6CNHp4rg5k1bhg0nWdLGLnOV71lmDzGQaLMy8iPLY0pw==", + "license": "MIT", + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/@docsearch/css": { + "version": "3.9.0", + "resolved": "https://registry.npmjs.org/@docsearch/css/-/css-3.9.0.tgz", + "integrity": "sha512-cQbnVbq0rrBwNAKegIac/t6a8nWoUAn8frnkLFW6YARaRmAQr5/Eoe6Ln2fqkUCZ40KpdrKbpSAmgrkviOxuWA==", + "license": "MIT" + }, + "node_modules/@docsearch/react": { + "version": "3.9.0", + "resolved": "https://registry.npmjs.org/@docsearch/react/-/react-3.9.0.tgz", + "integrity": "sha512-mb5FOZYZIkRQ6s/NWnM98k879vu5pscWqTLubLFBO87igYYT4VzVazh4h5o/zCvTIZgEt3PvsCOMOswOUo9yHQ==", + "license": "MIT", + "dependencies": { + "@algolia/autocomplete-core": "1.17.9", + "@algolia/autocomplete-preset-algolia": "1.17.9", + "@docsearch/css": "3.9.0", + "algoliasearch": "^5.14.2" + }, + "peerDependencies": { + "@types/react": ">= 16.8.0 < 20.0.0", + "react": ">= 16.8.0 < 20.0.0", + "react-dom": ">= 16.8.0 < 20.0.0", + "search-insights": ">= 1 < 3" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "react": { + "optional": true + }, + "react-dom": { + "optional": true + }, + "search-insights": { + "optional": true + } + } + }, + "node_modules/@docusaurus/babel": { + "version": "3.8.1", + "resolved": "https://registry.npmjs.org/@docusaurus/babel/-/babel-3.8.1.tgz", + "integrity": "sha512-3brkJrml8vUbn9aeoZUlJfsI/GqyFcDgQJwQkmBtclJgWDEQBKKeagZfOgx0WfUQhagL1sQLNW0iBdxnI863Uw==", + "license": "MIT", + "dependencies": { + "@babel/core": "^7.25.9", + "@babel/generator": "^7.25.9", + "@babel/plugin-syntax-dynamic-import": "^7.8.3", + "@babel/plugin-transform-runtime": "^7.25.9", + "@babel/preset-env": "^7.25.9", + "@babel/preset-react": "^7.25.9", + "@babel/preset-typescript": "^7.25.9", + "@babel/runtime": "^7.25.9", + "@babel/runtime-corejs3": "^7.25.9", + "@babel/traverse": "^7.25.9", + "@docusaurus/logger": "3.8.1", + "@docusaurus/utils": "3.8.1", + "babel-plugin-dynamic-import-node": "^2.3.3", + "fs-extra": "^11.1.1", + "tslib": "^2.6.0" + }, + "engines": { + "node": ">=18.0" + } + }, + "node_modules/@docusaurus/bundler": { + "version": "3.8.1", + "resolved": "https://registry.npmjs.org/@docusaurus/bundler/-/bundler-3.8.1.tgz", + "integrity": "sha512-/z4V0FRoQ0GuSLToNjOSGsk6m2lQUG4FRn8goOVoZSRsTrU8YR2aJacX5K3RG18EaX9b+52pN4m1sL3MQZVsQA==", + "license": "MIT", + "dependencies": { + "@babel/core": "^7.25.9", + "@docusaurus/babel": "3.8.1", + "@docusaurus/cssnano-preset": "3.8.1", + "@docusaurus/logger": "3.8.1", + "@docusaurus/types": "3.8.1", + "@docusaurus/utils": "3.8.1", + "babel-loader": "^9.2.1", + "clean-css": "^5.3.3", + "copy-webpack-plugin": "^11.0.0", + "css-loader": "^6.11.0", + "css-minimizer-webpack-plugin": "^5.0.1", + "cssnano": "^6.1.2", + "file-loader": "^6.2.0", + "html-minifier-terser": "^7.2.0", + "mini-css-extract-plugin": "^2.9.2", + "null-loader": "^4.0.1", + "postcss": "^8.5.4", + "postcss-loader": "^7.3.4", + "postcss-preset-env": "^10.2.1", + "terser-webpack-plugin": "^5.3.9", + "tslib": "^2.6.0", + "url-loader": "^4.1.1", + "webpack": "^5.95.0", + "webpackbar": "^6.0.1" + }, + "engines": { + "node": ">=18.0" + }, + "peerDependencies": { + "@docusaurus/faster": "*" + }, + "peerDependenciesMeta": { + "@docusaurus/faster": { + "optional": true + } + } + }, + "node_modules/@docusaurus/core": { + "version": "3.8.1", + "resolved": "https://registry.npmjs.org/@docusaurus/core/-/core-3.8.1.tgz", + "integrity": "sha512-ENB01IyQSqI2FLtOzqSI3qxG2B/jP4gQPahl2C3XReiLebcVh5B5cB9KYFvdoOqOWPyr5gXK4sjgTKv7peXCrA==", + "license": "MIT", + "dependencies": { + "@docusaurus/babel": "3.8.1", + "@docusaurus/bundler": "3.8.1", + "@docusaurus/logger": "3.8.1", + "@docusaurus/mdx-loader": "3.8.1", + "@docusaurus/utils": "3.8.1", + "@docusaurus/utils-common": "3.8.1", + "@docusaurus/utils-validation": "3.8.1", + "boxen": "^6.2.1", + "chalk": "^4.1.2", + "chokidar": "^3.5.3", + "cli-table3": "^0.6.3", + "combine-promises": "^1.1.0", + "commander": "^5.1.0", + "core-js": "^3.31.1", + "detect-port": "^1.5.1", + "escape-html": "^1.0.3", + "eta": "^2.2.0", + "eval": "^0.1.8", + "execa": "5.1.1", + "fs-extra": "^11.1.1", + "html-tags": "^3.3.1", + "html-webpack-plugin": "^5.6.0", + "leven": "^3.1.0", + "lodash": "^4.17.21", + "open": "^8.4.0", + "p-map": "^4.0.0", + "prompts": "^2.4.2", + "react-helmet-async": "npm:@slorber/react-helmet-async@1.3.0", + "react-loadable": "npm:@docusaurus/react-loadable@6.0.0", + "react-loadable-ssr-addon-v5-slorber": "^1.0.1", + "react-router": "^5.3.4", + "react-router-config": "^5.1.1", + "react-router-dom": "^5.3.4", + "semver": "^7.5.4", + "serve-handler": "^6.1.6", + "tinypool": "^1.0.2", + "tslib": "^2.6.0", + "update-notifier": "^6.0.2", + "webpack": "^5.95.0", + "webpack-bundle-analyzer": "^4.10.2", + "webpack-dev-server": "^4.15.2", + "webpack-merge": "^6.0.1" + }, + "bin": { + "docusaurus": "bin/docusaurus.mjs" + }, + "engines": { + "node": ">=18.0" + }, + "peerDependencies": { + "@mdx-js/react": "^3.0.0", + "react": "^18.0.0 || ^19.0.0", + "react-dom": "^18.0.0 || ^19.0.0" + } + }, + "node_modules/@docusaurus/cssnano-preset": { + "version": "3.8.1", + "resolved": "https://registry.npmjs.org/@docusaurus/cssnano-preset/-/cssnano-preset-3.8.1.tgz", + "integrity": "sha512-G7WyR2N6SpyUotqhGznERBK+x84uyhfMQM2MmDLs88bw4Flom6TY46HzkRkSEzaP9j80MbTN8naiL1fR17WQug==", + "license": "MIT", + "dependencies": { + "cssnano-preset-advanced": "^6.1.2", + "postcss": "^8.5.4", + "postcss-sort-media-queries": "^5.2.0", + "tslib": "^2.6.0" + }, + "engines": { + "node": ">=18.0" + } + }, + "node_modules/@docusaurus/logger": { + "version": "3.8.1", + "resolved": "https://registry.npmjs.org/@docusaurus/logger/-/logger-3.8.1.tgz", + "integrity": "sha512-2wjeGDhKcExEmjX8k1N/MRDiPKXGF2Pg+df/bDDPnnJWHXnVEZxXj80d6jcxp1Gpnksl0hF8t/ZQw9elqj2+ww==", + "license": "MIT", + "dependencies": { + "chalk": "^4.1.2", + "tslib": "^2.6.0" + }, + "engines": { + "node": ">=18.0" + } + }, + "node_modules/@docusaurus/mdx-loader": { + "version": "3.8.1", + "resolved": "https://registry.npmjs.org/@docusaurus/mdx-loader/-/mdx-loader-3.8.1.tgz", + "integrity": "sha512-DZRhagSFRcEq1cUtBMo4TKxSNo/W6/s44yhr8X+eoXqCLycFQUylebOMPseHi5tc4fkGJqwqpWJLz6JStU9L4w==", + "license": "MIT", + "dependencies": { + "@docusaurus/logger": "3.8.1", + "@docusaurus/utils": "3.8.1", + "@docusaurus/utils-validation": "3.8.1", + "@mdx-js/mdx": "^3.0.0", + "@slorber/remark-comment": "^1.0.0", + "escape-html": "^1.0.3", + "estree-util-value-to-estree": "^3.0.1", + "file-loader": "^6.2.0", + "fs-extra": "^11.1.1", + "image-size": "^2.0.2", + "mdast-util-mdx": "^3.0.0", + "mdast-util-to-string": "^4.0.0", + "rehype-raw": "^7.0.0", + "remark-directive": "^3.0.0", + "remark-emoji": "^4.0.0", + "remark-frontmatter": "^5.0.0", + "remark-gfm": "^4.0.0", + "stringify-object": "^3.3.0", + "tslib": "^2.6.0", + "unified": "^11.0.3", + "unist-util-visit": "^5.0.0", + "url-loader": "^4.1.1", + "vfile": "^6.0.1", + "webpack": "^5.88.1" + }, + "engines": { + "node": ">=18.0" + }, + "peerDependencies": { + "react": "^18.0.0 || ^19.0.0", + "react-dom": "^18.0.0 || ^19.0.0" + } + }, + "node_modules/@docusaurus/module-type-aliases": { + "version": "3.8.1", + "resolved": "https://registry.npmjs.org/@docusaurus/module-type-aliases/-/module-type-aliases-3.8.1.tgz", + "integrity": "sha512-6xhvAJiXzsaq3JdosS7wbRt/PwEPWHr9eM4YNYqVlbgG1hSK3uQDXTVvQktasp3VO6BmfYWPozueLWuj4gB+vg==", + "license": "MIT", + "dependencies": { + "@docusaurus/types": "3.8.1", + "@types/history": "^4.7.11", + "@types/react": "*", + "@types/react-router-config": "*", + "@types/react-router-dom": "*", + "react-helmet-async": "npm:@slorber/react-helmet-async@1.3.0", + "react-loadable": "npm:@docusaurus/react-loadable@6.0.0" + }, + "peerDependencies": { + "react": "*", + "react-dom": "*" + } + }, + "node_modules/@docusaurus/plugin-content-blog": { + "version": "3.8.1", + "resolved": "https://registry.npmjs.org/@docusaurus/plugin-content-blog/-/plugin-content-blog-3.8.1.tgz", + "integrity": "sha512-vNTpMmlvNP9n3hGEcgPaXyvTljanAKIUkuG9URQ1DeuDup0OR7Ltvoc8yrmH+iMZJbcQGhUJF+WjHLwuk8HSdw==", + "license": "MIT", + "dependencies": { + "@docusaurus/core": "3.8.1", + "@docusaurus/logger": "3.8.1", + "@docusaurus/mdx-loader": "3.8.1", + "@docusaurus/theme-common": "3.8.1", + "@docusaurus/types": "3.8.1", + "@docusaurus/utils": "3.8.1", + "@docusaurus/utils-common": "3.8.1", + "@docusaurus/utils-validation": "3.8.1", + "cheerio": "1.0.0-rc.12", + "feed": "^4.2.2", + "fs-extra": "^11.1.1", + "lodash": "^4.17.21", + "schema-dts": "^1.1.2", + "srcset": "^4.0.0", + "tslib": "^2.6.0", + "unist-util-visit": "^5.0.0", + "utility-types": "^3.10.0", + "webpack": "^5.88.1" + }, + "engines": { + "node": ">=18.0" + }, + "peerDependencies": { + "@docusaurus/plugin-content-docs": "*", + "react": "^18.0.0 || ^19.0.0", + "react-dom": "^18.0.0 || ^19.0.0" + } + }, + "node_modules/@docusaurus/plugin-content-docs": { + "version": "3.8.1", + "resolved": "https://registry.npmjs.org/@docusaurus/plugin-content-docs/-/plugin-content-docs-3.8.1.tgz", + "integrity": "sha512-oByRkSZzeGNQByCMaX+kif5Nl2vmtj2IHQI2fWjCfCootsdKZDPFLonhIp5s3IGJO7PLUfe0POyw0Xh/RrGXJA==", + "license": "MIT", + "dependencies": { + "@docusaurus/core": "3.8.1", + "@docusaurus/logger": "3.8.1", + "@docusaurus/mdx-loader": "3.8.1", + "@docusaurus/module-type-aliases": "3.8.1", + "@docusaurus/theme-common": "3.8.1", + "@docusaurus/types": "3.8.1", + "@docusaurus/utils": "3.8.1", + "@docusaurus/utils-common": "3.8.1", + "@docusaurus/utils-validation": "3.8.1", + "@types/react-router-config": "^5.0.7", + "combine-promises": "^1.1.0", + "fs-extra": "^11.1.1", + "js-yaml": "^4.1.0", + "lodash": "^4.17.21", + "schema-dts": "^1.1.2", + "tslib": "^2.6.0", + "utility-types": "^3.10.0", + "webpack": "^5.88.1" + }, + "engines": { + "node": ">=18.0" + }, + "peerDependencies": { + "react": "^18.0.0 || ^19.0.0", + "react-dom": "^18.0.0 || ^19.0.0" + } + }, + "node_modules/@docusaurus/plugin-content-pages": { + "version": "3.8.1", + "resolved": "https://registry.npmjs.org/@docusaurus/plugin-content-pages/-/plugin-content-pages-3.8.1.tgz", + "integrity": "sha512-a+V6MS2cIu37E/m7nDJn3dcxpvXb6TvgdNI22vJX8iUTp8eoMoPa0VArEbWvCxMY/xdC26WzNv4wZ6y0iIni/w==", + "license": "MIT", + "dependencies": { + "@docusaurus/core": "3.8.1", + "@docusaurus/mdx-loader": "3.8.1", + "@docusaurus/types": "3.8.1", + "@docusaurus/utils": "3.8.1", + "@docusaurus/utils-validation": "3.8.1", + "fs-extra": "^11.1.1", + "tslib": "^2.6.0", + "webpack": "^5.88.1" + }, + "engines": { + "node": ">=18.0" + }, + "peerDependencies": { + "react": "^18.0.0 || ^19.0.0", + "react-dom": "^18.0.0 || ^19.0.0" + } + }, + "node_modules/@docusaurus/plugin-css-cascade-layers": { + "version": "3.8.1", + "resolved": "https://registry.npmjs.org/@docusaurus/plugin-css-cascade-layers/-/plugin-css-cascade-layers-3.8.1.tgz", + "integrity": "sha512-VQ47xRxfNKjHS5ItzaVXpxeTm7/wJLFMOPo1BkmoMG4Cuz4nuI+Hs62+RMk1OqVog68Swz66xVPK8g9XTrBKRw==", + "license": "MIT", + "dependencies": { + "@docusaurus/core": "3.8.1", + "@docusaurus/types": "3.8.1", + "@docusaurus/utils": "3.8.1", + "@docusaurus/utils-validation": "3.8.1", + "tslib": "^2.6.0" + }, + "engines": { + "node": ">=18.0" + } + }, + "node_modules/@docusaurus/plugin-debug": { + "version": "3.8.1", + "resolved": "https://registry.npmjs.org/@docusaurus/plugin-debug/-/plugin-debug-3.8.1.tgz", + "integrity": "sha512-nT3lN7TV5bi5hKMB7FK8gCffFTBSsBsAfV84/v293qAmnHOyg1nr9okEw8AiwcO3bl9vije5nsUvP0aRl2lpaw==", + "license": "MIT", + "dependencies": { + "@docusaurus/core": "3.8.1", + "@docusaurus/types": "3.8.1", + "@docusaurus/utils": "3.8.1", + "fs-extra": "^11.1.1", + "react-json-view-lite": "^2.3.0", + "tslib": "^2.6.0" + }, + "engines": { + "node": ">=18.0" + }, + "peerDependencies": { + "react": "^18.0.0 || ^19.0.0", + "react-dom": "^18.0.0 || ^19.0.0" + } + }, + "node_modules/@docusaurus/plugin-google-analytics": { + "version": "3.8.1", + "resolved": "https://registry.npmjs.org/@docusaurus/plugin-google-analytics/-/plugin-google-analytics-3.8.1.tgz", + "integrity": "sha512-Hrb/PurOJsmwHAsfMDH6oVpahkEGsx7F8CWMjyP/dw1qjqmdS9rcV1nYCGlM8nOtD3Wk/eaThzUB5TSZsGz+7Q==", + "license": "MIT", + "dependencies": { + "@docusaurus/core": "3.8.1", + "@docusaurus/types": "3.8.1", + "@docusaurus/utils-validation": "3.8.1", + "tslib": "^2.6.0" + }, + "engines": { + "node": ">=18.0" + }, + "peerDependencies": { + "react": "^18.0.0 || ^19.0.0", + "react-dom": "^18.0.0 || ^19.0.0" + } + }, + "node_modules/@docusaurus/plugin-google-gtag": { + "version": "3.8.1", + "resolved": "https://registry.npmjs.org/@docusaurus/plugin-google-gtag/-/plugin-google-gtag-3.8.1.tgz", + "integrity": "sha512-tKE8j1cEZCh8KZa4aa80zpSTxsC2/ZYqjx6AAfd8uA8VHZVw79+7OTEP2PoWi0uL5/1Is0LF5Vwxd+1fz5HlKg==", + "license": "MIT", + "dependencies": { + "@docusaurus/core": "3.8.1", + "@docusaurus/types": "3.8.1", + "@docusaurus/utils-validation": "3.8.1", + "@types/gtag.js": "^0.0.12", + "tslib": "^2.6.0" + }, + "engines": { + "node": ">=18.0" + }, + "peerDependencies": { + "react": "^18.0.0 || ^19.0.0", + "react-dom": "^18.0.0 || ^19.0.0" + } + }, + "node_modules/@docusaurus/plugin-google-tag-manager": { + "version": "3.8.1", + "resolved": "https://registry.npmjs.org/@docusaurus/plugin-google-tag-manager/-/plugin-google-tag-manager-3.8.1.tgz", + "integrity": "sha512-iqe3XKITBquZq+6UAXdb1vI0fPY5iIOitVjPQ581R1ZKpHr0qe+V6gVOrrcOHixPDD/BUKdYwkxFjpNiEN+vBw==", + "license": "MIT", + "dependencies": { + "@docusaurus/core": "3.8.1", + "@docusaurus/types": "3.8.1", + "@docusaurus/utils-validation": "3.8.1", + "tslib": "^2.6.0" + }, + "engines": { + "node": ">=18.0" + }, + "peerDependencies": { + "react": "^18.0.0 || ^19.0.0", + "react-dom": "^18.0.0 || ^19.0.0" + } + }, + "node_modules/@docusaurus/plugin-sitemap": { + "version": "3.8.1", + "resolved": "https://registry.npmjs.org/@docusaurus/plugin-sitemap/-/plugin-sitemap-3.8.1.tgz", + "integrity": "sha512-+9YV/7VLbGTq8qNkjiugIelmfUEVkTyLe6X8bWq7K5qPvGXAjno27QAfFq63mYfFFbJc7z+pudL63acprbqGzw==", + "license": "MIT", + "dependencies": { + "@docusaurus/core": "3.8.1", + "@docusaurus/logger": "3.8.1", + "@docusaurus/types": "3.8.1", + "@docusaurus/utils": "3.8.1", + "@docusaurus/utils-common": "3.8.1", + "@docusaurus/utils-validation": "3.8.1", + "fs-extra": "^11.1.1", + "sitemap": "^7.1.1", + "tslib": "^2.6.0" + }, + "engines": { + "node": ">=18.0" + }, + "peerDependencies": { + "react": "^18.0.0 || ^19.0.0", + "react-dom": "^18.0.0 || ^19.0.0" + } + }, + "node_modules/@docusaurus/plugin-svgr": { + "version": "3.8.1", + "resolved": "https://registry.npmjs.org/@docusaurus/plugin-svgr/-/plugin-svgr-3.8.1.tgz", + "integrity": "sha512-rW0LWMDsdlsgowVwqiMb/7tANDodpy1wWPwCcamvhY7OECReN3feoFwLjd/U4tKjNY3encj0AJSTxJA+Fpe+Gw==", + "license": "MIT", + "dependencies": { + "@docusaurus/core": "3.8.1", + "@docusaurus/types": "3.8.1", + "@docusaurus/utils": "3.8.1", + "@docusaurus/utils-validation": "3.8.1", + "@svgr/core": "8.1.0", + "@svgr/webpack": "^8.1.0", + "tslib": "^2.6.0", + "webpack": "^5.88.1" + }, + "engines": { + "node": ">=18.0" + }, + "peerDependencies": { + "react": "^18.0.0 || ^19.0.0", + "react-dom": "^18.0.0 || ^19.0.0" + } + }, + "node_modules/@docusaurus/preset-classic": { + "version": "3.8.1", + "resolved": "https://registry.npmjs.org/@docusaurus/preset-classic/-/preset-classic-3.8.1.tgz", + "integrity": "sha512-yJSjYNHXD8POMGc2mKQuj3ApPrN+eG0rO1UPgSx7jySpYU+n4WjBikbrA2ue5ad9A7aouEtMWUoiSRXTH/g7KQ==", + "license": "MIT", + "dependencies": { + "@docusaurus/core": "3.8.1", + "@docusaurus/plugin-content-blog": "3.8.1", + "@docusaurus/plugin-content-docs": "3.8.1", + "@docusaurus/plugin-content-pages": "3.8.1", + "@docusaurus/plugin-css-cascade-layers": "3.8.1", + "@docusaurus/plugin-debug": "3.8.1", + "@docusaurus/plugin-google-analytics": "3.8.1", + "@docusaurus/plugin-google-gtag": "3.8.1", + "@docusaurus/plugin-google-tag-manager": "3.8.1", + "@docusaurus/plugin-sitemap": "3.8.1", + "@docusaurus/plugin-svgr": "3.8.1", + "@docusaurus/theme-classic": "3.8.1", + "@docusaurus/theme-common": "3.8.1", + "@docusaurus/theme-search-algolia": "3.8.1", + "@docusaurus/types": "3.8.1" + }, + "engines": { + "node": ">=18.0" + }, + "peerDependencies": { + "react": "^18.0.0 || ^19.0.0", + "react-dom": "^18.0.0 || ^19.0.0" + } + }, + "node_modules/@docusaurus/theme-classic": { + "version": "3.8.1", + "resolved": "https://registry.npmjs.org/@docusaurus/theme-classic/-/theme-classic-3.8.1.tgz", + "integrity": "sha512-bqDUCNqXeYypMCsE1VcTXSI1QuO4KXfx8Cvl6rYfY0bhhqN6d2WZlRkyLg/p6pm+DzvanqHOyYlqdPyP0iz+iw==", + "license": "MIT", + "dependencies": { + "@docusaurus/core": "3.8.1", + "@docusaurus/logger": "3.8.1", + "@docusaurus/mdx-loader": "3.8.1", + "@docusaurus/module-type-aliases": "3.8.1", + "@docusaurus/plugin-content-blog": "3.8.1", + "@docusaurus/plugin-content-docs": "3.8.1", + "@docusaurus/plugin-content-pages": "3.8.1", + "@docusaurus/theme-common": "3.8.1", + "@docusaurus/theme-translations": "3.8.1", + "@docusaurus/types": "3.8.1", + "@docusaurus/utils": "3.8.1", + "@docusaurus/utils-common": "3.8.1", + "@docusaurus/utils-validation": "3.8.1", + "@mdx-js/react": "^3.0.0", + "clsx": "^2.0.0", + "copy-text-to-clipboard": "^3.2.0", + "infima": "0.2.0-alpha.45", + "lodash": "^4.17.21", + "nprogress": "^0.2.0", + "postcss": "^8.5.4", + "prism-react-renderer": "^2.3.0", + "prismjs": "^1.29.0", + "react-router-dom": "^5.3.4", + "rtlcss": "^4.1.0", + "tslib": "^2.6.0", + "utility-types": "^3.10.0" + }, + "engines": { + "node": ">=18.0" + }, + "peerDependencies": { + "react": "^18.0.0 || ^19.0.0", + "react-dom": "^18.0.0 || ^19.0.0" + } + }, + "node_modules/@docusaurus/theme-common": { + "version": "3.8.1", + "resolved": "https://registry.npmjs.org/@docusaurus/theme-common/-/theme-common-3.8.1.tgz", + "integrity": "sha512-UswMOyTnPEVRvN5Qzbo+l8k4xrd5fTFu2VPPfD6FcW/6qUtVLmJTQCktbAL3KJ0BVXGm5aJXz/ZrzqFuZERGPw==", + "license": "MIT", + "dependencies": { + "@docusaurus/mdx-loader": "3.8.1", + "@docusaurus/module-type-aliases": "3.8.1", + "@docusaurus/utils": "3.8.1", + "@docusaurus/utils-common": "3.8.1", + "@types/history": "^4.7.11", + "@types/react": "*", + "@types/react-router-config": "*", + "clsx": "^2.0.0", + "parse-numeric-range": "^1.3.0", + "prism-react-renderer": "^2.3.0", + "tslib": "^2.6.0", + "utility-types": "^3.10.0" + }, + "engines": { + "node": ">=18.0" + }, + "peerDependencies": { + "@docusaurus/plugin-content-docs": "*", + "react": "^18.0.0 || ^19.0.0", + "react-dom": "^18.0.0 || ^19.0.0" + } + }, + "node_modules/@docusaurus/theme-search-algolia": { + "version": "3.8.1", + "resolved": "https://registry.npmjs.org/@docusaurus/theme-search-algolia/-/theme-search-algolia-3.8.1.tgz", + "integrity": "sha512-NBFH5rZVQRAQM087aYSRKQ9yGEK9eHd+xOxQjqNpxMiV85OhJDD4ZGz6YJIod26Fbooy54UWVdzNU0TFeUUUzQ==", + "license": "MIT", + "dependencies": { + "@docsearch/react": "^3.9.0", + "@docusaurus/core": "3.8.1", + "@docusaurus/logger": "3.8.1", + "@docusaurus/plugin-content-docs": "3.8.1", + "@docusaurus/theme-common": "3.8.1", + "@docusaurus/theme-translations": "3.8.1", + "@docusaurus/utils": "3.8.1", + "@docusaurus/utils-validation": "3.8.1", + "algoliasearch": "^5.17.1", + "algoliasearch-helper": "^3.22.6", + "clsx": "^2.0.0", + "eta": "^2.2.0", + "fs-extra": "^11.1.1", + "lodash": "^4.17.21", + "tslib": "^2.6.0", + "utility-types": "^3.10.0" + }, + "engines": { + "node": ">=18.0" + }, + "peerDependencies": { + "react": "^18.0.0 || ^19.0.0", + "react-dom": "^18.0.0 || ^19.0.0" + } + }, + "node_modules/@docusaurus/theme-translations": { + "version": "3.8.1", + "resolved": "https://registry.npmjs.org/@docusaurus/theme-translations/-/theme-translations-3.8.1.tgz", + "integrity": "sha512-OTp6eebuMcf2rJt4bqnvuwmm3NVXfzfYejL+u/Y1qwKhZPrjPoKWfk1CbOP5xH5ZOPkiAsx4dHdQBRJszK3z2g==", + "license": "MIT", + "dependencies": { + "fs-extra": "^11.1.1", + "tslib": "^2.6.0" + }, + "engines": { + "node": ">=18.0" + } + }, + "node_modules/@docusaurus/types": { + "version": "3.8.1", + "resolved": "https://registry.npmjs.org/@docusaurus/types/-/types-3.8.1.tgz", + "integrity": "sha512-ZPdW5AB+pBjiVrcLuw3dOS6BFlrG0XkS2lDGsj8TizcnREQg3J8cjsgfDviszOk4CweNfwo1AEELJkYaMUuOPg==", + "license": "MIT", + "dependencies": { + "@mdx-js/mdx": "^3.0.0", + "@types/history": "^4.7.11", + "@types/react": "*", + "commander": "^5.1.0", + "joi": "^17.9.2", + "react-helmet-async": "npm:@slorber/react-helmet-async@1.3.0", + "utility-types": "^3.10.0", + "webpack": "^5.95.0", + "webpack-merge": "^5.9.0" + }, + "peerDependencies": { + "react": "^18.0.0 || ^19.0.0", + "react-dom": "^18.0.0 || ^19.0.0" + } + }, + "node_modules/@docusaurus/types/node_modules/webpack-merge": { + "version": "5.10.0", + "resolved": "https://registry.npmjs.org/webpack-merge/-/webpack-merge-5.10.0.tgz", + "integrity": "sha512-+4zXKdx7UnO+1jaN4l2lHVD+mFvnlZQP/6ljaJVb4SZiwIKeUnrT5l0gkT8z+n4hKpC+jpOv6O9R+gLtag7pSA==", + "license": "MIT", + "dependencies": { + "clone-deep": "^4.0.1", + "flat": "^5.0.2", + "wildcard": "^2.0.0" + }, + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/@docusaurus/utils": { + "version": "3.8.1", + "resolved": "https://registry.npmjs.org/@docusaurus/utils/-/utils-3.8.1.tgz", + "integrity": "sha512-P1ml0nvOmEFdmu0smSXOqTS1sxU5tqvnc0dA4MTKV39kye+bhQnjkIKEE18fNOvxjyB86k8esoCIFM3x4RykOQ==", + "license": "MIT", + "dependencies": { + "@docusaurus/logger": "3.8.1", + "@docusaurus/types": "3.8.1", + "@docusaurus/utils-common": "3.8.1", + "escape-string-regexp": "^4.0.0", + "execa": "5.1.1", + "file-loader": "^6.2.0", + "fs-extra": "^11.1.1", + "github-slugger": "^1.5.0", + "globby": "^11.1.0", + "gray-matter": "^4.0.3", + "jiti": "^1.20.0", + "js-yaml": "^4.1.0", + "lodash": "^4.17.21", + "micromatch": "^4.0.5", + "p-queue": "^6.6.2", + "prompts": "^2.4.2", + "resolve-pathname": "^3.0.0", + "tslib": "^2.6.0", + "url-loader": "^4.1.1", + "utility-types": "^3.10.0", + "webpack": "^5.88.1" + }, + "engines": { + "node": ">=18.0" + } + }, + "node_modules/@docusaurus/utils-common": { + "version": "3.8.1", + "resolved": "https://registry.npmjs.org/@docusaurus/utils-common/-/utils-common-3.8.1.tgz", + "integrity": "sha512-zTZiDlvpvoJIrQEEd71c154DkcriBecm4z94OzEE9kz7ikS3J+iSlABhFXM45mZ0eN5pVqqr7cs60+ZlYLewtg==", + "license": "MIT", + "dependencies": { + "@docusaurus/types": "3.8.1", + "tslib": "^2.6.0" + }, + "engines": { + "node": ">=18.0" + } + }, + "node_modules/@docusaurus/utils-validation": { + "version": "3.8.1", + "resolved": "https://registry.npmjs.org/@docusaurus/utils-validation/-/utils-validation-3.8.1.tgz", + "integrity": "sha512-gs5bXIccxzEbyVecvxg6upTwaUbfa0KMmTj7HhHzc016AGyxH2o73k1/aOD0IFrdCsfJNt37MqNI47s2MgRZMA==", + "license": "MIT", + "dependencies": { + "@docusaurus/logger": "3.8.1", + "@docusaurus/utils": "3.8.1", + "@docusaurus/utils-common": "3.8.1", + "fs-extra": "^11.2.0", + "joi": "^17.9.2", + "js-yaml": "^4.1.0", + "lodash": "^4.17.21", + "tslib": "^2.6.0" + }, + "engines": { + "node": ">=18.0" + } + }, + "node_modules/@easyops-cn/autocomplete.js": { + "version": "0.38.1", + "resolved": "https://registry.npmjs.org/@easyops-cn/autocomplete.js/-/autocomplete.js-0.38.1.tgz", + "integrity": "sha512-drg76jS6syilOUmVNkyo1c7ZEBPcPuK+aJA7AksM5ZIIbV57DMHCywiCr+uHyv8BE5jUTU98j/H7gVrkHrWW3Q==", + "license": "MIT", + "dependencies": { + "cssesc": "^3.0.0", + "immediate": "^3.2.3" + } + }, + "node_modules/@easyops-cn/docusaurus-search-local": { + "version": "0.52.1", + "resolved": "https://registry.npmjs.org/@easyops-cn/docusaurus-search-local/-/docusaurus-search-local-0.52.1.tgz", + "integrity": "sha512-pwfANjTLOQyAPc2Iz93WbG4OQM5C4COCWARbLAs79FIpIS38gHq3PrbDIX8f7oDhGQp1u6f8fr3K3u3+yZXZTA==", + "license": "MIT", + "dependencies": { + "@docusaurus/plugin-content-docs": "^2 || ^3", + "@docusaurus/theme-translations": "^2 || ^3", + "@docusaurus/utils": "^2 || ^3", + "@docusaurus/utils-common": "^2 || ^3", + "@docusaurus/utils-validation": "^2 || ^3", + "@easyops-cn/autocomplete.js": "^0.38.1", + "@node-rs/jieba": "^1.6.0", + "cheerio": "^1.0.0", + "clsx": "^2.1.1", + "comlink": "^4.4.2", + "debug": "^4.2.0", + "fs-extra": "^10.0.0", + "klaw-sync": "^6.0.0", + "lunr": "^2.3.9", + "lunr-languages": "^1.4.0", + "mark.js": "^8.11.1", + "tslib": "^2.4.0" + }, + "engines": { + "node": ">=12" + }, + "peerDependencies": { + "@docusaurus/theme-common": "^2 || ^3", + "react": "^16.14.0 || ^17 || ^18 || ^19", + "react-dom": "^16.14.0 || 17 || ^18 || ^19" + } + }, + "node_modules/@easyops-cn/docusaurus-search-local/node_modules/cheerio": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/cheerio/-/cheerio-1.1.2.tgz", + "integrity": "sha512-IkxPpb5rS/d1IiLbHMgfPuS0FgiWTtFIm/Nj+2woXDLTZ7fOT2eqzgYbdMlLweqlHbsZjxEChoVK+7iph7jyQg==", + "license": "MIT", + "dependencies": { + "cheerio-select": "^2.1.0", + "dom-serializer": "^2.0.0", + "domhandler": "^5.0.3", + "domutils": "^3.2.2", + "encoding-sniffer": "^0.2.1", + "htmlparser2": "^10.0.0", + "parse5": "^7.3.0", + "parse5-htmlparser2-tree-adapter": "^7.1.0", + "parse5-parser-stream": "^7.1.2", + "undici": "^7.12.0", + "whatwg-mimetype": "^4.0.0" + }, + "engines": { + "node": ">=20.18.1" + }, + "funding": { + "url": "https://github.com/cheeriojs/cheerio?sponsor=1" + } + }, + "node_modules/@easyops-cn/docusaurus-search-local/node_modules/entities": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/entities/-/entities-6.0.1.tgz", + "integrity": "sha512-aN97NXWF6AWBTahfVOIrB/NShkzi5H7F9r1s9mD3cDj4Ko5f2qhhVoYMibXF7GlLveb/D2ioWay8lxI97Ven3g==", + "license": "BSD-2-Clause", + "engines": { + "node": ">=0.12" + }, + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" + } + }, + "node_modules/@easyops-cn/docusaurus-search-local/node_modules/fs-extra": { + "version": "10.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.1.0.tgz", + "integrity": "sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==", + "license": "MIT", + "dependencies": { + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/@easyops-cn/docusaurus-search-local/node_modules/htmlparser2": { + "version": "10.0.0", + "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-10.0.0.tgz", + "integrity": "sha512-TwAZM+zE5Tq3lrEHvOlvwgj1XLWQCtaaibSN11Q+gGBAS7Y1uZSWwXXRe4iF6OXnaq1riyQAPFOBtYc77Mxq0g==", + "funding": [ + "https://github.com/fb55/htmlparser2?sponsor=1", + { + "type": "github", + "url": "https://github.com/sponsors/fb55" + } + ], + "license": "MIT", + "dependencies": { + "domelementtype": "^2.3.0", + "domhandler": "^5.0.3", + "domutils": "^3.2.1", + "entities": "^6.0.0" + } + }, + "node_modules/@emnapi/core": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/@emnapi/core/-/core-1.5.0.tgz", + "integrity": "sha512-sbP8GzB1WDzacS8fgNPpHlp6C9VZe+SJP3F90W9rLemaQj2PzIuTEl1qDOYQf58YIpyjViI24y9aPWCjEzY2cg==", + "license": "MIT", + "optional": true, + "dependencies": { + "@emnapi/wasi-threads": "1.1.0", + "tslib": "^2.4.0" + } + }, + "node_modules/@emnapi/runtime": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/@emnapi/runtime/-/runtime-1.5.0.tgz", + "integrity": "sha512-97/BJ3iXHww3djw6hYIfErCZFee7qCtrneuLa20UXFCOTCfBM2cvQHjWJ2EG0s0MtdNwInarqCTz35i4wWXHsQ==", + "license": "MIT", + "optional": true, + "dependencies": { + "tslib": "^2.4.0" + } + }, + "node_modules/@emnapi/wasi-threads": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@emnapi/wasi-threads/-/wasi-threads-1.1.0.tgz", + "integrity": "sha512-WI0DdZ8xFSbgMjR1sFsKABJ/C5OnRrjT06JXbZKexJGrDuPTzZdDYfFlsgcCXCyf+suG5QU2e/y1Wo2V/OapLQ==", + "license": "MIT", + "optional": true, + "dependencies": { + "tslib": "^2.4.0" + } + }, + "node_modules/@exodus/schemasafe": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/@exodus/schemasafe/-/schemasafe-1.3.0.tgz", + "integrity": "sha512-5Aap/GaRupgNx/feGBwLLTVv8OQFfv3pq2lPRzPg9R+IOBnDgghTGW7l7EuVXOvg5cc/xSAlRW8rBrjIC3Nvqw==", + "license": "MIT" + }, + "node_modules/@faker-js/faker": { + "version": "5.5.3", + "resolved": "https://registry.npmjs.org/@faker-js/faker/-/faker-5.5.3.tgz", + "integrity": "sha512-R11tGE6yIFwqpaIqcfkcg7AICXzFg14+5h5v0TfF/9+RMDL6jhzCy/pxHVOfbALGdtVYdt6JdR21tuxEgl34dw==", + "deprecated": "Please update to a newer version.", + "license": "MIT" + }, + "node_modules/@hapi/hoek": { + "version": "9.3.0", + "resolved": "https://registry.npmjs.org/@hapi/hoek/-/hoek-9.3.0.tgz", + "integrity": "sha512-/c6rf4UJlmHlC9b5BaNvzAcFv7HZ2QHaV0D4/HNlBdvFnvQq8RI4kYdhyPCl7Xj+oWvTWQ8ujhqS53LIgAe6KQ==", + "license": "BSD-3-Clause" + }, + "node_modules/@hapi/topo": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/@hapi/topo/-/topo-5.1.0.tgz", + "integrity": "sha512-foQZKJig7Ob0BMAYBfcJk8d77QtOe7Wo4ox7ff1lQYoNNAb6jwcY1ncdoy2e9wQZzvNy7ODZCYJkK8kzmcAnAg==", + "license": "BSD-3-Clause", + "dependencies": { + "@hapi/hoek": "^9.0.0" + } + }, + "node_modules/@hookform/error-message": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/@hookform/error-message/-/error-message-2.0.1.tgz", + "integrity": "sha512-U410sAr92xgxT1idlu9WWOVjndxLdgPUHEB8Schr27C9eh7/xUnITWpCMF93s+lGiG++D4JnbSnrb5A21AdSNg==", + "license": "MIT", + "peerDependencies": { + "react": ">=16.8.0", + "react-dom": ">=16.8.0", + "react-hook-form": "^7.0.0" + } + }, + "node_modules/@isaacs/cliui": { + "version": "8.0.2", + "resolved": "https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz", + "integrity": "sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==", + "license": "ISC", + "dependencies": { + "string-width": "^5.1.2", + "string-width-cjs": "npm:string-width@^4.2.0", + "strip-ansi": "^7.0.1", + "strip-ansi-cjs": "npm:strip-ansi@^6.0.1", + "wrap-ansi": "^8.1.0", + "wrap-ansi-cjs": "npm:wrap-ansi@^7.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/@isaacs/cliui/node_modules/ansi-regex": { + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.2.2.tgz", + "integrity": "sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg==", + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" + } + }, + "node_modules/@isaacs/cliui/node_modules/strip-ansi": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.2.tgz", + "integrity": "sha512-gmBGslpoQJtgnMAvOVqGZpEz9dyoKTCzy2nfz/n8aIFhN/jCE/rCmcxabB6jOOHV+0WNnylOxaxBQPSvcWklhA==", + "license": "MIT", + "dependencies": { + "ansi-regex": "^6.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" + } + }, + "node_modules/@jest/schemas": { + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-29.6.3.tgz", + "integrity": "sha512-mo5j5X+jIZmJQveBKeS/clAueipV7KgiX1vMgCxam1RNYiqE1w62n0/tJJnHtjW8ZHcQco5gY85jA3mi0L+nSA==", + "license": "MIT", + "dependencies": { + "@sinclair/typebox": "^0.27.8" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/types": { + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-29.6.3.tgz", + "integrity": "sha512-u3UPsIilWKOM3F9CXtrG8LEJmNxwoCQC/XVj4IKYXvvpx7QIi/Kg1LI5uDmDpKlac62NUtX7eLjRh+jVZcLOzw==", + "license": "MIT", + "dependencies": { + "@jest/schemas": "^29.6.3", + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^3.0.0", + "@types/node": "*", + "@types/yargs": "^17.0.8", + "chalk": "^4.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jridgewell/gen-mapping": { + "version": "0.3.13", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.13.tgz", + "integrity": "sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==", + "license": "MIT", + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.5.0", + "@jridgewell/trace-mapping": "^0.3.24" + } + }, + "node_modules/@jridgewell/remapping": { + "version": "2.3.5", + "resolved": "https://registry.npmjs.org/@jridgewell/remapping/-/remapping-2.3.5.tgz", + "integrity": "sha512-LI9u/+laYG4Ds1TDKSJW2YPrIlcVYOwi2fUC6xB43lueCjgxV4lffOCZCtYFiH6TNOX+tQKXx97T4IKHbhyHEQ==", + "license": "MIT", + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.24" + } + }, + "node_modules/@jridgewell/resolve-uri": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", + "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", + "license": "MIT", + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/source-map": { + "version": "0.3.11", + "resolved": "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.11.tgz", + "integrity": "sha512-ZMp1V8ZFcPG5dIWnQLr3NSI1MiCU7UETdS/A0G8V/XWHvJv3ZsFqutJn1Y5RPmAPX6F3BiE397OqveU/9NCuIA==", + "license": "MIT", + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.25" + } + }, + "node_modules/@jridgewell/sourcemap-codec": { + "version": "1.5.5", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.5.tgz", + "integrity": "sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==", + "license": "MIT" + }, + "node_modules/@jridgewell/trace-mapping": { + "version": "0.3.31", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.31.tgz", + "integrity": "sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==", + "license": "MIT", + "dependencies": { + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" + } + }, + "node_modules/@jsdevtools/ono": { + "version": "7.1.3", + "resolved": "https://registry.npmjs.org/@jsdevtools/ono/-/ono-7.1.3.tgz", + "integrity": "sha512-4JQNk+3mVzK3xh2rqd6RB4J46qUR19azEHBneZyTZM+c456qOrbbM/5xcR8huNCCcbVt7+UmizG6GuUvPvKUYg==", + "license": "MIT" + }, + "node_modules/@leichtgewicht/ip-codec": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@leichtgewicht/ip-codec/-/ip-codec-2.0.5.tgz", + "integrity": "sha512-Vo+PSpZG2/fmgmiNzYK9qWRh8h/CHrwD0mo1h1DzL4yzHNSfWYujGTYsWGreD000gcgmZ7K4Ys6Tx9TxtsKdDw==", + "license": "MIT" + }, + "node_modules/@mdx-js/mdx": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/@mdx-js/mdx/-/mdx-3.1.1.tgz", + "integrity": "sha512-f6ZO2ifpwAQIpzGWaBQT2TXxPv6z3RBzQKpVftEWN78Vl/YweF1uwussDx8ECAXVtr3Rs89fKyG9YlzUs9DyGQ==", + "license": "MIT", + "dependencies": { + "@types/estree": "^1.0.0", + "@types/estree-jsx": "^1.0.0", + "@types/hast": "^3.0.0", + "@types/mdx": "^2.0.0", + "acorn": "^8.0.0", + "collapse-white-space": "^2.0.0", + "devlop": "^1.0.0", + "estree-util-is-identifier-name": "^3.0.0", + "estree-util-scope": "^1.0.0", + "estree-walker": "^3.0.0", + "hast-util-to-jsx-runtime": "^2.0.0", + "markdown-extensions": "^2.0.0", + "recma-build-jsx": "^1.0.0", + "recma-jsx": "^1.0.0", + "recma-stringify": "^1.0.0", + "rehype-recma": "^1.0.0", + "remark-mdx": "^3.0.0", + "remark-parse": "^11.0.0", + "remark-rehype": "^11.0.0", + "source-map": "^0.7.0", + "unified": "^11.0.0", + "unist-util-position-from-estree": "^2.0.0", + "unist-util-stringify-position": "^4.0.0", + "unist-util-visit": "^5.0.0", + "vfile": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/@mdx-js/react": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/@mdx-js/react/-/react-3.1.1.tgz", + "integrity": "sha512-f++rKLQgUVYDAtECQ6fn/is15GkEH9+nZPM3MS0RcxVqoTfawHvDlSCH7JbMhAM6uJ32v3eXLvLmLvjGu7PTQw==", + "license": "MIT", + "dependencies": { + "@types/mdx": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + }, + "peerDependencies": { + "@types/react": ">=16", + "react": ">=16" + } + }, + "node_modules/@napi-rs/wasm-runtime": { + "version": "0.2.12", + "resolved": "https://registry.npmjs.org/@napi-rs/wasm-runtime/-/wasm-runtime-0.2.12.tgz", + "integrity": "sha512-ZVWUcfwY4E/yPitQJl481FjFo3K22D6qF0DuFH6Y/nbnE11GY5uguDxZMGXPQ8WQ0128MXQD7TnfHyK4oWoIJQ==", + "license": "MIT", + "optional": true, + "dependencies": { + "@emnapi/core": "^1.4.3", + "@emnapi/runtime": "^1.4.3", + "@tybys/wasm-util": "^0.10.0" + } + }, + "node_modules/@node-rs/jieba": { + "version": "1.10.4", + "resolved": "https://registry.npmjs.org/@node-rs/jieba/-/jieba-1.10.4.tgz", + "integrity": "sha512-GvDgi8MnBiyWd6tksojej8anIx18244NmIOc1ovEw8WKNUejcccLfyu8vj66LWSuoZuKILVtNsOy4jvg3aoxIw==", + "license": "MIT", + "engines": { + "node": ">= 10" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/Brooooooklyn" + }, + "optionalDependencies": { + "@node-rs/jieba-android-arm-eabi": "1.10.4", + "@node-rs/jieba-android-arm64": "1.10.4", + "@node-rs/jieba-darwin-arm64": "1.10.4", + "@node-rs/jieba-darwin-x64": "1.10.4", + "@node-rs/jieba-freebsd-x64": "1.10.4", + "@node-rs/jieba-linux-arm-gnueabihf": "1.10.4", + "@node-rs/jieba-linux-arm64-gnu": "1.10.4", + "@node-rs/jieba-linux-arm64-musl": "1.10.4", + "@node-rs/jieba-linux-x64-gnu": "1.10.4", + "@node-rs/jieba-linux-x64-musl": "1.10.4", + "@node-rs/jieba-wasm32-wasi": "1.10.4", + "@node-rs/jieba-win32-arm64-msvc": "1.10.4", + "@node-rs/jieba-win32-ia32-msvc": "1.10.4", + "@node-rs/jieba-win32-x64-msvc": "1.10.4" + } + }, + "node_modules/@node-rs/jieba-android-arm-eabi": { + "version": "1.10.4", + "resolved": "https://registry.npmjs.org/@node-rs/jieba-android-arm-eabi/-/jieba-android-arm-eabi-1.10.4.tgz", + "integrity": "sha512-MhyvW5N3Fwcp385d0rxbCWH42kqDBatQTyP8XbnYbju2+0BO/eTeCCLYj7Agws4pwxn2LtdldXRSKavT7WdzNA==", + "cpu": [ + "arm" + ], + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@node-rs/jieba-android-arm64": { + "version": "1.10.4", + "resolved": "https://registry.npmjs.org/@node-rs/jieba-android-arm64/-/jieba-android-arm64-1.10.4.tgz", + "integrity": "sha512-XyDwq5+rQ+Tk55A+FGi6PtJbzf974oqnpyCcCPzwU3QVXJCa2Rr4Lci+fx8oOpU4plT3GuD+chXMYLsXipMgJA==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@node-rs/jieba-darwin-arm64": { + "version": "1.10.4", + "resolved": "https://registry.npmjs.org/@node-rs/jieba-darwin-arm64/-/jieba-darwin-arm64-1.10.4.tgz", + "integrity": "sha512-G++RYEJ2jo0rxF9626KUy90wp06TRUjAsvY/BrIzEOX/ingQYV/HjwQzNPRR1P1o32a6/U8RGo7zEBhfdybL6w==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@node-rs/jieba-darwin-x64": { + "version": "1.10.4", + "resolved": "https://registry.npmjs.org/@node-rs/jieba-darwin-x64/-/jieba-darwin-x64-1.10.4.tgz", + "integrity": "sha512-MmDNeOb2TXIZCPyWCi2upQnZpPjAxw5ZGEj6R8kNsPXVFALHIKMa6ZZ15LCOkSTsKXVC17j2t4h+hSuyYb6qfQ==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@node-rs/jieba-freebsd-x64": { + "version": "1.10.4", + "resolved": "https://registry.npmjs.org/@node-rs/jieba-freebsd-x64/-/jieba-freebsd-x64-1.10.4.tgz", + "integrity": "sha512-/x7aVQ8nqUWhpXU92RZqd333cq639i/olNpd9Z5hdlyyV5/B65LLy+Je2B2bfs62PVVm5QXRpeBcZqaHelp/bg==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@node-rs/jieba-linux-arm-gnueabihf": { + "version": "1.10.4", + "resolved": "https://registry.npmjs.org/@node-rs/jieba-linux-arm-gnueabihf/-/jieba-linux-arm-gnueabihf-1.10.4.tgz", + "integrity": "sha512-crd2M35oJBRLkoESs0O6QO3BBbhpv+tqXuKsqhIG94B1d02RVxtRIvSDwO33QurxqSdvN9IeSnVpHbDGkuXm3g==", + "cpu": [ + "arm" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@node-rs/jieba-linux-arm64-gnu": { + "version": "1.10.4", + "resolved": "https://registry.npmjs.org/@node-rs/jieba-linux-arm64-gnu/-/jieba-linux-arm64-gnu-1.10.4.tgz", + "integrity": "sha512-omIzNX1psUzPcsdnUhGU6oHeOaTCuCjUgOA/v/DGkvWC1jLcnfXe4vdYbtXMh4XOCuIgS1UCcvZEc8vQLXFbXQ==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@node-rs/jieba-linux-arm64-musl": { + "version": "1.10.4", + "resolved": "https://registry.npmjs.org/@node-rs/jieba-linux-arm64-musl/-/jieba-linux-arm64-musl-1.10.4.tgz", + "integrity": "sha512-Y/tiJ1+HeS5nnmLbZOE+66LbsPOHZ/PUckAYVeLlQfpygLEpLYdlh0aPpS5uiaWMjAXYZYdFkpZHhxDmSLpwpw==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@node-rs/jieba-linux-x64-gnu": { + "version": "1.10.4", + "resolved": "https://registry.npmjs.org/@node-rs/jieba-linux-x64-gnu/-/jieba-linux-x64-gnu-1.10.4.tgz", + "integrity": "sha512-WZO8ykRJpWGE9MHuZpy1lu3nJluPoeB+fIJJn5CWZ9YTVhNDWoCF4i/7nxz1ntulINYGQ8VVuCU9LD86Mek97g==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@node-rs/jieba-linux-x64-musl": { + "version": "1.10.4", + "resolved": "https://registry.npmjs.org/@node-rs/jieba-linux-x64-musl/-/jieba-linux-x64-musl-1.10.4.tgz", + "integrity": "sha512-uBBD4S1rGKcgCyAk6VCKatEVQb6EDD5I40v/DxODi5CuZVCANi9m5oee/MQbAoaX7RydA2f0OSCE9/tcwXEwUg==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@node-rs/jieba-wasm32-wasi": { + "version": "1.10.4", + "resolved": "https://registry.npmjs.org/@node-rs/jieba-wasm32-wasi/-/jieba-wasm32-wasi-1.10.4.tgz", + "integrity": "sha512-Y2umiKHjuIJy0uulNDz9SDYHdfq5Hmy7jY5nORO99B4pySKkcrMjpeVrmWXJLIsEKLJwcCXHxz8tjwU5/uhz0A==", + "cpu": [ + "wasm32" + ], + "license": "MIT", + "optional": true, + "dependencies": { + "@napi-rs/wasm-runtime": "^0.2.3" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@node-rs/jieba-win32-arm64-msvc": { + "version": "1.10.4", + "resolved": "https://registry.npmjs.org/@node-rs/jieba-win32-arm64-msvc/-/jieba-win32-arm64-msvc-1.10.4.tgz", + "integrity": "sha512-nwMtViFm4hjqhz1it/juQnxpXgqlGltCuWJ02bw70YUDMDlbyTy3grCJPpQQpueeETcALUnTxda8pZuVrLRcBA==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@node-rs/jieba-win32-ia32-msvc": { + "version": "1.10.4", + "resolved": "https://registry.npmjs.org/@node-rs/jieba-win32-ia32-msvc/-/jieba-win32-ia32-msvc-1.10.4.tgz", + "integrity": "sha512-DCAvLx7Z+W4z5oKS+7vUowAJr0uw9JBw8x1Y23Xs/xMA4Em+OOSiaF5/tCJqZUCJ8uC4QeImmgDFiBqGNwxlyA==", + "cpu": [ + "ia32" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@node-rs/jieba-win32-x64-msvc": { + "version": "1.10.4", + "resolved": "https://registry.npmjs.org/@node-rs/jieba-win32-x64-msvc/-/jieba-win32-x64-msvc-1.10.4.tgz", + "integrity": "sha512-+sqemSfS1jjb+Tt7InNbNzrRh1Ua3vProVvC4BZRPg010/leCbGFFiQHpzcPRfpxAXZrzG5Y0YBTsPzN/I4yHQ==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@nodelib/fs.scandir": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", + "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", + "license": "MIT", + "dependencies": { + "@nodelib/fs.stat": "2.0.5", + "run-parallel": "^1.1.9" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.stat": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", + "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", + "license": "MIT", + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.walk": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", + "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", + "license": "MIT", + "dependencies": { + "@nodelib/fs.scandir": "2.1.5", + "fastq": "^1.6.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@parcel/watcher": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/@parcel/watcher/-/watcher-2.5.1.tgz", + "integrity": "sha512-dfUnCxiN9H4ap84DvD2ubjw+3vUNpstxa0TneY/Paat8a3R4uQZDLSvWjmznAY/DoahqTHl9V46HF/Zs3F29pg==", + "hasInstallScript": true, + "license": "MIT", + "optional": true, + "dependencies": { + "detect-libc": "^1.0.3", + "is-glob": "^4.0.3", + "micromatch": "^4.0.5", + "node-addon-api": "^7.0.0" + }, + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + }, + "optionalDependencies": { + "@parcel/watcher-android-arm64": "2.5.1", + "@parcel/watcher-darwin-arm64": "2.5.1", + "@parcel/watcher-darwin-x64": "2.5.1", + "@parcel/watcher-freebsd-x64": "2.5.1", + "@parcel/watcher-linux-arm-glibc": "2.5.1", + "@parcel/watcher-linux-arm-musl": "2.5.1", + "@parcel/watcher-linux-arm64-glibc": "2.5.1", + "@parcel/watcher-linux-arm64-musl": "2.5.1", + "@parcel/watcher-linux-x64-glibc": "2.5.1", + "@parcel/watcher-linux-x64-musl": "2.5.1", + "@parcel/watcher-win32-arm64": "2.5.1", + "@parcel/watcher-win32-ia32": "2.5.1", + "@parcel/watcher-win32-x64": "2.5.1" + } + }, + "node_modules/@parcel/watcher-android-arm64": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/@parcel/watcher-android-arm64/-/watcher-android-arm64-2.5.1.tgz", + "integrity": "sha512-KF8+j9nNbUN8vzOFDpRMsaKBHZ/mcjEjMToVMJOhTozkDonQFFrRcfdLWn6yWKCmJKmdVxSgHiYvTCef4/qcBA==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-darwin-arm64": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/@parcel/watcher-darwin-arm64/-/watcher-darwin-arm64-2.5.1.tgz", + "integrity": "sha512-eAzPv5osDmZyBhou8PoF4i6RQXAfeKL9tjb3QzYuccXFMQU0ruIc/POh30ePnaOyD1UXdlKguHBmsTs53tVoPw==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-darwin-x64": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/@parcel/watcher-darwin-x64/-/watcher-darwin-x64-2.5.1.tgz", + "integrity": "sha512-1ZXDthrnNmwv10A0/3AJNZ9JGlzrF82i3gNQcWOzd7nJ8aj+ILyW1MTxVk35Db0u91oD5Nlk9MBiujMlwmeXZg==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-freebsd-x64": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/@parcel/watcher-freebsd-x64/-/watcher-freebsd-x64-2.5.1.tgz", + "integrity": "sha512-SI4eljM7Flp9yPuKi8W0ird8TI/JK6CSxju3NojVI6BjHsTyK7zxA9urjVjEKJ5MBYC+bLmMcbAWlZ+rFkLpJQ==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-linux-arm-glibc": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-arm-glibc/-/watcher-linux-arm-glibc-2.5.1.tgz", + "integrity": "sha512-RCdZlEyTs8geyBkkcnPWvtXLY44BCeZKmGYRtSgtwwnHR4dxfHRG3gR99XdMEdQ7KeiDdasJwwvNSF5jKtDwdA==", + "cpu": [ + "arm" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-linux-arm-musl": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-arm-musl/-/watcher-linux-arm-musl-2.5.1.tgz", + "integrity": "sha512-6E+m/Mm1t1yhB8X412stiKFG3XykmgdIOqhjWj+VL8oHkKABfu/gjFj8DvLrYVHSBNC+/u5PeNrujiSQ1zwd1Q==", + "cpu": [ + "arm" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-linux-arm64-glibc": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-arm64-glibc/-/watcher-linux-arm64-glibc-2.5.1.tgz", + "integrity": "sha512-LrGp+f02yU3BN9A+DGuY3v3bmnFUggAITBGriZHUREfNEzZh/GO06FF5u2kx8x+GBEUYfyTGamol4j3m9ANe8w==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-linux-arm64-musl": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-arm64-musl/-/watcher-linux-arm64-musl-2.5.1.tgz", + "integrity": "sha512-cFOjABi92pMYRXS7AcQv9/M1YuKRw8SZniCDw0ssQb/noPkRzA+HBDkwmyOJYp5wXcsTrhxO0zq1U11cK9jsFg==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-linux-x64-glibc": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-x64-glibc/-/watcher-linux-x64-glibc-2.5.1.tgz", + "integrity": "sha512-GcESn8NZySmfwlTsIur+49yDqSny2IhPeZfXunQi48DMugKeZ7uy1FX83pO0X22sHntJ4Ub+9k34XQCX+oHt2A==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-linux-x64-musl": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-x64-musl/-/watcher-linux-x64-musl-2.5.1.tgz", + "integrity": "sha512-n0E2EQbatQ3bXhcH2D1XIAANAcTZkQICBPVaxMeaCVBtOpBZpWJuf7LwyWPSBDITb7In8mqQgJ7gH8CILCURXg==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-win32-arm64": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/@parcel/watcher-win32-arm64/-/watcher-win32-arm64-2.5.1.tgz", + "integrity": "sha512-RFzklRvmc3PkjKjry3hLF9wD7ppR4AKcWNzH7kXR7GUe0Igb3Nz8fyPwtZCSquGrhU5HhUNDr/mKBqj7tqA2Vw==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-win32-ia32": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/@parcel/watcher-win32-ia32/-/watcher-win32-ia32-2.5.1.tgz", + "integrity": "sha512-c2KkcVN+NJmuA7CGlaGD1qJh1cLfDnQsHjE89E60vUEMlqduHGCdCLJCID5geFVM0dOtA3ZiIO8BoEQmzQVfpQ==", + "cpu": [ + "ia32" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-win32-x64": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/@parcel/watcher-win32-x64/-/watcher-win32-x64-2.5.1.tgz", + "integrity": "sha512-9lHBdJITeNR++EvSQVUcaZoWupyHfXe1jZvGZ06O/5MflPcuPLtEphScIBL+AiCWBO46tDSHzWyD0uDmmZqsgA==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@pkgjs/parseargs": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz", + "integrity": "sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==", + "license": "MIT", + "optional": true, + "engines": { + "node": ">=14" + } + }, + "node_modules/@pnpm/config.env-replace": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@pnpm/config.env-replace/-/config.env-replace-1.1.0.tgz", + "integrity": "sha512-htyl8TWnKL7K/ESFa1oW2UB5lVDxuF5DpM7tBi6Hu2LNL3mWkIzNLG6N4zoCUP1lCKNxWy/3iu8mS8MvToGd6w==", + "license": "MIT", + "engines": { + "node": ">=12.22.0" + } + }, + "node_modules/@pnpm/network.ca-file": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@pnpm/network.ca-file/-/network.ca-file-1.0.2.tgz", + "integrity": "sha512-YcPQ8a0jwYU9bTdJDpXjMi7Brhkr1mXsXrUJvjqM2mQDgkRiz8jFaQGOdaLxgjtUfQgZhKy/O3cG/YwmgKaxLA==", + "license": "MIT", + "dependencies": { + "graceful-fs": "4.2.10" + }, + "engines": { + "node": ">=12.22.0" + } + }, + "node_modules/@pnpm/network.ca-file/node_modules/graceful-fs": { + "version": "4.2.10", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.10.tgz", + "integrity": "sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA==", + "license": "ISC" + }, + "node_modules/@pnpm/npm-conf": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/@pnpm/npm-conf/-/npm-conf-2.3.1.tgz", + "integrity": "sha512-c83qWb22rNRuB0UaVCI0uRPNRr8Z0FWnEIvT47jiHAmOIUHbBOg5XvV7pM5x+rKn9HRpjxquDbXYSXr3fAKFcw==", + "license": "MIT", + "dependencies": { + "@pnpm/config.env-replace": "^1.1.0", + "@pnpm/network.ca-file": "^1.0.1", + "config-chain": "^1.1.11" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/@polka/url": { + "version": "1.0.0-next.29", + "resolved": "https://registry.npmjs.org/@polka/url/-/url-1.0.0-next.29.tgz", + "integrity": "sha512-wwQAWhWSuHaag8c4q/KN/vCoeOJYshAIvMQwD4GpSb3OiZklFfvAgmj0VCBBImRpuF/aFgIRzllXlVX93Jevww==", + "license": "MIT" + }, + "node_modules/@redocly/ajv": { + "version": "8.11.3", + "resolved": "https://registry.npmjs.org/@redocly/ajv/-/ajv-8.11.3.tgz", + "integrity": "sha512-4P3iZse91TkBiY+Dx5DUgxQ9GXkVJf++cmI0MOyLDxV9b5MUBI4II6ES8zA5JCbO72nKAJxWrw4PUPW+YP3ZDQ==", + "license": "MIT", + "dependencies": { + "fast-deep-equal": "^3.1.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2", + "uri-js-replace": "^1.0.1" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/@redocly/config": { + "version": "0.22.2", + "resolved": "https://registry.npmjs.org/@redocly/config/-/config-0.22.2.tgz", + "integrity": "sha512-roRDai8/zr2S9YfmzUfNhKjOF0NdcOIqF7bhf4MVC5UxpjIysDjyudvlAiVbpPHp3eDRWbdzUgtkK1a7YiDNyQ==", + "license": "MIT" + }, + "node_modules/@redocly/openapi-core": { + "version": "1.34.5", + "resolved": "https://registry.npmjs.org/@redocly/openapi-core/-/openapi-core-1.34.5.tgz", + "integrity": "sha512-0EbE8LRbkogtcCXU7liAyC00n9uNG9hJ+eMyHFdUsy9lB/WGqnEBgwjA9q2cyzAVcdTkQqTBBU1XePNnN3OijA==", + "license": "MIT", + "dependencies": { + "@redocly/ajv": "^8.11.2", + "@redocly/config": "^0.22.0", + "colorette": "^1.2.0", + "https-proxy-agent": "^7.0.5", + "js-levenshtein": "^1.1.6", + "js-yaml": "^4.1.0", + "minimatch": "^5.0.1", + "pluralize": "^8.0.0", + "yaml-ast-parser": "0.0.43" + }, + "engines": { + "node": ">=18.17.0", + "npm": ">=9.5.0" + } + }, + "node_modules/@sideway/address": { + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/@sideway/address/-/address-4.1.5.tgz", + "integrity": "sha512-IqO/DUQHUkPeixNQ8n0JA6102hT9CmaljNTPmQ1u8MEhBo/R4Q8eKLN/vGZxuebwOroDB4cbpjheD4+/sKFK4Q==", + "license": "BSD-3-Clause", + "dependencies": { + "@hapi/hoek": "^9.0.0" + } + }, + "node_modules/@sideway/formula": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@sideway/formula/-/formula-3.0.1.tgz", + "integrity": "sha512-/poHZJJVjx3L+zVD6g9KgHfYnb443oi7wLu/XKojDviHy6HOEOA6z1Trk5aR1dGcmPenJEgb2sK2I80LeS3MIg==", + "license": "BSD-3-Clause" + }, + "node_modules/@sideway/pinpoint": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@sideway/pinpoint/-/pinpoint-2.0.0.tgz", + "integrity": "sha512-RNiOoTPkptFtSVzQevY/yWtZwf/RxyVnPy/OcA9HBM3MlGDnBEYL5B41H0MTn0Uec8Hi+2qUtTfG2WWZBmMejQ==", + "license": "BSD-3-Clause" + }, + "node_modules/@sinclair/typebox": { + "version": "0.27.8", + "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.27.8.tgz", + "integrity": "sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA==", + "license": "MIT" + }, + "node_modules/@sindresorhus/is": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-4.6.0.tgz", + "integrity": "sha512-t09vSN3MdfsyCHoFcTRCH/iUtG7OJ0CsjzB8cjAmKc/va/kIgeDI/TxsigdncE/4be734m0cvIYwNaV4i2XqAw==", + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sindresorhus/is?sponsor=1" + } + }, + "node_modules/@slorber/remark-comment": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@slorber/remark-comment/-/remark-comment-1.0.0.tgz", + "integrity": "sha512-RCE24n7jsOj1M0UPvIQCHTe7fI0sFL4S2nwKVWwHyVr/wI/H8GosgsJGyhnsZoGFnD/P2hLf1mSbrrgSLN93NA==", + "license": "MIT", + "dependencies": { + "micromark-factory-space": "^1.0.0", + "micromark-util-character": "^1.1.0", + "micromark-util-symbol": "^1.0.1" + } + }, + "node_modules/@svgr/babel-plugin-add-jsx-attribute": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-add-jsx-attribute/-/babel-plugin-add-jsx-attribute-8.0.0.tgz", + "integrity": "sha512-b9MIk7yhdS1pMCZM8VeNfUlSKVRhsHZNMl5O9SfaX0l0t5wjdgu4IDzGB8bpnGBBOjGST3rRFVsaaEtI4W6f7g==", + "license": "MIT", + "engines": { + "node": ">=14" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@svgr/babel-plugin-remove-jsx-attribute": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-remove-jsx-attribute/-/babel-plugin-remove-jsx-attribute-8.0.0.tgz", + "integrity": "sha512-BcCkm/STipKvbCl6b7QFrMh/vx00vIP63k2eM66MfHJzPr6O2U0jYEViXkHJWqXqQYjdeA9cuCl5KWmlwjDvbA==", + "license": "MIT", + "engines": { + "node": ">=14" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@svgr/babel-plugin-remove-jsx-empty-expression": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-remove-jsx-empty-expression/-/babel-plugin-remove-jsx-empty-expression-8.0.0.tgz", + "integrity": "sha512-5BcGCBfBxB5+XSDSWnhTThfI9jcO5f0Ai2V24gZpG+wXF14BzwxxdDb4g6trdOux0rhibGs385BeFMSmxtS3uA==", + "license": "MIT", + "engines": { + "node": ">=14" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@svgr/babel-plugin-replace-jsx-attribute-value": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-replace-jsx-attribute-value/-/babel-plugin-replace-jsx-attribute-value-8.0.0.tgz", + "integrity": "sha512-KVQ+PtIjb1BuYT3ht8M5KbzWBhdAjjUPdlMtpuw/VjT8coTrItWX6Qafl9+ji831JaJcu6PJNKCV0bp01lBNzQ==", + "license": "MIT", + "engines": { + "node": ">=14" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@svgr/babel-plugin-svg-dynamic-title": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-svg-dynamic-title/-/babel-plugin-svg-dynamic-title-8.0.0.tgz", + "integrity": "sha512-omNiKqwjNmOQJ2v6ge4SErBbkooV2aAWwaPFs2vUY7p7GhVkzRkJ00kILXQvRhA6miHnNpXv7MRnnSjdRjK8og==", + "license": "MIT", + "engines": { + "node": ">=14" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@svgr/babel-plugin-svg-em-dimensions": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-svg-em-dimensions/-/babel-plugin-svg-em-dimensions-8.0.0.tgz", + "integrity": "sha512-mURHYnu6Iw3UBTbhGwE/vsngtCIbHE43xCRK7kCw4t01xyGqb2Pd+WXekRRoFOBIY29ZoOhUCTEweDMdrjfi9g==", + "license": "MIT", + "engines": { + "node": ">=14" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@svgr/babel-plugin-transform-react-native-svg": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-transform-react-native-svg/-/babel-plugin-transform-react-native-svg-8.1.0.tgz", + "integrity": "sha512-Tx8T58CHo+7nwJ+EhUwx3LfdNSG9R2OKfaIXXs5soiy5HtgoAEkDay9LIimLOcG8dJQH1wPZp/cnAv6S9CrR1Q==", + "license": "MIT", + "engines": { + "node": ">=14" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@svgr/babel-plugin-transform-svg-component": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-transform-svg-component/-/babel-plugin-transform-svg-component-8.0.0.tgz", + "integrity": "sha512-DFx8xa3cZXTdb/k3kfPeaixecQLgKh5NVBMwD0AQxOzcZawK4oo1Jh9LbrcACUivsCA7TLG8eeWgrDXjTMhRmw==", + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@svgr/babel-preset": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/@svgr/babel-preset/-/babel-preset-8.1.0.tgz", + "integrity": "sha512-7EYDbHE7MxHpv4sxvnVPngw5fuR6pw79SkcrILHJ/iMpuKySNCl5W1qcwPEpU+LgyRXOaAFgH0KhwD18wwg6ug==", + "license": "MIT", + "dependencies": { + "@svgr/babel-plugin-add-jsx-attribute": "8.0.0", + "@svgr/babel-plugin-remove-jsx-attribute": "8.0.0", + "@svgr/babel-plugin-remove-jsx-empty-expression": "8.0.0", + "@svgr/babel-plugin-replace-jsx-attribute-value": "8.0.0", + "@svgr/babel-plugin-svg-dynamic-title": "8.0.0", + "@svgr/babel-plugin-svg-em-dimensions": "8.0.0", + "@svgr/babel-plugin-transform-react-native-svg": "8.1.0", + "@svgr/babel-plugin-transform-svg-component": "8.0.0" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@svgr/core": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/@svgr/core/-/core-8.1.0.tgz", + "integrity": "sha512-8QqtOQT5ACVlmsvKOJNEaWmRPmcojMOzCz4Hs2BGG/toAp/K38LcsMRyLp349glq5AzJbCEeimEoxaX6v/fLrA==", + "license": "MIT", + "dependencies": { + "@babel/core": "^7.21.3", + "@svgr/babel-preset": "8.1.0", + "camelcase": "^6.2.0", + "cosmiconfig": "^8.1.3", + "snake-case": "^3.0.4" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + } + }, + "node_modules/@svgr/hast-util-to-babel-ast": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/@svgr/hast-util-to-babel-ast/-/hast-util-to-babel-ast-8.0.0.tgz", + "integrity": "sha512-EbDKwO9GpfWP4jN9sGdYwPBU0kdomaPIL2Eu4YwmgP+sJeXT+L7bMwJUBnhzfH8Q2qMBqZ4fJwpCyYsAN3mt2Q==", + "license": "MIT", + "dependencies": { + "@babel/types": "^7.21.3", + "entities": "^4.4.0" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + } + }, + "node_modules/@svgr/plugin-jsx": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/@svgr/plugin-jsx/-/plugin-jsx-8.1.0.tgz", + "integrity": "sha512-0xiIyBsLlr8quN+WyuxooNW9RJ0Dpr8uOnH/xrCVO8GLUcwHISwj1AG0k+LFzteTkAA0GbX0kj9q6Dk70PTiPA==", + "license": "MIT", + "dependencies": { + "@babel/core": "^7.21.3", + "@svgr/babel-preset": "8.1.0", + "@svgr/hast-util-to-babel-ast": "8.0.0", + "svg-parser": "^2.0.4" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + }, + "peerDependencies": { + "@svgr/core": "*" + } + }, + "node_modules/@svgr/plugin-svgo": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/@svgr/plugin-svgo/-/plugin-svgo-8.1.0.tgz", + "integrity": "sha512-Ywtl837OGO9pTLIN/onoWLmDQ4zFUycI1g76vuKGEz6evR/ZTJlJuz3G/fIkb6OVBJ2g0o6CGJzaEjfmEo3AHA==", + "license": "MIT", + "dependencies": { + "cosmiconfig": "^8.1.3", + "deepmerge": "^4.3.1", + "svgo": "^3.0.2" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + }, + "peerDependencies": { + "@svgr/core": "*" + } + }, + "node_modules/@svgr/webpack": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/@svgr/webpack/-/webpack-8.1.0.tgz", + "integrity": "sha512-LnhVjMWyMQV9ZmeEy26maJk+8HTIbd59cH4F2MJ439k9DqejRisfFNGAPvRYlKETuh9LrImlS8aKsBgKjMA8WA==", + "license": "MIT", + "dependencies": { + "@babel/core": "^7.21.3", + "@babel/plugin-transform-react-constant-elements": "^7.21.3", + "@babel/preset-env": "^7.20.2", + "@babel/preset-react": "^7.18.6", + "@babel/preset-typescript": "^7.21.0", + "@svgr/core": "8.1.0", + "@svgr/plugin-jsx": "8.1.0", + "@svgr/plugin-svgo": "8.1.0" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + } + }, + "node_modules/@szmarczak/http-timer": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/@szmarczak/http-timer/-/http-timer-5.0.1.tgz", + "integrity": "sha512-+PmQX0PiAYPMeVYe237LJAYvOMYW1j2rH5YROyS3b4CTVJum34HfRvKvAzozHAQG0TnHNdUfY9nCeUyRAs//cw==", + "license": "MIT", + "dependencies": { + "defer-to-connect": "^2.0.1" + }, + "engines": { + "node": ">=14.16" + } + }, + "node_modules/@trysound/sax": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/@trysound/sax/-/sax-0.2.0.tgz", + "integrity": "sha512-L7z9BgrNEcYyUYtF+HaEfiS5ebkh9jXqbszz7pC0hRBPaatV0XjSD3+eHrpqFemQfgwiFF0QPIarnIihIDn7OA==", + "license": "ISC", + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/@tybys/wasm-util": { + "version": "0.10.1", + "resolved": "https://registry.npmjs.org/@tybys/wasm-util/-/wasm-util-0.10.1.tgz", + "integrity": "sha512-9tTaPJLSiejZKx+Bmog4uSubteqTvFrVrURwkmHixBo0G4seD0zUxp98E1DzUBJxLQ3NPwXrGKDiVjwx/DpPsg==", + "license": "MIT", + "optional": true, + "dependencies": { + "tslib": "^2.4.0" + } + }, + "node_modules/@types/body-parser": { + "version": "1.19.6", + "resolved": "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.19.6.tgz", + "integrity": "sha512-HLFeCYgz89uk22N5Qg3dvGvsv46B8GLvKKo1zKG4NybA8U2DiEO3w9lqGg29t/tfLRJpJ6iQxnVw4OnB7MoM9g==", + "license": "MIT", + "dependencies": { + "@types/connect": "*", + "@types/node": "*" + } + }, + "node_modules/@types/bonjour": { + "version": "3.5.13", + "resolved": "https://registry.npmjs.org/@types/bonjour/-/bonjour-3.5.13.tgz", + "integrity": "sha512-z9fJ5Im06zvUL548KvYNecEVlA7cVDkGUi6kZusb04mpyEFKCIZJvloCcmpmLaIahDpOQGHaHmG6imtPMmPXGQ==", + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/connect": { + "version": "3.4.38", + "resolved": "https://registry.npmjs.org/@types/connect/-/connect-3.4.38.tgz", + "integrity": "sha512-K6uROf1LD88uDQqJCktA4yzL1YYAK6NgfsI0v/mTgyPKWsX1CnJ0XPSDhViejru1GcRkLWb8RlzFYJRqGUbaug==", + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/connect-history-api-fallback": { + "version": "1.5.4", + "resolved": "https://registry.npmjs.org/@types/connect-history-api-fallback/-/connect-history-api-fallback-1.5.4.tgz", + "integrity": "sha512-n6Cr2xS1h4uAulPRdlw6Jl6s1oG8KrVilPN2yUITEs+K48EzMJJ3W1xy8K5eWuFvjp3R74AOIGSmp2UfBJ8HFw==", + "license": "MIT", + "dependencies": { + "@types/express-serve-static-core": "*", + "@types/node": "*" + } + }, + "node_modules/@types/debug": { + "version": "4.1.12", + "resolved": "https://registry.npmjs.org/@types/debug/-/debug-4.1.12.tgz", + "integrity": "sha512-vIChWdVG3LG1SMxEvI/AK+FWJthlrqlTu7fbrlywTkkaONwk/UAGaULXRlf8vkzFBLVm0zkMdCquhL5aOjhXPQ==", + "license": "MIT", + "dependencies": { + "@types/ms": "*" + } + }, + "node_modules/@types/eslint": { + "version": "9.6.1", + "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-9.6.1.tgz", + "integrity": "sha512-FXx2pKgId/WyYo2jXw63kk7/+TY7u7AziEJxJAnSFzHlqTAS3Ync6SvgYAN/k4/PQpnnVuzoMuVnByKK2qp0ag==", + "license": "MIT", + "dependencies": { + "@types/estree": "*", + "@types/json-schema": "*" + } + }, + "node_modules/@types/eslint-scope": { + "version": "3.7.7", + "resolved": "https://registry.npmjs.org/@types/eslint-scope/-/eslint-scope-3.7.7.tgz", + "integrity": "sha512-MzMFlSLBqNF2gcHWO0G1vP/YQyfvrxZ0bF+u7mzUdZ1/xK4A4sru+nraZz5i3iEIk1l1uyicaDVTB4QbbEkAYg==", + "license": "MIT", + "dependencies": { + "@types/eslint": "*", + "@types/estree": "*" + } + }, + "node_modules/@types/estree": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.8.tgz", + "integrity": "sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==", + "license": "MIT" + }, + "node_modules/@types/estree-jsx": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/@types/estree-jsx/-/estree-jsx-1.0.5.tgz", + "integrity": "sha512-52CcUVNFyfb1A2ALocQw/Dd1BQFNmSdkuC3BkZ6iqhdMfQz7JWOFRuJFloOzjk+6WijU56m9oKXFAXc7o3Towg==", + "license": "MIT", + "dependencies": { + "@types/estree": "*" + } + }, + "node_modules/@types/express": { + "version": "4.17.23", + "resolved": "https://registry.npmjs.org/@types/express/-/express-4.17.23.tgz", + "integrity": "sha512-Crp6WY9aTYP3qPi2wGDo9iUe/rceX01UMhnF1jmwDcKCFM6cx7YhGP/Mpr3y9AASpfHixIG0E6azCcL5OcDHsQ==", + "license": "MIT", + "dependencies": { + "@types/body-parser": "*", + "@types/express-serve-static-core": "^4.17.33", + "@types/qs": "*", + "@types/serve-static": "*" + } + }, + "node_modules/@types/express-serve-static-core": { + "version": "5.0.7", + "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-5.0.7.tgz", + "integrity": "sha512-R+33OsgWw7rOhD1emjU7dzCDHucJrgJXMA5PYCzJxVil0dsyx5iBEPHqpPfiKNJQb7lZ1vxwoLR4Z87bBUpeGQ==", + "license": "MIT", + "dependencies": { + "@types/node": "*", + "@types/qs": "*", + "@types/range-parser": "*", + "@types/send": "*" + } + }, + "node_modules/@types/express/node_modules/@types/express-serve-static-core": { + "version": "4.19.6", + "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.19.6.tgz", + "integrity": "sha512-N4LZ2xG7DatVqhCZzOGb1Yi5lMbXSZcmdLDe9EzSndPV2HpWYWzRbaerl2n27irrm94EPpprqa8KpskPT085+A==", + "license": "MIT", + "dependencies": { + "@types/node": "*", + "@types/qs": "*", + "@types/range-parser": "*", + "@types/send": "*" + } + }, + "node_modules/@types/gtag.js": { + "version": "0.0.12", + "resolved": "https://registry.npmjs.org/@types/gtag.js/-/gtag.js-0.0.12.tgz", + "integrity": "sha512-YQV9bUsemkzG81Ea295/nF/5GijnD2Af7QhEofh7xu+kvCN6RdodgNwwGWXB5GMI3NoyvQo0odNctoH/qLMIpg==", + "license": "MIT" + }, + "node_modules/@types/hast": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@types/hast/-/hast-3.0.4.tgz", + "integrity": "sha512-WPs+bbQw5aCj+x6laNGWLH3wviHtoCv/P3+otBhbOhJgG8qtpdAMlTCxLtsTWA7LH1Oh/bFCHsBn0TPS5m30EQ==", + "license": "MIT", + "dependencies": { + "@types/unist": "*" + } + }, + "node_modules/@types/history": { + "version": "4.7.11", + "resolved": "https://registry.npmjs.org/@types/history/-/history-4.7.11.tgz", + "integrity": "sha512-qjDJRrmvBMiTx+jyLxvLfJU7UznFuokDv4f3WRuriHKERccVpFU+8XMQUAbDzoiJCsmexxRExQeMwwCdamSKDA==", + "license": "MIT" + }, + "node_modules/@types/hoist-non-react-statics": { + "version": "3.3.7", + "resolved": "https://registry.npmjs.org/@types/hoist-non-react-statics/-/hoist-non-react-statics-3.3.7.tgz", + "integrity": "sha512-PQTyIulDkIDro8P+IHbKCsw7U2xxBYflVzW/FgWdCAePD9xGSidgA76/GeJ6lBKoblyhf9pBY763gbrN+1dI8g==", + "license": "MIT", + "dependencies": { + "hoist-non-react-statics": "^3.3.0" + }, + "peerDependencies": { + "@types/react": "*" + } + }, + "node_modules/@types/html-minifier-terser": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/@types/html-minifier-terser/-/html-minifier-terser-6.1.0.tgz", + "integrity": "sha512-oh/6byDPnL1zeNXFrDXFLyZjkr1MsBG667IM792caf1L2UPOOMf65NFzjUH/ltyfwjAGfs1rsX1eftK0jC/KIg==", + "license": "MIT" + }, + "node_modules/@types/http-cache-semantics": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/@types/http-cache-semantics/-/http-cache-semantics-4.0.4.tgz", + "integrity": "sha512-1m0bIFVc7eJWyve9S0RnuRgcQqF/Xd5QsUZAZeQFr1Q3/p9JWoQQEqmVy+DPTNpGXwhgIetAoYF8JSc33q29QA==", + "license": "MIT" + }, + "node_modules/@types/http-errors": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@types/http-errors/-/http-errors-2.0.5.tgz", + "integrity": "sha512-r8Tayk8HJnX0FztbZN7oVqGccWgw98T/0neJphO91KkmOzug1KkofZURD4UaD5uH8AqcFLfdPErnBod0u71/qg==", + "license": "MIT" + }, + "node_modules/@types/http-proxy": { + "version": "1.17.16", + "resolved": "https://registry.npmjs.org/@types/http-proxy/-/http-proxy-1.17.16.tgz", + "integrity": "sha512-sdWoUajOB1cd0A8cRRQ1cfyWNbmFKLAqBB89Y8x5iYyG/mkJHc0YUH8pdWBy2omi9qtCpiIgGjuwO0dQST2l5w==", + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/istanbul-lib-coverage": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.6.tgz", + "integrity": "sha512-2QF/t/auWm0lsy8XtKVPG19v3sSOQlJe/YHZgfjb/KBBHOGSV+J2q/S671rcq9uTBrLAXmZpqJiaQbMT+zNU1w==", + "license": "MIT" + }, + "node_modules/@types/istanbul-lib-report": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@types/istanbul-lib-report/-/istanbul-lib-report-3.0.3.tgz", + "integrity": "sha512-NQn7AHQnk/RSLOxrBbGyJM/aVQ+pjj5HCgasFxc0K/KhoATfQ/47AyUl15I2yBUpihjmas+a+VJBOqecrFH+uA==", + "license": "MIT", + "dependencies": { + "@types/istanbul-lib-coverage": "*" + } + }, + "node_modules/@types/istanbul-reports": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.4.tgz", + "integrity": "sha512-pk2B1NWalF9toCRu6gjBzR69syFjP4Od8WRAX+0mmf9lAjCRicLOWc+ZrxZHx/0XRjotgkF9t6iaMJ+aXcOdZQ==", + "license": "MIT", + "dependencies": { + "@types/istanbul-lib-report": "*" + } + }, + "node_modules/@types/json-schema": { + "version": "7.0.15", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz", + "integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==", + "license": "MIT" + }, + "node_modules/@types/mdast": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/@types/mdast/-/mdast-4.0.4.tgz", + "integrity": "sha512-kGaNbPh1k7AFzgpud/gMdvIm5xuECykRR+JnWKQno9TAXVa6WIVCGTPvYGekIDL4uwCZQSYbUxNBSb1aUo79oA==", + "license": "MIT", + "dependencies": { + "@types/unist": "*" + } + }, + "node_modules/@types/mdx": { + "version": "2.0.13", + "resolved": "https://registry.npmjs.org/@types/mdx/-/mdx-2.0.13.tgz", + "integrity": "sha512-+OWZQfAYyio6YkJb3HLxDrvnx6SWWDbC0zVPfBRzUk0/nqoDyf6dNxQi3eArPe8rJ473nobTMQ/8Zk+LxJ+Yuw==", + "license": "MIT" + }, + "node_modules/@types/mime": { + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/@types/mime/-/mime-1.3.5.tgz", + "integrity": "sha512-/pyBZWSLD2n0dcHE3hq8s8ZvcETHtEuF+3E7XVt0Ig2nvsVQXdghHVcEkIWjy9A0wKfTn97a/PSDYohKIlnP/w==", + "license": "MIT" + }, + "node_modules/@types/ms": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@types/ms/-/ms-2.1.0.tgz", + "integrity": "sha512-GsCCIZDE/p3i96vtEqx+7dBUGXrc7zeSK3wwPHIaRThS+9OhWIXRqzs4d6k1SVU8g91DrNRWxWUGhp5KXQb2VA==", + "license": "MIT" + }, + "node_modules/@types/node": { + "version": "24.5.2", + "resolved": "https://registry.npmjs.org/@types/node/-/node-24.5.2.tgz", + "integrity": "sha512-FYxk1I7wPv3K2XBaoyH2cTnocQEu8AOZ60hPbsyukMPLv5/5qr7V1i8PLHdl6Zf87I+xZXFvPCXYjiTFq+YSDQ==", + "license": "MIT", + "dependencies": { + "undici-types": "~7.12.0" + } + }, + "node_modules/@types/node-forge": { + "version": "1.3.14", + "resolved": "https://registry.npmjs.org/@types/node-forge/-/node-forge-1.3.14.tgz", + "integrity": "sha512-mhVF2BnD4BO+jtOp7z1CdzaK4mbuK0LLQYAvdOLqHTavxFNq4zA1EmYkpnFjP8HOUzedfQkRnp0E2ulSAYSzAw==", + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/parse5": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/@types/parse5/-/parse5-6.0.3.tgz", + "integrity": "sha512-SuT16Q1K51EAVPz1K29DJ/sXjhSQ0zjvsypYJ6tlwVsRV9jwW5Adq2ch8Dq8kDBCkYnELS7N7VNCSB5nC56t/g==", + "license": "MIT" + }, + "node_modules/@types/prismjs": { + "version": "1.26.5", + "resolved": "https://registry.npmjs.org/@types/prismjs/-/prismjs-1.26.5.tgz", + "integrity": "sha512-AUZTa7hQ2KY5L7AmtSiqxlhWxb4ina0yd8hNbl4TWuqnv/pFP0nDMb3YrfSBf4hJVGLh2YEIBfKaBW/9UEl6IQ==", + "license": "MIT" + }, + "node_modules/@types/prop-types": { + "version": "15.7.15", + "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.15.tgz", + "integrity": "sha512-F6bEyamV9jKGAFBEmlQnesRPGOQqS2+Uwi0Em15xenOxHaf2hv6L8YCVn3rPdPJOiJfPiCnLIRyvwVaqMY3MIw==", + "license": "MIT" + }, + "node_modules/@types/qs": { + "version": "6.14.0", + "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.14.0.tgz", + "integrity": "sha512-eOunJqu0K1923aExK6y8p6fsihYEn/BYuQ4g0CxAAgFc4b/ZLN4CrsRZ55srTdqoiLzU2B2evC+apEIxprEzkQ==", + "license": "MIT" + }, + "node_modules/@types/range-parser": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/@types/range-parser/-/range-parser-1.2.7.tgz", + "integrity": "sha512-hKormJbkJqzQGhziax5PItDUTMAM9uE2XXQmM37dyd4hVM+5aVl7oVxMVUiVQn2oCQFN/LKCZdvSM0pFRqbSmQ==", + "license": "MIT" + }, + "node_modules/@types/react": { + "version": "19.1.13", + "resolved": "https://registry.npmjs.org/@types/react/-/react-19.1.13.tgz", + "integrity": "sha512-hHkbU/eoO3EG5/MZkuFSKmYqPbSVk5byPFa3e7y/8TybHiLMACgI8seVYlicwk7H5K/rI2px9xrQp/C+AUDTiQ==", + "license": "MIT", + "dependencies": { + "csstype": "^3.0.2" + } + }, + "node_modules/@types/react-redux": { + "version": "7.1.34", + "resolved": "https://registry.npmjs.org/@types/react-redux/-/react-redux-7.1.34.tgz", + "integrity": "sha512-GdFaVjEbYv4Fthm2ZLvj1VSCedV7TqE5y1kNwnjSdBOTXuRSgowux6J8TAct15T3CKBr63UMk+2CO7ilRhyrAQ==", + "license": "MIT", + "dependencies": { + "@types/hoist-non-react-statics": "^3.3.0", + "@types/react": "*", + "hoist-non-react-statics": "^3.3.0", + "redux": "^4.0.0" + } + }, + "node_modules/@types/react-router": { + "version": "5.1.20", + "resolved": "https://registry.npmjs.org/@types/react-router/-/react-router-5.1.20.tgz", + "integrity": "sha512-jGjmu/ZqS7FjSH6owMcD5qpq19+1RS9DeVRqfl1FeBMxTDQAGwlMWOcs52NDoXaNKyG3d1cYQFMs9rCrb88o9Q==", + "license": "MIT", + "dependencies": { + "@types/history": "^4.7.11", + "@types/react": "*" + } + }, + "node_modules/@types/react-router-config": { + "version": "5.0.11", + "resolved": "https://registry.npmjs.org/@types/react-router-config/-/react-router-config-5.0.11.tgz", + "integrity": "sha512-WmSAg7WgqW7m4x8Mt4N6ZyKz0BubSj/2tVUMsAHp+Yd2AMwcSbeFq9WympT19p5heCFmF97R9eD5uUR/t4HEqw==", + "license": "MIT", + "dependencies": { + "@types/history": "^4.7.11", + "@types/react": "*", + "@types/react-router": "^5.1.0" + } + }, + "node_modules/@types/react-router-dom": { + "version": "5.3.3", + "resolved": "https://registry.npmjs.org/@types/react-router-dom/-/react-router-dom-5.3.3.tgz", + "integrity": "sha512-kpqnYK4wcdm5UaWI3fLcELopqLrHgLqNsdpHauzlQktfkHL3npOSwtj1Uz9oKBAzs7lFtVkV8j83voAz2D8fhw==", + "license": "MIT", + "dependencies": { + "@types/history": "^4.7.11", + "@types/react": "*", + "@types/react-router": "*" + } + }, + "node_modules/@types/retry": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/@types/retry/-/retry-0.12.0.tgz", + "integrity": "sha512-wWKOClTTiizcZhXnPY4wikVAwmdYHp8q6DmC+EJUzAMsycb7HB32Kh9RN4+0gExjmPmZSAQjgURXIGATPegAvA==", + "license": "MIT" + }, + "node_modules/@types/sax": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/@types/sax/-/sax-1.2.7.tgz", + "integrity": "sha512-rO73L89PJxeYM3s3pPPjiPgVVcymqU490g0YO5n5By0k2Erzj6tay/4lr1CHAAU4JyOWd1rpQ8bCf6cZfHU96A==", + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/send": { + "version": "0.17.5", + "resolved": "https://registry.npmjs.org/@types/send/-/send-0.17.5.tgz", + "integrity": "sha512-z6F2D3cOStZvuk2SaP6YrwkNO65iTZcwA2ZkSABegdkAh/lf+Aa/YQndZVfmEXT5vgAp6zv06VQ3ejSVjAny4w==", + "license": "MIT", + "dependencies": { + "@types/mime": "^1", + "@types/node": "*" + } + }, + "node_modules/@types/serve-index": { + "version": "1.9.4", + "resolved": "https://registry.npmjs.org/@types/serve-index/-/serve-index-1.9.4.tgz", + "integrity": "sha512-qLpGZ/c2fhSs5gnYsQxtDEq3Oy8SXPClIXkW5ghvAvsNuVSA8k+gCONcUCS/UjLEYvYps+e8uBtfgXgvhwfNug==", + "license": "MIT", + "dependencies": { + "@types/express": "*" + } + }, + "node_modules/@types/serve-static": { + "version": "1.15.8", + "resolved": "https://registry.npmjs.org/@types/serve-static/-/serve-static-1.15.8.tgz", + "integrity": "sha512-roei0UY3LhpOJvjbIP6ZZFngyLKl5dskOtDhxY5THRSpO+ZI+nzJ+m5yUMzGrp89YRa7lvknKkMYjqQFGwA7Sg==", + "license": "MIT", + "dependencies": { + "@types/http-errors": "*", + "@types/node": "*", + "@types/send": "*" + } + }, + "node_modules/@types/sockjs": { + "version": "0.3.36", + "resolved": "https://registry.npmjs.org/@types/sockjs/-/sockjs-0.3.36.tgz", + "integrity": "sha512-MK9V6NzAS1+Ud7JV9lJLFqW85VbC9dq3LmwZCuBe4wBDgKC0Kj/jd8Xl+nSviU+Qc3+m7umHHyHg//2KSa0a0Q==", + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/unist": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@types/unist/-/unist-3.0.3.tgz", + "integrity": "sha512-ko/gIFJRv177XgZsZcBwnqJN5x/Gien8qNOn0D5bQU/zAzVf9Zt3BlcUiLqhV9y4ARk0GbT3tnUiPNgnTXzc/Q==", + "license": "MIT" + }, + "node_modules/@types/ws": { + "version": "8.18.1", + "resolved": "https://registry.npmjs.org/@types/ws/-/ws-8.18.1.tgz", + "integrity": "sha512-ThVF6DCVhA8kUGy+aazFQ4kXQ7E1Ty7A3ypFOe0IcJV8O/M511G99AW24irKrW56Wt44yG9+ij8FaqoBGkuBXg==", + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/yargs": { + "version": "17.0.33", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.33.tgz", + "integrity": "sha512-WpxBCKWPLr4xSsHgz511rFJAM+wS28w2zEO1QDNY5zM/S8ok70NNfztH0xwhqKyaK0OHCbN98LDAZuy1ctxDkA==", + "license": "MIT", + "dependencies": { + "@types/yargs-parser": "*" + } + }, + "node_modules/@types/yargs-parser": { + "version": "21.0.3", + "resolved": "https://registry.npmjs.org/@types/yargs-parser/-/yargs-parser-21.0.3.tgz", + "integrity": "sha512-I4q9QU9MQv4oEOz4tAHJtNz1cwuLxn2F3xcc2iV5WdqLPpUnj30aUuxt1mAxYTG+oe8CZMV/+6rU4S4gRDzqtQ==", + "license": "MIT" + }, + "node_modules/@ungap/structured-clone": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.3.0.tgz", + "integrity": "sha512-WmoN8qaIAo7WTYWbAZuG8PYEhn5fkz7dZrqTBZ7dtt//lL2Gwms1IcnQ5yHqjDfX8Ft5j4YzDM23f87zBfDe9g==", + "license": "ISC" + }, + "node_modules/@webassemblyjs/ast": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.14.1.tgz", + "integrity": "sha512-nuBEDgQfm1ccRp/8bCQrx1frohyufl4JlbMMZ4P1wpeOfDhF6FQkxZJ1b/e+PLwr6X1Nhw6OLme5usuBWYBvuQ==", + "license": "MIT", + "dependencies": { + "@webassemblyjs/helper-numbers": "1.13.2", + "@webassemblyjs/helper-wasm-bytecode": "1.13.2" + } + }, + "node_modules/@webassemblyjs/floating-point-hex-parser": { + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.13.2.tgz", + "integrity": "sha512-6oXyTOzbKxGH4steLbLNOu71Oj+C8Lg34n6CqRvqfS2O71BxY6ByfMDRhBytzknj9yGUPVJ1qIKhRlAwO1AovA==", + "license": "MIT" + }, + "node_modules/@webassemblyjs/helper-api-error": { + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.13.2.tgz", + "integrity": "sha512-U56GMYxy4ZQCbDZd6JuvvNV/WFildOjsaWD3Tzzvmw/mas3cXzRJPMjP83JqEsgSbyrmaGjBfDtV7KDXV9UzFQ==", + "license": "MIT" + }, + "node_modules/@webassemblyjs/helper-buffer": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.14.1.tgz", + "integrity": "sha512-jyH7wtcHiKssDtFPRB+iQdxlDf96m0E39yb0k5uJVhFGleZFoNw1c4aeIcVUPPbXUVJ94wwnMOAqUHyzoEPVMA==", + "license": "MIT" + }, + "node_modules/@webassemblyjs/helper-numbers": { + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-numbers/-/helper-numbers-1.13.2.tgz", + "integrity": "sha512-FE8aCmS5Q6eQYcV3gI35O4J789wlQA+7JrqTTpJqn5emA4U2hvwJmvFRC0HODS+3Ye6WioDklgd6scJ3+PLnEA==", + "license": "MIT", + "dependencies": { + "@webassemblyjs/floating-point-hex-parser": "1.13.2", + "@webassemblyjs/helper-api-error": "1.13.2", + "@xtuc/long": "4.2.2" + } + }, + "node_modules/@webassemblyjs/helper-wasm-bytecode": { + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.13.2.tgz", + "integrity": "sha512-3QbLKy93F0EAIXLh0ogEVR6rOubA9AoZ+WRYhNbFyuB70j3dRdwH9g+qXhLAO0kiYGlg3TxDV+I4rQTr/YNXkA==", + "license": "MIT" + }, + "node_modules/@webassemblyjs/helper-wasm-section": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.14.1.tgz", + "integrity": "sha512-ds5mXEqTJ6oxRoqjhWDU83OgzAYjwsCV8Lo/N+oRsNDmx/ZDpqalmrtgOMkHwxsG0iI//3BwWAErYRHtgn0dZw==", + "license": "MIT", + "dependencies": { + "@webassemblyjs/ast": "1.14.1", + "@webassemblyjs/helper-buffer": "1.14.1", + "@webassemblyjs/helper-wasm-bytecode": "1.13.2", + "@webassemblyjs/wasm-gen": "1.14.1" + } + }, + "node_modules/@webassemblyjs/ieee754": { + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.13.2.tgz", + "integrity": "sha512-4LtOzh58S/5lX4ITKxnAK2USuNEvpdVV9AlgGQb8rJDHaLeHciwG4zlGr0j/SNWlr7x3vO1lDEsuePvtcDNCkw==", + "license": "MIT", + "dependencies": { + "@xtuc/ieee754": "^1.2.0" + } + }, + "node_modules/@webassemblyjs/leb128": { + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.13.2.tgz", + "integrity": "sha512-Lde1oNoIdzVzdkNEAWZ1dZ5orIbff80YPdHx20mrHwHrVNNTjNr8E3xz9BdpcGqRQbAEa+fkrCb+fRFTl/6sQw==", + "license": "Apache-2.0", + "dependencies": { + "@xtuc/long": "4.2.2" + } + }, + "node_modules/@webassemblyjs/utf8": { + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.13.2.tgz", + "integrity": "sha512-3NQWGjKTASY1xV5m7Hr0iPeXD9+RDobLll3T9d2AO+g3my8xy5peVyjSag4I50mR1bBSN/Ct12lo+R9tJk0NZQ==", + "license": "MIT" + }, + "node_modules/@webassemblyjs/wasm-edit": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.14.1.tgz", + "integrity": "sha512-RNJUIQH/J8iA/1NzlE4N7KtyZNHi3w7at7hDjvRNm5rcUXa00z1vRz3glZoULfJ5mpvYhLybmVcwcjGrC1pRrQ==", + "license": "MIT", + "dependencies": { + "@webassemblyjs/ast": "1.14.1", + "@webassemblyjs/helper-buffer": "1.14.1", + "@webassemblyjs/helper-wasm-bytecode": "1.13.2", + "@webassemblyjs/helper-wasm-section": "1.14.1", + "@webassemblyjs/wasm-gen": "1.14.1", + "@webassemblyjs/wasm-opt": "1.14.1", + "@webassemblyjs/wasm-parser": "1.14.1", + "@webassemblyjs/wast-printer": "1.14.1" + } + }, + "node_modules/@webassemblyjs/wasm-gen": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.14.1.tgz", + "integrity": "sha512-AmomSIjP8ZbfGQhumkNvgC33AY7qtMCXnN6bL2u2Js4gVCg8fp735aEiMSBbDR7UQIj90n4wKAFUSEd0QN2Ukg==", + "license": "MIT", + "dependencies": { + "@webassemblyjs/ast": "1.14.1", + "@webassemblyjs/helper-wasm-bytecode": "1.13.2", + "@webassemblyjs/ieee754": "1.13.2", + "@webassemblyjs/leb128": "1.13.2", + "@webassemblyjs/utf8": "1.13.2" + } + }, + "node_modules/@webassemblyjs/wasm-opt": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.14.1.tgz", + "integrity": "sha512-PTcKLUNvBqnY2U6E5bdOQcSM+oVP/PmrDY9NzowJjislEjwP/C4an2303MCVS2Mg9d3AJpIGdUFIQQWbPds0Sw==", + "license": "MIT", + "dependencies": { + "@webassemblyjs/ast": "1.14.1", + "@webassemblyjs/helper-buffer": "1.14.1", + "@webassemblyjs/wasm-gen": "1.14.1", + "@webassemblyjs/wasm-parser": "1.14.1" + } + }, + "node_modules/@webassemblyjs/wasm-parser": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.14.1.tgz", + "integrity": "sha512-JLBl+KZ0R5qB7mCnud/yyX08jWFw5MsoalJ1pQ4EdFlgj9VdXKGuENGsiCIjegI1W7p91rUlcB/LB5yRJKNTcQ==", + "license": "MIT", + "dependencies": { + "@webassemblyjs/ast": "1.14.1", + "@webassemblyjs/helper-api-error": "1.13.2", + "@webassemblyjs/helper-wasm-bytecode": "1.13.2", + "@webassemblyjs/ieee754": "1.13.2", + "@webassemblyjs/leb128": "1.13.2", + "@webassemblyjs/utf8": "1.13.2" + } + }, + "node_modules/@webassemblyjs/wast-printer": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.14.1.tgz", + "integrity": "sha512-kPSSXE6De1XOR820C90RIo2ogvZG+c3KiHzqUoO/F34Y2shGzesfqv7o57xrxovZJH/MetF5UjroJ/R/3isoiw==", + "license": "MIT", + "dependencies": { + "@webassemblyjs/ast": "1.14.1", + "@xtuc/long": "4.2.2" + } + }, + "node_modules/@xtuc/ieee754": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@xtuc/ieee754/-/ieee754-1.2.0.tgz", + "integrity": "sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==", + "license": "BSD-3-Clause" + }, + "node_modules/@xtuc/long": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/@xtuc/long/-/long-4.2.2.tgz", + "integrity": "sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==", + "license": "Apache-2.0" + }, + "node_modules/accepts": { + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", + "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==", + "license": "MIT", + "dependencies": { + "mime-types": "~2.1.34", + "negotiator": "0.6.3" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/accepts/node_modules/negotiator": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", + "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/acorn": { + "version": "8.15.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.15.0.tgz", + "integrity": "sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg==", + "license": "MIT", + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/acorn-import-phases": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/acorn-import-phases/-/acorn-import-phases-1.0.4.tgz", + "integrity": "sha512-wKmbr/DDiIXzEOiWrTTUcDm24kQ2vGfZQvM2fwg2vXqR5uW6aapr7ObPtj1th32b9u90/Pf4AItvdTh42fBmVQ==", + "license": "MIT", + "engines": { + "node": ">=10.13.0" + }, + "peerDependencies": { + "acorn": "^8.14.0" + } + }, + "node_modules/acorn-jsx": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", + "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", + "license": "MIT", + "peerDependencies": { + "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" + } + }, + "node_modules/acorn-walk": { + "version": "8.3.4", + "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.3.4.tgz", + "integrity": "sha512-ueEepnujpqee2o5aIYnvHU6C0A42MNdsIDeqy5BydrkuC5R1ZuUFnm27EeFJGoEHJQgn3uleRvmTXaJgfXbt4g==", + "license": "MIT", + "dependencies": { + "acorn": "^8.11.0" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/address": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/address/-/address-1.2.2.tgz", + "integrity": "sha512-4B/qKCfeE/ODUaAUpSwfzazo5x29WD4r3vXiWsB7I2mSDAihwEqKO+g8GELZUQSSAo5e1XTYh3ZVfLyxBc12nA==", + "license": "MIT", + "engines": { + "node": ">= 10.0.0" + } + }, + "node_modules/agent-base": { + "version": "7.1.4", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.4.tgz", + "integrity": "sha512-MnA+YT8fwfJPgBx3m60MNqakm30XOkyIoH1y6huTQvC0PwZG7ki8NacLBcrPbNoo8vEZy7Jpuk7+jMO+CUovTQ==", + "license": "MIT", + "engines": { + "node": ">= 14" + } + }, + "node_modules/aggregate-error": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-3.1.0.tgz", + "integrity": "sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==", + "license": "MIT", + "dependencies": { + "clean-stack": "^2.0.0", + "indent-string": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/ajv": { + "version": "8.11.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.11.0.tgz", + "integrity": "sha512-wGgprdCvMalC0BztXvitD2hC04YffAvtsUn93JbGXYLAtCUO4xd17mCCZQxUOItiBwZvJScWo8NIvQMQ71rdpg==", + "license": "MIT", + "dependencies": { + "fast-deep-equal": "^3.1.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/ajv-draft-04": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/ajv-draft-04/-/ajv-draft-04-1.0.0.tgz", + "integrity": "sha512-mv00Te6nmYbRp5DCwclxtt7yV/joXJPGS7nM+97GdxvuttCOfgI3K4U25zboyeX0O+myI8ERluxQe5wljMmVIw==", + "license": "MIT", + "peerDependencies": { + "ajv": "^8.5.0" + }, + "peerDependenciesMeta": { + "ajv": { + "optional": true + } + } + }, + "node_modules/ajv-formats": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ajv-formats/-/ajv-formats-2.1.1.tgz", + "integrity": "sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA==", + "license": "MIT", + "dependencies": { + "ajv": "^8.0.0" + }, + "peerDependencies": { + "ajv": "^8.0.0" + }, + "peerDependenciesMeta": { + "ajv": { + "optional": true + } + } + }, + "node_modules/ajv-keywords": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-5.1.0.tgz", + "integrity": "sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==", + "license": "MIT", + "dependencies": { + "fast-deep-equal": "^3.1.3" + }, + "peerDependencies": { + "ajv": "^8.8.2" + } + }, + "node_modules/algoliasearch": { + "version": "5.37.0", + "resolved": "https://registry.npmjs.org/algoliasearch/-/algoliasearch-5.37.0.tgz", + "integrity": "sha512-y7gau/ZOQDqoInTQp0IwTOjkrHc4Aq4R8JgpmCleFwiLl+PbN2DMWoDUWZnrK8AhNJwT++dn28Bt4NZYNLAmuA==", + "license": "MIT", + "dependencies": { + "@algolia/abtesting": "1.3.0", + "@algolia/client-abtesting": "5.37.0", + "@algolia/client-analytics": "5.37.0", + "@algolia/client-common": "5.37.0", + "@algolia/client-insights": "5.37.0", + "@algolia/client-personalization": "5.37.0", + "@algolia/client-query-suggestions": "5.37.0", + "@algolia/client-search": "5.37.0", + "@algolia/ingestion": "1.37.0", + "@algolia/monitoring": "1.37.0", + "@algolia/recommend": "5.37.0", + "@algolia/requester-browser-xhr": "5.37.0", + "@algolia/requester-fetch": "5.37.0", + "@algolia/requester-node-http": "5.37.0" + }, + "engines": { + "node": ">= 14.0.0" + } + }, + "node_modules/algoliasearch-helper": { + "version": "3.26.0", + "resolved": "https://registry.npmjs.org/algoliasearch-helper/-/algoliasearch-helper-3.26.0.tgz", + "integrity": "sha512-Rv2x3GXleQ3ygwhkhJubhhYGsICmShLAiqtUuJTUkr9uOCOXyF2E71LVT4XDnVffbknv8XgScP4U0Oxtgm+hIw==", + "license": "MIT", + "dependencies": { + "@algolia/events": "^4.0.1" + }, + "peerDependencies": { + "algoliasearch": ">= 3.1 < 6" + } + }, + "node_modules/allof-merge": { + "version": "0.6.7", + "resolved": "https://registry.npmjs.org/allof-merge/-/allof-merge-0.6.7.tgz", + "integrity": "sha512-slvjkM56OdeVkm1tllrnaumtSHwqyHrepXkAe6Am+CW4WdbHkNqdOKPF6cvY3/IouzvXk1BoLICT5LY7sCoFGw==", + "license": "MIT", + "dependencies": { + "json-crawl": "^0.5.3" + } + }, + "node_modules/ansi-align": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/ansi-align/-/ansi-align-3.0.1.tgz", + "integrity": "sha512-IOfwwBF5iczOjp/WeY4YxyjqAFMQoZufdQWDd19SEExbVLNXqvpzSJ/M7Za4/sCPmQ0+GRquoA7bGcINcxew6w==", + "license": "ISC", + "dependencies": { + "string-width": "^4.1.0" + } + }, + "node_modules/ansi-align/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "license": "MIT" + }, + "node_modules/ansi-align/node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "license": "MIT", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/ansi-escapes": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz", + "integrity": "sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==", + "license": "MIT", + "dependencies": { + "type-fest": "^0.21.3" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/ansi-escapes/node_modules/type-fest": { + "version": "0.21.3", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz", + "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==", + "license": "(MIT OR CC0-1.0)", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/ansi-html-community": { + "version": "0.0.8", + "resolved": "https://registry.npmjs.org/ansi-html-community/-/ansi-html-community-0.0.8.tgz", + "integrity": "sha512-1APHAyr3+PCamwNw3bXCPp4HFLONZt/yIH0sZp0/469KWNTEy+qN5jQ3GVX6DMZ1UXAi34yVwtTeaG/HpBuuzw==", + "engines": [ + "node >= 0.8.0" + ], + "license": "Apache-2.0", + "bin": { + "ansi-html": "bin/ansi-html" + } + }, + "node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "license": "MIT", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/any-promise": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/any-promise/-/any-promise-1.3.0.tgz", + "integrity": "sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==", + "license": "MIT" + }, + "node_modules/anymatch": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", + "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", + "license": "ISC", + "dependencies": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/arg": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/arg/-/arg-5.0.2.tgz", + "integrity": "sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==", + "license": "MIT" + }, + "node_modules/argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", + "license": "Python-2.0" + }, + "node_modules/array-flatten": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", + "integrity": "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==", + "license": "MIT" + }, + "node_modules/array-union": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", + "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/astring": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/astring/-/astring-1.9.0.tgz", + "integrity": "sha512-LElXdjswlqjWrPpJFg1Fx4wpkOCxj1TDHlSV4PlaRxHGWko024xICaa97ZkMfs6DRKlCguiAI+rbXv5GWwXIkg==", + "license": "MIT", + "bin": { + "astring": "bin/astring" + } + }, + "node_modules/async": { + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/async/-/async-3.2.4.tgz", + "integrity": "sha512-iAB+JbDEGXhyIUavoDl9WP/Jj106Kz9DEn1DPgYw5ruDn0e3Wgi3sKFm55sASdGBNOQB8F59d9qQ7deqrHA8wQ==", + "license": "MIT" + }, + "node_modules/at-least-node": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/at-least-node/-/at-least-node-1.0.0.tgz", + "integrity": "sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg==", + "license": "ISC", + "engines": { + "node": ">= 4.0.0" + } + }, + "node_modules/autoprefixer": { + "version": "10.4.21", + "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.21.tgz", + "integrity": "sha512-O+A6LWV5LDHSJD3LjHYoNi4VLsj/Whi7k6zG12xTYaU4cQ8oxQGckXNX8cRHK5yOZ/ppVHe0ZBXGzSV9jXdVbQ==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/autoprefixer" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "browserslist": "^4.24.4", + "caniuse-lite": "^1.0.30001702", + "fraction.js": "^4.3.7", + "normalize-range": "^0.1.2", + "picocolors": "^1.1.1", + "postcss-value-parser": "^4.2.0" + }, + "bin": { + "autoprefixer": "bin/autoprefixer" + }, + "engines": { + "node": "^10 || ^12 || >=14" + }, + "peerDependencies": { + "postcss": "^8.1.0" + } + }, + "node_modules/babel-loader": { + "version": "9.2.1", + "resolved": "https://registry.npmjs.org/babel-loader/-/babel-loader-9.2.1.tgz", + "integrity": "sha512-fqe8naHt46e0yIdkjUZYqddSXfej3AHajX+CSO5X7oy0EmPc6o5Xh+RClNoHjnieWz9AW4kZxW9yyFMhVB1QLA==", + "license": "MIT", + "dependencies": { + "find-cache-dir": "^4.0.0", + "schema-utils": "^4.0.0" + }, + "engines": { + "node": ">= 14.15.0" + }, + "peerDependencies": { + "@babel/core": "^7.12.0", + "webpack": ">=5" + } + }, + "node_modules/babel-plugin-dynamic-import-node": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/babel-plugin-dynamic-import-node/-/babel-plugin-dynamic-import-node-2.3.3.tgz", + "integrity": "sha512-jZVI+s9Zg3IqA/kdi0i6UDCybUI3aSBLnglhYbSSjKlV7yF1F/5LWv8MakQmvYpnbJDS6fcBL2KzHSxNCMtWSQ==", + "license": "MIT", + "dependencies": { + "object.assign": "^4.1.0" + } + }, + "node_modules/babel-plugin-polyfill-corejs2": { + "version": "0.4.14", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.4.14.tgz", + "integrity": "sha512-Co2Y9wX854ts6U8gAAPXfn0GmAyctHuK8n0Yhfjd6t30g7yvKjspvvOo9yG+z52PZRgFErt7Ka2pYnXCjLKEpg==", + "license": "MIT", + "dependencies": { + "@babel/compat-data": "^7.27.7", + "@babel/helper-define-polyfill-provider": "^0.6.5", + "semver": "^6.3.1" + }, + "peerDependencies": { + "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" + } + }, + "node_modules/babel-plugin-polyfill-corejs2/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/babel-plugin-polyfill-corejs3": { + "version": "0.13.0", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.13.0.tgz", + "integrity": "sha512-U+GNwMdSFgzVmfhNm8GJUX88AadB3uo9KpJqS3FaqNIPKgySuvMb+bHPsOmmuWyIcuqZj/pzt1RUIUZns4y2+A==", + "license": "MIT", + "dependencies": { + "@babel/helper-define-polyfill-provider": "^0.6.5", + "core-js-compat": "^3.43.0" + }, + "peerDependencies": { + "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" + } + }, + "node_modules/babel-plugin-polyfill-regenerator": { + "version": "0.6.5", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.6.5.tgz", + "integrity": "sha512-ISqQ2frbiNU9vIJkzg7dlPpznPZ4jOiUQ1uSmB0fEHeowtN3COYRsXr/xexn64NpU13P06jc/L5TgiJXOgrbEg==", + "license": "MIT", + "dependencies": { + "@babel/helper-define-polyfill-provider": "^0.6.5" + }, + "peerDependencies": { + "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" + } + }, + "node_modules/bail": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/bail/-/bail-2.0.2.tgz", + "integrity": "sha512-0xO6mYd7JB2YesxDKplafRpsiOzPt9V02ddPCLbY1xYGPOX24NTyN50qnUxgCPcSoYMhKpAuBTjQoRZCAkUDRw==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "license": "MIT" + }, + "node_modules/base64-js": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", + "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT" + }, + "node_modules/baseline-browser-mapping": { + "version": "2.8.6", + "resolved": "https://registry.npmjs.org/baseline-browser-mapping/-/baseline-browser-mapping-2.8.6.tgz", + "integrity": "sha512-wrH5NNqren/QMtKUEEJf7z86YjfqW/2uw3IL3/xpqZUC95SSVIFXYQeeGjL6FT/X68IROu6RMehZQS5foy2BXw==", + "license": "Apache-2.0", + "bin": { + "baseline-browser-mapping": "dist/cli.js" + } + }, + "node_modules/batch": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/batch/-/batch-0.6.1.tgz", + "integrity": "sha512-x+VAiMRL6UPkx+kudNvxTl6hB2XNNCG2r+7wixVfIYwu/2HKRXimwQyaumLjMveWvT2Hkd/cAJw+QBMfJ/EKVw==", + "license": "MIT" + }, + "node_modules/big.js": { + "version": "5.2.2", + "resolved": "https://registry.npmjs.org/big.js/-/big.js-5.2.2.tgz", + "integrity": "sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ==", + "license": "MIT", + "engines": { + "node": "*" + } + }, + "node_modules/binary-extensions": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.3.0.tgz", + "integrity": "sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==", + "license": "MIT", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/body-parser": { + "version": "1.20.3", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.3.tgz", + "integrity": "sha512-7rAxByjUMqQ3/bHJy7D6OGXvx/MMc4IqBn/X0fcM1QUcAItpZrBEYhWGem+tzXH90c+G01ypMcYJBO9Y30203g==", + "license": "MIT", + "dependencies": { + "bytes": "3.1.2", + "content-type": "~1.0.5", + "debug": "2.6.9", + "depd": "2.0.0", + "destroy": "1.2.0", + "http-errors": "2.0.0", + "iconv-lite": "0.4.24", + "on-finished": "2.4.1", + "qs": "6.13.0", + "raw-body": "2.5.2", + "type-is": "~1.6.18", + "unpipe": "1.0.0" + }, + "engines": { + "node": ">= 0.8", + "npm": "1.2.8000 || >= 1.4.16" + } + }, + "node_modules/body-parser/node_modules/bytes": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", + "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/body-parser/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "license": "MIT", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/body-parser/node_modules/iconv-lite": { + "version": "0.4.24", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", + "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + "license": "MIT", + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/body-parser/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "license": "MIT" + }, + "node_modules/body-parser/node_modules/qs": { + "version": "6.13.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.13.0.tgz", + "integrity": "sha512-+38qI9SOr8tfZ4QmJNplMUxqjbe7LKvvZgWdExBOmd+egZTtjLB67Gu0HRX3u/XOq7UU2Nx6nsjvS16Z9uwfpg==", + "license": "BSD-3-Clause", + "dependencies": { + "side-channel": "^1.0.6" + }, + "engines": { + "node": ">=0.6" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/bonjour-service": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/bonjour-service/-/bonjour-service-1.3.0.tgz", + "integrity": "sha512-3YuAUiSkWykd+2Azjgyxei8OWf8thdn8AITIog2M4UICzoqfjlqr64WIjEXZllf/W6vK1goqleSR6brGomxQqA==", + "license": "MIT", + "dependencies": { + "fast-deep-equal": "^3.1.3", + "multicast-dns": "^7.2.5" + } + }, + "node_modules/boolbase": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz", + "integrity": "sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==", + "license": "ISC" + }, + "node_modules/boxen": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/boxen/-/boxen-6.2.1.tgz", + "integrity": "sha512-H4PEsJXfFI/Pt8sjDWbHlQPx4zL/bvSQjcilJmaulGt5mLDorHOHpmdXAJcBcmru7PhYSp/cDMWRko4ZUMFkSw==", + "license": "MIT", + "dependencies": { + "ansi-align": "^3.0.1", + "camelcase": "^6.2.0", + "chalk": "^4.1.2", + "cli-boxes": "^3.0.0", + "string-width": "^5.0.1", + "type-fest": "^2.5.0", + "widest-line": "^4.0.1", + "wrap-ansi": "^8.0.1" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/brace-expansion": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.2.tgz", + "integrity": "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==", + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/braces": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", + "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", + "license": "MIT", + "dependencies": { + "fill-range": "^7.1.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/browserslist": { + "version": "4.26.2", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.26.2.tgz", + "integrity": "sha512-ECFzp6uFOSB+dcZ5BK/IBaGWssbSYBHvuMeMt3MMFyhI0Z8SqGgEkBLARgpRH3hutIgPVsALcMwbDrJqPxQ65A==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "baseline-browser-mapping": "^2.8.3", + "caniuse-lite": "^1.0.30001741", + "electron-to-chromium": "^1.5.218", + "node-releases": "^2.0.21", + "update-browserslist-db": "^1.1.3" + }, + "bin": { + "browserslist": "cli.js" + }, + "engines": { + "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" + } + }, + "node_modules/buffer": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-6.0.3.tgz", + "integrity": "sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT", + "dependencies": { + "base64-js": "^1.3.1", + "ieee754": "^1.2.1" + } + }, + "node_modules/buffer-from": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", + "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==", + "license": "MIT" + }, + "node_modules/bytes": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.0.0.tgz", + "integrity": "sha512-pMhOfFDPiv9t5jjIXkHosWmkSyQbvsgEVNkz0ERHbuLh2T/7j4Mqqpz523Fe8MVY89KC6Sh/QfS2sM+SjgFDcw==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/cacheable-lookup": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/cacheable-lookup/-/cacheable-lookup-7.0.0.tgz", + "integrity": "sha512-+qJyx4xiKra8mZrcwhjMRMUhD5NR1R8esPkzIYxX96JiecFoxAXFuz/GpR3+ev4PE1WamHip78wV0vcmPQtp8w==", + "license": "MIT", + "engines": { + "node": ">=14.16" + } + }, + "node_modules/cacheable-request": { + "version": "10.2.14", + "resolved": "https://registry.npmjs.org/cacheable-request/-/cacheable-request-10.2.14.tgz", + "integrity": "sha512-zkDT5WAF4hSSoUgyfg5tFIxz8XQK+25W/TLVojJTMKBaxevLBBtLxgqguAuVQB8PVW79FVjHcU+GJ9tVbDZ9mQ==", + "license": "MIT", + "dependencies": { + "@types/http-cache-semantics": "^4.0.2", + "get-stream": "^6.0.1", + "http-cache-semantics": "^4.1.1", + "keyv": "^4.5.3", + "mimic-response": "^4.0.0", + "normalize-url": "^8.0.0", + "responselike": "^3.0.0" + }, + "engines": { + "node": ">=14.16" + } + }, + "node_modules/call-bind": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.8.tgz", + "integrity": "sha512-oKlSFMcMwpUg2ednkhQ454wfWiU/ul3CkJe/PEHcTKuiX6RpbehUiFMXu13HalGZxfUwCQzZG747YXBn1im9ww==", + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.0", + "es-define-property": "^1.0.0", + "get-intrinsic": "^1.2.4", + "set-function-length": "^1.2.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/call-bind-apply-helpers": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz", + "integrity": "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==", + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/call-bound": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/call-bound/-/call-bound-1.0.4.tgz", + "integrity": "sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==", + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.2", + "get-intrinsic": "^1.3.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/call-me-maybe": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/call-me-maybe/-/call-me-maybe-1.0.2.tgz", + "integrity": "sha512-HpX65o1Hnr9HH25ojC1YGs7HCQLq0GCOibSaWER0eNpgJ/Z1MZv2mTc7+xh6WOPxbRVcmgbv4hGU+uSQ/2xFZQ==", + "license": "MIT" + }, + "node_modules/callsites": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", + "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/camel-case": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/camel-case/-/camel-case-4.1.2.tgz", + "integrity": "sha512-gxGWBrTT1JuMx6R+o5PTXMmUnhnVzLQ9SNutD4YqKtI6ap897t3tKECYla6gCWEkplXnlNybEkZg9GEGxKFCgw==", + "license": "MIT", + "dependencies": { + "pascal-case": "^3.1.2", + "tslib": "^2.0.3" + } + }, + "node_modules/camelcase": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz", + "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==", + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/caniuse-api": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/caniuse-api/-/caniuse-api-3.0.0.tgz", + "integrity": "sha512-bsTwuIg/BZZK/vreVTYYbSWoe2F+71P7K5QGEX+pT250DZbfU1MQ5prOKpPR+LL6uWKK3KMwMCAS74QB3Um1uw==", + "license": "MIT", + "dependencies": { + "browserslist": "^4.0.0", + "caniuse-lite": "^1.0.0", + "lodash.memoize": "^4.1.2", + "lodash.uniq": "^4.5.0" + } + }, + "node_modules/caniuse-lite": { + "version": "1.0.30001743", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001743.tgz", + "integrity": "sha512-e6Ojr7RV14Un7dz6ASD0aZDmQPT/A+eZU+nuTNfjqmRrmkmQlnTNWH0SKmqagx9PeW87UVqapSurtAXifmtdmw==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/caniuse-lite" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "CC-BY-4.0" + }, + "node_modules/ccount": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/ccount/-/ccount-2.0.1.tgz", + "integrity": "sha512-eyrF0jiFpY+3drT6383f1qhkbGsLSifNAjA61IUjZjmLCWjItY6LB9ft9YhoDgwfmclB2zhu51Lc7+95b8NRAg==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/char-regex": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/char-regex/-/char-regex-1.0.2.tgz", + "integrity": "sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw==", + "license": "MIT", + "engines": { + "node": ">=10" + } + }, + "node_modules/character-entities": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/character-entities/-/character-entities-2.0.2.tgz", + "integrity": "sha512-shx7oQ0Awen/BRIdkjkvz54PnEEI/EjwXDSIZp86/KKdbafHh1Df/RYGBhn4hbe2+uKC9FnT5UCEdyPz3ai9hQ==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/character-entities-html4": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/character-entities-html4/-/character-entities-html4-2.1.0.tgz", + "integrity": "sha512-1v7fgQRj6hnSwFpq1Eu0ynr/CDEw0rXo2B61qXrLNdHZmPKgb7fqS1a2JwF0rISo9q77jDI8VMEHoApn8qDoZA==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/character-entities-legacy": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/character-entities-legacy/-/character-entities-legacy-3.0.0.tgz", + "integrity": "sha512-RpPp0asT/6ufRm//AJVwpViZbGM/MkjQFxJccQRHmISF/22NBtsHqAWmL+/pmkPWoIUJdWyeVleTl1wydHATVQ==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/character-reference-invalid": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/character-reference-invalid/-/character-reference-invalid-2.0.1.tgz", + "integrity": "sha512-iBZ4F4wRbyORVsu0jPV7gXkOsGYjGHPmAyv+HiHG8gi5PtC9KI2j1+v8/tlibRvjoWX027ypmG/n0HtO5t7unw==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/charset": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/charset/-/charset-1.0.1.tgz", + "integrity": "sha512-6dVyOOYjpfFcL1Y4qChrAoQLRHvj2ziyhcm0QJlhOcAhykL/k1kTUPbeo+87MNRTRdk2OIIsIXbuF3x2wi5EXg==", + "license": "MIT", + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/cheerio": { + "version": "1.0.0-rc.12", + "resolved": "https://registry.npmjs.org/cheerio/-/cheerio-1.0.0-rc.12.tgz", + "integrity": "sha512-VqR8m68vM46BNnuZ5NtnGBKIE/DfN0cRIzg9n40EIq9NOv90ayxLBXA8fXC5gquFRGJSTRqBq25Jt2ECLR431Q==", + "license": "MIT", + "dependencies": { + "cheerio-select": "^2.1.0", + "dom-serializer": "^2.0.0", + "domhandler": "^5.0.3", + "domutils": "^3.0.1", + "htmlparser2": "^8.0.1", + "parse5": "^7.0.0", + "parse5-htmlparser2-tree-adapter": "^7.0.0" + }, + "engines": { + "node": ">= 6" + }, + "funding": { + "url": "https://github.com/cheeriojs/cheerio?sponsor=1" + } + }, + "node_modules/cheerio-select": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/cheerio-select/-/cheerio-select-2.1.0.tgz", + "integrity": "sha512-9v9kG0LvzrlcungtnJtpGNxY+fzECQKhK4EGJX2vByejiMX84MFNQw4UxPJl3bFbTMw+Dfs37XaIkCwTZfLh4g==", + "license": "BSD-2-Clause", + "dependencies": { + "boolbase": "^1.0.0", + "css-select": "^5.1.0", + "css-what": "^6.1.0", + "domelementtype": "^2.3.0", + "domhandler": "^5.0.3", + "domutils": "^3.0.1" + }, + "funding": { + "url": "https://github.com/sponsors/fb55" + } + }, + "node_modules/chokidar": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz", + "integrity": "sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==", + "license": "MIT", + "dependencies": { + "anymatch": "~3.1.2", + "braces": "~3.0.2", + "glob-parent": "~5.1.2", + "is-binary-path": "~2.1.0", + "is-glob": "~4.0.1", + "normalize-path": "~3.0.0", + "readdirp": "~3.6.0" + }, + "engines": { + "node": ">= 8.10.0" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + }, + "optionalDependencies": { + "fsevents": "~2.3.2" + } + }, + "node_modules/chrome-trace-event": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/chrome-trace-event/-/chrome-trace-event-1.0.4.tgz", + "integrity": "sha512-rNjApaLzuwaOTjCiT8lSDdGN1APCiqkChLMJxJPWLunPAt5fy8xgU9/jNOchV84wfIxrA0lRQB7oCT8jrn/wrQ==", + "license": "MIT", + "engines": { + "node": ">=6.0" + } + }, + "node_modules/ci-info": { + "version": "3.9.0", + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.9.0.tgz", + "integrity": "sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/sibiraj-s" + } + ], + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/clean-css": { + "version": "5.3.3", + "resolved": "https://registry.npmjs.org/clean-css/-/clean-css-5.3.3.tgz", + "integrity": "sha512-D5J+kHaVb/wKSFcyyV75uCn8fiY4sV38XJoe4CUyGQ+mOU/fMVYUdH1hJC+CJQ5uY3EnW27SbJYS4X8BiLrAFg==", + "license": "MIT", + "dependencies": { + "source-map": "~0.6.0" + }, + "engines": { + "node": ">= 10.0" + } + }, + "node_modules/clean-css/node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/clean-stack": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-2.2.0.tgz", + "integrity": "sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/cli-boxes": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/cli-boxes/-/cli-boxes-3.0.0.tgz", + "integrity": "sha512-/lzGpEWL/8PfI0BmBOPRwp0c/wFNX1RdUML3jK/RcSBA9T8mZDdQpqYBKtCFTOfQbwPqWEOpjqW+Fnayc0969g==", + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/cli-table3": { + "version": "0.6.5", + "resolved": "https://registry.npmjs.org/cli-table3/-/cli-table3-0.6.5.tgz", + "integrity": "sha512-+W/5efTR7y5HRD7gACw9yQjqMVvEMLBHmboM/kPWam+H+Hmyrgjh6YncVKK122YZkXrLudzTuAukUw9FnMf7IQ==", + "license": "MIT", + "dependencies": { + "string-width": "^4.2.0" + }, + "engines": { + "node": "10.* || >= 12.*" + }, + "optionalDependencies": { + "@colors/colors": "1.5.0" + } + }, + "node_modules/cli-table3/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "license": "MIT" + }, + "node_modules/cli-table3/node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "license": "MIT", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/cliui": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", + "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", + "license": "ISC", + "dependencies": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.1", + "wrap-ansi": "^7.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/cliui/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "license": "MIT" + }, + "node_modules/cliui/node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "license": "MIT", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/cliui/node_modules/wrap-ansi": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/clone-deep": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/clone-deep/-/clone-deep-4.0.1.tgz", + "integrity": "sha512-neHB9xuzh/wk0dIHweyAXv2aPGZIVk3pLMe+/RNzINf17fe0OG96QroktYAUm7SM1PBnzTabaLboqqxDyMU+SQ==", + "license": "MIT", + "dependencies": { + "is-plain-object": "^2.0.4", + "kind-of": "^6.0.2", + "shallow-clone": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/clsx": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/clsx/-/clsx-2.1.1.tgz", + "integrity": "sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/collapse-white-space": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/collapse-white-space/-/collapse-white-space-2.1.0.tgz", + "integrity": "sha512-loKTxY1zCOuG4j9f6EPnuyyYkf58RnhhWTvRoZEokgB+WbdXehfjFviyOVYkqzEWz1Q5kRiZdBYS5SwxbQYwzw==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "license": "MIT", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "license": "MIT" + }, + "node_modules/colord": { + "version": "2.9.3", + "resolved": "https://registry.npmjs.org/colord/-/colord-2.9.3.tgz", + "integrity": "sha512-jeC1axXpnb0/2nn/Y1LPuLdgXBLH7aDcHu4KEKfqw3CUhX7ZpfBSlPKyqXE6btIgEzfWtrX3/tyBCaCvXvMkOw==", + "license": "MIT" + }, + "node_modules/colorette": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/colorette/-/colorette-1.4.0.tgz", + "integrity": "sha512-Y2oEozpomLn7Q3HFP7dpww7AtMJplbM9lGZP6RDfHqmbeRjiwRg4n6VM6j4KLmRke85uWEI7JqF17f3pqdRA0g==", + "license": "MIT" + }, + "node_modules/combine-promises": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/combine-promises/-/combine-promises-1.2.0.tgz", + "integrity": "sha512-VcQB1ziGD0NXrhKxiwyNbCDmRzs/OShMs2GqW2DlU2A/Sd0nQxE1oWDAE5O0ygSx5mgQOn9eIFh7yKPgFRVkPQ==", + "license": "MIT", + "engines": { + "node": ">=10" + } + }, + "node_modules/comlink": { + "version": "4.4.2", + "resolved": "https://registry.npmjs.org/comlink/-/comlink-4.4.2.tgz", + "integrity": "sha512-OxGdvBmJuNKSCMO4NTl1L47VRp6xn2wG4F/2hYzB6tiCb709otOxtEYCSvK80PtjODfXXZu8ds+Nw5kVCjqd2g==", + "license": "Apache-2.0" + }, + "node_modules/comma-separated-tokens": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/comma-separated-tokens/-/comma-separated-tokens-2.0.3.tgz", + "integrity": "sha512-Fu4hJdvzeylCfQPp9SGWidpzrMs7tTrlu6Vb8XGaRGck8QSNZJJp538Wrb60Lax4fPwR64ViY468OIUTbRlGZg==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/commander": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-5.1.0.tgz", + "integrity": "sha512-P0CysNDQ7rtVw4QIQtm+MRxV66vKFSvlsQvGYXZWR3qFU0jlMKHZZZgw8e+8DSah4UDKMqnknRDQz+xuQXQ/Zg==", + "license": "MIT", + "engines": { + "node": ">= 6" + } + }, + "node_modules/common-path-prefix": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/common-path-prefix/-/common-path-prefix-3.0.0.tgz", + "integrity": "sha512-QE33hToZseCH3jS0qN96O/bSh3kaw/h+Tq7ngyY9eWDUnTlTNUyqfqvCXioLe5Na5jFsL78ra/wuBU4iuEgd4w==", + "license": "ISC" + }, + "node_modules/compressible": { + "version": "2.0.18", + "resolved": "https://registry.npmjs.org/compressible/-/compressible-2.0.18.tgz", + "integrity": "sha512-AF3r7P5dWxL8MxyITRMlORQNaOA2IkAFaTr4k7BUumjPtRpGDTZpl0Pb1XCO6JeDCBdp126Cgs9sMxqSjgYyRg==", + "license": "MIT", + "dependencies": { + "mime-db": ">= 1.43.0 < 2" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/compression": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/compression/-/compression-1.8.1.tgz", + "integrity": "sha512-9mAqGPHLakhCLeNyxPkK4xVo746zQ/czLH1Ky+vkitMnWfWZps8r0qXuwhwizagCRttsL4lfG4pIOvaWLpAP0w==", + "license": "MIT", + "dependencies": { + "bytes": "3.1.2", + "compressible": "~2.0.18", + "debug": "2.6.9", + "negotiator": "~0.6.4", + "on-headers": "~1.1.0", + "safe-buffer": "5.2.1", + "vary": "~1.1.2" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/compression/node_modules/bytes": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", + "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/compression/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "license": "MIT", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/compression/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "license": "MIT" + }, + "node_modules/compute-gcd": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/compute-gcd/-/compute-gcd-1.2.1.tgz", + "integrity": "sha512-TwMbxBNz0l71+8Sc4czv13h4kEqnchV9igQZBi6QUaz09dnz13juGnnaWWJTRsP3brxOoxeB4SA2WELLw1hCtg==", + "dependencies": { + "validate.io-array": "^1.0.3", + "validate.io-function": "^1.0.2", + "validate.io-integer-array": "^1.0.0" + } + }, + "node_modules/compute-lcm": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/compute-lcm/-/compute-lcm-1.1.2.tgz", + "integrity": "sha512-OFNPdQAXnQhDSKioX8/XYT6sdUlXwpeMjfd6ApxMJfyZ4GxmLR1xvMERctlYhlHwIiz6CSpBc2+qYKjHGZw4TQ==", + "dependencies": { + "compute-gcd": "^1.2.1", + "validate.io-array": "^1.0.3", + "validate.io-function": "^1.0.2", + "validate.io-integer-array": "^1.0.0" + } + }, + "node_modules/concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", + "license": "MIT" + }, + "node_modules/config-chain": { + "version": "1.1.13", + "resolved": "https://registry.npmjs.org/config-chain/-/config-chain-1.1.13.tgz", + "integrity": "sha512-qj+f8APARXHrM0hraqXYb2/bOVSV4PvJQlNZ/DVj0QrmNM2q2euizkeuVckQ57J+W0mRH6Hvi+k50M4Jul2VRQ==", + "license": "MIT", + "dependencies": { + "ini": "^1.3.4", + "proto-list": "~1.2.1" + } + }, + "node_modules/configstore": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/configstore/-/configstore-6.0.0.tgz", + "integrity": "sha512-cD31W1v3GqUlQvbBCGcXmd2Nj9SvLDOP1oQ0YFuLETufzSPaKp11rYBsSOm7rCsW3OnIRAFM3OxRhceaXNYHkA==", + "license": "BSD-2-Clause", + "dependencies": { + "dot-prop": "^6.0.1", + "graceful-fs": "^4.2.6", + "unique-string": "^3.0.0", + "write-file-atomic": "^3.0.3", + "xdg-basedir": "^5.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/yeoman/configstore?sponsor=1" + } + }, + "node_modules/connect-history-api-fallback": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/connect-history-api-fallback/-/connect-history-api-fallback-2.0.0.tgz", + "integrity": "sha512-U73+6lQFmfiNPrYbXqr6kZ1i1wiRqXnp2nhMsINseWXO8lDau0LGEffJ8kQi4EjLZympVgRdvqjAgiZ1tgzDDA==", + "license": "MIT", + "engines": { + "node": ">=0.8" + } + }, + "node_modules/consola": { + "version": "3.4.2", + "resolved": "https://registry.npmjs.org/consola/-/consola-3.4.2.tgz", + "integrity": "sha512-5IKcdX0nnYavi6G7TtOhwkYzyjfJlatbjMjuLSfE2kYT5pMDOilZ4OvMhi637CcDICTmz3wARPoyhqyX1Y+XvA==", + "license": "MIT", + "engines": { + "node": "^14.18.0 || >=16.10.0" + } + }, + "node_modules/content-disposition": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.2.tgz", + "integrity": "sha512-kRGRZw3bLlFISDBgwTSA1TMBFN6J6GWDeubmDE3AF+3+yXL8hTWv8r5rkLbqYXY4RjPk/EzHnClI3zQf1cFmHA==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/content-type": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz", + "integrity": "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/convert-source-map": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", + "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", + "license": "MIT" + }, + "node_modules/cookie": { + "version": "0.7.1", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.7.1.tgz", + "integrity": "sha512-6DnInpx7SJ2AK3+CTUE/ZM0vWTUboZCegxhC2xiIydHR9jNuTAASBrfEpHhiGOZw/nX51bHt6YQl8jsGo4y/0w==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/cookie-signature": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", + "integrity": "sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==", + "license": "MIT" + }, + "node_modules/copy-text-to-clipboard": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/copy-text-to-clipboard/-/copy-text-to-clipboard-3.2.1.tgz", + "integrity": "sha512-3am6cw+WOicd0+HyzhC4kYS02wHJUiVQXmAADxfUARKsHBkWl1Vl3QQEiILlSs8YcPS/C0+y/urCNEYQk+byWA==", + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/copy-webpack-plugin": { + "version": "11.0.0", + "resolved": "https://registry.npmjs.org/copy-webpack-plugin/-/copy-webpack-plugin-11.0.0.tgz", + "integrity": "sha512-fX2MWpamkW0hZxMEg0+mYnA40LTosOSa5TqZ9GYIBzyJa9C3QUaMPSE2xAi/buNr8u89SfD9wHSQVBzrRa/SOQ==", + "license": "MIT", + "dependencies": { + "fast-glob": "^3.2.11", + "glob-parent": "^6.0.1", + "globby": "^13.1.1", + "normalize-path": "^3.0.0", + "schema-utils": "^4.0.0", + "serialize-javascript": "^6.0.0" + }, + "engines": { + "node": ">= 14.15.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^5.1.0" + } + }, + "node_modules/copy-webpack-plugin/node_modules/glob-parent": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", + "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", + "license": "ISC", + "dependencies": { + "is-glob": "^4.0.3" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/copy-webpack-plugin/node_modules/globby": { + "version": "13.2.2", + "resolved": "https://registry.npmjs.org/globby/-/globby-13.2.2.tgz", + "integrity": "sha512-Y1zNGV+pzQdh7H39l9zgB4PJqjRNqydvdYCDG4HFXM4XuvSaQQlEc91IU1yALL8gUTDomgBAfz3XJdmUS+oo0w==", + "license": "MIT", + "dependencies": { + "dir-glob": "^3.0.1", + "fast-glob": "^3.3.0", + "ignore": "^5.2.4", + "merge2": "^1.4.1", + "slash": "^4.0.0" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/copy-webpack-plugin/node_modules/slash": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-4.0.0.tgz", + "integrity": "sha512-3dOsAHXXUkQTpOYcoAxLIorMTp4gIQr5IW3iVb7A7lFIp0VHhnynm9izx6TssdrIcVIESAlVjtnO2K8bg+Coew==", + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/core-js": { + "version": "3.45.1", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.45.1.tgz", + "integrity": "sha512-L4NPsJlCfZsPeXukyzHFlg/i7IIVwHSItR0wg0FLNqYClJ4MQYTYLbC7EkjKYRLZF2iof2MUgN0EGy7MdQFChg==", + "hasInstallScript": true, + "license": "MIT", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/core-js" + } + }, + "node_modules/core-js-compat": { + "version": "3.45.1", + "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.45.1.tgz", + "integrity": "sha512-tqTt5T4PzsMIZ430XGviK4vzYSoeNJ6CXODi6c/voxOT6IZqBht5/EKaSNnYiEjjRYxjVz7DQIsOsY0XNi8PIA==", + "license": "MIT", + "dependencies": { + "browserslist": "^4.25.3" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/core-js" + } + }, + "node_modules/core-js-pure": { + "version": "3.45.1", + "resolved": "https://registry.npmjs.org/core-js-pure/-/core-js-pure-3.45.1.tgz", + "integrity": "sha512-OHnWFKgTUshEU8MK+lOs1H8kC8GkTi9Z1tvNkxrCcw9wl3MJIO7q2ld77wjWn4/xuGrVu2X+nME1iIIPBSdyEQ==", + "hasInstallScript": true, + "license": "MIT", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/core-js" + } + }, + "node_modules/core-util-is": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz", + "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==", + "license": "MIT" + }, + "node_modules/cosmiconfig": { + "version": "8.3.6", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-8.3.6.tgz", + "integrity": "sha512-kcZ6+W5QzcJ3P1Mt+83OUv/oHFqZHIx8DuxG6eZ5RGMERoLqp4BuGjhHLYGK+Kf5XVkQvqBSmAy/nGWN3qDgEA==", + "license": "MIT", + "dependencies": { + "import-fresh": "^3.3.0", + "js-yaml": "^4.1.0", + "parse-json": "^5.2.0", + "path-type": "^4.0.0" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/d-fischer" + }, + "peerDependencies": { + "typescript": ">=4.9.5" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/cross-spawn": { + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", + "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==", + "license": "MIT", + "dependencies": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/crypto-js": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/crypto-js/-/crypto-js-4.2.0.tgz", + "integrity": "sha512-KALDyEYgpY+Rlob/iriUtjV6d5Eq+Y191A5g4UqLAi8CyGP9N1+FdVbkc1SxKc2r4YAYqG8JzO2KGL+AizD70Q==", + "license": "MIT" + }, + "node_modules/crypto-random-string": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/crypto-random-string/-/crypto-random-string-4.0.0.tgz", + "integrity": "sha512-x8dy3RnvYdlUcPOjkEHqozhiwzKNSq7GcPuXFbnyMOCHxX8V3OgIg/pYuabl2sbUPfIJaeAQB7PMOK8DFIdoRA==", + "license": "MIT", + "dependencies": { + "type-fest": "^1.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/crypto-random-string/node_modules/type-fest": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-1.4.0.tgz", + "integrity": "sha512-yGSza74xk0UG8k+pLh5oeoYirvIiWo5t0/o3zHHAO2tRDiZcxWP7fywNlXhqb6/r6sWvwi+RsyQMWhVLe4BVuA==", + "license": "(MIT OR CC0-1.0)", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/css-blank-pseudo": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/css-blank-pseudo/-/css-blank-pseudo-7.0.1.tgz", + "integrity": "sha512-jf+twWGDf6LDoXDUode+nc7ZlrqfaNphrBIBrcmeP3D8yw1uPaix1gCC8LUQUGQ6CycuK2opkbFFWFuq/a94ag==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "dependencies": { + "postcss-selector-parser": "^7.0.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/css-blank-pseudo/node_modules/postcss-selector-parser": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.1.0.tgz", + "integrity": "sha512-8sLjZwK0R+JlxlYcTuVnyT2v+htpdrjDOKuMcOVdYjt52Lh8hWRYpxBPoKx/Zg+bcjc3wx6fmQevMmUztS/ccA==", + "license": "MIT", + "dependencies": { + "cssesc": "^3.0.0", + "util-deprecate": "^1.0.2" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/css-declaration-sorter": { + "version": "7.3.0", + "resolved": "https://registry.npmjs.org/css-declaration-sorter/-/css-declaration-sorter-7.3.0.tgz", + "integrity": "sha512-LQF6N/3vkAMYF4xoHLJfG718HRJh34Z8BnNhd6bosOMIVjMlhuZK5++oZa3uYAgrI5+7x2o27gUqTR2U/KjUOQ==", + "license": "ISC", + "engines": { + "node": "^14 || ^16 || >=18" + }, + "peerDependencies": { + "postcss": "^8.0.9" + } + }, + "node_modules/css-has-pseudo": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/css-has-pseudo/-/css-has-pseudo-7.0.3.tgz", + "integrity": "sha512-oG+vKuGyqe/xvEMoxAQrhi7uY16deJR3i7wwhBerVrGQKSqUC5GiOVxTpM9F9B9hw0J+eKeOWLH7E9gZ1Dr5rA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "dependencies": { + "@csstools/selector-specificity": "^5.0.0", + "postcss-selector-parser": "^7.0.0", + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/css-has-pseudo/node_modules/@csstools/selector-specificity": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/@csstools/selector-specificity/-/selector-specificity-5.0.0.tgz", + "integrity": "sha512-PCqQV3c4CoVm3kdPhyeZ07VmBRdH2EpMFA/pd9OASpOEC3aXNGoqPDAZ80D0cLpMBxnmk0+yNhGsEx31hq7Gtw==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss-selector-parser": "^7.0.0" + } + }, + "node_modules/css-has-pseudo/node_modules/postcss-selector-parser": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.1.0.tgz", + "integrity": "sha512-8sLjZwK0R+JlxlYcTuVnyT2v+htpdrjDOKuMcOVdYjt52Lh8hWRYpxBPoKx/Zg+bcjc3wx6fmQevMmUztS/ccA==", + "license": "MIT", + "dependencies": { + "cssesc": "^3.0.0", + "util-deprecate": "^1.0.2" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/css-loader": { + "version": "6.11.0", + "resolved": "https://registry.npmjs.org/css-loader/-/css-loader-6.11.0.tgz", + "integrity": "sha512-CTJ+AEQJjq5NzLga5pE39qdiSV56F8ywCIsqNIRF0r7BDgWsN25aazToqAFg7ZrtA/U016xudB3ffgweORxX7g==", + "license": "MIT", + "dependencies": { + "icss-utils": "^5.1.0", + "postcss": "^8.4.33", + "postcss-modules-extract-imports": "^3.1.0", + "postcss-modules-local-by-default": "^4.0.5", + "postcss-modules-scope": "^3.2.0", + "postcss-modules-values": "^4.0.0", + "postcss-value-parser": "^4.2.0", + "semver": "^7.5.4" + }, + "engines": { + "node": ">= 12.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "@rspack/core": "0.x || 1.x", + "webpack": "^5.0.0" + }, + "peerDependenciesMeta": { + "@rspack/core": { + "optional": true + }, + "webpack": { + "optional": true + } + } + }, + "node_modules/css-minimizer-webpack-plugin": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/css-minimizer-webpack-plugin/-/css-minimizer-webpack-plugin-5.0.1.tgz", + "integrity": "sha512-3caImjKFQkS+ws1TGcFn0V1HyDJFq1Euy589JlD6/3rV2kj+w7r5G9WDMgSHvpvXHNZ2calVypZWuEDQd9wfLg==", + "license": "MIT", + "dependencies": { + "@jridgewell/trace-mapping": "^0.3.18", + "cssnano": "^6.0.1", + "jest-worker": "^29.4.3", + "postcss": "^8.4.24", + "schema-utils": "^4.0.1", + "serialize-javascript": "^6.0.1" + }, + "engines": { + "node": ">= 14.15.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^5.0.0" + }, + "peerDependenciesMeta": { + "@parcel/css": { + "optional": true + }, + "@swc/css": { + "optional": true + }, + "clean-css": { + "optional": true + }, + "csso": { + "optional": true + }, + "esbuild": { + "optional": true + }, + "lightningcss": { + "optional": true + } + } + }, + "node_modules/css-prefers-color-scheme": { + "version": "10.0.0", + "resolved": "https://registry.npmjs.org/css-prefers-color-scheme/-/css-prefers-color-scheme-10.0.0.tgz", + "integrity": "sha512-VCtXZAWivRglTZditUfB4StnsWr6YVZ2PRtuxQLKTNRdtAf8tpzaVPE9zXIF3VaSc7O70iK/j1+NXxyQCqdPjQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/css-select": { + "version": "5.2.2", + "resolved": "https://registry.npmjs.org/css-select/-/css-select-5.2.2.tgz", + "integrity": "sha512-TizTzUddG/xYLA3NXodFM0fSbNizXjOKhqiQQwvhlspadZokn1KDy0NZFS0wuEubIYAV5/c1/lAr0TaaFXEXzw==", + "license": "BSD-2-Clause", + "dependencies": { + "boolbase": "^1.0.0", + "css-what": "^6.1.0", + "domhandler": "^5.0.2", + "domutils": "^3.0.1", + "nth-check": "^2.0.1" + }, + "funding": { + "url": "https://github.com/sponsors/fb55" + } + }, + "node_modules/css-tree": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-2.3.1.tgz", + "integrity": "sha512-6Fv1DV/TYw//QF5IzQdqsNDjx/wc8TrMBZsqjL9eW01tWb7R7k/mq+/VXfJCl7SoD5emsJop9cOByJZfs8hYIw==", + "license": "MIT", + "dependencies": { + "mdn-data": "2.0.30", + "source-map-js": "^1.0.1" + }, + "engines": { + "node": "^10 || ^12.20.0 || ^14.13.0 || >=15.0.0" + } + }, + "node_modules/css-what": { + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/css-what/-/css-what-6.2.2.tgz", + "integrity": "sha512-u/O3vwbptzhMs3L1fQE82ZSLHQQfto5gyZzwteVIEyeaY5Fc7R4dapF/BvRoSYFeqfBk4m0V1Vafq5Pjv25wvA==", + "license": "BSD-2-Clause", + "engines": { + "node": ">= 6" + }, + "funding": { + "url": "https://github.com/sponsors/fb55" + } + }, + "node_modules/cssdb": { + "version": "8.4.2", + "resolved": "https://registry.npmjs.org/cssdb/-/cssdb-8.4.2.tgz", + "integrity": "sha512-PzjkRkRUS+IHDJohtxkIczlxPPZqRo0nXplsYXOMBRPjcVRjj1W4DfvRgshUYTVuUigU7ptVYkFJQ7abUB0nyg==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + }, + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + } + ], + "license": "MIT-0" + }, + "node_modules/cssesc": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz", + "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==", + "license": "MIT", + "bin": { + "cssesc": "bin/cssesc" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/cssnano": { + "version": "6.1.2", + "resolved": "https://registry.npmjs.org/cssnano/-/cssnano-6.1.2.tgz", + "integrity": "sha512-rYk5UeX7VAM/u0lNqewCdasdtPK81CgX8wJFLEIXHbV2oldWRgJAsZrdhRXkV1NJzA2g850KiFm9mMU2HxNxMA==", + "license": "MIT", + "dependencies": { + "cssnano-preset-default": "^6.1.2", + "lilconfig": "^3.1.1" + }, + "engines": { + "node": "^14 || ^16 || >=18.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/cssnano" + }, + "peerDependencies": { + "postcss": "^8.4.31" + } + }, + "node_modules/cssnano-preset-advanced": { + "version": "6.1.2", + "resolved": "https://registry.npmjs.org/cssnano-preset-advanced/-/cssnano-preset-advanced-6.1.2.tgz", + "integrity": "sha512-Nhao7eD8ph2DoHolEzQs5CfRpiEP0xa1HBdnFZ82kvqdmbwVBUr2r1QuQ4t1pi+D1ZpqpcO4T+wy/7RxzJ/WPQ==", + "license": "MIT", + "dependencies": { + "autoprefixer": "^10.4.19", + "browserslist": "^4.23.0", + "cssnano-preset-default": "^6.1.2", + "postcss-discard-unused": "^6.0.5", + "postcss-merge-idents": "^6.0.3", + "postcss-reduce-idents": "^6.0.3", + "postcss-zindex": "^6.0.2" + }, + "engines": { + "node": "^14 || ^16 || >=18.0" + }, + "peerDependencies": { + "postcss": "^8.4.31" + } + }, + "node_modules/cssnano-preset-default": { + "version": "6.1.2", + "resolved": "https://registry.npmjs.org/cssnano-preset-default/-/cssnano-preset-default-6.1.2.tgz", + "integrity": "sha512-1C0C+eNaeN8OcHQa193aRgYexyJtU8XwbdieEjClw+J9d94E41LwT6ivKH0WT+fYwYWB0Zp3I3IZ7tI/BbUbrg==", + "license": "MIT", + "dependencies": { + "browserslist": "^4.23.0", + "css-declaration-sorter": "^7.2.0", + "cssnano-utils": "^4.0.2", + "postcss-calc": "^9.0.1", + "postcss-colormin": "^6.1.0", + "postcss-convert-values": "^6.1.0", + "postcss-discard-comments": "^6.0.2", + "postcss-discard-duplicates": "^6.0.3", + "postcss-discard-empty": "^6.0.3", + "postcss-discard-overridden": "^6.0.2", + "postcss-merge-longhand": "^6.0.5", + "postcss-merge-rules": "^6.1.1", + "postcss-minify-font-values": "^6.1.0", + "postcss-minify-gradients": "^6.0.3", + "postcss-minify-params": "^6.1.0", + "postcss-minify-selectors": "^6.0.4", + "postcss-normalize-charset": "^6.0.2", + "postcss-normalize-display-values": "^6.0.2", + "postcss-normalize-positions": "^6.0.2", + "postcss-normalize-repeat-style": "^6.0.2", + "postcss-normalize-string": "^6.0.2", + "postcss-normalize-timing-functions": "^6.0.2", + "postcss-normalize-unicode": "^6.1.0", + "postcss-normalize-url": "^6.0.2", + "postcss-normalize-whitespace": "^6.0.2", + "postcss-ordered-values": "^6.0.2", + "postcss-reduce-initial": "^6.1.0", + "postcss-reduce-transforms": "^6.0.2", + "postcss-svgo": "^6.0.3", + "postcss-unique-selectors": "^6.0.4" + }, + "engines": { + "node": "^14 || ^16 || >=18.0" + }, + "peerDependencies": { + "postcss": "^8.4.31" + } + }, + "node_modules/cssnano-utils": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/cssnano-utils/-/cssnano-utils-4.0.2.tgz", + "integrity": "sha512-ZR1jHg+wZ8o4c3zqf1SIUSTIvm/9mU343FMR6Obe/unskbvpGhZOo1J6d/r8D1pzkRQYuwbcH3hToOuoA2G7oQ==", + "license": "MIT", + "engines": { + "node": "^14 || ^16 || >=18.0" + }, + "peerDependencies": { + "postcss": "^8.4.31" + } + }, + "node_modules/csso": { + "version": "5.0.5", + "resolved": "https://registry.npmjs.org/csso/-/csso-5.0.5.tgz", + "integrity": "sha512-0LrrStPOdJj+SPCCrGhzryycLjwcgUSHBtxNA8aIDxf0GLsRh1cKYhB00Gd1lDOS4yGH69+SNn13+TWbVHETFQ==", + "license": "MIT", + "dependencies": { + "css-tree": "~2.2.0" + }, + "engines": { + "node": "^10 || ^12.20.0 || ^14.13.0 || >=15.0.0", + "npm": ">=7.0.0" + } + }, + "node_modules/csso/node_modules/css-tree": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-2.2.1.tgz", + "integrity": "sha512-OA0mILzGc1kCOCSJerOeqDxDQ4HOh+G8NbOJFOTgOCzpw7fCBubk0fEyxp8AgOL/jvLgYA/uV0cMbe43ElF1JA==", + "license": "MIT", + "dependencies": { + "mdn-data": "2.0.28", + "source-map-js": "^1.0.1" + }, + "engines": { + "node": "^10 || ^12.20.0 || ^14.13.0 || >=15.0.0", + "npm": ">=7.0.0" + } + }, + "node_modules/csso/node_modules/mdn-data": { + "version": "2.0.28", + "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.28.tgz", + "integrity": "sha512-aylIc7Z9y4yzHYAJNuESG3hfhC+0Ibp/MAMiaOZgNv4pmEdFyfZhhhny4MNiAfWdBQ1RQ2mfDWmM1x8SvGyp8g==", + "license": "CC0-1.0" + }, + "node_modules/csstype": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.3.tgz", + "integrity": "sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==", + "license": "MIT" + }, + "node_modules/debounce": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/debounce/-/debounce-1.2.1.tgz", + "integrity": "sha512-XRRe6Glud4rd/ZGQfiV1ruXSfbvfJedlV9Y6zOlP+2K04vBYiJEte6stfFkCP03aMnY5tsipamumUjL14fofug==", + "license": "MIT" + }, + "node_modules/debug": { + "version": "4.4.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", + "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", + "license": "MIT", + "dependencies": { + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/decode-named-character-reference": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/decode-named-character-reference/-/decode-named-character-reference-1.2.0.tgz", + "integrity": "sha512-c6fcElNV6ShtZXmsgNgFFV5tVX2PaV4g+MOAkb8eXHvn6sryJBrZa9r0zV6+dtTyoCKxtDy5tyQ5ZwQuidtd+Q==", + "license": "MIT", + "dependencies": { + "character-entities": "^2.0.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/decompress-response": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-6.0.0.tgz", + "integrity": "sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==", + "license": "MIT", + "dependencies": { + "mimic-response": "^3.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/decompress-response/node_modules/mimic-response": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-3.1.0.tgz", + "integrity": "sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==", + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/deep-extend": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz", + "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==", + "license": "MIT", + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/deepmerge": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.3.1.tgz", + "integrity": "sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/default-gateway": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/default-gateway/-/default-gateway-6.0.3.tgz", + "integrity": "sha512-fwSOJsbbNzZ/CUFpqFBqYfYNLj1NbMPm8MMCIzHjC83iSJRBEGmDUxU+WP661BaBQImeC2yHwXtz+P/O9o+XEg==", + "license": "BSD-2-Clause", + "dependencies": { + "execa": "^5.0.0" + }, + "engines": { + "node": ">= 10" + } + }, + "node_modules/defer-to-connect": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/defer-to-connect/-/defer-to-connect-2.0.1.tgz", + "integrity": "sha512-4tvttepXG1VaYGrRibk5EwJd1t4udunSOVMdLSAL6mId1ix438oPwPZMALY41FCijukO1L0twNcGsdzS7dHgDg==", + "license": "MIT", + "engines": { + "node": ">=10" + } + }, + "node_modules/define-data-property": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.4.tgz", + "integrity": "sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==", + "license": "MIT", + "dependencies": { + "es-define-property": "^1.0.0", + "es-errors": "^1.3.0", + "gopd": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/define-lazy-prop": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/define-lazy-prop/-/define-lazy-prop-2.0.0.tgz", + "integrity": "sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/define-properties": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.1.tgz", + "integrity": "sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==", + "license": "MIT", + "dependencies": { + "define-data-property": "^1.0.1", + "has-property-descriptors": "^1.0.0", + "object-keys": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/depd": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", + "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/dequal": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/dequal/-/dequal-2.0.3.tgz", + "integrity": "sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/destroy": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz", + "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==", + "license": "MIT", + "engines": { + "node": ">= 0.8", + "npm": "1.2.8000 || >= 1.4.16" + } + }, + "node_modules/detect-libc": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-1.0.3.tgz", + "integrity": "sha512-pGjwhsmsp4kL2RTz08wcOlGN83otlqHeD/Z5T8GXZB+/YcpQ/dgo+lbU8ZsGxV0HIvqqxo9l7mqYwyYMD9bKDg==", + "license": "Apache-2.0", + "optional": true, + "bin": { + "detect-libc": "bin/detect-libc.js" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/detect-node": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/detect-node/-/detect-node-2.1.0.tgz", + "integrity": "sha512-T0NIuQpnTvFDATNuHN5roPwSBG83rFsuO+MXXH9/3N1eFbn4wcPjttvjMLEPWJ0RGUYgQE7cGgS3tNxbqCGM7g==", + "license": "MIT" + }, + "node_modules/detect-package-manager": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/detect-package-manager/-/detect-package-manager-3.0.2.tgz", + "integrity": "sha512-8JFjJHutStYrfWwzfretQoyNGoZVW1Fsrp4JO9spa7h/fBfwgTMEIy4/LBzRDGsxwVPHU0q+T9YvwLDJoOApLQ==", + "license": "MIT", + "dependencies": { + "execa": "^5.1.1" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/detect-port": { + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/detect-port/-/detect-port-1.6.1.tgz", + "integrity": "sha512-CmnVc+Hek2egPx1PeTFVta2W78xy2K/9Rkf6cC4T59S50tVnzKj+tnx5mmx5lwvCkujZ4uRrpRSuV+IVs3f90Q==", + "license": "MIT", + "dependencies": { + "address": "^1.0.1", + "debug": "4" + }, + "bin": { + "detect": "bin/detect-port.js", + "detect-port": "bin/detect-port.js" + }, + "engines": { + "node": ">= 4.0.0" + } + }, + "node_modules/devlop": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/devlop/-/devlop-1.1.0.tgz", + "integrity": "sha512-RWmIqhcFf1lRYBvNmr7qTNuyCt/7/ns2jbpp1+PalgE/rDQcBT0fioSMUpJ93irlUhC5hrg4cYqe6U+0ImW0rA==", + "license": "MIT", + "dependencies": { + "dequal": "^2.0.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/diff": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/diff/-/diff-5.2.0.tgz", + "integrity": "sha512-uIFDxqpRZGZ6ThOk84hEfqWoHx2devRFvpTZcTHur85vImfaxUbTW9Ryh4CpCuDnToOP1CEtXKIgytHBPVff5A==", + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.3.1" + } + }, + "node_modules/dir-glob": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", + "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", + "license": "MIT", + "dependencies": { + "path-type": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/dns-packet": { + "version": "5.6.1", + "resolved": "https://registry.npmjs.org/dns-packet/-/dns-packet-5.6.1.tgz", + "integrity": "sha512-l4gcSouhcgIKRvyy99RNVOgxXiicE+2jZoNmaNmZ6JXiGajBOJAesk1OBlJuM5k2c+eudGdLxDqXuPCKIj6kpw==", + "license": "MIT", + "dependencies": { + "@leichtgewicht/ip-codec": "^2.0.1" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/docusaurus-plugin-openapi-docs": { + "version": "4.3.7", + "resolved": "https://registry.npmjs.org/docusaurus-plugin-openapi-docs/-/docusaurus-plugin-openapi-docs-4.3.7.tgz", + "integrity": "sha512-wCXuHniG108OGCj6qKtTOFLgyhnlztMegj63BbEyHC/OgM7PDL2Yj2VFkWsU3eCmJKI+czahanztFMhVLFD67w==", + "license": "MIT", + "dependencies": { + "@apidevtools/json-schema-ref-parser": "^11.5.4", + "@redocly/openapi-core": "^1.10.5", + "allof-merge": "^0.6.6", + "chalk": "^4.1.2", + "clsx": "^1.1.1", + "fs-extra": "^9.0.1", + "json-pointer": "^0.6.2", + "json5": "^2.2.3", + "lodash": "^4.17.20", + "mustache": "^4.2.0", + "openapi-to-postmanv2": "^4.21.0", + "postman-collection": "^4.4.0", + "slugify": "^1.6.5", + "swagger2openapi": "^7.0.8", + "xml-formatter": "^2.6.1" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@docusaurus/plugin-content-docs": "^3.5.0", + "@docusaurus/utils": "^3.5.0", + "@docusaurus/utils-validation": "^3.5.0", + "react": "^16.8.4 || ^17.0.0 || ^18.0.0 || ^19.0.0" + } + }, + "node_modules/docusaurus-plugin-openapi-docs/node_modules/clsx": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/clsx/-/clsx-1.2.1.tgz", + "integrity": "sha512-EcR6r5a8bj6pu3ycsa/E/cKVGuTgZJZdsyUYHOksG/UHIiKfjxzRxYJpyVBwYaQeOvghal9fcc4PidlgzugAQg==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/docusaurus-plugin-openapi-docs/node_modules/fs-extra": { + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz", + "integrity": "sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==", + "license": "MIT", + "dependencies": { + "at-least-node": "^1.0.0", + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/docusaurus-plugin-sass": { + "version": "0.2.6", + "resolved": "https://registry.npmjs.org/docusaurus-plugin-sass/-/docusaurus-plugin-sass-0.2.6.tgz", + "integrity": "sha512-2hKQQDkrufMong9upKoG/kSHJhuwd+FA3iAe/qzS/BmWpbIpe7XKmq5wlz4J5CJaOPu4x+iDJbgAxZqcoQf0kg==", + "license": "MIT", + "peer": true, + "dependencies": { + "sass-loader": "^16.0.2" + }, + "peerDependencies": { + "@docusaurus/core": "^2.0.0-beta || ^3.0.0-alpha", + "sass": "^1.30.0" + } + }, + "node_modules/docusaurus-theme-openapi-docs": { + "version": "4.3.7", + "resolved": "https://registry.npmjs.org/docusaurus-theme-openapi-docs/-/docusaurus-theme-openapi-docs-4.3.7.tgz", + "integrity": "sha512-VRKA8gFVIlSBUu7EAYOY3JDF2WetCSVsYx5WeFo8g6/7LJWHhX7/A7Wo2fJ0B61VE/c53BSdbmvVWSJoUqnkoA==", + "license": "MIT", + "dependencies": { + "@hookform/error-message": "^2.0.1", + "@reduxjs/toolkit": "^1.7.1", + "allof-merge": "^0.6.6", + "buffer": "^6.0.3", + "clsx": "^1.1.1", + "copy-text-to-clipboard": "^3.1.0", + "crypto-js": "^4.1.1", + "file-saver": "^2.0.5", + "lodash": "^4.17.20", + "pako": "^2.1.0", + "postman-code-generators": "^1.10.1", + "postman-collection": "^4.4.0", + "prism-react-renderer": "^2.3.0", + "process": "^0.11.10", + "react-hook-form": "^7.43.8", + "react-live": "^4.0.0", + "react-magic-dropzone": "^1.0.1", + "react-markdown": "^8.0.1", + "react-modal": "^3.15.1", + "react-redux": "^7.2.0", + "rehype-raw": "^6.1.1", + "remark-gfm": "3.0.1", + "sass": "^1.80.4", + "sass-loader": "^16.0.2", + "unist-util-visit": "^5.0.0", + "url": "^0.11.1", + "xml-formatter": "^2.6.1" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@docusaurus/theme-common": "^3.5.0", + "docusaurus-plugin-openapi-docs": "^4.0.0", + "docusaurus-plugin-sass": "^0.2.3", + "react": "^16.8.4 || ^17.0.0 || ^18.0.0 || ^19.0.0", + "react-dom": "^16.8.4 || ^17.0.0 || ^18.0.0 || ^19.0.0" + } + }, + "node_modules/docusaurus-theme-openapi-docs/node_modules/@reduxjs/toolkit": { + "version": "1.9.7", + "resolved": "https://registry.npmjs.org/@reduxjs/toolkit/-/toolkit-1.9.7.tgz", + "integrity": "sha512-t7v8ZPxhhKgOKtU+uyJT13lu4vL7az5aFi4IdoDs/eS548edn2M8Ik9h8fxgvMjGoAUVFSt6ZC1P5cWmQ014QQ==", + "license": "MIT", + "dependencies": { + "immer": "^9.0.21", + "redux": "^4.2.1", + "redux-thunk": "^2.4.2", + "reselect": "^4.1.8" + }, + "peerDependencies": { + "react": "^16.9.0 || ^17.0.0 || ^18", + "react-redux": "^7.2.1 || ^8.0.2" + }, + "peerDependenciesMeta": { + "react": { + "optional": true + }, + "react-redux": { + "optional": true + } + } + }, + "node_modules/docusaurus-theme-openapi-docs/node_modules/@types/hast": { + "version": "2.3.10", + "resolved": "https://registry.npmjs.org/@types/hast/-/hast-2.3.10.tgz", + "integrity": "sha512-McWspRw8xx8J9HurkVBfYj0xKoE25tOFlHGdx4MJ5xORQrMGZNqJhVQWaIbm6Oyla5kYOXtDiopzKRJzEOkwJw==", + "license": "MIT", + "dependencies": { + "@types/unist": "^2" + } + }, + "node_modules/docusaurus-theme-openapi-docs/node_modules/@types/mdast": { + "version": "3.0.15", + "resolved": "https://registry.npmjs.org/@types/mdast/-/mdast-3.0.15.tgz", + "integrity": "sha512-LnwD+mUEfxWMa1QpDraczIn6k0Ee3SMicuYSSzS6ZYl2gKS09EClnJYGd8Du6rfc5r/GZEk5o1mRb8TaTj03sQ==", + "license": "MIT", + "dependencies": { + "@types/unist": "^2" + } + }, + "node_modules/docusaurus-theme-openapi-docs/node_modules/@types/unist": { + "version": "2.0.11", + "resolved": "https://registry.npmjs.org/@types/unist/-/unist-2.0.11.tgz", + "integrity": "sha512-CmBKiL6NNo/OqgmMn95Fk9Whlp2mtvIv+KNpQKN2F4SjvrEesubTRWGYSg+BnWZOnlCaSTU1sMpsBOzgbYhnsA==", + "license": "MIT" + }, + "node_modules/docusaurus-theme-openapi-docs/node_modules/clsx": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/clsx/-/clsx-1.2.1.tgz", + "integrity": "sha512-EcR6r5a8bj6pu3ycsa/E/cKVGuTgZJZdsyUYHOksG/UHIiKfjxzRxYJpyVBwYaQeOvghal9fcc4PidlgzugAQg==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/docusaurus-theme-openapi-docs/node_modules/escape-string-regexp": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-5.0.0.tgz", + "integrity": "sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw==", + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/docusaurus-theme-openapi-docs/node_modules/hast-util-from-parse5": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/hast-util-from-parse5/-/hast-util-from-parse5-7.1.2.tgz", + "integrity": "sha512-Nz7FfPBuljzsN3tCQ4kCBKqdNhQE2l0Tn+X1ubgKBPRoiDIu1mL08Cfw4k7q71+Duyaw7DXDN+VTAp4Vh3oCOw==", + "license": "MIT", + "dependencies": { + "@types/hast": "^2.0.0", + "@types/unist": "^2.0.0", + "hastscript": "^7.0.0", + "property-information": "^6.0.0", + "vfile": "^5.0.0", + "vfile-location": "^4.0.0", + "web-namespaces": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/docusaurus-theme-openapi-docs/node_modules/hast-util-parse-selector": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/hast-util-parse-selector/-/hast-util-parse-selector-3.1.1.tgz", + "integrity": "sha512-jdlwBjEexy1oGz0aJ2f4GKMaVKkA9jwjr4MjAAI22E5fM/TXVZHuS5OpONtdeIkRKqAaryQ2E9xNQxijoThSZA==", + "license": "MIT", + "dependencies": { + "@types/hast": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/docusaurus-theme-openapi-docs/node_modules/hast-util-raw": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/hast-util-raw/-/hast-util-raw-7.2.3.tgz", + "integrity": "sha512-RujVQfVsOrxzPOPSzZFiwofMArbQke6DJjnFfceiEbFh7S05CbPt0cYN+A5YeD3pso0JQk6O1aHBnx9+Pm2uqg==", + "license": "MIT", + "dependencies": { + "@types/hast": "^2.0.0", + "@types/parse5": "^6.0.0", + "hast-util-from-parse5": "^7.0.0", + "hast-util-to-parse5": "^7.0.0", + "html-void-elements": "^2.0.0", + "parse5": "^6.0.0", + "unist-util-position": "^4.0.0", + "unist-util-visit": "^4.0.0", + "vfile": "^5.0.0", + "web-namespaces": "^2.0.0", + "zwitch": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/docusaurus-theme-openapi-docs/node_modules/hast-util-raw/node_modules/unist-util-visit": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/unist-util-visit/-/unist-util-visit-4.1.2.tgz", + "integrity": "sha512-MSd8OUGISqHdVvfY9TPhyK2VdUrPgxkUtWSuMHF6XAAFuL4LokseigBnZtPnJMu+FbynTkFNnFlyjxpVKujMRg==", + "license": "MIT", + "dependencies": { + "@types/unist": "^2.0.0", + "unist-util-is": "^5.0.0", + "unist-util-visit-parents": "^5.1.1" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/docusaurus-theme-openapi-docs/node_modules/hast-util-to-parse5": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/hast-util-to-parse5/-/hast-util-to-parse5-7.1.0.tgz", + "integrity": "sha512-YNRgAJkH2Jky5ySkIqFXTQiaqcAtJyVE+D5lkN6CdtOqrnkLfGYYrEcKuHOJZlp+MwjSwuD3fZuawI+sic/RBw==", + "license": "MIT", + "dependencies": { + "@types/hast": "^2.0.0", + "comma-separated-tokens": "^2.0.0", + "property-information": "^6.0.0", + "space-separated-tokens": "^2.0.0", + "web-namespaces": "^2.0.0", + "zwitch": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/docusaurus-theme-openapi-docs/node_modules/hastscript": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/hastscript/-/hastscript-7.2.0.tgz", + "integrity": "sha512-TtYPq24IldU8iKoJQqvZOuhi5CyCQRAbvDOX0x1eW6rsHSxa/1i2CCiptNTotGHJ3VoHRGmqiv6/D3q113ikkw==", + "license": "MIT", + "dependencies": { + "@types/hast": "^2.0.0", + "comma-separated-tokens": "^2.0.0", + "hast-util-parse-selector": "^3.0.0", + "property-information": "^6.0.0", + "space-separated-tokens": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/docusaurus-theme-openapi-docs/node_modules/html-void-elements": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/html-void-elements/-/html-void-elements-2.0.1.tgz", + "integrity": "sha512-0quDb7s97CfemeJAnW9wC0hw78MtW7NU3hqtCD75g2vFlDLt36llsYD7uB7SUzojLMP24N5IatXf7ylGXiGG9A==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/docusaurus-theme-openapi-docs/node_modules/mdast-util-find-and-replace": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/mdast-util-find-and-replace/-/mdast-util-find-and-replace-2.2.2.tgz", + "integrity": "sha512-MTtdFRz/eMDHXzeK6W3dO7mXUlF82Gom4y0oOgvHhh/HXZAGvIQDUvQ0SuUx+j2tv44b8xTHOm8K/9OoRFnXKw==", + "license": "MIT", + "dependencies": { + "@types/mdast": "^3.0.0", + "escape-string-regexp": "^5.0.0", + "unist-util-is": "^5.0.0", + "unist-util-visit-parents": "^5.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/docusaurus-theme-openapi-docs/node_modules/mdast-util-from-markdown": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/mdast-util-from-markdown/-/mdast-util-from-markdown-1.3.1.tgz", + "integrity": "sha512-4xTO/M8c82qBcnQc1tgpNtubGUW/Y1tBQ1B0i5CtSoelOLKFYlElIr3bvgREYYO5iRqbMY1YuqZng0GVOI8Qww==", + "license": "MIT", + "dependencies": { + "@types/mdast": "^3.0.0", + "@types/unist": "^2.0.0", + "decode-named-character-reference": "^1.0.0", + "mdast-util-to-string": "^3.1.0", + "micromark": "^3.0.0", + "micromark-util-decode-numeric-character-reference": "^1.0.0", + "micromark-util-decode-string": "^1.0.0", + "micromark-util-normalize-identifier": "^1.0.0", + "micromark-util-symbol": "^1.0.0", + "micromark-util-types": "^1.0.0", + "unist-util-stringify-position": "^3.0.0", + "uvu": "^0.5.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/docusaurus-theme-openapi-docs/node_modules/mdast-util-gfm": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/mdast-util-gfm/-/mdast-util-gfm-2.0.2.tgz", + "integrity": "sha512-qvZ608nBppZ4icQlhQQIAdc6S3Ffj9RGmzwUKUWuEICFnd1LVkN3EktF7ZHAgfcEdvZB5owU9tQgt99e2TlLjg==", + "license": "MIT", + "dependencies": { + "mdast-util-from-markdown": "^1.0.0", + "mdast-util-gfm-autolink-literal": "^1.0.0", + "mdast-util-gfm-footnote": "^1.0.0", + "mdast-util-gfm-strikethrough": "^1.0.0", + "mdast-util-gfm-table": "^1.0.0", + "mdast-util-gfm-task-list-item": "^1.0.0", + "mdast-util-to-markdown": "^1.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/docusaurus-theme-openapi-docs/node_modules/mdast-util-gfm-autolink-literal": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/mdast-util-gfm-autolink-literal/-/mdast-util-gfm-autolink-literal-1.0.3.tgz", + "integrity": "sha512-My8KJ57FYEy2W2LyNom4n3E7hKTuQk/0SES0u16tjA9Z3oFkF4RrC/hPAPgjlSpezsOvI8ObcXcElo92wn5IGA==", + "license": "MIT", + "dependencies": { + "@types/mdast": "^3.0.0", + "ccount": "^2.0.0", + "mdast-util-find-and-replace": "^2.0.0", + "micromark-util-character": "^1.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/docusaurus-theme-openapi-docs/node_modules/mdast-util-gfm-footnote": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/mdast-util-gfm-footnote/-/mdast-util-gfm-footnote-1.0.2.tgz", + "integrity": "sha512-56D19KOGbE00uKVj3sgIykpwKL179QsVFwx/DCW0u/0+URsryacI4MAdNJl0dh+u2PSsD9FtxPFbHCzJ78qJFQ==", + "license": "MIT", + "dependencies": { + "@types/mdast": "^3.0.0", + "mdast-util-to-markdown": "^1.3.0", + "micromark-util-normalize-identifier": "^1.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/docusaurus-theme-openapi-docs/node_modules/mdast-util-gfm-strikethrough": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/mdast-util-gfm-strikethrough/-/mdast-util-gfm-strikethrough-1.0.3.tgz", + "integrity": "sha512-DAPhYzTYrRcXdMjUtUjKvW9z/FNAMTdU0ORyMcbmkwYNbKocDpdk+PX1L1dQgOID/+vVs1uBQ7ElrBQfZ0cuiQ==", + "license": "MIT", + "dependencies": { + "@types/mdast": "^3.0.0", + "mdast-util-to-markdown": "^1.3.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/docusaurus-theme-openapi-docs/node_modules/mdast-util-gfm-table": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/mdast-util-gfm-table/-/mdast-util-gfm-table-1.0.7.tgz", + "integrity": "sha512-jjcpmNnQvrmN5Vx7y7lEc2iIOEytYv7rTvu+MeyAsSHTASGCCRA79Igg2uKssgOs1i1po8s3plW0sTu1wkkLGg==", + "license": "MIT", + "dependencies": { + "@types/mdast": "^3.0.0", + "markdown-table": "^3.0.0", + "mdast-util-from-markdown": "^1.0.0", + "mdast-util-to-markdown": "^1.3.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/docusaurus-theme-openapi-docs/node_modules/mdast-util-gfm-task-list-item": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/mdast-util-gfm-task-list-item/-/mdast-util-gfm-task-list-item-1.0.2.tgz", + "integrity": "sha512-PFTA1gzfp1B1UaiJVyhJZA1rm0+Tzn690frc/L8vNX1Jop4STZgOE6bxUhnzdVSB+vm2GU1tIsuQcA9bxTQpMQ==", + "license": "MIT", + "dependencies": { + "@types/mdast": "^3.0.0", + "mdast-util-to-markdown": "^1.3.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/docusaurus-theme-openapi-docs/node_modules/mdast-util-phrasing": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/mdast-util-phrasing/-/mdast-util-phrasing-3.0.1.tgz", + "integrity": "sha512-WmI1gTXUBJo4/ZmSk79Wcb2HcjPJBzM1nlI/OUWA8yk2X9ik3ffNbBGsU+09BFmXaL1IBb9fiuvq6/KMiNycSg==", + "license": "MIT", + "dependencies": { + "@types/mdast": "^3.0.0", + "unist-util-is": "^5.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/docusaurus-theme-openapi-docs/node_modules/mdast-util-to-markdown": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/mdast-util-to-markdown/-/mdast-util-to-markdown-1.5.0.tgz", + "integrity": "sha512-bbv7TPv/WC49thZPg3jXuqzuvI45IL2EVAr/KxF0BSdHsU0ceFHOmwQn6evxAh1GaoK/6GQ1wp4R4oW2+LFL/A==", + "license": "MIT", + "dependencies": { + "@types/mdast": "^3.0.0", + "@types/unist": "^2.0.0", + "longest-streak": "^3.0.0", + "mdast-util-phrasing": "^3.0.0", + "mdast-util-to-string": "^3.0.0", + "micromark-util-decode-string": "^1.0.0", + "unist-util-visit": "^4.0.0", + "zwitch": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/docusaurus-theme-openapi-docs/node_modules/mdast-util-to-markdown/node_modules/unist-util-visit": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/unist-util-visit/-/unist-util-visit-4.1.2.tgz", + "integrity": "sha512-MSd8OUGISqHdVvfY9TPhyK2VdUrPgxkUtWSuMHF6XAAFuL4LokseigBnZtPnJMu+FbynTkFNnFlyjxpVKujMRg==", + "license": "MIT", + "dependencies": { + "@types/unist": "^2.0.0", + "unist-util-is": "^5.0.0", + "unist-util-visit-parents": "^5.1.1" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/docusaurus-theme-openapi-docs/node_modules/mdast-util-to-string": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/mdast-util-to-string/-/mdast-util-to-string-3.2.0.tgz", + "integrity": "sha512-V4Zn/ncyN1QNSqSBxTrMOLpjr+IKdHl2v3KVLoWmDPscP4r9GcCi71gjgvUV1SFSKh92AjAG4peFuBl2/YgCJg==", + "license": "MIT", + "dependencies": { + "@types/mdast": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/docusaurus-theme-openapi-docs/node_modules/micromark": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/micromark/-/micromark-3.2.0.tgz", + "integrity": "sha512-uD66tJj54JLYq0De10AhWycZWGQNUvDI55xPgk2sQM5kn1JYlhbCMTtEeT27+vAhW2FBQxLlOmS3pmA7/2z4aA==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "@types/debug": "^4.0.0", + "debug": "^4.0.0", + "decode-named-character-reference": "^1.0.0", + "micromark-core-commonmark": "^1.0.1", + "micromark-factory-space": "^1.0.0", + "micromark-util-character": "^1.0.0", + "micromark-util-chunked": "^1.0.0", + "micromark-util-combine-extensions": "^1.0.0", + "micromark-util-decode-numeric-character-reference": "^1.0.0", + "micromark-util-encode": "^1.0.0", + "micromark-util-normalize-identifier": "^1.0.0", + "micromark-util-resolve-all": "^1.0.0", + "micromark-util-sanitize-uri": "^1.0.0", + "micromark-util-subtokenize": "^1.0.0", + "micromark-util-symbol": "^1.0.0", + "micromark-util-types": "^1.0.1", + "uvu": "^0.5.0" + } + }, + "node_modules/docusaurus-theme-openapi-docs/node_modules/micromark-core-commonmark": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/micromark-core-commonmark/-/micromark-core-commonmark-1.1.0.tgz", + "integrity": "sha512-BgHO1aRbolh2hcrzL2d1La37V0Aoz73ymF8rAcKnohLy93titmv62E0gP8Hrx9PKcKrqCZ1BbLGbP3bEhoXYlw==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "decode-named-character-reference": "^1.0.0", + "micromark-factory-destination": "^1.0.0", + "micromark-factory-label": "^1.0.0", + "micromark-factory-space": "^1.0.0", + "micromark-factory-title": "^1.0.0", + "micromark-factory-whitespace": "^1.0.0", + "micromark-util-character": "^1.0.0", + "micromark-util-chunked": "^1.0.0", + "micromark-util-classify-character": "^1.0.0", + "micromark-util-html-tag-name": "^1.0.0", + "micromark-util-normalize-identifier": "^1.0.0", + "micromark-util-resolve-all": "^1.0.0", + "micromark-util-subtokenize": "^1.0.0", + "micromark-util-symbol": "^1.0.0", + "micromark-util-types": "^1.0.1", + "uvu": "^0.5.0" + } + }, + "node_modules/docusaurus-theme-openapi-docs/node_modules/micromark-extension-gfm": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/micromark-extension-gfm/-/micromark-extension-gfm-2.0.3.tgz", + "integrity": "sha512-vb9OoHqrhCmbRidQv/2+Bc6pkP0FrtlhurxZofvOEy5o8RtuuvTq+RQ1Vw5ZDNrVraQZu3HixESqbG+0iKk/MQ==", + "license": "MIT", + "dependencies": { + "micromark-extension-gfm-autolink-literal": "^1.0.0", + "micromark-extension-gfm-footnote": "^1.0.0", + "micromark-extension-gfm-strikethrough": "^1.0.0", + "micromark-extension-gfm-table": "^1.0.0", + "micromark-extension-gfm-tagfilter": "^1.0.0", + "micromark-extension-gfm-task-list-item": "^1.0.0", + "micromark-util-combine-extensions": "^1.0.0", + "micromark-util-types": "^1.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/docusaurus-theme-openapi-docs/node_modules/micromark-extension-gfm-autolink-literal": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/micromark-extension-gfm-autolink-literal/-/micromark-extension-gfm-autolink-literal-1.0.5.tgz", + "integrity": "sha512-z3wJSLrDf8kRDOh2qBtoTRD53vJ+CWIyo7uyZuxf/JAbNJjiHsOpG1y5wxk8drtv3ETAHutCu6N3thkOOgueWg==", + "license": "MIT", + "dependencies": { + "micromark-util-character": "^1.0.0", + "micromark-util-sanitize-uri": "^1.0.0", + "micromark-util-symbol": "^1.0.0", + "micromark-util-types": "^1.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/docusaurus-theme-openapi-docs/node_modules/micromark-extension-gfm-footnote": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/micromark-extension-gfm-footnote/-/micromark-extension-gfm-footnote-1.1.2.tgz", + "integrity": "sha512-Yxn7z7SxgyGWRNa4wzf8AhYYWNrwl5q1Z8ii+CSTTIqVkmGZF1CElX2JI8g5yGoM3GAman9/PVCUFUSJ0kB/8Q==", + "license": "MIT", + "dependencies": { + "micromark-core-commonmark": "^1.0.0", + "micromark-factory-space": "^1.0.0", + "micromark-util-character": "^1.0.0", + "micromark-util-normalize-identifier": "^1.0.0", + "micromark-util-sanitize-uri": "^1.0.0", + "micromark-util-symbol": "^1.0.0", + "micromark-util-types": "^1.0.0", + "uvu": "^0.5.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/docusaurus-theme-openapi-docs/node_modules/micromark-extension-gfm-strikethrough": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/micromark-extension-gfm-strikethrough/-/micromark-extension-gfm-strikethrough-1.0.7.tgz", + "integrity": "sha512-sX0FawVE1o3abGk3vRjOH50L5TTLr3b5XMqnP9YDRb34M0v5OoZhG+OHFz1OffZ9dlwgpTBKaT4XW/AsUVnSDw==", + "license": "MIT", + "dependencies": { + "micromark-util-chunked": "^1.0.0", + "micromark-util-classify-character": "^1.0.0", + "micromark-util-resolve-all": "^1.0.0", + "micromark-util-symbol": "^1.0.0", + "micromark-util-types": "^1.0.0", + "uvu": "^0.5.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/docusaurus-theme-openapi-docs/node_modules/micromark-extension-gfm-table": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/micromark-extension-gfm-table/-/micromark-extension-gfm-table-1.0.7.tgz", + "integrity": "sha512-3ZORTHtcSnMQEKtAOsBQ9/oHp9096pI/UvdPtN7ehKvrmZZ2+bbWhi0ln+I9drmwXMt5boocn6OlwQzNXeVeqw==", + "license": "MIT", + "dependencies": { + "micromark-factory-space": "^1.0.0", + "micromark-util-character": "^1.0.0", + "micromark-util-symbol": "^1.0.0", + "micromark-util-types": "^1.0.0", + "uvu": "^0.5.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/docusaurus-theme-openapi-docs/node_modules/micromark-extension-gfm-tagfilter": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/micromark-extension-gfm-tagfilter/-/micromark-extension-gfm-tagfilter-1.0.2.tgz", + "integrity": "sha512-5XWB9GbAUSHTn8VPU8/1DBXMuKYT5uOgEjJb8gN3mW0PNW5OPHpSdojoqf+iq1xo7vWzw/P8bAHY0n6ijpXF7g==", + "license": "MIT", + "dependencies": { + "micromark-util-types": "^1.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/docusaurus-theme-openapi-docs/node_modules/micromark-extension-gfm-task-list-item": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/micromark-extension-gfm-task-list-item/-/micromark-extension-gfm-task-list-item-1.0.5.tgz", + "integrity": "sha512-RMFXl2uQ0pNQy6Lun2YBYT9g9INXtWJULgbt01D/x8/6yJ2qpKyzdZD3pi6UIkzF++Da49xAelVKUeUMqd5eIQ==", + "license": "MIT", + "dependencies": { + "micromark-factory-space": "^1.0.0", + "micromark-util-character": "^1.0.0", + "micromark-util-symbol": "^1.0.0", + "micromark-util-types": "^1.0.0", + "uvu": "^0.5.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/docusaurus-theme-openapi-docs/node_modules/micromark-factory-destination": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/micromark-factory-destination/-/micromark-factory-destination-1.1.0.tgz", + "integrity": "sha512-XaNDROBgx9SgSChd69pjiGKbV+nfHGDPVYFs5dOoDd7ZnMAE+Cuu91BCpsY8RT2NP9vo/B8pds2VQNCLiu0zhg==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-character": "^1.0.0", + "micromark-util-symbol": "^1.0.0", + "micromark-util-types": "^1.0.0" + } + }, + "node_modules/docusaurus-theme-openapi-docs/node_modules/micromark-factory-label": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/micromark-factory-label/-/micromark-factory-label-1.1.0.tgz", + "integrity": "sha512-OLtyez4vZo/1NjxGhcpDSbHQ+m0IIGnT8BoPamh+7jVlzLJBH98zzuCoUeMxvM6WsNeh8wx8cKvqLiPHEACn0w==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-character": "^1.0.0", + "micromark-util-symbol": "^1.0.0", + "micromark-util-types": "^1.0.0", + "uvu": "^0.5.0" + } + }, + "node_modules/docusaurus-theme-openapi-docs/node_modules/micromark-factory-title": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/micromark-factory-title/-/micromark-factory-title-1.1.0.tgz", + "integrity": "sha512-J7n9R3vMmgjDOCY8NPw55jiyaQnH5kBdV2/UXCtZIpnHH3P6nHUKaH7XXEYuWwx/xUJcawa8plLBEjMPU24HzQ==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-factory-space": "^1.0.0", + "micromark-util-character": "^1.0.0", + "micromark-util-symbol": "^1.0.0", + "micromark-util-types": "^1.0.0" + } + }, + "node_modules/docusaurus-theme-openapi-docs/node_modules/micromark-factory-whitespace": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/micromark-factory-whitespace/-/micromark-factory-whitespace-1.1.0.tgz", + "integrity": "sha512-v2WlmiymVSp5oMg+1Q0N1Lxmt6pMhIHD457whWM7/GUlEks1hI9xj5w3zbc4uuMKXGisksZk8DzP2UyGbGqNsQ==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-factory-space": "^1.0.0", + "micromark-util-character": "^1.0.0", + "micromark-util-symbol": "^1.0.0", + "micromark-util-types": "^1.0.0" + } + }, + "node_modules/docusaurus-theme-openapi-docs/node_modules/micromark-util-chunked": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/micromark-util-chunked/-/micromark-util-chunked-1.1.0.tgz", + "integrity": "sha512-Ye01HXpkZPNcV6FiyoW2fGZDUw4Yc7vT0E9Sad83+bEDiCJ1uXu0S3mr8WLpsz3HaG3x2q0HM6CTuPdcZcluFQ==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-symbol": "^1.0.0" + } + }, + "node_modules/docusaurus-theme-openapi-docs/node_modules/micromark-util-classify-character": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/micromark-util-classify-character/-/micromark-util-classify-character-1.1.0.tgz", + "integrity": "sha512-SL0wLxtKSnklKSUplok1WQFoGhUdWYKggKUiqhX+Swala+BtptGCu5iPRc+xvzJ4PXE/hwM3FNXsfEVgoZsWbw==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-character": "^1.0.0", + "micromark-util-symbol": "^1.0.0", + "micromark-util-types": "^1.0.0" + } + }, + "node_modules/docusaurus-theme-openapi-docs/node_modules/micromark-util-combine-extensions": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/micromark-util-combine-extensions/-/micromark-util-combine-extensions-1.1.0.tgz", + "integrity": "sha512-Q20sp4mfNf9yEqDL50WwuWZHUrCO4fEyeDCnMGmG5Pr0Cz15Uo7KBs6jq+dq0EgX4DPwwrh9m0X+zPV1ypFvUA==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-chunked": "^1.0.0", + "micromark-util-types": "^1.0.0" + } + }, + "node_modules/docusaurus-theme-openapi-docs/node_modules/micromark-util-decode-numeric-character-reference": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/micromark-util-decode-numeric-character-reference/-/micromark-util-decode-numeric-character-reference-1.1.0.tgz", + "integrity": "sha512-m9V0ExGv0jB1OT21mrWcuf4QhP46pH1KkfWy9ZEezqHKAxkj4mPCy3nIH1rkbdMlChLHX531eOrymlwyZIf2iw==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-symbol": "^1.0.0" + } + }, + "node_modules/docusaurus-theme-openapi-docs/node_modules/micromark-util-decode-string": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/micromark-util-decode-string/-/micromark-util-decode-string-1.1.0.tgz", + "integrity": "sha512-YphLGCK8gM1tG1bd54azwyrQRjCFcmgj2S2GoJDNnh4vYtnL38JS8M4gpxzOPNyHdNEpheyWXCTnnTDY3N+NVQ==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "decode-named-character-reference": "^1.0.0", + "micromark-util-character": "^1.0.0", + "micromark-util-decode-numeric-character-reference": "^1.0.0", + "micromark-util-symbol": "^1.0.0" + } + }, + "node_modules/docusaurus-theme-openapi-docs/node_modules/micromark-util-encode": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/micromark-util-encode/-/micromark-util-encode-1.1.0.tgz", + "integrity": "sha512-EuEzTWSTAj9PA5GOAs992GzNh2dGQO52UvAbtSOMvXTxv3Criqb6IOzJUBCmEqrrXSblJIJBbFFv6zPxpreiJw==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, + "node_modules/docusaurus-theme-openapi-docs/node_modules/micromark-util-html-tag-name": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/micromark-util-html-tag-name/-/micromark-util-html-tag-name-1.2.0.tgz", + "integrity": "sha512-VTQzcuQgFUD7yYztuQFKXT49KghjtETQ+Wv/zUjGSGBioZnkA4P1XXZPT1FHeJA6RwRXSF47yvJ1tsJdoxwO+Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, + "node_modules/docusaurus-theme-openapi-docs/node_modules/micromark-util-normalize-identifier": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/micromark-util-normalize-identifier/-/micromark-util-normalize-identifier-1.1.0.tgz", + "integrity": "sha512-N+w5vhqrBihhjdpM8+5Xsxy71QWqGn7HYNUvch71iV2PM7+E3uWGox1Qp90loa1ephtCxG2ftRV/Conitc6P2Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-symbol": "^1.0.0" + } + }, + "node_modules/docusaurus-theme-openapi-docs/node_modules/micromark-util-resolve-all": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/micromark-util-resolve-all/-/micromark-util-resolve-all-1.1.0.tgz", + "integrity": "sha512-b/G6BTMSg+bX+xVCshPTPyAu2tmA0E4X98NSR7eIbeC6ycCqCeE7wjfDIgzEbkzdEVJXRtOG4FbEm/uGbCRouA==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-types": "^1.0.0" + } + }, + "node_modules/docusaurus-theme-openapi-docs/node_modules/micromark-util-sanitize-uri": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/micromark-util-sanitize-uri/-/micromark-util-sanitize-uri-1.2.0.tgz", + "integrity": "sha512-QO4GXv0XZfWey4pYFndLUKEAktKkG5kZTdUNaTAkzbuJxn2tNBOr+QtxR2XpWaMhbImT2dPzyLrPXLlPhph34A==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-character": "^1.0.0", + "micromark-util-encode": "^1.0.0", + "micromark-util-symbol": "^1.0.0" + } + }, + "node_modules/docusaurus-theme-openapi-docs/node_modules/micromark-util-subtokenize": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/micromark-util-subtokenize/-/micromark-util-subtokenize-1.1.0.tgz", + "integrity": "sha512-kUQHyzRoxvZO2PuLzMt2P/dwVsTiivCK8icYTeR+3WgbuPqfHgPPy7nFKbeqRivBvn/3N3GBiNC+JRTMSxEC7A==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-chunked": "^1.0.0", + "micromark-util-symbol": "^1.0.0", + "micromark-util-types": "^1.0.0", + "uvu": "^0.5.0" + } + }, + "node_modules/docusaurus-theme-openapi-docs/node_modules/micromark-util-types": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/micromark-util-types/-/micromark-util-types-1.1.0.tgz", + "integrity": "sha512-ukRBgie8TIAcacscVHSiddHjO4k/q3pnedmzMQ4iwDcK0FtFCohKOlFbaOL/mPgfnPsL3C1ZyxJa4sbWrBl3jg==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, + "node_modules/docusaurus-theme-openapi-docs/node_modules/parse5": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-6.0.1.tgz", + "integrity": "sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw==", + "license": "MIT" + }, + "node_modules/docusaurus-theme-openapi-docs/node_modules/property-information": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/property-information/-/property-information-6.5.0.tgz", + "integrity": "sha512-PgTgs/BlvHxOu8QuEN7wi5A0OmXaBcHpmCSTehcs6Uuu9IkDIEo13Hy7n898RHfrQ49vKCoGeWZSaAK01nwVig==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/docusaurus-theme-openapi-docs/node_modules/react-is": { + "version": "17.0.2", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-17.0.2.tgz", + "integrity": "sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==", + "license": "MIT" + }, + "node_modules/docusaurus-theme-openapi-docs/node_modules/react-redux": { + "version": "7.2.9", + "resolved": "https://registry.npmjs.org/react-redux/-/react-redux-7.2.9.tgz", + "integrity": "sha512-Gx4L3uM182jEEayZfRbI/G11ZpYdNAnBs70lFVMNdHJI76XYtR+7m0MN+eAs7UHBPhWXcnFPaS+9owSCJQHNpQ==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.15.4", + "@types/react-redux": "^7.1.20", + "hoist-non-react-statics": "^3.3.2", + "loose-envify": "^1.4.0", + "prop-types": "^15.7.2", + "react-is": "^17.0.2" + }, + "peerDependencies": { + "react": "^16.8.3 || ^17 || ^18" + }, + "peerDependenciesMeta": { + "react-dom": { + "optional": true + }, + "react-native": { + "optional": true + } + } + }, + "node_modules/docusaurus-theme-openapi-docs/node_modules/rehype-raw": { + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/rehype-raw/-/rehype-raw-6.1.1.tgz", + "integrity": "sha512-d6AKtisSRtDRX4aSPsJGTfnzrX2ZkHQLE5kiUuGOeEoLpbEulFF4hj0mLPbsa+7vmguDKOVVEQdHKDSwoaIDsQ==", + "license": "MIT", + "dependencies": { + "@types/hast": "^2.0.0", + "hast-util-raw": "^7.2.0", + "unified": "^10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/docusaurus-theme-openapi-docs/node_modules/remark-gfm": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/remark-gfm/-/remark-gfm-3.0.1.tgz", + "integrity": "sha512-lEFDoi2PICJyNrACFOfDD3JlLkuSbOa5Wd8EPt06HUdptv8Gn0bxYTdbU/XXQ3swAPkEaGxxPN9cbnMHvVu1Ig==", + "license": "MIT", + "dependencies": { + "@types/mdast": "^3.0.0", + "mdast-util-gfm": "^2.0.0", + "micromark-extension-gfm": "^2.0.0", + "unified": "^10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/docusaurus-theme-openapi-docs/node_modules/unified": { + "version": "10.1.2", + "resolved": "https://registry.npmjs.org/unified/-/unified-10.1.2.tgz", + "integrity": "sha512-pUSWAi/RAnVy1Pif2kAoeWNBa3JVrx0MId2LASj8G+7AiHWoKZNTomq6LG326T68U7/e263X6fTdcXIy7XnF7Q==", + "license": "MIT", + "dependencies": { + "@types/unist": "^2.0.0", + "bail": "^2.0.0", + "extend": "^3.0.0", + "is-buffer": "^2.0.0", + "is-plain-obj": "^4.0.0", + "trough": "^2.0.0", + "vfile": "^5.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/docusaurus-theme-openapi-docs/node_modules/unist-util-is": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/unist-util-is/-/unist-util-is-5.2.1.tgz", + "integrity": "sha512-u9njyyfEh43npf1M+yGKDGVPbY/JWEemg5nH05ncKPfi+kBbKBJoTdsogMu33uhytuLlv9y0O7GH7fEdwLdLQw==", + "license": "MIT", + "dependencies": { + "@types/unist": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/docusaurus-theme-openapi-docs/node_modules/unist-util-position": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/unist-util-position/-/unist-util-position-4.0.4.tgz", + "integrity": "sha512-kUBE91efOWfIVBo8xzh/uZQ7p9ffYRtUbMRZBNFYwf0RK8koUMx6dGUfwylLOKmaT2cs4wSW96QoYUSXAyEtpg==", + "license": "MIT", + "dependencies": { + "@types/unist": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/docusaurus-theme-openapi-docs/node_modules/unist-util-stringify-position": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/unist-util-stringify-position/-/unist-util-stringify-position-3.0.3.tgz", + "integrity": "sha512-k5GzIBZ/QatR8N5X2y+drfpWG8IDBzdnVj6OInRNWm1oXrzydiaAT2OQiA8DPRRZyAKb9b6I2a6PxYklZD0gKg==", + "license": "MIT", + "dependencies": { + "@types/unist": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/docusaurus-theme-openapi-docs/node_modules/unist-util-visit-parents": { + "version": "5.1.3", + "resolved": "https://registry.npmjs.org/unist-util-visit-parents/-/unist-util-visit-parents-5.1.3.tgz", + "integrity": "sha512-x6+y8g7wWMyQhL1iZfhIPhDAs7Xwbn9nRosDXl7qoPTSCy0yNxnKc+hWokFifWQIDGi154rdUqKvbCa4+1kLhg==", + "license": "MIT", + "dependencies": { + "@types/unist": "^2.0.0", + "unist-util-is": "^5.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/docusaurus-theme-openapi-docs/node_modules/vfile": { + "version": "5.3.7", + "resolved": "https://registry.npmjs.org/vfile/-/vfile-5.3.7.tgz", + "integrity": "sha512-r7qlzkgErKjobAmyNIkkSpizsFPYiUPuJb5pNW1RB4JcYVZhs4lIbVqk8XPk033CV/1z8ss5pkax8SuhGpcG8g==", + "license": "MIT", + "dependencies": { + "@types/unist": "^2.0.0", + "is-buffer": "^2.0.0", + "unist-util-stringify-position": "^3.0.0", + "vfile-message": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/docusaurus-theme-openapi-docs/node_modules/vfile-location": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/vfile-location/-/vfile-location-4.1.0.tgz", + "integrity": "sha512-YF23YMyASIIJXpktBa4vIGLJ5Gs88UB/XePgqPmTa7cDA+JeO3yclbpheQYCHjVHBn/yePzrXuygIL+xbvRYHw==", + "license": "MIT", + "dependencies": { + "@types/unist": "^2.0.0", + "vfile": "^5.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/docusaurus-theme-openapi-docs/node_modules/vfile-message": { + "version": "3.1.4", + "resolved": "https://registry.npmjs.org/vfile-message/-/vfile-message-3.1.4.tgz", + "integrity": "sha512-fa0Z6P8HUrQN4BZaX05SIVXic+7kE3b05PWAtPuYP9QLHsLKYR7/AlLW3NtOrpXRLeawpDLMsVkmk5DG0NXgWw==", + "license": "MIT", + "dependencies": { + "@types/unist": "^2.0.0", + "unist-util-stringify-position": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/dom-converter": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/dom-converter/-/dom-converter-0.2.0.tgz", + "integrity": "sha512-gd3ypIPfOMr9h5jIKq8E3sHOTCjeirnl0WK5ZdS1AW0Odt0b1PaWaHdJ4Qk4klv+YB9aJBS7mESXjFoDQPu6DA==", + "license": "MIT", + "dependencies": { + "utila": "~0.4" + } + }, + "node_modules/dom-serializer": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-2.0.0.tgz", + "integrity": "sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg==", + "license": "MIT", + "dependencies": { + "domelementtype": "^2.3.0", + "domhandler": "^5.0.2", + "entities": "^4.2.0" + }, + "funding": { + "url": "https://github.com/cheeriojs/dom-serializer?sponsor=1" + } + }, + "node_modules/domelementtype": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.3.0.tgz", + "integrity": "sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/fb55" + } + ], + "license": "BSD-2-Clause" + }, + "node_modules/domhandler": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-5.0.3.tgz", + "integrity": "sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w==", + "license": "BSD-2-Clause", + "dependencies": { + "domelementtype": "^2.3.0" + }, + "engines": { + "node": ">= 4" + }, + "funding": { + "url": "https://github.com/fb55/domhandler?sponsor=1" + } + }, + "node_modules/domutils": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/domutils/-/domutils-3.2.2.tgz", + "integrity": "sha512-6kZKyUajlDuqlHKVX1w7gyslj9MPIXzIFiz/rGu35uC1wMi+kMhQwGhl4lt9unC9Vb9INnY9Z3/ZA3+FhASLaw==", + "license": "BSD-2-Clause", + "dependencies": { + "dom-serializer": "^2.0.0", + "domelementtype": "^2.3.0", + "domhandler": "^5.0.3" + }, + "funding": { + "url": "https://github.com/fb55/domutils?sponsor=1" + } + }, + "node_modules/dot-case": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/dot-case/-/dot-case-3.0.4.tgz", + "integrity": "sha512-Kv5nKlh6yRrdrGvxeJ2e5y2eRUpkUosIW4A2AS38zwSz27zu7ufDwQPi5Jhs3XAlGNetl3bmnGhQsMtkKJnj3w==", + "license": "MIT", + "dependencies": { + "no-case": "^3.0.4", + "tslib": "^2.0.3" + } + }, + "node_modules/dot-prop": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-6.0.1.tgz", + "integrity": "sha512-tE7ztYzXHIeyvc7N+hR3oi7FIbf/NIjVP9hmAt3yMXzrQ072/fpjGLx2GxNxGxUl5V73MEqYzioOMoVhGMJ5cA==", + "license": "MIT", + "dependencies": { + "is-obj": "^2.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/dot-prop/node_modules/is-obj": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-2.0.0.tgz", + "integrity": "sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/dunder-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz", + "integrity": "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==", + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.1", + "es-errors": "^1.3.0", + "gopd": "^1.2.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/duplexer": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/duplexer/-/duplexer-0.1.2.tgz", + "integrity": "sha512-jtD6YG370ZCIi/9GTaJKQxWTZD045+4R4hTk/x1UyoqadyJ9x9CgSi1RlVDQF8U2sxLLSnFkCaMihqljHIWgMg==", + "license": "MIT" + }, + "node_modules/eastasianwidth": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz", + "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==", + "license": "MIT" + }, + "node_modules/ee-first": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", + "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==", + "license": "MIT" + }, + "node_modules/electron-to-chromium": { + "version": "1.5.222", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.222.tgz", + "integrity": "sha512-gA7psSwSwQRE60CEoLz6JBCQPIxNeuzB2nL8vE03GK/OHxlvykbLyeiumQy1iH5C2f3YbRAZpGCMT12a/9ih9w==", + "license": "ISC" + }, + "node_modules/emoji-regex": { + "version": "9.2.2", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", + "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==", + "license": "MIT" + }, + "node_modules/emojilib": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/emojilib/-/emojilib-2.4.0.tgz", + "integrity": "sha512-5U0rVMU5Y2n2+ykNLQqMoqklN9ICBT/KsvC1Gz6vqHbz2AXXGkG+Pm5rMWk/8Vjrr/mY9985Hi8DYzn1F09Nyw==", + "license": "MIT" + }, + "node_modules/emojis-list": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-3.0.0.tgz", + "integrity": "sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q==", + "license": "MIT", + "engines": { + "node": ">= 4" + } + }, + "node_modules/emoticon": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/emoticon/-/emoticon-4.1.0.tgz", + "integrity": "sha512-VWZfnxqwNcc51hIy/sbOdEem6D+cVtpPzEEtVAFdaas30+1dgkyaOQ4sQ6Bp0tOMqWO1v+HQfYaoodOkdhK6SQ==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/encodeurl": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-2.0.0.tgz", + "integrity": "sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/encoding-sniffer": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/encoding-sniffer/-/encoding-sniffer-0.2.1.tgz", + "integrity": "sha512-5gvq20T6vfpekVtqrYQsSCFZ1wEg5+wW0/QaZMWkFr6BqD3NfKs0rLCx4rrVlSWJeZb5NBJgVLswK/w2MWU+Gw==", + "license": "MIT", + "dependencies": { + "iconv-lite": "^0.6.3", + "whatwg-encoding": "^3.1.1" + }, + "funding": { + "url": "https://github.com/fb55/encoding-sniffer?sponsor=1" + } + }, + "node_modules/enhanced-resolve": { + "version": "5.18.3", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.18.3.tgz", + "integrity": "sha512-d4lC8xfavMeBjzGr2vECC3fsGXziXZQyJxD868h2M/mBI3PwAuODxAkLkq5HYuvrPYcUtiLzsTo8U3PgX3Ocww==", + "license": "MIT", + "dependencies": { + "graceful-fs": "^4.2.4", + "tapable": "^2.2.0" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/entities": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz", + "integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==", + "license": "BSD-2-Clause", + "engines": { + "node": ">=0.12" + }, + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" + } + }, + "node_modules/error-ex": { + "version": "1.3.4", + "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.4.tgz", + "integrity": "sha512-sqQamAnR14VgCr1A618A3sGrygcpK+HEbenA/HiEAkkUwcZIIB/tgWqHFxWgOyDh4nB4JCRimh79dR5Ywc9MDQ==", + "license": "MIT", + "dependencies": { + "is-arrayish": "^0.2.1" + } + }, + "node_modules/es-define-property": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz", + "integrity": "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-errors": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", + "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-module-lexer": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-1.7.0.tgz", + "integrity": "sha512-jEQoCwk8hyb2AZziIOLhDqpm5+2ww5uIE6lkO/6jcOCusfk6LhMHpXXfBLXTZ7Ydyt0j4VoUQv6uGNYbdW+kBA==", + "license": "MIT" + }, + "node_modules/es-object-atoms": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.1.tgz", + "integrity": "sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==", + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es6-promise": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/es6-promise/-/es6-promise-3.3.1.tgz", + "integrity": "sha512-SOp9Phqvqn7jtEUxPWdWfWoLmyt2VaJ6MpvP9Comy1MceMXqE6bxvaTu4iaxpYYPzhny28Lc+M87/c2cPK6lDg==", + "license": "MIT" + }, + "node_modules/esast-util-from-estree": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/esast-util-from-estree/-/esast-util-from-estree-2.0.0.tgz", + "integrity": "sha512-4CyanoAudUSBAn5K13H4JhsMH6L9ZP7XbLVe/dKybkxMO7eDyLsT8UHl9TRNrU2Gr9nz+FovfSIjuXWJ81uVwQ==", + "license": "MIT", + "dependencies": { + "@types/estree-jsx": "^1.0.0", + "devlop": "^1.0.0", + "estree-util-visit": "^2.0.0", + "unist-util-position-from-estree": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/esast-util-from-js": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/esast-util-from-js/-/esast-util-from-js-2.0.1.tgz", + "integrity": "sha512-8Ja+rNJ0Lt56Pcf3TAmpBZjmx8ZcK5Ts4cAzIOjsjevg9oSXJnl6SUQ2EevU8tv3h6ZLWmoKL5H4fgWvdvfETw==", + "license": "MIT", + "dependencies": { + "@types/estree-jsx": "^1.0.0", + "acorn": "^8.0.0", + "esast-util-from-estree": "^2.0.0", + "vfile-message": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/escalade": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", + "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/escape-goat": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/escape-goat/-/escape-goat-4.0.0.tgz", + "integrity": "sha512-2Sd4ShcWxbx6OY1IHyla/CVNwvg7XwZVoXZHcSu9w9SReNP1EzzD5T8NWKIR38fIqEns9kDWKUQTXXAmlDrdPg==", + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/escape-html": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", + "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==", + "license": "MIT" + }, + "node_modules/escape-string-regexp": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", + "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/eslint-scope": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", + "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", + "license": "BSD-2-Clause", + "dependencies": { + "esrecurse": "^4.3.0", + "estraverse": "^4.1.1" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/esprima": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", + "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", + "license": "BSD-2-Clause", + "bin": { + "esparse": "bin/esparse.js", + "esvalidate": "bin/esvalidate.js" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/esrecurse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", + "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", + "license": "BSD-2-Clause", + "dependencies": { + "estraverse": "^5.2.0" + }, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/esrecurse/node_modules/estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "license": "BSD-2-Clause", + "engines": { + "node": ">=4.0" + } + }, + "node_modules/estraverse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", + "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", + "license": "BSD-2-Clause", + "engines": { + "node": ">=4.0" + } + }, + "node_modules/estree-util-attach-comments": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/estree-util-attach-comments/-/estree-util-attach-comments-3.0.0.tgz", + "integrity": "sha512-cKUwm/HUcTDsYh/9FgnuFqpfquUbwIqwKM26BVCGDPVgvaCl/nDCCjUfiLlx6lsEZ3Z4RFxNbOQ60pkaEwFxGw==", + "license": "MIT", + "dependencies": { + "@types/estree": "^1.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/estree-util-build-jsx": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/estree-util-build-jsx/-/estree-util-build-jsx-3.0.1.tgz", + "integrity": "sha512-8U5eiL6BTrPxp/CHbs2yMgP8ftMhR5ww1eIKoWRMlqvltHF8fZn5LRDvTKuxD3DUn+shRbLGqXemcP51oFCsGQ==", + "license": "MIT", + "dependencies": { + "@types/estree-jsx": "^1.0.0", + "devlop": "^1.0.0", + "estree-util-is-identifier-name": "^3.0.0", + "estree-walker": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/estree-util-is-identifier-name": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/estree-util-is-identifier-name/-/estree-util-is-identifier-name-3.0.0.tgz", + "integrity": "sha512-hFtqIDZTIUZ9BXLb8y4pYGyk6+wekIivNVTcmvk8NoOh+VeRn5y6cEHzbURrWbfp1fIqdVipilzj+lfaadNZmg==", + "license": "MIT", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/estree-util-scope": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/estree-util-scope/-/estree-util-scope-1.0.0.tgz", + "integrity": "sha512-2CAASclonf+JFWBNJPndcOpA8EMJwa0Q8LUFJEKqXLW6+qBvbFZuF5gItbQOs/umBUkjviCSDCbBwU2cXbmrhQ==", + "license": "MIT", + "dependencies": { + "@types/estree": "^1.0.0", + "devlop": "^1.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/estree-util-to-js": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/estree-util-to-js/-/estree-util-to-js-2.0.0.tgz", + "integrity": "sha512-WDF+xj5rRWmD5tj6bIqRi6CkLIXbbNQUcxQHzGysQzvHmdYG2G7p/Tf0J0gpxGgkeMZNTIjT/AoSvC9Xehcgdg==", + "license": "MIT", + "dependencies": { + "@types/estree-jsx": "^1.0.0", + "astring": "^1.8.0", + "source-map": "^0.7.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/estree-util-value-to-estree": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/estree-util-value-to-estree/-/estree-util-value-to-estree-3.4.0.tgz", + "integrity": "sha512-Zlp+gxis+gCfK12d3Srl2PdX2ybsEA8ZYy6vQGVQTNNYLEGRQQ56XB64bjemN8kxIKXP1nC9ip4Z+ILy9LGzvQ==", + "license": "MIT", + "dependencies": { + "@types/estree": "^1.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/remcohaszing" + } + }, + "node_modules/estree-util-visit": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/estree-util-visit/-/estree-util-visit-2.0.0.tgz", + "integrity": "sha512-m5KgiH85xAhhW8Wta0vShLcUvOsh3LLPI2YVwcbio1l7E09NTLL1EyMZFM1OyWowoH0skScNbhOPl4kcBgzTww==", + "license": "MIT", + "dependencies": { + "@types/estree-jsx": "^1.0.0", + "@types/unist": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/estree-walker": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-3.0.3.tgz", + "integrity": "sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==", + "license": "MIT", + "dependencies": { + "@types/estree": "^1.0.0" + } + }, + "node_modules/esutils": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", + "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", + "license": "BSD-2-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/eta": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/eta/-/eta-2.2.0.tgz", + "integrity": "sha512-UVQ72Rqjy/ZKQalzV5dCCJP80GrmPrMxh6NlNf+erV6ObL0ZFkhCstWRawS85z3smdr3d2wXPsZEY7rDPfGd2g==", + "license": "MIT", + "engines": { + "node": ">=6.0.0" + }, + "funding": { + "url": "https://github.com/eta-dev/eta?sponsor=1" + } + }, + "node_modules/etag": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", + "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/eval": { + "version": "0.1.8", + "resolved": "https://registry.npmjs.org/eval/-/eval-0.1.8.tgz", + "integrity": "sha512-EzV94NYKoO09GLXGjXj9JIlXijVck4ONSr5wiCWDvhsvj5jxSrzTmRU/9C1DyB6uToszLs8aifA6NQ7lEQdvFw==", + "dependencies": { + "@types/node": "*", + "require-like": ">= 0.1.1" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/eventemitter3": { + "version": "4.0.7", + "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.7.tgz", + "integrity": "sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==", + "license": "MIT" + }, + "node_modules/events": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz", + "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==", + "license": "MIT", + "engines": { + "node": ">=0.8.x" + } + }, + "node_modules/execa": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz", + "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==", + "license": "MIT", + "dependencies": { + "cross-spawn": "^7.0.3", + "get-stream": "^6.0.0", + "human-signals": "^2.1.0", + "is-stream": "^2.0.0", + "merge-stream": "^2.0.0", + "npm-run-path": "^4.0.1", + "onetime": "^5.1.2", + "signal-exit": "^3.0.3", + "strip-final-newline": "^2.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sindresorhus/execa?sponsor=1" + } + }, + "node_modules/exenv": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/exenv/-/exenv-1.2.2.tgz", + "integrity": "sha512-Z+ktTxTwv9ILfgKCk32OX3n/doe+OcLTRtqK9pcL+JsP3J1/VW8Uvl4ZjLlKqeW4rzK4oesDOGMEMRIZqtP4Iw==", + "license": "BSD-3-Clause" + }, + "node_modules/express": { + "version": "4.21.2", + "resolved": "https://registry.npmjs.org/express/-/express-4.21.2.tgz", + "integrity": "sha512-28HqgMZAmih1Czt9ny7qr6ek2qddF4FclbMzwhCREB6OFfH+rXAnuNCwo1/wFvrtbgsQDb4kSbX9de9lFbrXnA==", + "license": "MIT", + "dependencies": { + "accepts": "~1.3.8", + "array-flatten": "1.1.1", + "body-parser": "1.20.3", + "content-disposition": "0.5.4", + "content-type": "~1.0.4", + "cookie": "0.7.1", + "cookie-signature": "1.0.6", + "debug": "2.6.9", + "depd": "2.0.0", + "encodeurl": "~2.0.0", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "finalhandler": "1.3.1", + "fresh": "0.5.2", + "http-errors": "2.0.0", + "merge-descriptors": "1.0.3", + "methods": "~1.1.2", + "on-finished": "2.4.1", + "parseurl": "~1.3.3", + "path-to-regexp": "0.1.12", + "proxy-addr": "~2.0.7", + "qs": "6.13.0", + "range-parser": "~1.2.1", + "safe-buffer": "5.2.1", + "send": "0.19.0", + "serve-static": "1.16.2", + "setprototypeof": "1.2.0", + "statuses": "2.0.1", + "type-is": "~1.6.18", + "utils-merge": "1.0.1", + "vary": "~1.1.2" + }, + "engines": { + "node": ">= 0.10.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "node_modules/express/node_modules/content-disposition": { + "version": "0.5.4", + "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz", + "integrity": "sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==", + "license": "MIT", + "dependencies": { + "safe-buffer": "5.2.1" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/express/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "license": "MIT", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/express/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "license": "MIT" + }, + "node_modules/express/node_modules/path-to-regexp": { + "version": "0.1.12", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.12.tgz", + "integrity": "sha512-RA1GjUVMnvYFxuqovrEqZoxxW5NUZqbwKtYz/Tt7nXerk0LbLblQmrsgdeOxV5SFHf0UDggjS/bSeOZwt1pmEQ==", + "license": "MIT" + }, + "node_modules/express/node_modules/qs": { + "version": "6.13.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.13.0.tgz", + "integrity": "sha512-+38qI9SOr8tfZ4QmJNplMUxqjbe7LKvvZgWdExBOmd+egZTtjLB67Gu0HRX3u/XOq7UU2Nx6nsjvS16Z9uwfpg==", + "license": "BSD-3-Clause", + "dependencies": { + "side-channel": "^1.0.6" + }, + "engines": { + "node": ">=0.6" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/express/node_modules/range-parser": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", + "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/extend": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", + "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==", + "license": "MIT" + }, + "node_modules/extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug==", + "license": "MIT", + "dependencies": { + "is-extendable": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/fast-deep-equal": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", + "license": "MIT" + }, + "node_modules/fast-glob": { + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.3.tgz", + "integrity": "sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==", + "license": "MIT", + "dependencies": { + "@nodelib/fs.stat": "^2.0.2", + "@nodelib/fs.walk": "^1.2.3", + "glob-parent": "^5.1.2", + "merge2": "^1.3.0", + "micromatch": "^4.0.8" + }, + "engines": { + "node": ">=8.6.0" + } + }, + "node_modules/fast-json-stable-stringify": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", + "license": "MIT" + }, + "node_modules/fast-safe-stringify": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/fast-safe-stringify/-/fast-safe-stringify-2.1.1.tgz", + "integrity": "sha512-W+KJc2dmILlPplD/H4K9l9LcAHAfPtP6BY84uVLXQ6Evcz9Lcg33Y2z1IVblT6xdY54PXYVHEv+0Wpq8Io6zkA==", + "license": "MIT" + }, + "node_modules/fastq": { + "version": "1.19.1", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.19.1.tgz", + "integrity": "sha512-GwLTyxkCXjXbxqIhTsMI2Nui8huMPtnxg7krajPJAjnEG/iiOS7i+zCtWGZR9G0NBKbXKh6X9m9UIsYX/N6vvQ==", + "license": "ISC", + "dependencies": { + "reusify": "^1.0.4" + } + }, + "node_modules/fault": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/fault/-/fault-2.0.1.tgz", + "integrity": "sha512-WtySTkS4OKev5JtpHXnib4Gxiurzh5NCGvWrFaZ34m6JehfTUhKZvn9njTfw48t6JumVQOmrKqpmGcdwxnhqBQ==", + "license": "MIT", + "dependencies": { + "format": "^0.2.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/faye-websocket": { + "version": "0.11.4", + "resolved": "https://registry.npmjs.org/faye-websocket/-/faye-websocket-0.11.4.tgz", + "integrity": "sha512-CzbClwlXAuiRQAlUyfqPgvPoNKTckTPGfwZV4ZdAhVcP2lh9KUxJg2b5GkE7XbjKQ3YJnQ9z6D9ntLAlB+tP8g==", + "license": "Apache-2.0", + "dependencies": { + "websocket-driver": ">=0.5.1" + }, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/feed": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/feed/-/feed-4.2.2.tgz", + "integrity": "sha512-u5/sxGfiMfZNtJ3OvQpXcvotFpYkL0n9u9mM2vkui2nGo8b4wvDkJ8gAkYqbA8QpGyFCv3RK0Z+Iv+9veCS9bQ==", + "license": "MIT", + "dependencies": { + "xml-js": "^1.6.11" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/figures": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/figures/-/figures-3.2.0.tgz", + "integrity": "sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg==", + "license": "MIT", + "dependencies": { + "escape-string-regexp": "^1.0.5" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/figures/node_modules/escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", + "license": "MIT", + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/file-loader": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/file-loader/-/file-loader-6.2.0.tgz", + "integrity": "sha512-qo3glqyTa61Ytg4u73GultjHGjdRyig3tG6lPtyX/jOEJvHif9uB0/OCI2Kif6ctF3caQTW2G5gym21oAsI4pw==", + "license": "MIT", + "dependencies": { + "loader-utils": "^2.0.0", + "schema-utils": "^3.0.0" + }, + "engines": { + "node": ">= 10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^4.0.0 || ^5.0.0" + } + }, + "node_modules/file-loader/node_modules/ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "license": "MIT", + "dependencies": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/file-loader/node_modules/ajv-keywords": { + "version": "3.5.2", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", + "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==", + "license": "MIT", + "peerDependencies": { + "ajv": "^6.9.1" + } + }, + "node_modules/file-loader/node_modules/json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "license": "MIT" + }, + "node_modules/file-loader/node_modules/schema-utils": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.3.0.tgz", + "integrity": "sha512-pN/yOAvcC+5rQ5nERGuwrjLlYvLTbCibnZ1I7B1LaiAz9BRBlE9GMgE/eqV30P7aJQUf7Ddimy/RsbYO/GrVGg==", + "license": "MIT", + "dependencies": { + "@types/json-schema": "^7.0.8", + "ajv": "^6.12.5", + "ajv-keywords": "^3.5.2" + }, + "engines": { + "node": ">= 10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } + }, + "node_modules/file-saver": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/file-saver/-/file-saver-2.0.5.tgz", + "integrity": "sha512-P9bmyZ3h/PRG+Nzga+rbdI4OEpNDzAVyy74uVO9ATgzLK6VtAsYybF/+TOCvrc0MO793d6+42lLyZTw7/ArVzA==", + "license": "MIT" + }, + "node_modules/file-type": { + "version": "3.9.0", + "resolved": "https://registry.npmjs.org/file-type/-/file-type-3.9.0.tgz", + "integrity": "sha512-RLoqTXE8/vPmMuTI88DAzhMYC99I8BWv7zYP4A1puo5HIjEJ5EX48ighy4ZyKMG9EDXxBgW6e++cn7d1xuFghA==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/fill-range": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", + "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", + "license": "MIT", + "dependencies": { + "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/finalhandler": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.3.1.tgz", + "integrity": "sha512-6BN9trH7bp3qvnrRyzsBz+g3lZxTNZTbVO2EV1CS0WIcDbawYVdYvGflME/9QP0h0pYlCDBCTjYa9nZzMDpyxQ==", + "license": "MIT", + "dependencies": { + "debug": "2.6.9", + "encodeurl": "~2.0.0", + "escape-html": "~1.0.3", + "on-finished": "2.4.1", + "parseurl": "~1.3.3", + "statuses": "2.0.1", + "unpipe": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/finalhandler/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "license": "MIT", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/finalhandler/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "license": "MIT" + }, + "node_modules/find-cache-dir": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-4.0.0.tgz", + "integrity": "sha512-9ZonPT4ZAK4a+1pUPVPZJapbi7O5qbbJPdYw/NOQWZZbVLdDTYM3A4R9z/DpAM08IDaFGsvPgiGZ82WEwUDWjg==", + "license": "MIT", + "dependencies": { + "common-path-prefix": "^3.0.0", + "pkg-dir": "^7.0.0" + }, + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/find-up": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-6.3.0.tgz", + "integrity": "sha512-v2ZsoEuVHYy8ZIlYqwPe/39Cy+cFDzp4dXPaxNvkEuouymu+2Jbz0PxpKarJHYJTmv2HWT3O382qY8l4jMWthw==", + "license": "MIT", + "dependencies": { + "locate-path": "^7.1.0", + "path-exists": "^5.0.0" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/flat": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/flat/-/flat-5.0.2.tgz", + "integrity": "sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ==", + "license": "BSD-3-Clause", + "bin": { + "flat": "cli.js" + } + }, + "node_modules/follow-redirects": { + "version": "1.15.11", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.11.tgz", + "integrity": "sha512-deG2P0JfjrTxl50XGCDyfI97ZGVCxIpfKYmfyrQ54n5FO/0gfIES8C/Psl6kWVDolizcaaxZJnTS0QSMxvnsBQ==", + "funding": [ + { + "type": "individual", + "url": "https://github.com/sponsors/RubenVerborgh" + } + ], + "license": "MIT", + "engines": { + "node": ">=4.0" + }, + "peerDependenciesMeta": { + "debug": { + "optional": true + } + } + }, + "node_modules/foreach": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/foreach/-/foreach-2.0.6.tgz", + "integrity": "sha512-k6GAGDyqLe9JaebCsFCoudPPWfihKu8pylYXRlqP1J7ms39iPoTtk2fviNglIeQEwdh0bQeKJ01ZPyuyQvKzwg==", + "license": "MIT" + }, + "node_modules/foreground-child": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.3.1.tgz", + "integrity": "sha512-gIXjKqtFuWEgzFRJA9WCQeSJLZDjgJUOMCMzxtvFq/37KojM1BFGufqsCy0r4qSQmYLsZYMeyRqzIWOMup03sw==", + "license": "ISC", + "dependencies": { + "cross-spawn": "^7.0.6", + "signal-exit": "^4.0.1" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/foreground-child/node_modules/signal-exit": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", + "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", + "license": "ISC", + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/form-data-encoder": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/form-data-encoder/-/form-data-encoder-2.1.4.tgz", + "integrity": "sha512-yDYSgNMraqvnxiEXO4hi88+YZxaHC6QKzb5N84iRCTDeRO7ZALpir/lVmf/uXUhnwUr2O4HU8s/n6x+yNjQkHw==", + "license": "MIT", + "engines": { + "node": ">= 14.17" + } + }, + "node_modules/format": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/format/-/format-0.2.2.tgz", + "integrity": "sha512-wzsgA6WOq+09wrU1tsJ09udeR/YZRaeArL9e1wPbFg3GG2yDnC2ldKpxs4xunpFF9DgqCqOIra3bc1HWrJ37Ww==", + "engines": { + "node": ">=0.4.x" + } + }, + "node_modules/forwarded": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", + "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/fraction.js": { + "version": "4.3.7", + "resolved": "https://registry.npmjs.org/fraction.js/-/fraction.js-4.3.7.tgz", + "integrity": "sha512-ZsDfxO51wGAXREY55a7la9LScWpwv9RxIrYABrlvOFBlH/ShPnrtsXeuUIfXKKOVicNxQ+o8JTbJvjS4M89yew==", + "license": "MIT", + "engines": { + "node": "*" + }, + "funding": { + "type": "patreon", + "url": "https://github.com/sponsors/rawify" + } + }, + "node_modules/fresh": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", + "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/fs-extra": { + "version": "11.3.2", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.3.2.tgz", + "integrity": "sha512-Xr9F6z6up6Ws+NjzMCZc6WXg2YFRlrLP9NQDO3VQrWrfiojdhS56TzueT88ze0uBdCTwEIhQ3ptnmKeWGFAe0A==", + "license": "MIT", + "dependencies": { + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + }, + "engines": { + "node": ">=14.14" + } + }, + "node_modules/fs-monkey": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/fs-monkey/-/fs-monkey-1.1.0.tgz", + "integrity": "sha512-QMUezzXWII9EV5aTFXW1UBVUO77wYPpjqIF8/AviUCThNeSYZykpoTixUeaNNBwmCev0AMDWMAni+f8Hxb1IFw==", + "license": "Unlicense" + }, + "node_modules/fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", + "license": "ISC" + }, + "node_modules/fsevents": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", + "hasInstallScript": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/function-bind": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", + "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/gensync": { + "version": "1.0.0-beta.2", + "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", + "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/get-caller-file": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", + "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", + "license": "ISC", + "engines": { + "node": "6.* || 8.* || >= 10.*" + } + }, + "node_modules/get-intrinsic": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.3.0.tgz", + "integrity": "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==", + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.2", + "es-define-property": "^1.0.1", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.1.1", + "function-bind": "^1.1.2", + "get-proto": "^1.0.1", + "gopd": "^1.2.0", + "has-symbols": "^1.1.0", + "hasown": "^2.0.2", + "math-intrinsics": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/get-own-enumerable-property-symbols": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/get-own-enumerable-property-symbols/-/get-own-enumerable-property-symbols-3.0.2.tgz", + "integrity": "sha512-I0UBV/XOz1XkIJHEUDMZAbzCThU/H8DxmSfmdGcKPnVhu2VfFqr34jr9777IyaTYvxjedWhqVIilEDsCdP5G6g==", + "license": "ISC" + }, + "node_modules/get-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/get-proto/-/get-proto-1.0.1.tgz", + "integrity": "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==", + "license": "MIT", + "dependencies": { + "dunder-proto": "^1.0.1", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/get-stream": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", + "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/github-slugger": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/github-slugger/-/github-slugger-1.5.0.tgz", + "integrity": "sha512-wIh+gKBI9Nshz2o46B0B3f5k/W+WI9ZAv6y5Dn5WJ5SK1t0TnDimB4WE5rmTD05ZAIn8HALCZVmCsvj0w0v0lw==", + "license": "ISC" + }, + "node_modules/glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "deprecated": "Glob versions prior to v9 are no longer supported", + "license": "ISC", + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "license": "ISC", + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/glob-to-regexp": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz", + "integrity": "sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==", + "license": "BSD-2-Clause" + }, + "node_modules/glob/node_modules/brace-expansion": { + "version": "1.1.12", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz", + "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/glob/node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "license": "ISC", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/global-dirs": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/global-dirs/-/global-dirs-3.0.1.tgz", + "integrity": "sha512-NBcGGFbBA9s1VzD41QXDG+3++t9Mn5t1FpLdhESY6oKY4gYTFpX4wO3sqGUa0Srjtbfj3szX0RnemmrVRUdULA==", + "license": "MIT", + "dependencies": { + "ini": "2.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/global-dirs/node_modules/ini": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ini/-/ini-2.0.0.tgz", + "integrity": "sha512-7PnF4oN3CvZF23ADhA5wRaYEQpJ8qygSkbtTXWBeXWXmEVRXK+1ITciHWwHhsjv1TmW0MgacIv6hEi5pX5NQdA==", + "license": "ISC", + "engines": { + "node": ">=10" + } + }, + "node_modules/globby": { + "version": "11.1.0", + "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", + "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==", + "license": "MIT", + "dependencies": { + "array-union": "^2.1.0", + "dir-glob": "^3.0.1", + "fast-glob": "^3.2.9", + "ignore": "^5.2.0", + "merge2": "^1.4.1", + "slash": "^3.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/gopd": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz", + "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/got": { + "version": "12.6.1", + "resolved": "https://registry.npmjs.org/got/-/got-12.6.1.tgz", + "integrity": "sha512-mThBblvlAF1d4O5oqyvN+ZxLAYwIJK7bpMxgYqPD9okW0C3qm5FFn7k811QrcuEBwaogR3ngOFoCfs6mRv7teQ==", + "license": "MIT", + "dependencies": { + "@sindresorhus/is": "^5.2.0", + "@szmarczak/http-timer": "^5.0.1", + "cacheable-lookup": "^7.0.0", + "cacheable-request": "^10.2.8", + "decompress-response": "^6.0.0", + "form-data-encoder": "^2.1.2", + "get-stream": "^6.0.1", + "http2-wrapper": "^2.1.10", + "lowercase-keys": "^3.0.0", + "p-cancelable": "^3.0.0", + "responselike": "^3.0.0" + }, + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sindresorhus/got?sponsor=1" + } + }, + "node_modules/got/node_modules/@sindresorhus/is": { + "version": "5.6.0", + "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-5.6.0.tgz", + "integrity": "sha512-TV7t8GKYaJWsn00tFDqBw8+Uqmr8A0fRU1tvTQhyZzGv0sJCGRQL3JGMI3ucuKo3XIZdUP+Lx7/gh2t3lewy7g==", + "license": "MIT", + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sindresorhus/is?sponsor=1" + } + }, + "node_modules/graceful-fs": { + "version": "4.2.11", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", + "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", + "license": "ISC" + }, + "node_modules/graphlib": { + "version": "2.1.8", + "resolved": "https://registry.npmjs.org/graphlib/-/graphlib-2.1.8.tgz", + "integrity": "sha512-jcLLfkpoVGmH7/InMC/1hIvOPSUh38oJtGhvrOFGzioE1DZ+0YW16RgmOJhHiuWTvGiJQ9Z1Ik43JvkRPRvE+A==", + "license": "MIT", + "dependencies": { + "lodash": "^4.17.15" + } + }, + "node_modules/gray-matter": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/gray-matter/-/gray-matter-4.0.3.tgz", + "integrity": "sha512-5v6yZd4JK3eMI3FqqCouswVqwugaA9r4dNZB1wwcmrD02QkV5H0y7XBQW8QwQqEaZY1pM9aqORSORhJRdNK44Q==", + "license": "MIT", + "dependencies": { + "js-yaml": "^3.13.1", + "kind-of": "^6.0.2", + "section-matter": "^1.0.0", + "strip-bom-string": "^1.0.0" + }, + "engines": { + "node": ">=6.0" + } + }, + "node_modules/gray-matter/node_modules/argparse": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", + "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", + "license": "MIT", + "dependencies": { + "sprintf-js": "~1.0.2" + } + }, + "node_modules/gray-matter/node_modules/js-yaml": { + "version": "3.14.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", + "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", + "license": "MIT", + "dependencies": { + "argparse": "^1.0.7", + "esprima": "^4.0.0" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/gzip-size": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/gzip-size/-/gzip-size-6.0.0.tgz", + "integrity": "sha512-ax7ZYomf6jqPTQ4+XCpUGyXKHk5WweS+e05MBO4/y3WJ5RkmPXNKvX+bx1behVILVwr6JSQvZAku021CHPXG3Q==", + "license": "MIT", + "dependencies": { + "duplexer": "^0.1.2" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/handle-thing": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/handle-thing/-/handle-thing-2.0.1.tgz", + "integrity": "sha512-9Qn4yBxelxoh2Ow62nP+Ka/kMnOXRi8BXnRaUwezLNhqelnN49xKz4F/dPP8OYLxLxq6JDtZb2i9XznUQbNPTg==", + "license": "MIT" + }, + "node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/has-property-descriptors": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz", + "integrity": "sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==", + "license": "MIT", + "dependencies": { + "es-define-property": "^1.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-symbols": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz", + "integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-yarn": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-yarn/-/has-yarn-3.0.0.tgz", + "integrity": "sha512-IrsVwUHhEULx3R8f/aA8AHuEzAorplsab/v8HBzEiIukwq5i/EC+xmOW+HfP1OaDP+2JkgT1yILHN2O3UFIbcA==", + "license": "MIT", + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/hasown": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", + "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", + "license": "MIT", + "dependencies": { + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/hast-util-from-parse5": { + "version": "8.0.3", + "resolved": "https://registry.npmjs.org/hast-util-from-parse5/-/hast-util-from-parse5-8.0.3.tgz", + "integrity": "sha512-3kxEVkEKt0zvcZ3hCRYI8rqrgwtlIOFMWkbclACvjlDw8Li9S2hk/d51OI0nr/gIpdMHNepwgOKqZ/sy0Clpyg==", + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.0", + "@types/unist": "^3.0.0", + "devlop": "^1.0.0", + "hastscript": "^9.0.0", + "property-information": "^7.0.0", + "vfile": "^6.0.0", + "vfile-location": "^5.0.0", + "web-namespaces": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hast-util-parse-selector": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/hast-util-parse-selector/-/hast-util-parse-selector-4.0.0.tgz", + "integrity": "sha512-wkQCkSYoOGCRKERFWcxMVMOcYE2K1AaNLU8DXS9arxnLOUEWbOXKXiJUNzEpqZ3JOKpnha3jkFrumEjVliDe7A==", + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hast-util-raw": { + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/hast-util-raw/-/hast-util-raw-9.1.0.tgz", + "integrity": "sha512-Y8/SBAHkZGoNkpzqqfCldijcuUKh7/su31kEBp67cFY09Wy0mTRgtsLYsiIxMJxlu0f6AA5SUTbDR8K0rxnbUw==", + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.0", + "@types/unist": "^3.0.0", + "@ungap/structured-clone": "^1.0.0", + "hast-util-from-parse5": "^8.0.0", + "hast-util-to-parse5": "^8.0.0", + "html-void-elements": "^3.0.0", + "mdast-util-to-hast": "^13.0.0", + "parse5": "^7.0.0", + "unist-util-position": "^5.0.0", + "unist-util-visit": "^5.0.0", + "vfile": "^6.0.0", + "web-namespaces": "^2.0.0", + "zwitch": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hast-util-to-estree": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/hast-util-to-estree/-/hast-util-to-estree-3.1.3.tgz", + "integrity": "sha512-48+B/rJWAp0jamNbAAf9M7Uf//UVqAoMmgXhBdxTDJLGKY+LRnZ99qcG+Qjl5HfMpYNzS5v4EAwVEF34LeAj7w==", + "license": "MIT", + "dependencies": { + "@types/estree": "^1.0.0", + "@types/estree-jsx": "^1.0.0", + "@types/hast": "^3.0.0", + "comma-separated-tokens": "^2.0.0", + "devlop": "^1.0.0", + "estree-util-attach-comments": "^3.0.0", + "estree-util-is-identifier-name": "^3.0.0", + "hast-util-whitespace": "^3.0.0", + "mdast-util-mdx-expression": "^2.0.0", + "mdast-util-mdx-jsx": "^3.0.0", + "mdast-util-mdxjs-esm": "^2.0.0", + "property-information": "^7.0.0", + "space-separated-tokens": "^2.0.0", + "style-to-js": "^1.0.0", + "unist-util-position": "^5.0.0", + "zwitch": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hast-util-to-jsx-runtime": { + "version": "2.3.6", + "resolved": "https://registry.npmjs.org/hast-util-to-jsx-runtime/-/hast-util-to-jsx-runtime-2.3.6.tgz", + "integrity": "sha512-zl6s8LwNyo1P9uw+XJGvZtdFF1GdAkOg8ujOw+4Pyb76874fLps4ueHXDhXWdk6YHQ6OgUtinliG7RsYvCbbBg==", + "license": "MIT", + "dependencies": { + "@types/estree": "^1.0.0", + "@types/hast": "^3.0.0", + "@types/unist": "^3.0.0", + "comma-separated-tokens": "^2.0.0", + "devlop": "^1.0.0", + "estree-util-is-identifier-name": "^3.0.0", + "hast-util-whitespace": "^3.0.0", + "mdast-util-mdx-expression": "^2.0.0", + "mdast-util-mdx-jsx": "^3.0.0", + "mdast-util-mdxjs-esm": "^2.0.0", + "property-information": "^7.0.0", + "space-separated-tokens": "^2.0.0", + "style-to-js": "^1.0.0", + "unist-util-position": "^5.0.0", + "vfile-message": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hast-util-to-parse5": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/hast-util-to-parse5/-/hast-util-to-parse5-8.0.0.tgz", + "integrity": "sha512-3KKrV5ZVI8if87DVSi1vDeByYrkGzg4mEfeu4alwgmmIeARiBLKCZS2uw5Gb6nU9x9Yufyj3iudm6i7nl52PFw==", + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.0", + "comma-separated-tokens": "^2.0.0", + "devlop": "^1.0.0", + "property-information": "^6.0.0", + "space-separated-tokens": "^2.0.0", + "web-namespaces": "^2.0.0", + "zwitch": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hast-util-to-parse5/node_modules/property-information": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/property-information/-/property-information-6.5.0.tgz", + "integrity": "sha512-PgTgs/BlvHxOu8QuEN7wi5A0OmXaBcHpmCSTehcs6Uuu9IkDIEo13Hy7n898RHfrQ49vKCoGeWZSaAK01nwVig==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/hast-util-whitespace": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/hast-util-whitespace/-/hast-util-whitespace-3.0.0.tgz", + "integrity": "sha512-88JUN06ipLwsnv+dVn+OIYOvAuvBMy/Qoi6O7mQHxdPXpjy+Cd6xRkWwux7DKO+4sYILtLBRIKgsdpS2gQc7qw==", + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hastscript": { + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/hastscript/-/hastscript-9.0.1.tgz", + "integrity": "sha512-g7df9rMFX/SPi34tyGCyUBREQoKkapwdY/T04Qn9TDWfHhAYt4/I0gMVirzK5wEzeUqIjEB+LXC/ypb7Aqno5w==", + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.0", + "comma-separated-tokens": "^2.0.0", + "hast-util-parse-selector": "^4.0.0", + "property-information": "^7.0.0", + "space-separated-tokens": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/he": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", + "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==", + "license": "MIT", + "bin": { + "he": "bin/he" + } + }, + "node_modules/history": { + "version": "4.10.1", + "resolved": "https://registry.npmjs.org/history/-/history-4.10.1.tgz", + "integrity": "sha512-36nwAD620w12kuzPAsyINPWJqlNbij+hpK1k9XRloDtym8mxzGYl2c17LnV6IAGB2Dmg4tEa7G7DlawS0+qjew==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.1.2", + "loose-envify": "^1.2.0", + "resolve-pathname": "^3.0.0", + "tiny-invariant": "^1.0.2", + "tiny-warning": "^1.0.0", + "value-equal": "^1.0.1" + } + }, + "node_modules/hoist-non-react-statics": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/hoist-non-react-statics/-/hoist-non-react-statics-3.3.2.tgz", + "integrity": "sha512-/gGivxi8JPKWNm/W0jSmzcMPpfpPLc3dY/6GxhX2hQ9iGj3aDfklV4ET7NjKpSinLpJ5vafa9iiGIEZg10SfBw==", + "license": "BSD-3-Clause", + "dependencies": { + "react-is": "^16.7.0" + } + }, + "node_modules/hpack.js": { + "version": "2.1.6", + "resolved": "https://registry.npmjs.org/hpack.js/-/hpack.js-2.1.6.tgz", + "integrity": "sha512-zJxVehUdMGIKsRaNt7apO2Gqp0BdqW5yaiGHXXmbpvxgBYVZnAql+BJb4RO5ad2MgpbZKn5G6nMnegrH1FcNYQ==", + "license": "MIT", + "dependencies": { + "inherits": "^2.0.1", + "obuf": "^1.0.0", + "readable-stream": "^2.0.1", + "wbuf": "^1.1.0" + } + }, + "node_modules/hpack.js/node_modules/isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==", + "license": "MIT" + }, + "node_modules/hpack.js/node_modules/readable-stream": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", + "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", + "license": "MIT", + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "node_modules/hpack.js/node_modules/safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "license": "MIT" + }, + "node_modules/hpack.js/node_modules/string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "license": "MIT", + "dependencies": { + "safe-buffer": "~5.1.0" + } + }, + "node_modules/html-entities": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/html-entities/-/html-entities-2.6.0.tgz", + "integrity": "sha512-kig+rMn/QOVRvr7c86gQ8lWXq+Hkv6CbAH1hLu+RG338StTpE8Z0b44SDVaqVu7HGKf27frdmUYEs9hTUX/cLQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/mdevils" + }, + { + "type": "patreon", + "url": "https://patreon.com/mdevils" + } + ], + "license": "MIT" + }, + "node_modules/html-escaper": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz", + "integrity": "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==", + "license": "MIT" + }, + "node_modules/html-minifier-terser": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/html-minifier-terser/-/html-minifier-terser-7.2.0.tgz", + "integrity": "sha512-tXgn3QfqPIpGl9o+K5tpcj3/MN4SfLtsx2GWwBC3SSd0tXQGyF3gsSqad8loJgKZGM3ZxbYDd5yhiBIdWpmvLA==", + "license": "MIT", + "dependencies": { + "camel-case": "^4.1.2", + "clean-css": "~5.3.2", + "commander": "^10.0.0", + "entities": "^4.4.0", + "param-case": "^3.0.4", + "relateurl": "^0.2.7", + "terser": "^5.15.1" + }, + "bin": { + "html-minifier-terser": "cli.js" + }, + "engines": { + "node": "^14.13.1 || >=16.0.0" + } + }, + "node_modules/html-minifier-terser/node_modules/commander": { + "version": "10.0.1", + "resolved": "https://registry.npmjs.org/commander/-/commander-10.0.1.tgz", + "integrity": "sha512-y4Mg2tXshplEbSGzx7amzPwKKOCGuoSRP/CjEdwwk0FOGlUbq6lKuoyDZTNZkmxHdJtp54hdfY/JUrdL7Xfdug==", + "license": "MIT", + "engines": { + "node": ">=14" + } + }, + "node_modules/html-tags": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/html-tags/-/html-tags-3.3.1.tgz", + "integrity": "sha512-ztqyC3kLto0e9WbNp0aeP+M3kTt+nbaIveGmUxAtZa+8iFgKLUOD4YKM5j+f3QD89bra7UeumolZHKuOXnTmeQ==", + "license": "MIT", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/html-void-elements": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/html-void-elements/-/html-void-elements-3.0.0.tgz", + "integrity": "sha512-bEqo66MRXsUGxWHV5IP0PUiAWwoEjba4VCzg0LjFJBpchPaTfyfCKTG6bc5F8ucKec3q5y6qOdGyYTSBEvhCrg==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/html-webpack-plugin": { + "version": "5.6.4", + "resolved": "https://registry.npmjs.org/html-webpack-plugin/-/html-webpack-plugin-5.6.4.tgz", + "integrity": "sha512-V/PZeWsqhfpE27nKeX9EO2sbR+D17A+tLf6qU+ht66jdUsN0QLKJN27Z+1+gHrVMKgndBahes0PU6rRihDgHTw==", + "license": "MIT", + "dependencies": { + "@types/html-minifier-terser": "^6.0.0", + "html-minifier-terser": "^6.0.2", + "lodash": "^4.17.21", + "pretty-error": "^4.0.0", + "tapable": "^2.0.0" + }, + "engines": { + "node": ">=10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/html-webpack-plugin" + }, + "peerDependencies": { + "@rspack/core": "0.x || 1.x", + "webpack": "^5.20.0" + }, + "peerDependenciesMeta": { + "@rspack/core": { + "optional": true + }, + "webpack": { + "optional": true + } + } + }, + "node_modules/html-webpack-plugin/node_modules/commander": { + "version": "8.3.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-8.3.0.tgz", + "integrity": "sha512-OkTL9umf+He2DZkUq8f8J9of7yL6RJKI24dVITBmNfZBmri9zYZQrKkuXiKhyfPSu8tUhnVBB1iKXevvnlR4Ww==", + "license": "MIT", + "engines": { + "node": ">= 12" + } + }, + "node_modules/html-webpack-plugin/node_modules/html-minifier-terser": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/html-minifier-terser/-/html-minifier-terser-6.1.0.tgz", + "integrity": "sha512-YXxSlJBZTP7RS3tWnQw74ooKa6L9b9i9QYXY21eUEvhZ3u9XLfv6OnFsQq6RxkhHygsaUMvYsZRV5rU/OVNZxw==", + "license": "MIT", + "dependencies": { + "camel-case": "^4.1.2", + "clean-css": "^5.2.2", + "commander": "^8.3.0", + "he": "^1.2.0", + "param-case": "^3.0.4", + "relateurl": "^0.2.7", + "terser": "^5.10.0" + }, + "bin": { + "html-minifier-terser": "cli.js" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/htmlparser2": { + "version": "8.0.2", + "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-8.0.2.tgz", + "integrity": "sha512-GYdjWKDkbRLkZ5geuHs5NY1puJ+PXwP7+fHPRz06Eirsb9ugf6d8kkXav6ADhcODhFFPMIXyxkxSuMf3D6NCFA==", + "funding": [ + "https://github.com/fb55/htmlparser2?sponsor=1", + { + "type": "github", + "url": "https://github.com/sponsors/fb55" + } + ], + "license": "MIT", + "dependencies": { + "domelementtype": "^2.3.0", + "domhandler": "^5.0.3", + "domutils": "^3.0.1", + "entities": "^4.4.0" + } + }, + "node_modules/http-cache-semantics": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.2.0.tgz", + "integrity": "sha512-dTxcvPXqPvXBQpq5dUr6mEMJX4oIEFv6bwom3FDwKRDsuIjjJGANqhBuoAn9c1RQJIdAKav33ED65E2ys+87QQ==", + "license": "BSD-2-Clause" + }, + "node_modules/http-deceiver": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/http-deceiver/-/http-deceiver-1.2.7.tgz", + "integrity": "sha512-LmpOGxTfbpgtGVxJrj5k7asXHCgNZp5nLfp+hWc8QQRqtb7fUy6kRY3BO1h9ddF6yIPYUARgxGOwB42DnxIaNw==", + "license": "MIT" + }, + "node_modules/http-errors": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz", + "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==", + "license": "MIT", + "dependencies": { + "depd": "2.0.0", + "inherits": "2.0.4", + "setprototypeof": "1.2.0", + "statuses": "2.0.1", + "toidentifier": "1.0.1" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/http-parser-js": { + "version": "0.5.10", + "resolved": "https://registry.npmjs.org/http-parser-js/-/http-parser-js-0.5.10.tgz", + "integrity": "sha512-Pysuw9XpUq5dVc/2SMHpuTY01RFl8fttgcyunjL7eEMhGM3cI4eOmiCycJDVCo/7O7ClfQD3SaI6ftDzqOXYMA==", + "license": "MIT" + }, + "node_modules/http-proxy": { + "version": "1.18.1", + "resolved": "https://registry.npmjs.org/http-proxy/-/http-proxy-1.18.1.tgz", + "integrity": "sha512-7mz/721AbnJwIVbnaSv1Cz3Am0ZLT/UBwkC92VlxhXv/k/BBQfM2fXElQNC27BVGr0uwUpplYPQM9LnaBMR5NQ==", + "license": "MIT", + "dependencies": { + "eventemitter3": "^4.0.0", + "follow-redirects": "^1.0.0", + "requires-port": "^1.0.0" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/http-proxy-middleware": { + "version": "2.0.9", + "resolved": "https://registry.npmjs.org/http-proxy-middleware/-/http-proxy-middleware-2.0.9.tgz", + "integrity": "sha512-c1IyJYLYppU574+YI7R4QyX2ystMtVXZwIdzazUIPIJsHuWNd+mho2j+bKoHftndicGj9yh+xjd+l0yj7VeT1Q==", + "license": "MIT", + "dependencies": { + "@types/http-proxy": "^1.17.8", + "http-proxy": "^1.18.1", + "is-glob": "^4.0.1", + "is-plain-obj": "^3.0.0", + "micromatch": "^4.0.2" + }, + "engines": { + "node": ">=12.0.0" + }, + "peerDependencies": { + "@types/express": "^4.17.13" + }, + "peerDependenciesMeta": { + "@types/express": { + "optional": true + } + } + }, + "node_modules/http-proxy-middleware/node_modules/is-plain-obj": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-3.0.0.tgz", + "integrity": "sha512-gwsOE28k+23GP1B6vFl1oVh/WOzmawBrKwo5Ev6wMKzPkaXaCDIQKzLnvsA42DRlbVTWorkgTKIviAKCWkfUwA==", + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/http-reasons": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/http-reasons/-/http-reasons-0.1.0.tgz", + "integrity": "sha512-P6kYh0lKZ+y29T2Gqz+RlC9WBLhKe8kDmcJ+A+611jFfxdPsbMRQ5aNmFRM3lENqFkK+HTTL+tlQviAiv0AbLQ==", + "license": "Apache-2.0" + }, + "node_modules/http2-client": { + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/http2-client/-/http2-client-1.3.5.tgz", + "integrity": "sha512-EC2utToWl4RKfs5zd36Mxq7nzHHBuomZboI0yYL6Y0RmBgT7Sgkq4rQ0ezFTYoIsSs7Tm9SJe+o2FcAg6GBhGA==", + "license": "MIT" + }, + "node_modules/http2-wrapper": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/http2-wrapper/-/http2-wrapper-2.2.1.tgz", + "integrity": "sha512-V5nVw1PAOgfI3Lmeaj2Exmeg7fenjhRUgz1lPSezy1CuhPYbgQtbQj4jZfEAEMlaL+vupsvhjqCyjzob0yxsmQ==", + "license": "MIT", + "dependencies": { + "quick-lru": "^5.1.1", + "resolve-alpn": "^1.2.0" + }, + "engines": { + "node": ">=10.19.0" + } + }, + "node_modules/https-proxy-agent": { + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-7.0.6.tgz", + "integrity": "sha512-vK9P5/iUfdl95AI+JVyUuIcVtd4ofvtrOr3HNtM2yxC9bnMbEdp3x01OhQNnjb8IJYi38VlTE3mBXwcfvywuSw==", + "license": "MIT", + "dependencies": { + "agent-base": "^7.1.2", + "debug": "4" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/human-signals": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz", + "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==", + "license": "Apache-2.0", + "engines": { + "node": ">=10.17.0" + } + }, + "node_modules/iconv-lite": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", + "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", + "license": "MIT", + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/icss-utils": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/icss-utils/-/icss-utils-5.1.0.tgz", + "integrity": "sha512-soFhflCVWLfRNOPU3iv5Z9VUdT44xFRbzjLsEzSr5AQmgqPMTHdU3PMT1Cf1ssx8fLNJDA1juftYl+PUcv3MqA==", + "license": "ISC", + "engines": { + "node": "^10 || ^12 || >= 14" + }, + "peerDependencies": { + "postcss": "^8.1.0" + } + }, + "node_modules/ieee754": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", + "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "BSD-3-Clause" + }, + "node_modules/ignore": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz", + "integrity": "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==", + "license": "MIT", + "engines": { + "node": ">= 4" + } + }, + "node_modules/image-size": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/image-size/-/image-size-2.0.2.tgz", + "integrity": "sha512-IRqXKlaXwgSMAMtpNzZa1ZAe8m+Sa1770Dhk8VkSsP9LS+iHD62Zd8FQKs8fbPiagBE7BzoFX23cxFnwshpV6w==", + "license": "MIT", + "bin": { + "image-size": "bin/image-size.js" + }, + "engines": { + "node": ">=16.x" + } + }, + "node_modules/immediate": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/immediate/-/immediate-3.3.0.tgz", + "integrity": "sha512-HR7EVodfFUdQCTIeySw+WDRFJlPcLOJbXfwwZ7Oom6tjsvZ3bOkCDJHehQC3nxJrv7+f9XecwazynjU8e4Vw3Q==", + "license": "MIT" + }, + "node_modules/immer": { + "version": "9.0.21", + "resolved": "https://registry.npmjs.org/immer/-/immer-9.0.21.tgz", + "integrity": "sha512-bc4NBHqOqSfRW7POMkHd51LvClaeMXpm8dx0e8oE2GORbq5aRK7Bxl4FyzVLdGtLmvLKL7BTDBG5ACQm4HWjTA==", + "license": "MIT", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/immer" + } + }, + "node_modules/immutable": { + "version": "5.1.3", + "resolved": "https://registry.npmjs.org/immutable/-/immutable-5.1.3.tgz", + "integrity": "sha512-+chQdDfvscSF1SJqv2gn4SRO2ZyS3xL3r7IW/wWEEzrzLisnOlKiQu5ytC/BVNcS15C39WT2Hg/bjKjDMcu+zg==", + "license": "MIT" + }, + "node_modules/import-fresh": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.1.tgz", + "integrity": "sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ==", + "license": "MIT", + "dependencies": { + "parent-module": "^1.0.0", + "resolve-from": "^4.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/import-lazy": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/import-lazy/-/import-lazy-4.0.0.tgz", + "integrity": "sha512-rKtvo6a868b5Hu3heneU+L4yEQ4jYKLtjpnPeUdK7h0yzXGmyBTypknlkCvHFBqfX9YlorEiMM6Dnq/5atfHkw==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", + "license": "MIT", + "engines": { + "node": ">=0.8.19" + } + }, + "node_modules/indent-string": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz", + "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/infima": { + "version": "0.2.0-alpha.45", + "resolved": "https://registry.npmjs.org/infima/-/infima-0.2.0-alpha.45.tgz", + "integrity": "sha512-uyH0zfr1erU1OohLk0fT4Rrb94AOhguWNOcD9uGrSpRvNB+6gZXUoJX5J0NtvzBO10YZ9PgvA4NFgt+fYg8ojw==", + "license": "MIT", + "engines": { + "node": ">=12" + } + }, + "node_modules/inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", + "deprecated": "This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful.", + "license": "ISC", + "dependencies": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "node_modules/inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", + "license": "ISC" + }, + "node_modules/ini": { + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", + "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==", + "license": "ISC" + }, + "node_modules/inline-style-parser": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/inline-style-parser/-/inline-style-parser-0.1.1.tgz", + "integrity": "sha512-7NXolsK4CAS5+xvdj5OMMbI962hU/wvwoxk+LWR9Ek9bVtyuuYScDN6eS0rUm6TxApFpw7CX1o4uJzcd4AyD3Q==", + "license": "MIT" + }, + "node_modules/interpret": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/interpret/-/interpret-1.4.0.tgz", + "integrity": "sha512-agE4QfB2Lkp9uICn7BAqoscw4SZP9kTE2hxiFI3jBPmXJfdqiahTbUuKGsMoN2GtqL9AxhYioAcVvgsb1HvRbA==", + "license": "MIT", + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/invariant": { + "version": "2.2.4", + "resolved": "https://registry.npmjs.org/invariant/-/invariant-2.2.4.tgz", + "integrity": "sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA==", + "license": "MIT", + "dependencies": { + "loose-envify": "^1.0.0" + } + }, + "node_modules/ipaddr.js": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-2.2.0.tgz", + "integrity": "sha512-Ag3wB2o37wslZS19hZqorUnrnzSkpOVy+IiiDEiTqNubEYpYuHWIf6K4psgN2ZWKExS4xhVCrRVfb/wfW8fWJA==", + "license": "MIT", + "engines": { + "node": ">= 10" + } + }, + "node_modules/is-alphabetical": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-alphabetical/-/is-alphabetical-2.0.1.tgz", + "integrity": "sha512-FWyyY60MeTNyeSRpkM2Iry0G9hpr7/9kD40mD/cGQEuilcZYS4okz8SN2Q6rLCJ8gbCt6fN+rC+6tMGS99LaxQ==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/is-alphanumerical": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-alphanumerical/-/is-alphanumerical-2.0.1.tgz", + "integrity": "sha512-hmbYhX/9MUMF5uh7tOXyK/n0ZvWpad5caBA17GsC6vyuCqaWliRG5K1qS9inmUhEMaOBIW7/whAnSwveW/LtZw==", + "license": "MIT", + "dependencies": { + "is-alphabetical": "^2.0.0", + "is-decimal": "^2.0.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/is-arrayish": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", + "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==", + "license": "MIT" + }, + "node_modules/is-binary-path": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", + "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", + "license": "MIT", + "dependencies": { + "binary-extensions": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-buffer": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-2.0.5.tgz", + "integrity": "sha512-i2R6zNFDwgEHJyQUtJEk0XFi1i0dPFn/oqjK3/vPCcDeJvW5NQ83V8QbicfF1SupOaB0h8ntgBC2YiE7dfyctQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/is-ci": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/is-ci/-/is-ci-3.0.1.tgz", + "integrity": "sha512-ZYvCgrefwqoQ6yTyYUbQu64HsITZ3NfKX1lzaEYdkTDcfKzzCI/wthRRYKkdjHKFVgNiXKAKm65Zo1pk2as/QQ==", + "license": "MIT", + "dependencies": { + "ci-info": "^3.2.0" + }, + "bin": { + "is-ci": "bin.js" + } + }, + "node_modules/is-core-module": { + "version": "2.16.1", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.16.1.tgz", + "integrity": "sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w==", + "license": "MIT", + "dependencies": { + "hasown": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-decimal": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-decimal/-/is-decimal-2.0.1.tgz", + "integrity": "sha512-AAB9hiomQs5DXWcRB1rqsxGUstbRroFOPPVAomNk/3XHR5JyEZChOyTWe2oayKnsSsr/kcGqF+z6yuH6HHpN0A==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/is-docker": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-2.2.1.tgz", + "integrity": "sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==", + "license": "MIT", + "bin": { + "is-docker": "cli.js" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-extendable": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", + "integrity": "sha512-5BMULNob1vgFX6EjQw5izWDxrecWK9AM72rugNr0TFldMOi0fj6Jk+zeKIt0xGj4cEfQIJth4w3OKWOJ4f+AFw==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/is-glob": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "license": "MIT", + "dependencies": { + "is-extglob": "^2.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-hexadecimal": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-hexadecimal/-/is-hexadecimal-2.0.1.tgz", + "integrity": "sha512-DgZQp241c8oO6cA1SbTEWiXeoxV42vlcJxgH+B3hi1AiqqKruZR3ZGF8In3fj4+/y/7rHvlOZLZtgJ/4ttYGZg==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/is-installed-globally": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/is-installed-globally/-/is-installed-globally-0.4.0.tgz", + "integrity": "sha512-iwGqO3J21aaSkC7jWnHP/difazwS7SFeIqxv6wEtLU8Y5KlzFTjyqcSIT0d8s4+dDhKytsk9PJZ2BkS5eZwQRQ==", + "license": "MIT", + "dependencies": { + "global-dirs": "^3.0.0", + "is-path-inside": "^3.0.2" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-npm": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/is-npm/-/is-npm-6.1.0.tgz", + "integrity": "sha512-O2z4/kNgyjhQwVR1Wpkbfc19JIhggF97NZNCpWTnjH7kVcZMUrnut9XSN7txI7VdyIYk5ZatOq3zvSuWpU8hoA==", + "license": "MIT", + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "license": "MIT", + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/is-obj": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-1.0.1.tgz", + "integrity": "sha512-l4RyHgRqGN4Y3+9JHVrNqO+tN0rV5My76uW5/nuO4K1b6vw5G8d/cmFjP9tRfEsdhZNt0IFdZuK/c2Vr4Nb+Qg==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-path-inside": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz", + "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/is-plain-obj": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-4.1.0.tgz", + "integrity": "sha512-+Pgi+vMuUNkJyExiMBt5IlFoMyKnr5zhJ4Uspz58WOhBF5QoIZkFyNHIbBAtHwzVAgk5RtndVNsDRN61/mmDqg==", + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-plain-object": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", + "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", + "license": "MIT", + "dependencies": { + "isobject": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-regexp": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-regexp/-/is-regexp-1.0.0.tgz", + "integrity": "sha512-7zjFAPO4/gwyQAAgRRmqeEeyIICSdmCqa3tsVHMdBzaXXRiqopZL4Cyghg/XulGWrtABTpbnYYzzIRffLkP4oA==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-stream": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", + "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", + "license": "MIT", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-typedarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", + "integrity": "sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA==", + "license": "MIT" + }, + "node_modules/is-wsl": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-2.2.0.tgz", + "integrity": "sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==", + "license": "MIT", + "dependencies": { + "is-docker": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-yarn-global": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/is-yarn-global/-/is-yarn-global-0.4.1.tgz", + "integrity": "sha512-/kppl+R+LO5VmhYSEWARUFjodS25D68gvj8W7z0I7OWhUla5xWu8KL6CtB2V0R6yqhnRgbcaREMr4EEM6htLPQ==", + "license": "MIT", + "engines": { + "node": ">=12" + } + }, + "node_modules/isarray": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", + "integrity": "sha512-D2S+3GLxWH+uhrNEcoh/fnmYeP8E8/zHl644d/jdA0g2uyXvy3sb0qxotE+ne0LtccHknQzWwZEzhak7oJ0COQ==", + "license": "MIT" + }, + "node_modules/isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", + "license": "ISC" + }, + "node_modules/isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/jackspeak": { + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-3.4.3.tgz", + "integrity": "sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==", + "license": "BlueOak-1.0.0", + "dependencies": { + "@isaacs/cliui": "^8.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + }, + "optionalDependencies": { + "@pkgjs/parseargs": "^0.11.0" + } + }, + "node_modules/jest-util": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-29.7.0.tgz", + "integrity": "sha512-z6EbKajIpqGKU56y5KBUgy1dt1ihhQJgWzUlZHArA/+X2ad7Cb5iF+AK1EWVL/Bo7Rz9uurpqw6SiBCefUbCGA==", + "license": "MIT", + "dependencies": { + "@jest/types": "^29.6.3", + "@types/node": "*", + "chalk": "^4.0.0", + "ci-info": "^3.2.0", + "graceful-fs": "^4.2.9", + "picomatch": "^2.2.3" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-worker": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-29.7.0.tgz", + "integrity": "sha512-eIz2msL/EzL9UFTFFx7jBTkeZfku0yUAyZZZmJ93H2TYEiroIx2PQjEXcwYtYl8zXCxb+PAmA2hLIt/6ZEkPHw==", + "license": "MIT", + "dependencies": { + "@types/node": "*", + "jest-util": "^29.7.0", + "merge-stream": "^2.0.0", + "supports-color": "^8.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-worker/node_modules/supports-color": { + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", + "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/supports-color?sponsor=1" + } + }, + "node_modules/jiti": { + "version": "1.21.7", + "resolved": "https://registry.npmjs.org/jiti/-/jiti-1.21.7.tgz", + "integrity": "sha512-/imKNG4EbWNrVjoNC/1H5/9GFy+tqjGBHCaSsN+P2RnPqjsLmv6UD3Ej+Kj8nBWaRAwyk7kK5ZUc+OEatnTR3A==", + "license": "MIT", + "bin": { + "jiti": "bin/jiti.js" + } + }, + "node_modules/joi": { + "version": "17.13.3", + "resolved": "https://registry.npmjs.org/joi/-/joi-17.13.3.tgz", + "integrity": "sha512-otDA4ldcIx+ZXsKHWmp0YizCweVRZG96J10b0FevjfuncLO1oX59THoAmHkNubYJ+9gWsYsp5k8v4ib6oDv1fA==", + "license": "BSD-3-Clause", + "dependencies": { + "@hapi/hoek": "^9.3.0", + "@hapi/topo": "^5.1.0", + "@sideway/address": "^4.1.5", + "@sideway/formula": "^3.0.1", + "@sideway/pinpoint": "^2.0.0" + } + }, + "node_modules/js-levenshtein": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/js-levenshtein/-/js-levenshtein-1.1.6.tgz", + "integrity": "sha512-X2BB11YZtrRqY4EnQcLX5Rh373zbK4alC1FW7D7MBhL2gtcC17cTnr6DmfHZeS0s2rTHjUTMMHfG7gO8SSdw+g==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", + "license": "MIT" + }, + "node_modules/js-yaml": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", + "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", + "license": "MIT", + "dependencies": { + "argparse": "^2.0.1" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/jsesc": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-3.1.0.tgz", + "integrity": "sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==", + "license": "MIT", + "bin": { + "jsesc": "bin/jsesc" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/json-buffer": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", + "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==", + "license": "MIT" + }, + "node_modules/json-crawl": { + "version": "0.5.3", + "resolved": "https://registry.npmjs.org/json-crawl/-/json-crawl-0.5.3.tgz", + "integrity": "sha512-BEjjCw8c7SxzNK4orhlWD5cXQh8vCk2LqDr4WgQq4CV+5dvopeYwt1Tskg67SuSLKvoFH5g0yuYtg7rcfKV6YA==", + "license": "MIT", + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/json-parse-even-better-errors": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", + "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==", + "license": "MIT" + }, + "node_modules/json-pointer": { + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/json-pointer/-/json-pointer-0.6.2.tgz", + "integrity": "sha512-vLWcKbOaXlO+jvRy4qNd+TI1QUPZzfJj1tpJ3vAXDych5XJf93ftpUKe5pKCrzyIIwgBJcOcCVRUfqQP25afBw==", + "license": "MIT", + "dependencies": { + "foreach": "^2.0.4" + } + }, + "node_modules/json-schema-compare": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/json-schema-compare/-/json-schema-compare-0.2.2.tgz", + "integrity": "sha512-c4WYmDKyJXhs7WWvAWm3uIYnfyWFoIp+JEoX34rctVvEkMYCPGhXtvmFFXiffBbxfZsvQ0RNnV5H7GvDF5HCqQ==", + "license": "MIT", + "dependencies": { + "lodash": "^4.17.4" + } + }, + "node_modules/json-schema-merge-allof": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/json-schema-merge-allof/-/json-schema-merge-allof-0.8.1.tgz", + "integrity": "sha512-CTUKmIlPJbsWfzRRnOXz+0MjIqvnleIXwFTzz+t9T86HnYX/Rozria6ZVGLktAU9e+NygNljveP+yxqtQp/Q4w==", + "license": "MIT", + "dependencies": { + "compute-lcm": "^1.1.2", + "json-schema-compare": "^0.2.2", + "lodash": "^4.17.20" + }, + "engines": { + "node": ">=12.0.0" + } + }, + "node_modules/json-schema-traverse": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", + "license": "MIT" + }, + "node_modules/json5": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", + "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", + "license": "MIT", + "bin": { + "json5": "lib/cli.js" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/jsonfile": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.2.0.tgz", + "integrity": "sha512-FGuPw30AdOIUTRMC2OMRtQV+jkVj2cfPqSeWXv1NEAJ1qZ5zb1X6z1mFhbfOB/iy3ssJCD+3KuZ8r8C3uVFlAg==", + "license": "MIT", + "dependencies": { + "universalify": "^2.0.0" + }, + "optionalDependencies": { + "graceful-fs": "^4.1.6" + } + }, + "node_modules/keyv": { + "version": "4.5.4", + "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz", + "integrity": "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==", + "license": "MIT", + "dependencies": { + "json-buffer": "3.0.1" + } + }, + "node_modules/kind-of": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", + "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/klaw-sync": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/klaw-sync/-/klaw-sync-6.0.0.tgz", + "integrity": "sha512-nIeuVSzdCCs6TDPTqI8w1Yre34sSq7AkZ4B3sfOBbI2CgVSB4Du4aLQijFU2+lhAFCwt9+42Hel6lQNIv6AntQ==", + "license": "MIT", + "dependencies": { + "graceful-fs": "^4.1.11" + } + }, + "node_modules/kleur": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/kleur/-/kleur-3.0.3.tgz", + "integrity": "sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/latest-version": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/latest-version/-/latest-version-7.0.0.tgz", + "integrity": "sha512-KvNT4XqAMzdcL6ka6Tl3i2lYeFDgXNCuIX+xNx6ZMVR1dFq+idXd9FLKNMOIx0t9mJ9/HudyX4oZWXZQ0UJHeg==", + "license": "MIT", + "dependencies": { + "package-json": "^8.1.0" + }, + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/launch-editor": { + "version": "2.11.1", + "resolved": "https://registry.npmjs.org/launch-editor/-/launch-editor-2.11.1.tgz", + "integrity": "sha512-SEET7oNfgSaB6Ym0jufAdCeo3meJVeCaaDyzRygy0xsp2BFKCprcfHljTq4QkzTLUxEKkFK6OK4811YM2oSrRg==", + "license": "MIT", + "dependencies": { + "picocolors": "^1.1.1", + "shell-quote": "^1.8.3" + } + }, + "node_modules/leven": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/leven/-/leven-3.1.0.tgz", + "integrity": "sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/lilconfig": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-3.1.3.tgz", + "integrity": "sha512-/vlFKAoH5Cgt3Ie+JLhRbwOsCQePABiU3tJ1egGvyQ+33R/vcwM2Zl2QR/LzjsBeItPt3oSVXapn+m4nQDvpzw==", + "license": "MIT", + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/antonk52" + } + }, + "node_modules/lines-and-columns": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", + "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==", + "license": "MIT" + }, + "node_modules/liquid-json": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/liquid-json/-/liquid-json-0.3.1.tgz", + "integrity": "sha512-wUayTU8MS827Dam6MxgD72Ui+KOSF+u/eIqpatOtjnvgJ0+mnDq33uC2M7J0tPK+upe/DpUAuK4JUU89iBoNKQ==", + "license": "Apache-2.0", + "engines": { + "node": ">=4" + } + }, + "node_modules/loader-runner": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-4.3.0.tgz", + "integrity": "sha512-3R/1M+yS3j5ou80Me59j7F9IMs4PXs3VqRrm0TU3AbKPxlmpoY1TNscJV/oGJXo8qCatFGTfDbY6W6ipGOYXfg==", + "license": "MIT", + "engines": { + "node": ">=6.11.5" + } + }, + "node_modules/loader-utils": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-2.0.4.tgz", + "integrity": "sha512-xXqpXoINfFhgua9xiqD8fPFHgkoq1mmmpE92WlDbm9rNRd/EbRb+Gqf908T2DMfuHjjJlksiK2RbHVOdD/MqSw==", + "license": "MIT", + "dependencies": { + "big.js": "^5.2.2", + "emojis-list": "^3.0.0", + "json5": "^2.1.2" + }, + "engines": { + "node": ">=8.9.0" + } + }, + "node_modules/locate-path": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-7.2.0.tgz", + "integrity": "sha512-gvVijfZvn7R+2qyPX8mAuKcFGDf6Nc61GdvGafQsHL0sBIxfKzA+usWn4GFC/bk+QdwPUD4kWFJLhElipq+0VA==", + "license": "MIT", + "dependencies": { + "p-locate": "^6.0.0" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/lodash": { + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", + "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", + "license": "MIT" + }, + "node_modules/lodash.debounce": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/lodash.debounce/-/lodash.debounce-4.0.8.tgz", + "integrity": "sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow==", + "license": "MIT" + }, + "node_modules/lodash.memoize": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/lodash.memoize/-/lodash.memoize-4.1.2.tgz", + "integrity": "sha512-t7j+NzmgnQzTAYXcsHYLgimltOV1MXHtlOWf6GjL9Kj8GK5FInw5JotxvbOs+IvV1/Dzo04/fCGfLVs7aXb4Ag==", + "license": "MIT" + }, + "node_modules/lodash.uniq": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/lodash.uniq/-/lodash.uniq-4.5.0.tgz", + "integrity": "sha512-xfBaXQd9ryd9dlSDvnvI0lvxfLJlYAZzXomUYzLKtUeOQvOP5piqAWuGtrhWeqaXK9hhoM/iyJc5AV+XfsX3HQ==", + "license": "MIT" + }, + "node_modules/longest-streak": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/longest-streak/-/longest-streak-3.1.0.tgz", + "integrity": "sha512-9Ri+o0JYgehTaVBBDoMqIl8GXtbWg711O3srftcHhZ0dqnETqLaoIK0x17fUw9rFSlK/0NlsKe0Ahhyl5pXE2g==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/loose-envify": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", + "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", + "license": "MIT", + "dependencies": { + "js-tokens": "^3.0.0 || ^4.0.0" + }, + "bin": { + "loose-envify": "cli.js" + } + }, + "node_modules/lower-case": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/lower-case/-/lower-case-2.0.2.tgz", + "integrity": "sha512-7fm3l3NAF9WfN6W3JOmf5drwpVqX78JtoGJ3A6W0a6ZnldM41w2fV5D490psKFTpMds8TJse/eHLFFsNHHjHgg==", + "license": "MIT", + "dependencies": { + "tslib": "^2.0.3" + } + }, + "node_modules/lowercase-keys": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-3.0.0.tgz", + "integrity": "sha512-ozCC6gdQ+glXOQsveKD0YsDy8DSQFjDTz4zyzEHNV5+JP5D62LmfDZ6o1cycFx9ouG940M5dE8C8CTewdj2YWQ==", + "license": "MIT", + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/lru-cache": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", + "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", + "license": "ISC", + "dependencies": { + "yallist": "^3.0.2" + } + }, + "node_modules/lunr": { + "version": "2.3.9", + "resolved": "https://registry.npmjs.org/lunr/-/lunr-2.3.9.tgz", + "integrity": "sha512-zTU3DaZaF3Rt9rhN3uBMGQD3dD2/vFQqnvZCDv4dl5iOzq2IZQqTxu90r4E5J+nP70J3ilqVCrbho2eWaeW8Ow==", + "license": "MIT" + }, + "node_modules/lunr-languages": { + "version": "1.14.0", + "resolved": "https://registry.npmjs.org/lunr-languages/-/lunr-languages-1.14.0.tgz", + "integrity": "sha512-hWUAb2KqM3L7J5bcrngszzISY4BxrXn/Xhbb9TTCJYEGqlR1nG67/M14sp09+PTIRklobrn57IAxcdcO/ZFyNA==", + "license": "MPL-1.1" + }, + "node_modules/mark.js": { + "version": "8.11.1", + "resolved": "https://registry.npmjs.org/mark.js/-/mark.js-8.11.1.tgz", + "integrity": "sha512-1I+1qpDt4idfgLQG+BNWmrqku+7/2bi5nLf4YwF8y8zXvmfiTBY3PV3ZibfrjBueCByROpuBjLLFCajqkgYoLQ==", + "license": "MIT" + }, + "node_modules/markdown-extensions": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/markdown-extensions/-/markdown-extensions-2.0.0.tgz", + "integrity": "sha512-o5vL7aDWatOTX8LzaS1WMoaoxIiLRQJuIKKe2wAw6IeULDHaqbiqiggmx+pKvZDb1Sj+pE46Sn1T7lCqfFtg1Q==", + "license": "MIT", + "engines": { + "node": ">=16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/markdown-table": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/markdown-table/-/markdown-table-3.0.4.tgz", + "integrity": "sha512-wiYz4+JrLyb/DqW2hkFJxP7Vd7JuTDm77fvbM8VfEQdmSMqcImWeeRbHwZjBjIFki/VaMK2BhFi7oUUZeM5bqw==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/math-intrinsics": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz", + "integrity": "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/mdast-util-definitions": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/mdast-util-definitions/-/mdast-util-definitions-5.1.2.tgz", + "integrity": "sha512-8SVPMuHqlPME/z3gqVwWY4zVXn8lqKv/pAhC57FuJ40ImXyBpmO5ukh98zB2v7Blql2FiHjHv9LVztSIqjY+MA==", + "license": "MIT", + "dependencies": { + "@types/mdast": "^3.0.0", + "@types/unist": "^2.0.0", + "unist-util-visit": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-definitions/node_modules/@types/mdast": { + "version": "3.0.15", + "resolved": "https://registry.npmjs.org/@types/mdast/-/mdast-3.0.15.tgz", + "integrity": "sha512-LnwD+mUEfxWMa1QpDraczIn6k0Ee3SMicuYSSzS6ZYl2gKS09EClnJYGd8Du6rfc5r/GZEk5o1mRb8TaTj03sQ==", + "license": "MIT", + "dependencies": { + "@types/unist": "^2" + } + }, + "node_modules/mdast-util-definitions/node_modules/@types/unist": { + "version": "2.0.11", + "resolved": "https://registry.npmjs.org/@types/unist/-/unist-2.0.11.tgz", + "integrity": "sha512-CmBKiL6NNo/OqgmMn95Fk9Whlp2mtvIv+KNpQKN2F4SjvrEesubTRWGYSg+BnWZOnlCaSTU1sMpsBOzgbYhnsA==", + "license": "MIT" + }, + "node_modules/mdast-util-definitions/node_modules/unist-util-is": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/unist-util-is/-/unist-util-is-5.2.1.tgz", + "integrity": "sha512-u9njyyfEh43npf1M+yGKDGVPbY/JWEemg5nH05ncKPfi+kBbKBJoTdsogMu33uhytuLlv9y0O7GH7fEdwLdLQw==", + "license": "MIT", + "dependencies": { + "@types/unist": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-definitions/node_modules/unist-util-visit": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/unist-util-visit/-/unist-util-visit-4.1.2.tgz", + "integrity": "sha512-MSd8OUGISqHdVvfY9TPhyK2VdUrPgxkUtWSuMHF6XAAFuL4LokseigBnZtPnJMu+FbynTkFNnFlyjxpVKujMRg==", + "license": "MIT", + "dependencies": { + "@types/unist": "^2.0.0", + "unist-util-is": "^5.0.0", + "unist-util-visit-parents": "^5.1.1" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-definitions/node_modules/unist-util-visit-parents": { + "version": "5.1.3", + "resolved": "https://registry.npmjs.org/unist-util-visit-parents/-/unist-util-visit-parents-5.1.3.tgz", + "integrity": "sha512-x6+y8g7wWMyQhL1iZfhIPhDAs7Xwbn9nRosDXl7qoPTSCy0yNxnKc+hWokFifWQIDGi154rdUqKvbCa4+1kLhg==", + "license": "MIT", + "dependencies": { + "@types/unist": "^2.0.0", + "unist-util-is": "^5.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-directive": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/mdast-util-directive/-/mdast-util-directive-3.1.0.tgz", + "integrity": "sha512-I3fNFt+DHmpWCYAT7quoM6lHf9wuqtI+oCOfvILnoicNIqjh5E3dEJWiXuYME2gNe8vl1iMQwyUHa7bgFmak6Q==", + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0", + "@types/unist": "^3.0.0", + "ccount": "^2.0.0", + "devlop": "^1.0.0", + "mdast-util-from-markdown": "^2.0.0", + "mdast-util-to-markdown": "^2.0.0", + "parse-entities": "^4.0.0", + "stringify-entities": "^4.0.0", + "unist-util-visit-parents": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-find-and-replace": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/mdast-util-find-and-replace/-/mdast-util-find-and-replace-3.0.2.tgz", + "integrity": "sha512-Tmd1Vg/m3Xz43afeNxDIhWRtFZgM2VLyaf4vSTYwudTyeuTneoL3qtWMA5jeLyz/O1vDJmmV4QuScFCA2tBPwg==", + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0", + "escape-string-regexp": "^5.0.0", + "unist-util-is": "^6.0.0", + "unist-util-visit-parents": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-find-and-replace/node_modules/escape-string-regexp": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-5.0.0.tgz", + "integrity": "sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw==", + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/mdast-util-from-markdown": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/mdast-util-from-markdown/-/mdast-util-from-markdown-2.0.2.tgz", + "integrity": "sha512-uZhTV/8NBuw0WHkPTrCqDOl0zVe1BIng5ZtHoDk49ME1qqcjYmmLmOf0gELgcRMxN4w2iuIeVso5/6QymSrgmA==", + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0", + "@types/unist": "^3.0.0", + "decode-named-character-reference": "^1.0.0", + "devlop": "^1.0.0", + "mdast-util-to-string": "^4.0.0", + "micromark": "^4.0.0", + "micromark-util-decode-numeric-character-reference": "^2.0.0", + "micromark-util-decode-string": "^2.0.0", + "micromark-util-normalize-identifier": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0", + "unist-util-stringify-position": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-from-markdown/node_modules/micromark-util-symbol": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.1.tgz", + "integrity": "sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, + "node_modules/mdast-util-frontmatter": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/mdast-util-frontmatter/-/mdast-util-frontmatter-2.0.1.tgz", + "integrity": "sha512-LRqI9+wdgC25P0URIJY9vwocIzCcksduHQ9OF2joxQoyTNVduwLAFUzjoopuRJbJAReaKrNQKAZKL3uCMugWJA==", + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0", + "devlop": "^1.0.0", + "escape-string-regexp": "^5.0.0", + "mdast-util-from-markdown": "^2.0.0", + "mdast-util-to-markdown": "^2.0.0", + "micromark-extension-frontmatter": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-frontmatter/node_modules/escape-string-regexp": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-5.0.0.tgz", + "integrity": "sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw==", + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/mdast-util-gfm": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/mdast-util-gfm/-/mdast-util-gfm-3.1.0.tgz", + "integrity": "sha512-0ulfdQOM3ysHhCJ1p06l0b0VKlhU0wuQs3thxZQagjcjPrlFRqY215uZGHHJan9GEAXd9MbfPjFJz+qMkVR6zQ==", + "license": "MIT", + "dependencies": { + "mdast-util-from-markdown": "^2.0.0", + "mdast-util-gfm-autolink-literal": "^2.0.0", + "mdast-util-gfm-footnote": "^2.0.0", + "mdast-util-gfm-strikethrough": "^2.0.0", + "mdast-util-gfm-table": "^2.0.0", + "mdast-util-gfm-task-list-item": "^2.0.0", + "mdast-util-to-markdown": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-gfm-autolink-literal": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/mdast-util-gfm-autolink-literal/-/mdast-util-gfm-autolink-literal-2.0.1.tgz", + "integrity": "sha512-5HVP2MKaP6L+G6YaxPNjuL0BPrq9orG3TsrZ9YXbA3vDw/ACI4MEsnoDpn6ZNm7GnZgtAcONJyPhOP8tNJQavQ==", + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0", + "ccount": "^2.0.0", + "devlop": "^1.0.0", + "mdast-util-find-and-replace": "^3.0.0", + "micromark-util-character": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-gfm-autolink-literal/node_modules/micromark-util-character": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.1.1.tgz", + "integrity": "sha512-wv8tdUTJ3thSFFFJKtpYKOYiGP2+v96Hvk4Tu8KpCAsTMs6yi+nVmGh1syvSCsaxz45J6Jbw+9DD6g97+NV67Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/mdast-util-gfm-autolink-literal/node_modules/micromark-util-symbol": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.1.tgz", + "integrity": "sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, + "node_modules/mdast-util-gfm-footnote": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mdast-util-gfm-footnote/-/mdast-util-gfm-footnote-2.1.0.tgz", + "integrity": "sha512-sqpDWlsHn7Ac9GNZQMeUzPQSMzR6Wv0WKRNvQRg0KqHh02fpTz69Qc1QSseNX29bhz1ROIyNyxExfawVKTm1GQ==", + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0", + "devlop": "^1.1.0", + "mdast-util-from-markdown": "^2.0.0", + "mdast-util-to-markdown": "^2.0.0", + "micromark-util-normalize-identifier": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-gfm-strikethrough": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/mdast-util-gfm-strikethrough/-/mdast-util-gfm-strikethrough-2.0.0.tgz", + "integrity": "sha512-mKKb915TF+OC5ptj5bJ7WFRPdYtuHv0yTRxK2tJvi+BDqbkiG7h7u/9SI89nRAYcmap2xHQL9D+QG/6wSrTtXg==", + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0", + "mdast-util-from-markdown": "^2.0.0", + "mdast-util-to-markdown": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-gfm-table": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/mdast-util-gfm-table/-/mdast-util-gfm-table-2.0.0.tgz", + "integrity": "sha512-78UEvebzz/rJIxLvE7ZtDd/vIQ0RHv+3Mh5DR96p7cS7HsBhYIICDBCu8csTNWNO6tBWfqXPWekRuj2FNOGOZg==", + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0", + "devlop": "^1.0.0", + "markdown-table": "^3.0.0", + "mdast-util-from-markdown": "^2.0.0", + "mdast-util-to-markdown": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-gfm-task-list-item": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/mdast-util-gfm-task-list-item/-/mdast-util-gfm-task-list-item-2.0.0.tgz", + "integrity": "sha512-IrtvNvjxC1o06taBAVJznEnkiHxLFTzgonUdy8hzFVeDun0uTjxxrRGVaNFqkU1wJR3RBPEfsxmU6jDWPofrTQ==", + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0", + "devlop": "^1.0.0", + "mdast-util-from-markdown": "^2.0.0", + "mdast-util-to-markdown": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-mdx": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/mdast-util-mdx/-/mdast-util-mdx-3.0.0.tgz", + "integrity": "sha512-JfbYLAW7XnYTTbUsmpu0kdBUVe+yKVJZBItEjwyYJiDJuZ9w4eeaqks4HQO+R7objWgS2ymV60GYpI14Ug554w==", + "license": "MIT", + "dependencies": { + "mdast-util-from-markdown": "^2.0.0", + "mdast-util-mdx-expression": "^2.0.0", + "mdast-util-mdx-jsx": "^3.0.0", + "mdast-util-mdxjs-esm": "^2.0.0", + "mdast-util-to-markdown": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-mdx-expression": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/mdast-util-mdx-expression/-/mdast-util-mdx-expression-2.0.1.tgz", + "integrity": "sha512-J6f+9hUp+ldTZqKRSg7Vw5V6MqjATc+3E4gf3CFNcuZNWD8XdyI6zQ8GqH7f8169MM6P7hMBRDVGnn7oHB9kXQ==", + "license": "MIT", + "dependencies": { + "@types/estree-jsx": "^1.0.0", + "@types/hast": "^3.0.0", + "@types/mdast": "^4.0.0", + "devlop": "^1.0.0", + "mdast-util-from-markdown": "^2.0.0", + "mdast-util-to-markdown": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-mdx-jsx": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/mdast-util-mdx-jsx/-/mdast-util-mdx-jsx-3.2.0.tgz", + "integrity": "sha512-lj/z8v0r6ZtsN/cGNNtemmmfoLAFZnjMbNyLzBafjzikOM+glrjNHPlf6lQDOTccj9n5b0PPihEBbhneMyGs1Q==", + "license": "MIT", + "dependencies": { + "@types/estree-jsx": "^1.0.0", + "@types/hast": "^3.0.0", + "@types/mdast": "^4.0.0", + "@types/unist": "^3.0.0", + "ccount": "^2.0.0", + "devlop": "^1.1.0", + "mdast-util-from-markdown": "^2.0.0", + "mdast-util-to-markdown": "^2.0.0", + "parse-entities": "^4.0.0", + "stringify-entities": "^4.0.0", + "unist-util-stringify-position": "^4.0.0", + "vfile-message": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-mdxjs-esm": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/mdast-util-mdxjs-esm/-/mdast-util-mdxjs-esm-2.0.1.tgz", + "integrity": "sha512-EcmOpxsZ96CvlP03NghtH1EsLtr0n9Tm4lPUJUBccV9RwUOneqSycg19n5HGzCf+10LozMRSObtVr3ee1WoHtg==", + "license": "MIT", + "dependencies": { + "@types/estree-jsx": "^1.0.0", + "@types/hast": "^3.0.0", + "@types/mdast": "^4.0.0", + "devlop": "^1.0.0", + "mdast-util-from-markdown": "^2.0.0", + "mdast-util-to-markdown": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-phrasing": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/mdast-util-phrasing/-/mdast-util-phrasing-4.1.0.tgz", + "integrity": "sha512-TqICwyvJJpBwvGAMZjj4J2n0X8QWp21b9l0o7eXyVJ25YNWYbJDVIyD1bZXE6WtV6RmKJVYmQAKWa0zWOABz2w==", + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0", + "unist-util-is": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-to-hast": { + "version": "13.2.0", + "resolved": "https://registry.npmjs.org/mdast-util-to-hast/-/mdast-util-to-hast-13.2.0.tgz", + "integrity": "sha512-QGYKEuUsYT9ykKBCMOEDLsU5JRObWQusAolFMeko/tYPufNkRffBAQjIE+99jbA87xv6FgmjLtwjh9wBWajwAA==", + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.0", + "@types/mdast": "^4.0.0", + "@ungap/structured-clone": "^1.0.0", + "devlop": "^1.0.0", + "micromark-util-sanitize-uri": "^2.0.0", + "trim-lines": "^3.0.0", + "unist-util-position": "^5.0.0", + "unist-util-visit": "^5.0.0", + "vfile": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-to-markdown": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/mdast-util-to-markdown/-/mdast-util-to-markdown-2.1.2.tgz", + "integrity": "sha512-xj68wMTvGXVOKonmog6LwyJKrYXZPvlwabaryTjLh9LuvovB/KAH+kvi8Gjj+7rJjsFi23nkUxRQv1KqSroMqA==", + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0", + "@types/unist": "^3.0.0", + "longest-streak": "^3.0.0", + "mdast-util-phrasing": "^4.0.0", + "mdast-util-to-string": "^4.0.0", + "micromark-util-classify-character": "^2.0.0", + "micromark-util-decode-string": "^2.0.0", + "unist-util-visit": "^5.0.0", + "zwitch": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-to-string": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/mdast-util-to-string/-/mdast-util-to-string-4.0.0.tgz", + "integrity": "sha512-0H44vDimn51F0YwvxSJSm0eCDOJTRlmN0R1yBh4HLj9wiV1Dn0QoXGbvFAWj2hSItVTlCmBF1hqKlIyUBVFLPg==", + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdn-data": { + "version": "2.0.30", + "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.30.tgz", + "integrity": "sha512-GaqWWShW4kv/G9IEucWScBx9G1/vsFZZJUO+tD26M8J8z3Kw5RDQjaoZe03YAClgeS/SWPOcb4nkFBTEi5DUEA==", + "license": "CC0-1.0" + }, + "node_modules/media-typer": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", + "integrity": "sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/memfs": { + "version": "3.5.3", + "resolved": "https://registry.npmjs.org/memfs/-/memfs-3.5.3.tgz", + "integrity": "sha512-UERzLsxzllchadvbPs5aolHh65ISpKpM+ccLbOJ8/vvpBKmAWf+la7dXFy7Mr0ySHbdHrFv5kGFCUHHe6GFEmw==", + "license": "Unlicense", + "dependencies": { + "fs-monkey": "^1.0.4" + }, + "engines": { + "node": ">= 4.0.0" + } + }, + "node_modules/merge-descriptors": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.3.tgz", + "integrity": "sha512-gaNvAS7TZ897/rVaZ0nMtAyxNyi/pdbjbAwUpFQpN70GqnVfOiXpeUUMKRBmzXaSQ8DdTX4/0ms62r2K+hE6mQ==", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/merge-stream": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", + "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==", + "license": "MIT" + }, + "node_modules/merge2": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", + "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", + "license": "MIT", + "engines": { + "node": ">= 8" + } + }, + "node_modules/methods": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", + "integrity": "sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/micromark": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/micromark/-/micromark-4.0.2.tgz", + "integrity": "sha512-zpe98Q6kvavpCr1NPVSCMebCKfD7CA2NqZ+rykeNhONIJBpc1tFKt9hucLGwha3jNTNI8lHpctWJWoimVF4PfA==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "@types/debug": "^4.0.0", + "debug": "^4.0.0", + "decode-named-character-reference": "^1.0.0", + "devlop": "^1.0.0", + "micromark-core-commonmark": "^2.0.0", + "micromark-factory-space": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-chunked": "^2.0.0", + "micromark-util-combine-extensions": "^2.0.0", + "micromark-util-decode-numeric-character-reference": "^2.0.0", + "micromark-util-encode": "^2.0.0", + "micromark-util-normalize-identifier": "^2.0.0", + "micromark-util-resolve-all": "^2.0.0", + "micromark-util-sanitize-uri": "^2.0.0", + "micromark-util-subtokenize": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-core-commonmark": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/micromark-core-commonmark/-/micromark-core-commonmark-2.0.3.tgz", + "integrity": "sha512-RDBrHEMSxVFLg6xvnXmb1Ayr2WzLAWjeSATAoxwKYJV94TeNavgoIdA0a9ytzDSVzBy2YKFK+emCPOEibLeCrg==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "decode-named-character-reference": "^1.0.0", + "devlop": "^1.0.0", + "micromark-factory-destination": "^2.0.0", + "micromark-factory-label": "^2.0.0", + "micromark-factory-space": "^2.0.0", + "micromark-factory-title": "^2.0.0", + "micromark-factory-whitespace": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-chunked": "^2.0.0", + "micromark-util-classify-character": "^2.0.0", + "micromark-util-html-tag-name": "^2.0.0", + "micromark-util-normalize-identifier": "^2.0.0", + "micromark-util-resolve-all": "^2.0.0", + "micromark-util-subtokenize": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-core-commonmark/node_modules/micromark-factory-space": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-factory-space/-/micromark-factory-space-2.0.1.tgz", + "integrity": "sha512-zRkxjtBxxLd2Sc0d+fbnEunsTj46SWXgXciZmHq0kDYGnck/ZSGj9/wULTV95uoeYiK5hRXP2mJ98Uo4cq/LQg==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-character": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-core-commonmark/node_modules/micromark-util-character": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.1.1.tgz", + "integrity": "sha512-wv8tdUTJ3thSFFFJKtpYKOYiGP2+v96Hvk4Tu8KpCAsTMs6yi+nVmGh1syvSCsaxz45J6Jbw+9DD6g97+NV67Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-core-commonmark/node_modules/micromark-util-symbol": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.1.tgz", + "integrity": "sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, + "node_modules/micromark-extension-directive": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/micromark-extension-directive/-/micromark-extension-directive-3.0.2.tgz", + "integrity": "sha512-wjcXHgk+PPdmvR58Le9d7zQYWy+vKEU9Se44p2CrCDPiLr2FMyiT4Fyb5UFKFC66wGB3kPlgD7q3TnoqPS7SZA==", + "license": "MIT", + "dependencies": { + "devlop": "^1.0.0", + "micromark-factory-space": "^2.0.0", + "micromark-factory-whitespace": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0", + "parse-entities": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/micromark-extension-directive/node_modules/micromark-factory-space": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-factory-space/-/micromark-factory-space-2.0.1.tgz", + "integrity": "sha512-zRkxjtBxxLd2Sc0d+fbnEunsTj46SWXgXciZmHq0kDYGnck/ZSGj9/wULTV95uoeYiK5hRXP2mJ98Uo4cq/LQg==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-character": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-extension-directive/node_modules/micromark-util-character": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.1.1.tgz", + "integrity": "sha512-wv8tdUTJ3thSFFFJKtpYKOYiGP2+v96Hvk4Tu8KpCAsTMs6yi+nVmGh1syvSCsaxz45J6Jbw+9DD6g97+NV67Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-extension-directive/node_modules/micromark-util-symbol": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.1.tgz", + "integrity": "sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, + "node_modules/micromark-extension-frontmatter": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-extension-frontmatter/-/micromark-extension-frontmatter-2.0.0.tgz", + "integrity": "sha512-C4AkuM3dA58cgZha7zVnuVxBhDsbttIMiytjgsM2XbHAB2faRVaHRle40558FBN+DJcrLNCoqG5mlrpdU4cRtg==", + "license": "MIT", + "dependencies": { + "fault": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/micromark-extension-frontmatter/node_modules/micromark-util-character": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.1.1.tgz", + "integrity": "sha512-wv8tdUTJ3thSFFFJKtpYKOYiGP2+v96Hvk4Tu8KpCAsTMs6yi+nVmGh1syvSCsaxz45J6Jbw+9DD6g97+NV67Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-extension-frontmatter/node_modules/micromark-util-symbol": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.1.tgz", + "integrity": "sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, + "node_modules/micromark-extension-gfm": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/micromark-extension-gfm/-/micromark-extension-gfm-3.0.0.tgz", + "integrity": "sha512-vsKArQsicm7t0z2GugkCKtZehqUm31oeGBV/KVSorWSy8ZlNAv7ytjFhvaryUiCUJYqs+NoE6AFhpQvBTM6Q4w==", + "license": "MIT", + "dependencies": { + "micromark-extension-gfm-autolink-literal": "^2.0.0", + "micromark-extension-gfm-footnote": "^2.0.0", + "micromark-extension-gfm-strikethrough": "^2.0.0", + "micromark-extension-gfm-table": "^2.0.0", + "micromark-extension-gfm-tagfilter": "^2.0.0", + "micromark-extension-gfm-task-list-item": "^2.0.0", + "micromark-util-combine-extensions": "^2.0.0", + "micromark-util-types": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/micromark-extension-gfm-autolink-literal": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/micromark-extension-gfm-autolink-literal/-/micromark-extension-gfm-autolink-literal-2.1.0.tgz", + "integrity": "sha512-oOg7knzhicgQ3t4QCjCWgTmfNhvQbDDnJeVu9v81r7NltNCVmhPy1fJRX27pISafdjL+SVc4d3l48Gb6pbRypw==", + "license": "MIT", + "dependencies": { + "micromark-util-character": "^2.0.0", + "micromark-util-sanitize-uri": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/micromark-extension-gfm-autolink-literal/node_modules/micromark-util-character": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.1.1.tgz", + "integrity": "sha512-wv8tdUTJ3thSFFFJKtpYKOYiGP2+v96Hvk4Tu8KpCAsTMs6yi+nVmGh1syvSCsaxz45J6Jbw+9DD6g97+NV67Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-extension-gfm-autolink-literal/node_modules/micromark-util-symbol": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.1.tgz", + "integrity": "sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, + "node_modules/micromark-extension-gfm-footnote": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/micromark-extension-gfm-footnote/-/micromark-extension-gfm-footnote-2.1.0.tgz", + "integrity": "sha512-/yPhxI1ntnDNsiHtzLKYnE3vf9JZ6cAisqVDauhp4CEHxlb4uoOTxOCJ+9s51bIB8U1N1FJ1RXOKTIlD5B/gqw==", + "license": "MIT", + "dependencies": { + "devlop": "^1.0.0", + "micromark-core-commonmark": "^2.0.0", + "micromark-factory-space": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-normalize-identifier": "^2.0.0", + "micromark-util-sanitize-uri": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/micromark-extension-gfm-footnote/node_modules/micromark-factory-space": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-factory-space/-/micromark-factory-space-2.0.1.tgz", + "integrity": "sha512-zRkxjtBxxLd2Sc0d+fbnEunsTj46SWXgXciZmHq0kDYGnck/ZSGj9/wULTV95uoeYiK5hRXP2mJ98Uo4cq/LQg==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-character": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-extension-gfm-footnote/node_modules/micromark-util-character": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.1.1.tgz", + "integrity": "sha512-wv8tdUTJ3thSFFFJKtpYKOYiGP2+v96Hvk4Tu8KpCAsTMs6yi+nVmGh1syvSCsaxz45J6Jbw+9DD6g97+NV67Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-extension-gfm-footnote/node_modules/micromark-util-symbol": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.1.tgz", + "integrity": "sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, + "node_modules/micromark-extension-gfm-strikethrough": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/micromark-extension-gfm-strikethrough/-/micromark-extension-gfm-strikethrough-2.1.0.tgz", + "integrity": "sha512-ADVjpOOkjz1hhkZLlBiYA9cR2Anf8F4HqZUO6e5eDcPQd0Txw5fxLzzxnEkSkfnD0wziSGiv7sYhk/ktvbf1uw==", + "license": "MIT", + "dependencies": { + "devlop": "^1.0.0", + "micromark-util-chunked": "^2.0.0", + "micromark-util-classify-character": "^2.0.0", + "micromark-util-resolve-all": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/micromark-extension-gfm-strikethrough/node_modules/micromark-util-symbol": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.1.tgz", + "integrity": "sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, + "node_modules/micromark-extension-gfm-table": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/micromark-extension-gfm-table/-/micromark-extension-gfm-table-2.1.1.tgz", + "integrity": "sha512-t2OU/dXXioARrC6yWfJ4hqB7rct14e8f7m0cbI5hUmDyyIlwv5vEtooptH8INkbLzOatzKuVbQmAYcbWoyz6Dg==", + "license": "MIT", + "dependencies": { + "devlop": "^1.0.0", + "micromark-factory-space": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/micromark-extension-gfm-table/node_modules/micromark-factory-space": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-factory-space/-/micromark-factory-space-2.0.1.tgz", + "integrity": "sha512-zRkxjtBxxLd2Sc0d+fbnEunsTj46SWXgXciZmHq0kDYGnck/ZSGj9/wULTV95uoeYiK5hRXP2mJ98Uo4cq/LQg==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-character": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-extension-gfm-table/node_modules/micromark-util-character": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.1.1.tgz", + "integrity": "sha512-wv8tdUTJ3thSFFFJKtpYKOYiGP2+v96Hvk4Tu8KpCAsTMs6yi+nVmGh1syvSCsaxz45J6Jbw+9DD6g97+NV67Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-extension-gfm-table/node_modules/micromark-util-symbol": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.1.tgz", + "integrity": "sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, + "node_modules/micromark-extension-gfm-tagfilter": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-extension-gfm-tagfilter/-/micromark-extension-gfm-tagfilter-2.0.0.tgz", + "integrity": "sha512-xHlTOmuCSotIA8TW1mDIM6X2O1SiX5P9IuDtqGonFhEK0qgRI4yeC6vMxEV2dgyr2TiD+2PQ10o+cOhdVAcwfg==", + "license": "MIT", + "dependencies": { + "micromark-util-types": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/micromark-extension-gfm-task-list-item": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/micromark-extension-gfm-task-list-item/-/micromark-extension-gfm-task-list-item-2.1.0.tgz", + "integrity": "sha512-qIBZhqxqI6fjLDYFTBIa4eivDMnP+OZqsNwmQ3xNLE4Cxwc+zfQEfbs6tzAo2Hjq+bh6q5F+Z8/cksrLFYWQQw==", + "license": "MIT", + "dependencies": { + "devlop": "^1.0.0", + "micromark-factory-space": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/micromark-extension-gfm-task-list-item/node_modules/micromark-factory-space": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-factory-space/-/micromark-factory-space-2.0.1.tgz", + "integrity": "sha512-zRkxjtBxxLd2Sc0d+fbnEunsTj46SWXgXciZmHq0kDYGnck/ZSGj9/wULTV95uoeYiK5hRXP2mJ98Uo4cq/LQg==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-character": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-extension-gfm-task-list-item/node_modules/micromark-util-character": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.1.1.tgz", + "integrity": "sha512-wv8tdUTJ3thSFFFJKtpYKOYiGP2+v96Hvk4Tu8KpCAsTMs6yi+nVmGh1syvSCsaxz45J6Jbw+9DD6g97+NV67Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-extension-gfm-task-list-item/node_modules/micromark-util-symbol": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.1.tgz", + "integrity": "sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, + "node_modules/micromark-extension-mdx-expression": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/micromark-extension-mdx-expression/-/micromark-extension-mdx-expression-3.0.1.tgz", + "integrity": "sha512-dD/ADLJ1AeMvSAKBwO22zG22N4ybhe7kFIZ3LsDI0GlsNr2A3KYxb0LdC1u5rj4Nw+CHKY0RVdnHX8vj8ejm4Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "@types/estree": "^1.0.0", + "devlop": "^1.0.0", + "micromark-factory-mdx-expression": "^2.0.0", + "micromark-factory-space": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-events-to-acorn": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-extension-mdx-expression/node_modules/micromark-factory-space": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-factory-space/-/micromark-factory-space-2.0.1.tgz", + "integrity": "sha512-zRkxjtBxxLd2Sc0d+fbnEunsTj46SWXgXciZmHq0kDYGnck/ZSGj9/wULTV95uoeYiK5hRXP2mJ98Uo4cq/LQg==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-character": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-extension-mdx-expression/node_modules/micromark-util-character": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.1.1.tgz", + "integrity": "sha512-wv8tdUTJ3thSFFFJKtpYKOYiGP2+v96Hvk4Tu8KpCAsTMs6yi+nVmGh1syvSCsaxz45J6Jbw+9DD6g97+NV67Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-extension-mdx-expression/node_modules/micromark-util-symbol": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.1.tgz", + "integrity": "sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, + "node_modules/micromark-extension-mdx-jsx": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/micromark-extension-mdx-jsx/-/micromark-extension-mdx-jsx-3.0.2.tgz", + "integrity": "sha512-e5+q1DjMh62LZAJOnDraSSbDMvGJ8x3cbjygy2qFEi7HCeUT4BDKCvMozPozcD6WmOt6sVvYDNBKhFSz3kjOVQ==", + "license": "MIT", + "dependencies": { + "@types/estree": "^1.0.0", + "devlop": "^1.0.0", + "estree-util-is-identifier-name": "^3.0.0", + "micromark-factory-mdx-expression": "^2.0.0", + "micromark-factory-space": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-events-to-acorn": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0", + "vfile-message": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/micromark-extension-mdx-jsx/node_modules/micromark-factory-space": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-factory-space/-/micromark-factory-space-2.0.1.tgz", + "integrity": "sha512-zRkxjtBxxLd2Sc0d+fbnEunsTj46SWXgXciZmHq0kDYGnck/ZSGj9/wULTV95uoeYiK5hRXP2mJ98Uo4cq/LQg==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-character": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-extension-mdx-jsx/node_modules/micromark-util-character": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.1.1.tgz", + "integrity": "sha512-wv8tdUTJ3thSFFFJKtpYKOYiGP2+v96Hvk4Tu8KpCAsTMs6yi+nVmGh1syvSCsaxz45J6Jbw+9DD6g97+NV67Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-extension-mdx-jsx/node_modules/micromark-util-symbol": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.1.tgz", + "integrity": "sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, + "node_modules/micromark-extension-mdx-md": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-extension-mdx-md/-/micromark-extension-mdx-md-2.0.0.tgz", + "integrity": "sha512-EpAiszsB3blw4Rpba7xTOUptcFeBFi+6PY8VnJ2hhimH+vCQDirWgsMpz7w1XcZE7LVrSAUGb9VJpG9ghlYvYQ==", + "license": "MIT", + "dependencies": { + "micromark-util-types": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/micromark-extension-mdxjs": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/micromark-extension-mdxjs/-/micromark-extension-mdxjs-3.0.0.tgz", + "integrity": "sha512-A873fJfhnJ2siZyUrJ31l34Uqwy4xIFmvPY1oj+Ean5PHcPBYzEsvqvWGaWcfEIr11O5Dlw3p2y0tZWpKHDejQ==", + "license": "MIT", + "dependencies": { + "acorn": "^8.0.0", + "acorn-jsx": "^5.0.0", + "micromark-extension-mdx-expression": "^3.0.0", + "micromark-extension-mdx-jsx": "^3.0.0", + "micromark-extension-mdx-md": "^2.0.0", + "micromark-extension-mdxjs-esm": "^3.0.0", + "micromark-util-combine-extensions": "^2.0.0", + "micromark-util-types": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/micromark-extension-mdxjs-esm": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/micromark-extension-mdxjs-esm/-/micromark-extension-mdxjs-esm-3.0.0.tgz", + "integrity": "sha512-DJFl4ZqkErRpq/dAPyeWp15tGrcrrJho1hKK5uBS70BCtfrIFg81sqcTVu3Ta+KD1Tk5vAtBNElWxtAa+m8K9A==", + "license": "MIT", + "dependencies": { + "@types/estree": "^1.0.0", + "devlop": "^1.0.0", + "micromark-core-commonmark": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-events-to-acorn": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0", + "unist-util-position-from-estree": "^2.0.0", + "vfile-message": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/micromark-extension-mdxjs-esm/node_modules/micromark-util-character": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.1.1.tgz", + "integrity": "sha512-wv8tdUTJ3thSFFFJKtpYKOYiGP2+v96Hvk4Tu8KpCAsTMs6yi+nVmGh1syvSCsaxz45J6Jbw+9DD6g97+NV67Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-extension-mdxjs-esm/node_modules/micromark-util-symbol": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.1.tgz", + "integrity": "sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, + "node_modules/micromark-factory-destination": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-factory-destination/-/micromark-factory-destination-2.0.1.tgz", + "integrity": "sha512-Xe6rDdJlkmbFRExpTOmRj9N3MaWmbAgdpSrBQvCFqhezUn4AHqJHbaEnfbVYYiexVSs//tqOdY/DxhjdCiJnIA==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-factory-destination/node_modules/micromark-util-character": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.1.1.tgz", + "integrity": "sha512-wv8tdUTJ3thSFFFJKtpYKOYiGP2+v96Hvk4Tu8KpCAsTMs6yi+nVmGh1syvSCsaxz45J6Jbw+9DD6g97+NV67Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-factory-destination/node_modules/micromark-util-symbol": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.1.tgz", + "integrity": "sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, + "node_modules/micromark-factory-label": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-factory-label/-/micromark-factory-label-2.0.1.tgz", + "integrity": "sha512-VFMekyQExqIW7xIChcXn4ok29YE3rnuyveW3wZQWWqF4Nv9Wk5rgJ99KzPvHjkmPXF93FXIbBp6YdW3t71/7Vg==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "devlop": "^1.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-factory-label/node_modules/micromark-util-character": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.1.1.tgz", + "integrity": "sha512-wv8tdUTJ3thSFFFJKtpYKOYiGP2+v96Hvk4Tu8KpCAsTMs6yi+nVmGh1syvSCsaxz45J6Jbw+9DD6g97+NV67Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-factory-label/node_modules/micromark-util-symbol": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.1.tgz", + "integrity": "sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, + "node_modules/micromark-factory-mdx-expression": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/micromark-factory-mdx-expression/-/micromark-factory-mdx-expression-2.0.3.tgz", + "integrity": "sha512-kQnEtA3vzucU2BkrIa8/VaSAsP+EJ3CKOvhMuJgOEGg9KDC6OAY6nSnNDVRiVNRqj7Y4SlSzcStaH/5jge8JdQ==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "@types/estree": "^1.0.0", + "devlop": "^1.0.0", + "micromark-factory-space": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-events-to-acorn": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0", + "unist-util-position-from-estree": "^2.0.0", + "vfile-message": "^4.0.0" + } + }, + "node_modules/micromark-factory-mdx-expression/node_modules/micromark-factory-space": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-factory-space/-/micromark-factory-space-2.0.1.tgz", + "integrity": "sha512-zRkxjtBxxLd2Sc0d+fbnEunsTj46SWXgXciZmHq0kDYGnck/ZSGj9/wULTV95uoeYiK5hRXP2mJ98Uo4cq/LQg==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-character": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-factory-mdx-expression/node_modules/micromark-util-character": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.1.1.tgz", + "integrity": "sha512-wv8tdUTJ3thSFFFJKtpYKOYiGP2+v96Hvk4Tu8KpCAsTMs6yi+nVmGh1syvSCsaxz45J6Jbw+9DD6g97+NV67Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-factory-mdx-expression/node_modules/micromark-util-symbol": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.1.tgz", + "integrity": "sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, + "node_modules/micromark-factory-space": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/micromark-factory-space/-/micromark-factory-space-1.1.0.tgz", + "integrity": "sha512-cRzEj7c0OL4Mw2v6nwzttyOZe8XY/Z8G0rzmWQZTBi/jjwyw/U4uqKtUORXQrR5bAZZnbTI/feRV/R7hc4jQYQ==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-character": "^1.0.0", + "micromark-util-types": "^1.0.0" + } + }, + "node_modules/micromark-factory-space/node_modules/micromark-util-types": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/micromark-util-types/-/micromark-util-types-1.1.0.tgz", + "integrity": "sha512-ukRBgie8TIAcacscVHSiddHjO4k/q3pnedmzMQ4iwDcK0FtFCohKOlFbaOL/mPgfnPsL3C1ZyxJa4sbWrBl3jg==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, + "node_modules/micromark-factory-title": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-factory-title/-/micromark-factory-title-2.0.1.tgz", + "integrity": "sha512-5bZ+3CjhAd9eChYTHsjy6TGxpOFSKgKKJPJxr293jTbfry2KDoWkhBb6TcPVB4NmzaPhMs1Frm9AZH7OD4Cjzw==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-factory-space": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-factory-title/node_modules/micromark-factory-space": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-factory-space/-/micromark-factory-space-2.0.1.tgz", + "integrity": "sha512-zRkxjtBxxLd2Sc0d+fbnEunsTj46SWXgXciZmHq0kDYGnck/ZSGj9/wULTV95uoeYiK5hRXP2mJ98Uo4cq/LQg==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-character": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-factory-title/node_modules/micromark-util-character": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.1.1.tgz", + "integrity": "sha512-wv8tdUTJ3thSFFFJKtpYKOYiGP2+v96Hvk4Tu8KpCAsTMs6yi+nVmGh1syvSCsaxz45J6Jbw+9DD6g97+NV67Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-factory-title/node_modules/micromark-util-symbol": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.1.tgz", + "integrity": "sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, + "node_modules/micromark-factory-whitespace": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-factory-whitespace/-/micromark-factory-whitespace-2.0.1.tgz", + "integrity": "sha512-Ob0nuZ3PKt/n0hORHyvoD9uZhr+Za8sFoP+OnMcnWK5lngSzALgQYKMr9RJVOWLqQYuyn6ulqGWSXdwf6F80lQ==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-factory-space": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-factory-whitespace/node_modules/micromark-factory-space": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-factory-space/-/micromark-factory-space-2.0.1.tgz", + "integrity": "sha512-zRkxjtBxxLd2Sc0d+fbnEunsTj46SWXgXciZmHq0kDYGnck/ZSGj9/wULTV95uoeYiK5hRXP2mJ98Uo4cq/LQg==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-character": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-factory-whitespace/node_modules/micromark-util-character": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.1.1.tgz", + "integrity": "sha512-wv8tdUTJ3thSFFFJKtpYKOYiGP2+v96Hvk4Tu8KpCAsTMs6yi+nVmGh1syvSCsaxz45J6Jbw+9DD6g97+NV67Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-factory-whitespace/node_modules/micromark-util-symbol": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.1.tgz", + "integrity": "sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, + "node_modules/micromark-util-character": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-1.2.0.tgz", + "integrity": "sha512-lXraTwcX3yH/vMDaFWCQJP1uIszLVebzUa3ZHdrgxr7KEU/9mL4mVgCpGbyhvNLNlauROiNUq7WN5u7ndbY6xg==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-symbol": "^1.0.0", + "micromark-util-types": "^1.0.0" + } + }, + "node_modules/micromark-util-character/node_modules/micromark-util-types": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/micromark-util-types/-/micromark-util-types-1.1.0.tgz", + "integrity": "sha512-ukRBgie8TIAcacscVHSiddHjO4k/q3pnedmzMQ4iwDcK0FtFCohKOlFbaOL/mPgfnPsL3C1ZyxJa4sbWrBl3jg==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, + "node_modules/micromark-util-chunked": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-chunked/-/micromark-util-chunked-2.0.1.tgz", + "integrity": "sha512-QUNFEOPELfmvv+4xiNg2sRYeS/P84pTW0TCgP5zc9FpXetHY0ab7SxKyAQCNCc1eK0459uoLI1y5oO5Vc1dbhA==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-symbol": "^2.0.0" + } + }, + "node_modules/micromark-util-chunked/node_modules/micromark-util-symbol": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.1.tgz", + "integrity": "sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, + "node_modules/micromark-util-classify-character": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-classify-character/-/micromark-util-classify-character-2.0.1.tgz", + "integrity": "sha512-K0kHzM6afW/MbeWYWLjoHQv1sgg2Q9EccHEDzSkxiP/EaagNzCm7T/WMKZ3rjMbvIpvBiZgwR3dKMygtA4mG1Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-util-classify-character/node_modules/micromark-util-character": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.1.1.tgz", + "integrity": "sha512-wv8tdUTJ3thSFFFJKtpYKOYiGP2+v96Hvk4Tu8KpCAsTMs6yi+nVmGh1syvSCsaxz45J6Jbw+9DD6g97+NV67Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-util-classify-character/node_modules/micromark-util-symbol": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.1.tgz", + "integrity": "sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, + "node_modules/micromark-util-combine-extensions": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-combine-extensions/-/micromark-util-combine-extensions-2.0.1.tgz", + "integrity": "sha512-OnAnH8Ujmy59JcyZw8JSbK9cGpdVY44NKgSM7E9Eh7DiLS2E9RNQf0dONaGDzEG9yjEl5hcqeIsj4hfRkLH/Bg==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-chunked": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-util-decode-numeric-character-reference": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/micromark-util-decode-numeric-character-reference/-/micromark-util-decode-numeric-character-reference-2.0.2.tgz", + "integrity": "sha512-ccUbYk6CwVdkmCQMyr64dXz42EfHGkPQlBj5p7YVGzq8I7CtjXZJrubAYezf7Rp+bjPseiROqe7G6foFd+lEuw==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-symbol": "^2.0.0" + } + }, + "node_modules/micromark-util-decode-numeric-character-reference/node_modules/micromark-util-symbol": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.1.tgz", + "integrity": "sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, + "node_modules/micromark-util-decode-string": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-decode-string/-/micromark-util-decode-string-2.0.1.tgz", + "integrity": "sha512-nDV/77Fj6eH1ynwscYTOsbK7rR//Uj0bZXBwJZRfaLEJ1iGBR6kIfNmlNqaqJf649EP0F3NWNdeJi03elllNUQ==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "decode-named-character-reference": "^1.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-decode-numeric-character-reference": "^2.0.0", + "micromark-util-symbol": "^2.0.0" + } + }, + "node_modules/micromark-util-decode-string/node_modules/micromark-util-character": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.1.1.tgz", + "integrity": "sha512-wv8tdUTJ3thSFFFJKtpYKOYiGP2+v96Hvk4Tu8KpCAsTMs6yi+nVmGh1syvSCsaxz45J6Jbw+9DD6g97+NV67Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-util-decode-string/node_modules/micromark-util-symbol": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.1.tgz", + "integrity": "sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, + "node_modules/micromark-util-encode": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-encode/-/micromark-util-encode-2.0.1.tgz", + "integrity": "sha512-c3cVx2y4KqUnwopcO9b/SCdo2O67LwJJ/UyqGfbigahfegL9myoEFoDYZgkT7f36T0bLrM9hZTAaAyH+PCAXjw==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, + "node_modules/micromark-util-events-to-acorn": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/micromark-util-events-to-acorn/-/micromark-util-events-to-acorn-2.0.3.tgz", + "integrity": "sha512-jmsiEIiZ1n7X1Rr5k8wVExBQCg5jy4UXVADItHmNk1zkwEVhBuIUKRu3fqv+hs4nxLISi2DQGlqIOGiFxgbfHg==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "@types/estree": "^1.0.0", + "@types/unist": "^3.0.0", + "devlop": "^1.0.0", + "estree-util-visit": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0", + "vfile-message": "^4.0.0" + } + }, + "node_modules/micromark-util-events-to-acorn/node_modules/micromark-util-symbol": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.1.tgz", + "integrity": "sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, + "node_modules/micromark-util-html-tag-name": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-html-tag-name/-/micromark-util-html-tag-name-2.0.1.tgz", + "integrity": "sha512-2cNEiYDhCWKI+Gs9T0Tiysk136SnR13hhO8yW6BGNyhOC4qYFnwF1nKfD3HFAIXA5c45RrIG1ub11GiXeYd1xA==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, + "node_modules/micromark-util-normalize-identifier": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-normalize-identifier/-/micromark-util-normalize-identifier-2.0.1.tgz", + "integrity": "sha512-sxPqmo70LyARJs0w2UclACPUUEqltCkJ6PhKdMIDuJ3gSf/Q+/GIe3WKl0Ijb/GyH9lOpUkRAO2wp0GVkLvS9Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-symbol": "^2.0.0" + } + }, + "node_modules/micromark-util-normalize-identifier/node_modules/micromark-util-symbol": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.1.tgz", + "integrity": "sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, + "node_modules/micromark-util-resolve-all": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-resolve-all/-/micromark-util-resolve-all-2.0.1.tgz", + "integrity": "sha512-VdQyxFWFT2/FGJgwQnJYbe1jjQoNTS4RjglmSjTUlpUMa95Htx9NHeYW4rGDJzbjvCsl9eLjMQwGeElsqmzcHg==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-util-sanitize-uri": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-sanitize-uri/-/micromark-util-sanitize-uri-2.0.1.tgz", + "integrity": "sha512-9N9IomZ/YuGGZZmQec1MbgxtlgougxTodVwDzzEouPKo3qFWvymFHWcnDi2vzV1ff6kas9ucW+o3yzJK9YB1AQ==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-character": "^2.0.0", + "micromark-util-encode": "^2.0.0", + "micromark-util-symbol": "^2.0.0" + } + }, + "node_modules/micromark-util-sanitize-uri/node_modules/micromark-util-character": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.1.1.tgz", + "integrity": "sha512-wv8tdUTJ3thSFFFJKtpYKOYiGP2+v96Hvk4Tu8KpCAsTMs6yi+nVmGh1syvSCsaxz45J6Jbw+9DD6g97+NV67Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-util-sanitize-uri/node_modules/micromark-util-symbol": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.1.tgz", + "integrity": "sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, + "node_modules/micromark-util-subtokenize": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/micromark-util-subtokenize/-/micromark-util-subtokenize-2.1.0.tgz", + "integrity": "sha512-XQLu552iSctvnEcgXw6+Sx75GflAPNED1qx7eBJ+wydBb2KCbRZe+NwvIEEMM83uml1+2WSXpBAcp9IUCgCYWA==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "devlop": "^1.0.0", + "micromark-util-chunked": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-util-subtokenize/node_modules/micromark-util-symbol": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.1.tgz", + "integrity": "sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, + "node_modules/micromark-util-symbol": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-1.1.0.tgz", + "integrity": "sha512-uEjpEYY6KMs1g7QfJ2eX1SQEV+ZT4rUD3UcF6l57acZvLNK7PBZL+ty82Z1qhK1/yXIY4bdx04FKMgR0g4IAag==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, + "node_modules/micromark-util-types": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/micromark-util-types/-/micromark-util-types-2.0.2.tgz", + "integrity": "sha512-Yw0ECSpJoViF1qTU4DC6NwtC4aWGt1EkzaQB8KPPyCRR8z9TWeV0HbEFGTO+ZY1wB22zmxnJqhPyTpOVCpeHTA==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, + "node_modules/micromark/node_modules/micromark-factory-space": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-factory-space/-/micromark-factory-space-2.0.1.tgz", + "integrity": "sha512-zRkxjtBxxLd2Sc0d+fbnEunsTj46SWXgXciZmHq0kDYGnck/ZSGj9/wULTV95uoeYiK5hRXP2mJ98Uo4cq/LQg==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-character": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark/node_modules/micromark-util-character": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.1.1.tgz", + "integrity": "sha512-wv8tdUTJ3thSFFFJKtpYKOYiGP2+v96Hvk4Tu8KpCAsTMs6yi+nVmGh1syvSCsaxz45J6Jbw+9DD6g97+NV67Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark/node_modules/micromark-util-symbol": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.1.tgz", + "integrity": "sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, + "node_modules/micromatch": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz", + "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==", + "license": "MIT", + "dependencies": { + "braces": "^3.0.3", + "picomatch": "^2.3.1" + }, + "engines": { + "node": ">=8.6" + } + }, + "node_modules/mime": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", + "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", + "license": "MIT", + "bin": { + "mime": "cli.js" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/mime-db": { + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mime-format": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/mime-format/-/mime-format-2.0.1.tgz", + "integrity": "sha512-XxU3ngPbEnrYnNbIX+lYSaYg0M01v6p2ntd2YaFksTu0vayaw5OJvbdRyWs07EYRlLED5qadUZ+xo+XhOvFhwg==", + "license": "Apache-2.0", + "dependencies": { + "charset": "^1.0.0" + } + }, + "node_modules/mime-types": { + "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "license": "MIT", + "dependencies": { + "mime-db": "1.52.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mimic-fn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", + "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/mimic-response": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-4.0.0.tgz", + "integrity": "sha512-e5ISH9xMYU0DzrT+jl8q2ze9D6eWBto+I8CNpe+VI+K2J/F/k3PdkdTdz4wvGVH4NTpo+NRYTVIuMQEMMcsLqg==", + "license": "MIT", + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/mini-css-extract-plugin": { + "version": "2.9.4", + "resolved": "https://registry.npmjs.org/mini-css-extract-plugin/-/mini-css-extract-plugin-2.9.4.tgz", + "integrity": "sha512-ZWYT7ln73Hptxqxk2DxPU9MmapXRhxkJD6tkSR04dnQxm8BGu2hzgKLugK5yySD97u/8yy7Ma7E76k9ZdvtjkQ==", + "license": "MIT", + "dependencies": { + "schema-utils": "^4.0.0", + "tapable": "^2.2.1" + }, + "engines": { + "node": ">= 12.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^5.0.0" + } + }, + "node_modules/minimalistic-assert": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz", + "integrity": "sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==", + "license": "ISC" + }, + "node_modules/minimatch": { + "version": "5.1.6", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz", + "integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==", + "license": "ISC", + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/minimist": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", + "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/minipass": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz", + "integrity": "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==", + "license": "ISC", + "engines": { + "node": ">=16 || 14 >=14.17" + } + }, + "node_modules/mri": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/mri/-/mri-1.2.0.tgz", + "integrity": "sha512-tzzskb3bG8LvYGFF/mDTpq3jpI6Q9wc3LEmBaghu+DdCssd1FakN7Bc0hVNmEyGq1bq3RgfkCb3cmQLpNPOroA==", + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/mrmime": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/mrmime/-/mrmime-2.0.1.tgz", + "integrity": "sha512-Y3wQdFg2Va6etvQ5I82yUhGdsKrcYox6p7FfL1LbK2J4V01F9TGlepTIhnK24t7koZibmg82KGglhA1XK5IsLQ==", + "license": "MIT", + "engines": { + "node": ">=10" + } + }, + "node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "license": "MIT" + }, + "node_modules/multicast-dns": { + "version": "7.2.5", + "resolved": "https://registry.npmjs.org/multicast-dns/-/multicast-dns-7.2.5.tgz", + "integrity": "sha512-2eznPJP8z2BFLX50tf0LuODrpINqP1RVIm/CObbTcBRITQgmC/TjcREF1NeTBzIcR5XO/ukWo+YHOjBbFwIupg==", + "license": "MIT", + "dependencies": { + "dns-packet": "^5.2.2", + "thunky": "^1.0.2" + }, + "bin": { + "multicast-dns": "cli.js" + } + }, + "node_modules/mustache": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/mustache/-/mustache-4.2.0.tgz", + "integrity": "sha512-71ippSywq5Yb7/tVYyGbkBggbU8H3u5Rz56fH60jGFgr8uHwxs+aSKeqmluIVzM0m0kB7xQjKS6qPfd0b2ZoqQ==", + "license": "MIT", + "bin": { + "mustache": "bin/mustache" + } + }, + "node_modules/mz": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/mz/-/mz-2.7.0.tgz", + "integrity": "sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==", + "license": "MIT", + "dependencies": { + "any-promise": "^1.0.0", + "object-assign": "^4.0.1", + "thenify-all": "^1.0.0" + } + }, + "node_modules/nanoid": { + "version": "3.3.11", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.11.tgz", + "integrity": "sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "bin": { + "nanoid": "bin/nanoid.cjs" + }, + "engines": { + "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" + } + }, + "node_modules/negotiator": { + "version": "0.6.4", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.4.tgz", + "integrity": "sha512-myRT3DiWPHqho5PrJaIRyaMv2kgYf0mUVgBNOYMuCH5Ki1yEiQaf/ZJuQ62nvpc44wL5WDbTX7yGJi1Neevw8w==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/neo-async": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz", + "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==", + "license": "MIT" + }, + "node_modules/neotraverse": { + "version": "0.6.15", + "resolved": "https://registry.npmjs.org/neotraverse/-/neotraverse-0.6.15.tgz", + "integrity": "sha512-HZpdkco+JeXq0G+WWpMJ4NsX3pqb5O7eR9uGz3FfoFt+LYzU8iRWp49nJtud6hsDoywM8tIrDo3gjgmOqJA8LA==", + "license": "MIT", + "engines": { + "node": ">= 10" + } + }, + "node_modules/no-case": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/no-case/-/no-case-3.0.4.tgz", + "integrity": "sha512-fgAN3jGAh+RoxUGZHTSOLJIqUc2wmoBwGR4tbpNAKmmovFoWq0OdRkb0VkldReO2a2iBT/OEulG9XSUc10r3zg==", + "license": "MIT", + "dependencies": { + "lower-case": "^2.0.2", + "tslib": "^2.0.3" + } + }, + "node_modules/node-addon-api": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-7.1.1.tgz", + "integrity": "sha512-5m3bsyrjFWE1xf7nz7YXdN4udnVtXK6/Yfgn5qnahL6bCkf2yKt4k3nuTKAtT4r3IG8JNR2ncsIMdZuAzJjHQQ==", + "license": "MIT", + "optional": true + }, + "node_modules/node-emoji": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/node-emoji/-/node-emoji-2.2.0.tgz", + "integrity": "sha512-Z3lTE9pLaJF47NyMhd4ww1yFTAP8YhYI8SleJiHzM46Fgpm5cnNzSl9XfzFNqbaz+VlJrIj3fXQ4DeN1Rjm6cw==", + "license": "MIT", + "dependencies": { + "@sindresorhus/is": "^4.6.0", + "char-regex": "^1.0.2", + "emojilib": "^2.4.0", + "skin-tone": "^2.0.0" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/node-fetch": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.7.0.tgz", + "integrity": "sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==", + "license": "MIT", + "dependencies": { + "whatwg-url": "^5.0.0" + }, + "engines": { + "node": "4.x || >=6.0.0" + }, + "peerDependencies": { + "encoding": "^0.1.0" + }, + "peerDependenciesMeta": { + "encoding": { + "optional": true + } + } + }, + "node_modules/node-fetch-h2": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/node-fetch-h2/-/node-fetch-h2-2.3.0.tgz", + "integrity": "sha512-ofRW94Ab0T4AOh5Fk8t0h8OBWrmjb0SSB20xh1H8YnPV9EJ+f5AMoYSUQ2zgJ4Iq2HAK0I2l5/Nequ8YzFS3Hg==", + "license": "MIT", + "dependencies": { + "http2-client": "^1.2.5" + }, + "engines": { + "node": "4.x || >=6.0.0" + } + }, + "node_modules/node-forge": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/node-forge/-/node-forge-1.3.1.tgz", + "integrity": "sha512-dPEtOeMvF9VMcYV/1Wb8CPoVAXtp6MKMlcbAt4ddqmGqUJ6fQZFXkNZNkNlfevtNkGtaSoXf/vNNNSvgrdXwtA==", + "license": "(BSD-3-Clause OR GPL-2.0)", + "engines": { + "node": ">= 6.13.0" + } + }, + "node_modules/node-readfiles": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/node-readfiles/-/node-readfiles-0.2.0.tgz", + "integrity": "sha512-SU00ZarexNlE4Rjdm83vglt5Y9yiQ+XI1XpflWlb7q7UTN1JUItm69xMeiQCTxtTfnzt+83T8Cx+vI2ED++VDA==", + "license": "MIT", + "dependencies": { + "es6-promise": "^3.2.1" + } + }, + "node_modules/node-releases": { + "version": "2.0.21", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.21.tgz", + "integrity": "sha512-5b0pgg78U3hwXkCM8Z9b2FJdPZlr9Psr9V2gQPESdGHqbntyFJKFW4r5TeWGFzafGY3hzs1JC62VEQMbl1JFkw==", + "license": "MIT" + }, + "node_modules/normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/normalize-range": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/normalize-range/-/normalize-range-0.1.2.tgz", + "integrity": "sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/normalize-url": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-8.1.0.tgz", + "integrity": "sha512-X06Mfd/5aKsRHc0O0J5CUedwnPmnDtLF2+nq+KN9KSDlJHkPuh0JUviWjEWMe0SW/9TDdSLVPuk7L5gGTIA1/w==", + "license": "MIT", + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/npm-run-path": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", + "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", + "license": "MIT", + "dependencies": { + "path-key": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/nprogress": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/nprogress/-/nprogress-0.2.0.tgz", + "integrity": "sha512-I19aIingLgR1fmhftnbWWO3dXc0hSxqHQHQb3H8m+K3TnEn/iSeTZZOyvKXWqQESMwuUVnatlCnZdLBZZt2VSA==", + "license": "MIT" + }, + "node_modules/nth-check": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-2.1.1.tgz", + "integrity": "sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==", + "license": "BSD-2-Clause", + "dependencies": { + "boolbase": "^1.0.0" + }, + "funding": { + "url": "https://github.com/fb55/nth-check?sponsor=1" + } + }, + "node_modules/null-loader": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/null-loader/-/null-loader-4.0.1.tgz", + "integrity": "sha512-pxqVbi4U6N26lq+LmgIbB5XATP0VdZKOG25DhHi8btMmJJefGArFyDg1yc4U3hWCJbMqSrw0qyrz1UQX+qYXqg==", + "license": "MIT", + "dependencies": { + "loader-utils": "^2.0.0", + "schema-utils": "^3.0.0" + }, + "engines": { + "node": ">= 10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^4.0.0 || ^5.0.0" + } + }, + "node_modules/null-loader/node_modules/ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "license": "MIT", + "dependencies": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/null-loader/node_modules/ajv-keywords": { + "version": "3.5.2", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", + "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==", + "license": "MIT", + "peerDependencies": { + "ajv": "^6.9.1" + } + }, + "node_modules/null-loader/node_modules/json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "license": "MIT" + }, + "node_modules/null-loader/node_modules/schema-utils": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.3.0.tgz", + "integrity": "sha512-pN/yOAvcC+5rQ5nERGuwrjLlYvLTbCibnZ1I7B1LaiAz9BRBlE9GMgE/eqV30P7aJQUf7Ddimy/RsbYO/GrVGg==", + "license": "MIT", + "dependencies": { + "@types/json-schema": "^7.0.8", + "ajv": "^6.12.5", + "ajv-keywords": "^3.5.2" + }, + "engines": { + "node": ">= 10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } + }, + "node_modules/oas-kit-common": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/oas-kit-common/-/oas-kit-common-1.0.8.tgz", + "integrity": "sha512-pJTS2+T0oGIwgjGpw7sIRU8RQMcUoKCDWFLdBqKB2BNmGpbBMH2sdqAaOXUg8OzonZHU0L7vfJu1mJFEiYDWOQ==", + "license": "BSD-3-Clause", + "dependencies": { + "fast-safe-stringify": "^2.0.7" + } + }, + "node_modules/oas-linter": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/oas-linter/-/oas-linter-3.2.2.tgz", + "integrity": "sha512-KEGjPDVoU5K6swgo9hJVA/qYGlwfbFx+Kg2QB/kd7rzV5N8N5Mg6PlsoCMohVnQmo+pzJap/F610qTodKzecGQ==", + "license": "BSD-3-Clause", + "dependencies": { + "@exodus/schemasafe": "^1.0.0-rc.2", + "should": "^13.2.1", + "yaml": "^1.10.0" + }, + "funding": { + "url": "https://github.com/Mermade/oas-kit?sponsor=1" + } + }, + "node_modules/oas-resolver": { + "version": "2.5.6", + "resolved": "https://registry.npmjs.org/oas-resolver/-/oas-resolver-2.5.6.tgz", + "integrity": "sha512-Yx5PWQNZomfEhPPOphFbZKi9W93CocQj18NlD2Pa4GWZzdZpSJvYwoiuurRI7m3SpcChrnO08hkuQDL3FGsVFQ==", + "license": "BSD-3-Clause", + "dependencies": { + "node-fetch-h2": "^2.3.0", + "oas-kit-common": "^1.0.8", + "reftools": "^1.1.9", + "yaml": "^1.10.0", + "yargs": "^17.0.1" + }, + "bin": { + "resolve": "resolve.js" + }, + "funding": { + "url": "https://github.com/Mermade/oas-kit?sponsor=1" + } + }, + "node_modules/oas-resolver-browser": { + "version": "2.5.6", + "resolved": "https://registry.npmjs.org/oas-resolver-browser/-/oas-resolver-browser-2.5.6.tgz", + "integrity": "sha512-Jw5elT/kwUJrnGaVuRWe1D7hmnYWB8rfDDjBnpQ+RYY/dzAewGXeTexXzt4fGEo6PUE4eqKqPWF79MZxxvMppA==", + "license": "BSD-3-Clause", + "dependencies": { + "node-fetch-h2": "^2.3.0", + "oas-kit-common": "^1.0.8", + "path-browserify": "^1.0.1", + "reftools": "^1.1.9", + "yaml": "^1.10.0", + "yargs": "^17.0.1" + }, + "bin": { + "resolve": "resolve.js" + }, + "funding": { + "url": "https://github.com/Mermade/oas-kit?sponsor=1" + } + }, + "node_modules/oas-schema-walker": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/oas-schema-walker/-/oas-schema-walker-1.1.5.tgz", + "integrity": "sha512-2yucenq1a9YPmeNExoUa9Qwrt9RFkjqaMAA1X+U7sbb0AqBeTIdMHky9SQQ6iN94bO5NW0W4TRYXerG+BdAvAQ==", + "license": "BSD-3-Clause", + "funding": { + "url": "https://github.com/Mermade/oas-kit?sponsor=1" + } + }, + "node_modules/oas-validator": { + "version": "5.0.8", + "resolved": "https://registry.npmjs.org/oas-validator/-/oas-validator-5.0.8.tgz", + "integrity": "sha512-cu20/HE5N5HKqVygs3dt94eYJfBi0TsZvPVXDhbXQHiEityDN+RROTleefoKRKKJ9dFAF2JBkDHgvWj0sjKGmw==", + "license": "BSD-3-Clause", + "dependencies": { + "call-me-maybe": "^1.0.1", + "oas-kit-common": "^1.0.8", + "oas-linter": "^3.2.2", + "oas-resolver": "^2.5.6", + "oas-schema-walker": "^1.1.5", + "reftools": "^1.1.9", + "should": "^13.2.1", + "yaml": "^1.10.0" + }, + "funding": { + "url": "https://github.com/Mermade/oas-kit?sponsor=1" + } + }, + "node_modules/object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object-hash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/object-hash/-/object-hash-3.0.0.tgz", + "integrity": "sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw==", + "license": "MIT", + "engines": { + "node": ">= 6" + } + }, + "node_modules/object-inspect": { + "version": "1.13.4", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.4.tgz", + "integrity": "sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/object-keys": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", + "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/object.assign": { + "version": "4.1.7", + "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.7.tgz", + "integrity": "sha512-nK28WOo+QIjBkDduTINE4JkF/UJJKyf2EJxvJKfblDpyg0Q+pkOHNTL0Qwy6NP6FhE/EnzV73BxxqcJaXY9anw==", + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.3", + "define-properties": "^1.2.1", + "es-object-atoms": "^1.0.0", + "has-symbols": "^1.1.0", + "object-keys": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/obuf": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/obuf/-/obuf-1.1.2.tgz", + "integrity": "sha512-PX1wu0AmAdPqOL1mWhqmlOd8kOIZQwGZw6rh7uby9fTc5lhaOWFLX3I6R1hrF9k3zUY40e6igsLGkDXK92LJNg==", + "license": "MIT" + }, + "node_modules/on-finished": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", + "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", + "license": "MIT", + "dependencies": { + "ee-first": "1.1.1" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/on-headers": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/on-headers/-/on-headers-1.1.0.tgz", + "integrity": "sha512-737ZY3yNnXy37FHkQxPzt4UZ2UWPWiCZWLvFZ4fu5cueciegX0zGPnrlY6bwRg4FdQOe9YU8MkmJwGhoMybl8A==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", + "license": "ISC", + "dependencies": { + "wrappy": "1" + } + }, + "node_modules/onetime": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", + "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", + "license": "MIT", + "dependencies": { + "mimic-fn": "^2.1.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/open": { + "version": "8.4.2", + "resolved": "https://registry.npmjs.org/open/-/open-8.4.2.tgz", + "integrity": "sha512-7x81NCL719oNbsq/3mh+hVrAWmFuEYUqrq/Iw3kUzH8ReypT9QQ0BLoJS7/G9k6N81XjW4qHWtjWwe/9eLy1EQ==", + "license": "MIT", + "dependencies": { + "define-lazy-prop": "^2.0.0", + "is-docker": "^2.1.1", + "is-wsl": "^2.2.0" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/openapi-to-postmanv2": { + "version": "4.25.0", + "resolved": "https://registry.npmjs.org/openapi-to-postmanv2/-/openapi-to-postmanv2-4.25.0.tgz", + "integrity": "sha512-sIymbkQby0gzxt2Yez8YKB6hoISEel05XwGwNrAhr6+vxJWXNxkmssQc/8UEtVkuJ9ZfUXLkip9PYACIpfPDWg==", + "license": "Apache-2.0", + "dependencies": { + "ajv": "8.11.0", + "ajv-draft-04": "1.0.0", + "ajv-formats": "2.1.1", + "async": "3.2.4", + "commander": "2.20.3", + "graphlib": "2.1.8", + "js-yaml": "4.1.0", + "json-pointer": "0.6.2", + "json-schema-merge-allof": "0.8.1", + "lodash": "4.17.21", + "neotraverse": "0.6.15", + "oas-resolver-browser": "2.5.6", + "object-hash": "3.0.0", + "path-browserify": "1.0.1", + "postman-collection": "^4.4.0", + "swagger2openapi": "7.0.8", + "yaml": "1.10.2" + }, + "bin": { + "openapi2postmanv2": "bin/openapi2postmanv2.js" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/openapi-to-postmanv2/node_modules/commander": { + "version": "2.20.3", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", + "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", + "license": "MIT" + }, + "node_modules/opener": { + "version": "1.5.2", + "resolved": "https://registry.npmjs.org/opener/-/opener-1.5.2.tgz", + "integrity": "sha512-ur5UIdyw5Y7yEj9wLzhqXiy6GZ3Mwx0yGI+5sMn2r0N0v3cKJvUmFH5yPP+WXh9e0xfyzyJX95D8l088DNFj7A==", + "license": "(WTFPL OR MIT)", + "bin": { + "opener": "bin/opener-bin.js" + } + }, + "node_modules/p-cancelable": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-3.0.0.tgz", + "integrity": "sha512-mlVgR3PGuzlo0MmTdk4cXqXWlwQDLnONTAg6sm62XkMJEiRxN3GL3SffkYvqwonbkJBcrI7Uvv5Zh9yjvn2iUw==", + "license": "MIT", + "engines": { + "node": ">=12.20" + } + }, + "node_modules/p-finally": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz", + "integrity": "sha512-LICb2p9CB7FS+0eR1oqWnHhp0FljGLZCWBE9aix0Uye9W8LTQPwMTYVGWQWIw9RdQiDg4+epXQODwIYJtSJaow==", + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/p-limit": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-4.0.0.tgz", + "integrity": "sha512-5b0R4txpzjPWVw/cXXUResoD4hb6U/x9BH08L7nw+GN1sezDzPdxeRvpc9c433fZhBan/wusjbCsqwqm4EIBIQ==", + "license": "MIT", + "dependencies": { + "yocto-queue": "^1.0.0" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-locate": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-6.0.0.tgz", + "integrity": "sha512-wPrq66Llhl7/4AGC6I+cqxT07LhXvWL08LNXz1fENOw0Ap4sRZZ/gZpTTJ5jpurzzzfS2W/Ge9BY3LgLjCShcw==", + "license": "MIT", + "dependencies": { + "p-limit": "^4.0.0" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-map": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/p-map/-/p-map-4.0.0.tgz", + "integrity": "sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ==", + "license": "MIT", + "dependencies": { + "aggregate-error": "^3.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-queue": { + "version": "6.6.2", + "resolved": "https://registry.npmjs.org/p-queue/-/p-queue-6.6.2.tgz", + "integrity": "sha512-RwFpb72c/BhQLEXIZ5K2e+AhgNVmIejGlTgiB9MzZ0e93GRvqZ7uSi0dvRF7/XIXDeNkra2fNHBxTyPDGySpjQ==", + "license": "MIT", + "dependencies": { + "eventemitter3": "^4.0.4", + "p-timeout": "^3.2.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-retry": { + "version": "4.6.2", + "resolved": "https://registry.npmjs.org/p-retry/-/p-retry-4.6.2.tgz", + "integrity": "sha512-312Id396EbJdvRONlngUx0NydfrIQ5lsYu0znKVUzVvArzEIt08V1qhtyESbGVd1FGX7UKtiFp5uwKZdM8wIuQ==", + "license": "MIT", + "dependencies": { + "@types/retry": "0.12.0", + "retry": "^0.13.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/p-timeout": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/p-timeout/-/p-timeout-3.2.0.tgz", + "integrity": "sha512-rhIwUycgwwKcP9yTOOFK/AKsAopjjCakVqLHePO3CC6Mir1Z99xT+R63jZxAT5lFZLa2inS5h+ZS2GvR99/FBg==", + "license": "MIT", + "dependencies": { + "p-finally": "^1.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/package-json": { + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/package-json/-/package-json-8.1.1.tgz", + "integrity": "sha512-cbH9IAIJHNj9uXi196JVsRlt7cHKak6u/e6AkL/bkRelZ7rlL3X1YKxsZwa36xipOEKAsdtmaG6aAJoM1fx2zA==", + "license": "MIT", + "dependencies": { + "got": "^12.1.0", + "registry-auth-token": "^5.0.1", + "registry-url": "^6.0.0", + "semver": "^7.3.7" + }, + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/package-json-from-dist": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/package-json-from-dist/-/package-json-from-dist-1.0.1.tgz", + "integrity": "sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw==", + "license": "BlueOak-1.0.0" + }, + "node_modules/pako": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/pako/-/pako-2.1.0.tgz", + "integrity": "sha512-w+eufiZ1WuJYgPXbV/PO3NCMEc3xqylkKHzp8bxp1uW4qaSNQUkwmLLEc3kKsfz8lpV1F8Ht3U1Cm+9Srog2ug==", + "license": "(MIT AND Zlib)" + }, + "node_modules/param-case": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/param-case/-/param-case-3.0.4.tgz", + "integrity": "sha512-RXlj7zCYokReqWpOPH9oYivUzLYZ5vAPIfEmCTNViosC78F8F0H9y7T7gG2M39ymgutxF5gcFEsyZQSph9Bp3A==", + "license": "MIT", + "dependencies": { + "dot-case": "^3.0.4", + "tslib": "^2.0.3" + } + }, + "node_modules/parent-module": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", + "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", + "license": "MIT", + "dependencies": { + "callsites": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/parse-entities": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/parse-entities/-/parse-entities-4.0.2.tgz", + "integrity": "sha512-GG2AQYWoLgL877gQIKeRPGO1xF9+eG1ujIb5soS5gPvLQ1y2o8FL90w2QWNdf9I361Mpp7726c+lj3U0qK1uGw==", + "license": "MIT", + "dependencies": { + "@types/unist": "^2.0.0", + "character-entities-legacy": "^3.0.0", + "character-reference-invalid": "^2.0.0", + "decode-named-character-reference": "^1.0.0", + "is-alphanumerical": "^2.0.0", + "is-decimal": "^2.0.0", + "is-hexadecimal": "^2.0.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/parse-entities/node_modules/@types/unist": { + "version": "2.0.11", + "resolved": "https://registry.npmjs.org/@types/unist/-/unist-2.0.11.tgz", + "integrity": "sha512-CmBKiL6NNo/OqgmMn95Fk9Whlp2mtvIv+KNpQKN2F4SjvrEesubTRWGYSg+BnWZOnlCaSTU1sMpsBOzgbYhnsA==", + "license": "MIT" + }, + "node_modules/parse-json": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", + "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.0.0", + "error-ex": "^1.3.1", + "json-parse-even-better-errors": "^2.3.0", + "lines-and-columns": "^1.1.6" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/parse-numeric-range": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/parse-numeric-range/-/parse-numeric-range-1.3.0.tgz", + "integrity": "sha512-twN+njEipszzlMJd4ONUYgSfZPDxgHhT9Ahed5uTigpQn90FggW4SA/AIPq/6a149fTbE9qBEcSwE3FAEp6wQQ==", + "license": "ISC" + }, + "node_modules/parse5": { + "version": "7.3.0", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-7.3.0.tgz", + "integrity": "sha512-IInvU7fabl34qmi9gY8XOVxhYyMyuH2xUNpb2q8/Y+7552KlejkRvqvD19nMoUW/uQGGbqNpA6Tufu5FL5BZgw==", + "license": "MIT", + "dependencies": { + "entities": "^6.0.0" + }, + "funding": { + "url": "https://github.com/inikulin/parse5?sponsor=1" + } + }, + "node_modules/parse5-htmlparser2-tree-adapter": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/parse5-htmlparser2-tree-adapter/-/parse5-htmlparser2-tree-adapter-7.1.0.tgz", + "integrity": "sha512-ruw5xyKs6lrpo9x9rCZqZZnIUntICjQAd0Wsmp396Ul9lN/h+ifgVV1x1gZHi8euej6wTfpqX8j+BFQxF0NS/g==", + "license": "MIT", + "dependencies": { + "domhandler": "^5.0.3", + "parse5": "^7.0.0" + }, + "funding": { + "url": "https://github.com/inikulin/parse5?sponsor=1" + } + }, + "node_modules/parse5-parser-stream": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/parse5-parser-stream/-/parse5-parser-stream-7.1.2.tgz", + "integrity": "sha512-JyeQc9iwFLn5TbvvqACIF/VXG6abODeB3Fwmv/TGdLk2LfbWkaySGY72at4+Ty7EkPZj854u4CrICqNk2qIbow==", + "license": "MIT", + "dependencies": { + "parse5": "^7.0.0" + }, + "funding": { + "url": "https://github.com/inikulin/parse5?sponsor=1" + } + }, + "node_modules/parse5/node_modules/entities": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/entities/-/entities-6.0.1.tgz", + "integrity": "sha512-aN97NXWF6AWBTahfVOIrB/NShkzi5H7F9r1s9mD3cDj4Ko5f2qhhVoYMibXF7GlLveb/D2ioWay8lxI97Ven3g==", + "license": "BSD-2-Clause", + "engines": { + "node": ">=0.12" + }, + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" + } + }, + "node_modules/parseurl": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", + "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/pascal-case": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/pascal-case/-/pascal-case-3.1.2.tgz", + "integrity": "sha512-uWlGT3YSnK9x3BQJaOdcZwrnV6hPpd8jFH1/ucpiLRPh/2zCVJKS19E4GvYHvaCcACn3foXZ0cLB9Wrx1KGe5g==", + "license": "MIT", + "dependencies": { + "no-case": "^3.0.4", + "tslib": "^2.0.3" + } + }, + "node_modules/path": { + "version": "0.12.7", + "resolved": "https://registry.npmjs.org/path/-/path-0.12.7.tgz", + "integrity": "sha512-aXXC6s+1w7otVF9UletFkFcDsJeO7lSZBPUQhtb5O0xJe8LtYhj/GxldoL09bBj9+ZmE2hNoHqQSFMN5fikh4Q==", + "license": "MIT", + "dependencies": { + "process": "^0.11.1", + "util": "^0.10.3" + } + }, + "node_modules/path-browserify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-browserify/-/path-browserify-1.0.1.tgz", + "integrity": "sha512-b7uo2UCUOYZcnF/3ID0lulOJi/bafxa1xPe7ZPsammBSpjSWQkjNxlt635YGS2MiR9GjvuXCtz2emr3jbsz98g==", + "license": "MIT" + }, + "node_modules/path-exists": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-5.0.0.tgz", + "integrity": "sha512-RjhtfwJOxzcFmNOi6ltcbcu4Iu+FL3zEj83dk4kAS+fVpTxXLO1b38RvJgT/0QwvV/L3aY9TAnyv0EOqW4GoMQ==", + "license": "MIT", + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + } + }, + "node_modules/path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/path-is-inside": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/path-is-inside/-/path-is-inside-1.0.2.tgz", + "integrity": "sha512-DUWJr3+ULp4zXmol/SZkFf3JGsS9/SIv+Y3Rt93/UjPpDpklB5f1er4O3POIbUuUJ3FXgqte2Q7SrU6zAqwk8w==", + "license": "(WTFPL OR MIT)" + }, + "node_modules/path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/path-parse": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", + "license": "MIT" + }, + "node_modules/path-scurry": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.11.1.tgz", + "integrity": "sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==", + "license": "BlueOak-1.0.0", + "dependencies": { + "lru-cache": "^10.2.0", + "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0" + }, + "engines": { + "node": ">=16 || 14 >=14.18" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/path-scurry/node_modules/lru-cache": { + "version": "10.4.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz", + "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==", + "license": "ISC" + }, + "node_modules/path-to-regexp": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-1.9.0.tgz", + "integrity": "sha512-xIp7/apCFJuUHdDLWe8O1HIkb0kQrOMb/0u6FXQjemHn/ii5LrIzU6bdECnsiTF/GjZkMEKg1xdiZwNqDYlZ6g==", + "license": "MIT", + "dependencies": { + "isarray": "0.0.1" + } + }, + "node_modules/path-type": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", + "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/picocolors": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", + "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", + "license": "ISC" + }, + "node_modules/picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "license": "MIT", + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/pirates": { + "version": "4.0.7", + "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.7.tgz", + "integrity": "sha512-TfySrs/5nm8fQJDcBDuUng3VOUKsd7S+zqvbOTiGXHfxX4wK31ard+hoNuvkicM/2YFzlpDgABOevKSsB4G/FA==", + "license": "MIT", + "engines": { + "node": ">= 6" + } + }, + "node_modules/pkg-dir": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-7.0.0.tgz", + "integrity": "sha512-Ie9z/WINcxxLp27BKOCHGde4ITq9UklYKDzVo1nhk5sqGEXU3FpkwP5GM2voTGJkGd9B3Otl+Q4uwSOeSUtOBA==", + "license": "MIT", + "dependencies": { + "find-up": "^6.3.0" + }, + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/pluralize": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/pluralize/-/pluralize-8.0.0.tgz", + "integrity": "sha512-Nc3IT5yHzflTfbjgqWcCPpo7DaKy4FnpB0l/zCAW0Tc7jxAiuqSxHasntB3D7887LSrA93kDJ9IXovxJYxyLCA==", + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/postcss": { + "version": "8.5.6", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.6.tgz", + "integrity": "sha512-3Ybi1tAuwAP9s0r1UQ2J4n5Y0G05bJkpUIO0/bI9MhwmD70S5aTWbXGBwxHrelT+XM1k6dM0pk+SwNkpTRN7Pg==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/postcss" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "nanoid": "^3.3.11", + "picocolors": "^1.1.1", + "source-map-js": "^1.2.1" + }, + "engines": { + "node": "^10 || ^12 || >=14" + } + }, + "node_modules/postcss-attribute-case-insensitive": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/postcss-attribute-case-insensitive/-/postcss-attribute-case-insensitive-7.0.1.tgz", + "integrity": "sha512-Uai+SupNSqzlschRyNx3kbCTWgY/2hcwtHEI/ej2LJWc9JJ77qKgGptd8DHwY1mXtZ7Aoh4z4yxfwMBue9eNgw==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT", + "dependencies": { + "postcss-selector-parser": "^7.0.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/postcss-attribute-case-insensitive/node_modules/postcss-selector-parser": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.1.0.tgz", + "integrity": "sha512-8sLjZwK0R+JlxlYcTuVnyT2v+htpdrjDOKuMcOVdYjt52Lh8hWRYpxBPoKx/Zg+bcjc3wx6fmQevMmUztS/ccA==", + "license": "MIT", + "dependencies": { + "cssesc": "^3.0.0", + "util-deprecate": "^1.0.2" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/postcss-calc": { + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/postcss-calc/-/postcss-calc-9.0.1.tgz", + "integrity": "sha512-TipgjGyzP5QzEhsOZUaIkeO5mKeMFpebWzRogWG/ysonUlnHcq5aJe0jOjpfzUU8PeSaBQnrE8ehR0QA5vs8PQ==", + "license": "MIT", + "dependencies": { + "postcss-selector-parser": "^6.0.11", + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^14 || ^16 || >=18.0" + }, + "peerDependencies": { + "postcss": "^8.2.2" + } + }, + "node_modules/postcss-clamp": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/postcss-clamp/-/postcss-clamp-4.1.0.tgz", + "integrity": "sha512-ry4b1Llo/9zz+PKC+030KUnPITTJAHeOwjfAyyB60eT0AorGLdzp52s31OsPRHRf8NchkgFoG2y6fCfn1IV1Ow==", + "license": "MIT", + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": ">=7.6.0" + }, + "peerDependencies": { + "postcss": "^8.4.6" + } + }, + "node_modules/postcss-color-functional-notation": { + "version": "7.0.12", + "resolved": "https://registry.npmjs.org/postcss-color-functional-notation/-/postcss-color-functional-notation-7.0.12.tgz", + "integrity": "sha512-TLCW9fN5kvO/u38/uesdpbx3e8AkTYhMvDZYa9JpmImWuTE99bDQ7GU7hdOADIZsiI9/zuxfAJxny/khknp1Zw==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "dependencies": { + "@csstools/css-color-parser": "^3.1.0", + "@csstools/css-parser-algorithms": "^3.0.5", + "@csstools/css-tokenizer": "^3.0.4", + "@csstools/postcss-progressive-custom-properties": "^4.2.1", + "@csstools/utilities": "^2.0.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/postcss-color-hex-alpha": { + "version": "10.0.0", + "resolved": "https://registry.npmjs.org/postcss-color-hex-alpha/-/postcss-color-hex-alpha-10.0.0.tgz", + "integrity": "sha512-1kervM2cnlgPs2a8Vt/Qbe5cQ++N7rkYo/2rz2BkqJZIHQwaVuJgQH38REHrAi4uM0b1fqxMkWYmese94iMp3w==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT", + "dependencies": { + "@csstools/utilities": "^2.0.0", + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/postcss-color-rebeccapurple": { + "version": "10.0.0", + "resolved": "https://registry.npmjs.org/postcss-color-rebeccapurple/-/postcss-color-rebeccapurple-10.0.0.tgz", + "integrity": "sha512-JFta737jSP+hdAIEhk1Vs0q0YF5P8fFcj+09pweS8ktuGuZ8pPlykHsk6mPxZ8awDl4TrcxUqJo9l1IhVr/OjQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "dependencies": { + "@csstools/utilities": "^2.0.0", + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/postcss-colormin": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/postcss-colormin/-/postcss-colormin-6.1.0.tgz", + "integrity": "sha512-x9yX7DOxeMAR+BgGVnNSAxmAj98NX/YxEMNFP+SDCEeNLb2r3i6Hh1ksMsnW8Ub5SLCpbescQqn9YEbE9554Sw==", + "license": "MIT", + "dependencies": { + "browserslist": "^4.23.0", + "caniuse-api": "^3.0.0", + "colord": "^2.9.3", + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^14 || ^16 || >=18.0" + }, + "peerDependencies": { + "postcss": "^8.4.31" + } + }, + "node_modules/postcss-convert-values": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/postcss-convert-values/-/postcss-convert-values-6.1.0.tgz", + "integrity": "sha512-zx8IwP/ts9WvUM6NkVSkiU902QZL1bwPhaVaLynPtCsOTqp+ZKbNi+s6XJg3rfqpKGA/oc7Oxk5t8pOQJcwl/w==", + "license": "MIT", + "dependencies": { + "browserslist": "^4.23.0", + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^14 || ^16 || >=18.0" + }, + "peerDependencies": { + "postcss": "^8.4.31" + } + }, + "node_modules/postcss-custom-media": { + "version": "11.0.6", + "resolved": "https://registry.npmjs.org/postcss-custom-media/-/postcss-custom-media-11.0.6.tgz", + "integrity": "sha512-C4lD4b7mUIw+RZhtY7qUbf4eADmb7Ey8BFA2px9jUbwg7pjTZDl4KY4bvlUV+/vXQvzQRfiGEVJyAbtOsCMInw==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT", + "dependencies": { + "@csstools/cascade-layer-name-parser": "^2.0.5", + "@csstools/css-parser-algorithms": "^3.0.5", + "@csstools/css-tokenizer": "^3.0.4", + "@csstools/media-query-list-parser": "^4.0.3" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/postcss-custom-properties": { + "version": "14.0.6", + "resolved": "https://registry.npmjs.org/postcss-custom-properties/-/postcss-custom-properties-14.0.6.tgz", + "integrity": "sha512-fTYSp3xuk4BUeVhxCSJdIPhDLpJfNakZKoiTDx7yRGCdlZrSJR7mWKVOBS4sBF+5poPQFMj2YdXx1VHItBGihQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT", + "dependencies": { + "@csstools/cascade-layer-name-parser": "^2.0.5", + "@csstools/css-parser-algorithms": "^3.0.5", + "@csstools/css-tokenizer": "^3.0.4", + "@csstools/utilities": "^2.0.0", + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/postcss-custom-selectors": { + "version": "8.0.5", + "resolved": "https://registry.npmjs.org/postcss-custom-selectors/-/postcss-custom-selectors-8.0.5.tgz", + "integrity": "sha512-9PGmckHQswiB2usSO6XMSswO2yFWVoCAuih1yl9FVcwkscLjRKjwsjM3t+NIWpSU2Jx3eOiK2+t4vVTQaoCHHg==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT", + "dependencies": { + "@csstools/cascade-layer-name-parser": "^2.0.5", + "@csstools/css-parser-algorithms": "^3.0.5", + "@csstools/css-tokenizer": "^3.0.4", + "postcss-selector-parser": "^7.0.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/postcss-custom-selectors/node_modules/postcss-selector-parser": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.1.0.tgz", + "integrity": "sha512-8sLjZwK0R+JlxlYcTuVnyT2v+htpdrjDOKuMcOVdYjt52Lh8hWRYpxBPoKx/Zg+bcjc3wx6fmQevMmUztS/ccA==", + "license": "MIT", + "dependencies": { + "cssesc": "^3.0.0", + "util-deprecate": "^1.0.2" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/postcss-dir-pseudo-class": { + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/postcss-dir-pseudo-class/-/postcss-dir-pseudo-class-9.0.1.tgz", + "integrity": "sha512-tRBEK0MHYvcMUrAuYMEOa0zg9APqirBcgzi6P21OhxtJyJADo/SWBwY1CAwEohQ/6HDaa9jCjLRG7K3PVQYHEA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "dependencies": { + "postcss-selector-parser": "^7.0.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/postcss-dir-pseudo-class/node_modules/postcss-selector-parser": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.1.0.tgz", + "integrity": "sha512-8sLjZwK0R+JlxlYcTuVnyT2v+htpdrjDOKuMcOVdYjt52Lh8hWRYpxBPoKx/Zg+bcjc3wx6fmQevMmUztS/ccA==", + "license": "MIT", + "dependencies": { + "cssesc": "^3.0.0", + "util-deprecate": "^1.0.2" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/postcss-discard-comments": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/postcss-discard-comments/-/postcss-discard-comments-6.0.2.tgz", + "integrity": "sha512-65w/uIqhSBBfQmYnG92FO1mWZjJ4GL5b8atm5Yw2UgrwD7HiNiSSNwJor1eCFGzUgYnN/iIknhNRVqjrrpuglw==", + "license": "MIT", + "engines": { + "node": "^14 || ^16 || >=18.0" + }, + "peerDependencies": { + "postcss": "^8.4.31" + } + }, + "node_modules/postcss-discard-duplicates": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/postcss-discard-duplicates/-/postcss-discard-duplicates-6.0.3.tgz", + "integrity": "sha512-+JA0DCvc5XvFAxwx6f/e68gQu/7Z9ud584VLmcgto28eB8FqSFZwtrLwB5Kcp70eIoWP/HXqz4wpo8rD8gpsTw==", + "license": "MIT", + "engines": { + "node": "^14 || ^16 || >=18.0" + }, + "peerDependencies": { + "postcss": "^8.4.31" + } + }, + "node_modules/postcss-discard-empty": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/postcss-discard-empty/-/postcss-discard-empty-6.0.3.tgz", + "integrity": "sha512-znyno9cHKQsK6PtxL5D19Fj9uwSzC2mB74cpT66fhgOadEUPyXFkbgwm5tvc3bt3NAy8ltE5MrghxovZRVnOjQ==", + "license": "MIT", + "engines": { + "node": "^14 || ^16 || >=18.0" + }, + "peerDependencies": { + "postcss": "^8.4.31" + } + }, + "node_modules/postcss-discard-overridden": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/postcss-discard-overridden/-/postcss-discard-overridden-6.0.2.tgz", + "integrity": "sha512-j87xzI4LUggC5zND7KdjsI25APtyMuynXZSujByMaav2roV6OZX+8AaCUcZSWqckZpjAjRyFDdpqybgjFO0HJQ==", + "license": "MIT", + "engines": { + "node": "^14 || ^16 || >=18.0" + }, + "peerDependencies": { + "postcss": "^8.4.31" + } + }, + "node_modules/postcss-discard-unused": { + "version": "6.0.5", + "resolved": "https://registry.npmjs.org/postcss-discard-unused/-/postcss-discard-unused-6.0.5.tgz", + "integrity": "sha512-wHalBlRHkaNnNwfC8z+ppX57VhvS+HWgjW508esjdaEYr3Mx7Gnn2xA4R/CKf5+Z9S5qsqC+Uzh4ueENWwCVUA==", + "license": "MIT", + "dependencies": { + "postcss-selector-parser": "^6.0.16" + }, + "engines": { + "node": "^14 || ^16 || >=18.0" + }, + "peerDependencies": { + "postcss": "^8.4.31" + } + }, + "node_modules/postcss-double-position-gradients": { + "version": "6.0.4", + "resolved": "https://registry.npmjs.org/postcss-double-position-gradients/-/postcss-double-position-gradients-6.0.4.tgz", + "integrity": "sha512-m6IKmxo7FxSP5nF2l63QbCC3r+bWpFUWmZXZf096WxG0m7Vl1Q1+ruFOhpdDRmKrRS+S3Jtk+TVk/7z0+BVK6g==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "dependencies": { + "@csstools/postcss-progressive-custom-properties": "^4.2.1", + "@csstools/utilities": "^2.0.0", + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/postcss-focus-visible": { + "version": "10.0.1", + "resolved": "https://registry.npmjs.org/postcss-focus-visible/-/postcss-focus-visible-10.0.1.tgz", + "integrity": "sha512-U58wyjS/I1GZgjRok33aE8juW9qQgQUNwTSdxQGuShHzwuYdcklnvK/+qOWX1Q9kr7ysbraQ6ht6r+udansalA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "dependencies": { + "postcss-selector-parser": "^7.0.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/postcss-focus-visible/node_modules/postcss-selector-parser": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.1.0.tgz", + "integrity": "sha512-8sLjZwK0R+JlxlYcTuVnyT2v+htpdrjDOKuMcOVdYjt52Lh8hWRYpxBPoKx/Zg+bcjc3wx6fmQevMmUztS/ccA==", + "license": "MIT", + "dependencies": { + "cssesc": "^3.0.0", + "util-deprecate": "^1.0.2" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/postcss-focus-within": { + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/postcss-focus-within/-/postcss-focus-within-9.0.1.tgz", + "integrity": "sha512-fzNUyS1yOYa7mOjpci/bR+u+ESvdar6hk8XNK/TRR0fiGTp2QT5N+ducP0n3rfH/m9I7H/EQU6lsa2BrgxkEjw==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "dependencies": { + "postcss-selector-parser": "^7.0.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/postcss-focus-within/node_modules/postcss-selector-parser": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.1.0.tgz", + "integrity": "sha512-8sLjZwK0R+JlxlYcTuVnyT2v+htpdrjDOKuMcOVdYjt52Lh8hWRYpxBPoKx/Zg+bcjc3wx6fmQevMmUztS/ccA==", + "license": "MIT", + "dependencies": { + "cssesc": "^3.0.0", + "util-deprecate": "^1.0.2" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/postcss-font-variant": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/postcss-font-variant/-/postcss-font-variant-5.0.0.tgz", + "integrity": "sha512-1fmkBaCALD72CK2a9i468mA/+tr9/1cBxRRMXOUaZqO43oWPR5imcyPjXwuv7PXbCid4ndlP5zWhidQVVa3hmA==", + "license": "MIT", + "peerDependencies": { + "postcss": "^8.1.0" + } + }, + "node_modules/postcss-gap-properties": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/postcss-gap-properties/-/postcss-gap-properties-6.0.0.tgz", + "integrity": "sha512-Om0WPjEwiM9Ru+VhfEDPZJAKWUd0mV1HmNXqp2C29z80aQ2uP9UVhLc7e3aYMIor/S5cVhoPgYQ7RtfeZpYTRw==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/postcss-image-set-function": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/postcss-image-set-function/-/postcss-image-set-function-7.0.0.tgz", + "integrity": "sha512-QL7W7QNlZuzOwBTeXEmbVckNt1FSmhQtbMRvGGqqU4Nf4xk6KUEQhAoWuMzwbSv5jxiRiSZ5Tv7eiDB9U87znA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "dependencies": { + "@csstools/utilities": "^2.0.0", + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/postcss-lab-function": { + "version": "7.0.12", + "resolved": "https://registry.npmjs.org/postcss-lab-function/-/postcss-lab-function-7.0.12.tgz", + "integrity": "sha512-tUcyRk1ZTPec3OuKFsqtRzW2Go5lehW29XA21lZ65XmzQkz43VY2tyWEC202F7W3mILOjw0voOiuxRGTsN+J9w==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "dependencies": { + "@csstools/css-color-parser": "^3.1.0", + "@csstools/css-parser-algorithms": "^3.0.5", + "@csstools/css-tokenizer": "^3.0.4", + "@csstools/postcss-progressive-custom-properties": "^4.2.1", + "@csstools/utilities": "^2.0.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/postcss-loader": { + "version": "7.3.4", + "resolved": "https://registry.npmjs.org/postcss-loader/-/postcss-loader-7.3.4.tgz", + "integrity": "sha512-iW5WTTBSC5BfsBJ9daFMPVrLT36MrNiC6fqOZTTaHjBNX6Pfd5p+hSBqe/fEeNd7pc13QiAyGt7VdGMw4eRC4A==", + "license": "MIT", + "dependencies": { + "cosmiconfig": "^8.3.5", + "jiti": "^1.20.0", + "semver": "^7.5.4" + }, + "engines": { + "node": ">= 14.15.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "postcss": "^7.0.0 || ^8.0.1", + "webpack": "^5.0.0" + } + }, + "node_modules/postcss-logical": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/postcss-logical/-/postcss-logical-8.1.0.tgz", + "integrity": "sha512-pL1hXFQ2fEXNKiNiAgtfA005T9FBxky5zkX6s4GZM2D8RkVgRqz3f4g1JUoq925zXv495qk8UNldDwh8uGEDoA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/postcss-merge-idents": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/postcss-merge-idents/-/postcss-merge-idents-6.0.3.tgz", + "integrity": "sha512-1oIoAsODUs6IHQZkLQGO15uGEbK3EAl5wi9SS8hs45VgsxQfMnxvt+L+zIr7ifZFIH14cfAeVe2uCTa+SPRa3g==", + "license": "MIT", + "dependencies": { + "cssnano-utils": "^4.0.2", + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^14 || ^16 || >=18.0" + }, + "peerDependencies": { + "postcss": "^8.4.31" + } + }, + "node_modules/postcss-merge-longhand": { + "version": "6.0.5", + "resolved": "https://registry.npmjs.org/postcss-merge-longhand/-/postcss-merge-longhand-6.0.5.tgz", + "integrity": "sha512-5LOiordeTfi64QhICp07nzzuTDjNSO8g5Ksdibt44d+uvIIAE1oZdRn8y/W5ZtYgRH/lnLDlvi9F8btZcVzu3w==", + "license": "MIT", + "dependencies": { + "postcss-value-parser": "^4.2.0", + "stylehacks": "^6.1.1" + }, + "engines": { + "node": "^14 || ^16 || >=18.0" + }, + "peerDependencies": { + "postcss": "^8.4.31" + } + }, + "node_modules/postcss-merge-rules": { + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/postcss-merge-rules/-/postcss-merge-rules-6.1.1.tgz", + "integrity": "sha512-KOdWF0gju31AQPZiD+2Ar9Qjowz1LTChSjFFbS+e2sFgc4uHOp3ZvVX4sNeTlk0w2O31ecFGgrFzhO0RSWbWwQ==", + "license": "MIT", + "dependencies": { + "browserslist": "^4.23.0", + "caniuse-api": "^3.0.0", + "cssnano-utils": "^4.0.2", + "postcss-selector-parser": "^6.0.16" + }, + "engines": { + "node": "^14 || ^16 || >=18.0" + }, + "peerDependencies": { + "postcss": "^8.4.31" + } + }, + "node_modules/postcss-minify-font-values": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/postcss-minify-font-values/-/postcss-minify-font-values-6.1.0.tgz", + "integrity": "sha512-gklfI/n+9rTh8nYaSJXlCo3nOKqMNkxuGpTn/Qm0gstL3ywTr9/WRKznE+oy6fvfolH6dF+QM4nCo8yPLdvGJg==", + "license": "MIT", + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^14 || ^16 || >=18.0" + }, + "peerDependencies": { + "postcss": "^8.4.31" + } + }, + "node_modules/postcss-minify-gradients": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/postcss-minify-gradients/-/postcss-minify-gradients-6.0.3.tgz", + "integrity": "sha512-4KXAHrYlzF0Rr7uc4VrfwDJ2ajrtNEpNEuLxFgwkhFZ56/7gaE4Nr49nLsQDZyUe+ds+kEhf+YAUolJiYXF8+Q==", + "license": "MIT", + "dependencies": { + "colord": "^2.9.3", + "cssnano-utils": "^4.0.2", + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^14 || ^16 || >=18.0" + }, + "peerDependencies": { + "postcss": "^8.4.31" + } + }, + "node_modules/postcss-minify-params": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/postcss-minify-params/-/postcss-minify-params-6.1.0.tgz", + "integrity": "sha512-bmSKnDtyyE8ujHQK0RQJDIKhQ20Jq1LYiez54WiaOoBtcSuflfK3Nm596LvbtlFcpipMjgClQGyGr7GAs+H1uA==", + "license": "MIT", + "dependencies": { + "browserslist": "^4.23.0", + "cssnano-utils": "^4.0.2", + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^14 || ^16 || >=18.0" + }, + "peerDependencies": { + "postcss": "^8.4.31" + } + }, + "node_modules/postcss-minify-selectors": { + "version": "6.0.4", + "resolved": "https://registry.npmjs.org/postcss-minify-selectors/-/postcss-minify-selectors-6.0.4.tgz", + "integrity": "sha512-L8dZSwNLgK7pjTto9PzWRoMbnLq5vsZSTu8+j1P/2GB8qdtGQfn+K1uSvFgYvgh83cbyxT5m43ZZhUMTJDSClQ==", + "license": "MIT", + "dependencies": { + "postcss-selector-parser": "^6.0.16" + }, + "engines": { + "node": "^14 || ^16 || >=18.0" + }, + "peerDependencies": { + "postcss": "^8.4.31" + } + }, + "node_modules/postcss-modules-extract-imports": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/postcss-modules-extract-imports/-/postcss-modules-extract-imports-3.1.0.tgz", + "integrity": "sha512-k3kNe0aNFQDAZGbin48pL2VNidTF0w4/eASDsxlyspobzU3wZQLOGj7L9gfRe0Jo9/4uud09DsjFNH7winGv8Q==", + "license": "ISC", + "engines": { + "node": "^10 || ^12 || >= 14" + }, + "peerDependencies": { + "postcss": "^8.1.0" + } + }, + "node_modules/postcss-modules-local-by-default": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/postcss-modules-local-by-default/-/postcss-modules-local-by-default-4.2.0.tgz", + "integrity": "sha512-5kcJm/zk+GJDSfw+V/42fJ5fhjL5YbFDl8nVdXkJPLLW+Vf9mTD5Xe0wqIaDnLuL2U6cDNpTr+UQ+v2HWIBhzw==", + "license": "MIT", + "dependencies": { + "icss-utils": "^5.0.0", + "postcss-selector-parser": "^7.0.0", + "postcss-value-parser": "^4.1.0" + }, + "engines": { + "node": "^10 || ^12 || >= 14" + }, + "peerDependencies": { + "postcss": "^8.1.0" + } + }, + "node_modules/postcss-modules-local-by-default/node_modules/postcss-selector-parser": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.1.0.tgz", + "integrity": "sha512-8sLjZwK0R+JlxlYcTuVnyT2v+htpdrjDOKuMcOVdYjt52Lh8hWRYpxBPoKx/Zg+bcjc3wx6fmQevMmUztS/ccA==", + "license": "MIT", + "dependencies": { + "cssesc": "^3.0.0", + "util-deprecate": "^1.0.2" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/postcss-modules-scope": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/postcss-modules-scope/-/postcss-modules-scope-3.2.1.tgz", + "integrity": "sha512-m9jZstCVaqGjTAuny8MdgE88scJnCiQSlSrOWcTQgM2t32UBe+MUmFSO5t7VMSfAf/FJKImAxBav8ooCHJXCJA==", + "license": "ISC", + "dependencies": { + "postcss-selector-parser": "^7.0.0" + }, + "engines": { + "node": "^10 || ^12 || >= 14" + }, + "peerDependencies": { + "postcss": "^8.1.0" + } + }, + "node_modules/postcss-modules-scope/node_modules/postcss-selector-parser": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.1.0.tgz", + "integrity": "sha512-8sLjZwK0R+JlxlYcTuVnyT2v+htpdrjDOKuMcOVdYjt52Lh8hWRYpxBPoKx/Zg+bcjc3wx6fmQevMmUztS/ccA==", + "license": "MIT", + "dependencies": { + "cssesc": "^3.0.0", + "util-deprecate": "^1.0.2" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/postcss-modules-values": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/postcss-modules-values/-/postcss-modules-values-4.0.0.tgz", + "integrity": "sha512-RDxHkAiEGI78gS2ofyvCsu7iycRv7oqw5xMWn9iMoR0N/7mf9D50ecQqUo5BZ9Zh2vH4bCUR/ktCqbB9m8vJjQ==", + "license": "ISC", + "dependencies": { + "icss-utils": "^5.0.0" + }, + "engines": { + "node": "^10 || ^12 || >= 14" + }, + "peerDependencies": { + "postcss": "^8.1.0" + } + }, + "node_modules/postcss-nesting": { + "version": "13.0.2", + "resolved": "https://registry.npmjs.org/postcss-nesting/-/postcss-nesting-13.0.2.tgz", + "integrity": "sha512-1YCI290TX+VP0U/K/aFxzHzQWHWURL+CtHMSbex1lCdpXD1SoR2sYuxDu5aNI9lPoXpKTCggFZiDJbwylU0LEQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "dependencies": { + "@csstools/selector-resolve-nested": "^3.1.0", + "@csstools/selector-specificity": "^5.0.0", + "postcss-selector-parser": "^7.0.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/postcss-nesting/node_modules/@csstools/selector-resolve-nested": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@csstools/selector-resolve-nested/-/selector-resolve-nested-3.1.0.tgz", + "integrity": "sha512-mf1LEW0tJLKfWyvn5KdDrhpxHyuxpbNwTIwOYLIvsTffeyOf85j5oIzfG0yosxDgx/sswlqBnESYUcQH0vgZ0g==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss-selector-parser": "^7.0.0" + } + }, + "node_modules/postcss-nesting/node_modules/@csstools/selector-specificity": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/@csstools/selector-specificity/-/selector-specificity-5.0.0.tgz", + "integrity": "sha512-PCqQV3c4CoVm3kdPhyeZ07VmBRdH2EpMFA/pd9OASpOEC3aXNGoqPDAZ80D0cLpMBxnmk0+yNhGsEx31hq7Gtw==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss-selector-parser": "^7.0.0" + } + }, + "node_modules/postcss-nesting/node_modules/postcss-selector-parser": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.1.0.tgz", + "integrity": "sha512-8sLjZwK0R+JlxlYcTuVnyT2v+htpdrjDOKuMcOVdYjt52Lh8hWRYpxBPoKx/Zg+bcjc3wx6fmQevMmUztS/ccA==", + "license": "MIT", + "dependencies": { + "cssesc": "^3.0.0", + "util-deprecate": "^1.0.2" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/postcss-normalize-charset": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/postcss-normalize-charset/-/postcss-normalize-charset-6.0.2.tgz", + "integrity": "sha512-a8N9czmdnrjPHa3DeFlwqst5eaL5W8jYu3EBbTTkI5FHkfMhFZh1EGbku6jhHhIzTA6tquI2P42NtZ59M/H/kQ==", + "license": "MIT", + "engines": { + "node": "^14 || ^16 || >=18.0" + }, + "peerDependencies": { + "postcss": "^8.4.31" + } + }, + "node_modules/postcss-normalize-display-values": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/postcss-normalize-display-values/-/postcss-normalize-display-values-6.0.2.tgz", + "integrity": "sha512-8H04Mxsb82ON/aAkPeq8kcBbAtI5Q2a64X/mnRRfPXBq7XeogoQvReqxEfc0B4WPq1KimjezNC8flUtC3Qz6jg==", + "license": "MIT", + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^14 || ^16 || >=18.0" + }, + "peerDependencies": { + "postcss": "^8.4.31" + } + }, + "node_modules/postcss-normalize-positions": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/postcss-normalize-positions/-/postcss-normalize-positions-6.0.2.tgz", + "integrity": "sha512-/JFzI441OAB9O7VnLA+RtSNZvQ0NCFZDOtp6QPFo1iIyawyXg0YI3CYM9HBy1WvwCRHnPep/BvI1+dGPKoXx/Q==", + "license": "MIT", + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^14 || ^16 || >=18.0" + }, + "peerDependencies": { + "postcss": "^8.4.31" + } + }, + "node_modules/postcss-normalize-repeat-style": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/postcss-normalize-repeat-style/-/postcss-normalize-repeat-style-6.0.2.tgz", + "integrity": "sha512-YdCgsfHkJ2jEXwR4RR3Tm/iOxSfdRt7jplS6XRh9Js9PyCR/aka/FCb6TuHT2U8gQubbm/mPmF6L7FY9d79VwQ==", + "license": "MIT", + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^14 || ^16 || >=18.0" + }, + "peerDependencies": { + "postcss": "^8.4.31" + } + }, + "node_modules/postcss-normalize-string": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/postcss-normalize-string/-/postcss-normalize-string-6.0.2.tgz", + "integrity": "sha512-vQZIivlxlfqqMp4L9PZsFE4YUkWniziKjQWUtsxUiVsSSPelQydwS8Wwcuw0+83ZjPWNTl02oxlIvXsmmG+CiQ==", + "license": "MIT", + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^14 || ^16 || >=18.0" + }, + "peerDependencies": { + "postcss": "^8.4.31" + } + }, + "node_modules/postcss-normalize-timing-functions": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/postcss-normalize-timing-functions/-/postcss-normalize-timing-functions-6.0.2.tgz", + "integrity": "sha512-a+YrtMox4TBtId/AEwbA03VcJgtyW4dGBizPl7e88cTFULYsprgHWTbfyjSLyHeBcK/Q9JhXkt2ZXiwaVHoMzA==", + "license": "MIT", + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^14 || ^16 || >=18.0" + }, + "peerDependencies": { + "postcss": "^8.4.31" + } + }, + "node_modules/postcss-normalize-unicode": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/postcss-normalize-unicode/-/postcss-normalize-unicode-6.1.0.tgz", + "integrity": "sha512-QVC5TQHsVj33otj8/JD869Ndr5Xcc/+fwRh4HAsFsAeygQQXm+0PySrKbr/8tkDKzW+EVT3QkqZMfFrGiossDg==", + "license": "MIT", + "dependencies": { + "browserslist": "^4.23.0", + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^14 || ^16 || >=18.0" + }, + "peerDependencies": { + "postcss": "^8.4.31" + } + }, + "node_modules/postcss-normalize-url": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/postcss-normalize-url/-/postcss-normalize-url-6.0.2.tgz", + "integrity": "sha512-kVNcWhCeKAzZ8B4pv/DnrU1wNh458zBNp8dh4y5hhxih5RZQ12QWMuQrDgPRw3LRl8mN9vOVfHl7uhvHYMoXsQ==", + "license": "MIT", + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^14 || ^16 || >=18.0" + }, + "peerDependencies": { + "postcss": "^8.4.31" + } + }, + "node_modules/postcss-normalize-whitespace": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/postcss-normalize-whitespace/-/postcss-normalize-whitespace-6.0.2.tgz", + "integrity": "sha512-sXZ2Nj1icbJOKmdjXVT9pnyHQKiSAyuNQHSgRCUgThn2388Y9cGVDR+E9J9iAYbSbLHI+UUwLVl1Wzco/zgv0Q==", + "license": "MIT", + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^14 || ^16 || >=18.0" + }, + "peerDependencies": { + "postcss": "^8.4.31" + } + }, + "node_modules/postcss-opacity-percentage": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/postcss-opacity-percentage/-/postcss-opacity-percentage-3.0.0.tgz", + "integrity": "sha512-K6HGVzyxUxd/VgZdX04DCtdwWJ4NGLG212US4/LA1TLAbHgmAsTWVR86o+gGIbFtnTkfOpb9sCRBx8K7HO66qQ==", + "funding": [ + { + "type": "kofi", + "url": "https://ko-fi.com/mrcgrtz" + }, + { + "type": "liberapay", + "url": "https://liberapay.com/mrcgrtz" + } + ], + "license": "MIT", + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/postcss-ordered-values": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/postcss-ordered-values/-/postcss-ordered-values-6.0.2.tgz", + "integrity": "sha512-VRZSOB+JU32RsEAQrO94QPkClGPKJEL/Z9PCBImXMhIeK5KAYo6slP/hBYlLgrCjFxyqvn5VC81tycFEDBLG1Q==", + "license": "MIT", + "dependencies": { + "cssnano-utils": "^4.0.2", + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^14 || ^16 || >=18.0" + }, + "peerDependencies": { + "postcss": "^8.4.31" + } + }, + "node_modules/postcss-overflow-shorthand": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/postcss-overflow-shorthand/-/postcss-overflow-shorthand-6.0.0.tgz", + "integrity": "sha512-BdDl/AbVkDjoTofzDQnwDdm/Ym6oS9KgmO7Gr+LHYjNWJ6ExORe4+3pcLQsLA9gIROMkiGVjjwZNoL/mpXHd5Q==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/postcss-page-break": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/postcss-page-break/-/postcss-page-break-3.0.4.tgz", + "integrity": "sha512-1JGu8oCjVXLa9q9rFTo4MbeeA5FMe00/9C7lN4va606Rdb+HkxXtXsmEDrIraQ11fGz/WvKWa8gMuCKkrXpTsQ==", + "license": "MIT", + "peerDependencies": { + "postcss": "^8" + } + }, + "node_modules/postcss-place": { + "version": "10.0.0", + "resolved": "https://registry.npmjs.org/postcss-place/-/postcss-place-10.0.0.tgz", + "integrity": "sha512-5EBrMzat2pPAxQNWYavwAfoKfYcTADJ8AXGVPcUZ2UkNloUTWzJQExgrzrDkh3EKzmAx1evfTAzF9I8NGcc+qw==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/postcss-preset-env": { + "version": "10.4.0", + "resolved": "https://registry.npmjs.org/postcss-preset-env/-/postcss-preset-env-10.4.0.tgz", + "integrity": "sha512-2kqpOthQ6JhxqQq1FSAAZGe9COQv75Aw8WbsOvQVNJ2nSevc9Yx/IKZGuZ7XJ+iOTtVon7LfO7ELRzg8AZ+sdw==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "dependencies": { + "@csstools/postcss-alpha-function": "^1.0.1", + "@csstools/postcss-cascade-layers": "^5.0.2", + "@csstools/postcss-color-function": "^4.0.12", + "@csstools/postcss-color-function-display-p3-linear": "^1.0.1", + "@csstools/postcss-color-mix-function": "^3.0.12", + "@csstools/postcss-color-mix-variadic-function-arguments": "^1.0.2", + "@csstools/postcss-content-alt-text": "^2.0.8", + "@csstools/postcss-contrast-color-function": "^2.0.12", + "@csstools/postcss-exponential-functions": "^2.0.9", + "@csstools/postcss-font-format-keywords": "^4.0.0", + "@csstools/postcss-gamut-mapping": "^2.0.11", + "@csstools/postcss-gradients-interpolation-method": "^5.0.12", + "@csstools/postcss-hwb-function": "^4.0.12", + "@csstools/postcss-ic-unit": "^4.0.4", + "@csstools/postcss-initial": "^2.0.1", + "@csstools/postcss-is-pseudo-class": "^5.0.3", + "@csstools/postcss-light-dark-function": "^2.0.11", + "@csstools/postcss-logical-float-and-clear": "^3.0.0", + "@csstools/postcss-logical-overflow": "^2.0.0", + "@csstools/postcss-logical-overscroll-behavior": "^2.0.0", + "@csstools/postcss-logical-resize": "^3.0.0", + "@csstools/postcss-logical-viewport-units": "^3.0.4", + "@csstools/postcss-media-minmax": "^2.0.9", + "@csstools/postcss-media-queries-aspect-ratio-number-values": "^3.0.5", + "@csstools/postcss-nested-calc": "^4.0.0", + "@csstools/postcss-normalize-display-values": "^4.0.0", + "@csstools/postcss-oklab-function": "^4.0.12", + "@csstools/postcss-progressive-custom-properties": "^4.2.1", + "@csstools/postcss-random-function": "^2.0.1", + "@csstools/postcss-relative-color-syntax": "^3.0.12", + "@csstools/postcss-scope-pseudo-class": "^4.0.1", + "@csstools/postcss-sign-functions": "^1.1.4", + "@csstools/postcss-stepped-value-functions": "^4.0.9", + "@csstools/postcss-text-decoration-shorthand": "^4.0.3", + "@csstools/postcss-trigonometric-functions": "^4.0.9", + "@csstools/postcss-unset-value": "^4.0.0", + "autoprefixer": "^10.4.21", + "browserslist": "^4.26.0", + "css-blank-pseudo": "^7.0.1", + "css-has-pseudo": "^7.0.3", + "css-prefers-color-scheme": "^10.0.0", + "cssdb": "^8.4.2", + "postcss-attribute-case-insensitive": "^7.0.1", + "postcss-clamp": "^4.1.0", + "postcss-color-functional-notation": "^7.0.12", + "postcss-color-hex-alpha": "^10.0.0", + "postcss-color-rebeccapurple": "^10.0.0", + "postcss-custom-media": "^11.0.6", + "postcss-custom-properties": "^14.0.6", + "postcss-custom-selectors": "^8.0.5", + "postcss-dir-pseudo-class": "^9.0.1", + "postcss-double-position-gradients": "^6.0.4", + "postcss-focus-visible": "^10.0.1", + "postcss-focus-within": "^9.0.1", + "postcss-font-variant": "^5.0.0", + "postcss-gap-properties": "^6.0.0", + "postcss-image-set-function": "^7.0.0", + "postcss-lab-function": "^7.0.12", + "postcss-logical": "^8.1.0", + "postcss-nesting": "^13.0.2", + "postcss-opacity-percentage": "^3.0.0", + "postcss-overflow-shorthand": "^6.0.0", + "postcss-page-break": "^3.0.4", + "postcss-place": "^10.0.0", + "postcss-pseudo-class-any-link": "^10.0.1", + "postcss-replace-overflow-wrap": "^4.0.0", + "postcss-selector-not": "^8.0.1" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/postcss-pseudo-class-any-link": { + "version": "10.0.1", + "resolved": "https://registry.npmjs.org/postcss-pseudo-class-any-link/-/postcss-pseudo-class-any-link-10.0.1.tgz", + "integrity": "sha512-3el9rXlBOqTFaMFkWDOkHUTQekFIYnaQY55Rsp8As8QQkpiSgIYEcF/6Ond93oHiDsGb4kad8zjt+NPlOC1H0Q==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "dependencies": { + "postcss-selector-parser": "^7.0.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/postcss-pseudo-class-any-link/node_modules/postcss-selector-parser": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.1.0.tgz", + "integrity": "sha512-8sLjZwK0R+JlxlYcTuVnyT2v+htpdrjDOKuMcOVdYjt52Lh8hWRYpxBPoKx/Zg+bcjc3wx6fmQevMmUztS/ccA==", + "license": "MIT", + "dependencies": { + "cssesc": "^3.0.0", + "util-deprecate": "^1.0.2" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/postcss-reduce-idents": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/postcss-reduce-idents/-/postcss-reduce-idents-6.0.3.tgz", + "integrity": "sha512-G3yCqZDpsNPoQgbDUy3T0E6hqOQ5xigUtBQyrmq3tn2GxlyiL0yyl7H+T8ulQR6kOcHJ9t7/9H4/R2tv8tJbMA==", + "license": "MIT", + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^14 || ^16 || >=18.0" + }, + "peerDependencies": { + "postcss": "^8.4.31" + } + }, + "node_modules/postcss-reduce-initial": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/postcss-reduce-initial/-/postcss-reduce-initial-6.1.0.tgz", + "integrity": "sha512-RarLgBK/CrL1qZags04oKbVbrrVK2wcxhvta3GCxrZO4zveibqbRPmm2VI8sSgCXwoUHEliRSbOfpR0b/VIoiw==", + "license": "MIT", + "dependencies": { + "browserslist": "^4.23.0", + "caniuse-api": "^3.0.0" + }, + "engines": { + "node": "^14 || ^16 || >=18.0" + }, + "peerDependencies": { + "postcss": "^8.4.31" + } + }, + "node_modules/postcss-reduce-transforms": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/postcss-reduce-transforms/-/postcss-reduce-transforms-6.0.2.tgz", + "integrity": "sha512-sB+Ya++3Xj1WaT9+5LOOdirAxP7dJZms3GRcYheSPi1PiTMigsxHAdkrbItHxwYHr4kt1zL7mmcHstgMYT+aiA==", + "license": "MIT", + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^14 || ^16 || >=18.0" + }, + "peerDependencies": { + "postcss": "^8.4.31" + } + }, + "node_modules/postcss-replace-overflow-wrap": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/postcss-replace-overflow-wrap/-/postcss-replace-overflow-wrap-4.0.0.tgz", + "integrity": "sha512-KmF7SBPphT4gPPcKZc7aDkweHiKEEO8cla/GjcBK+ckKxiZslIu3C4GCRW3DNfL0o7yW7kMQu9xlZ1kXRXLXtw==", + "license": "MIT", + "peerDependencies": { + "postcss": "^8.0.3" + } + }, + "node_modules/postcss-selector-not": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/postcss-selector-not/-/postcss-selector-not-8.0.1.tgz", + "integrity": "sha512-kmVy/5PYVb2UOhy0+LqUYAhKj7DUGDpSWa5LZqlkWJaaAV+dxxsOG3+St0yNLu6vsKD7Dmqx+nWQt0iil89+WA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT", + "dependencies": { + "postcss-selector-parser": "^7.0.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/postcss-selector-not/node_modules/postcss-selector-parser": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.1.0.tgz", + "integrity": "sha512-8sLjZwK0R+JlxlYcTuVnyT2v+htpdrjDOKuMcOVdYjt52Lh8hWRYpxBPoKx/Zg+bcjc3wx6fmQevMmUztS/ccA==", + "license": "MIT", + "dependencies": { + "cssesc": "^3.0.0", + "util-deprecate": "^1.0.2" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/postcss-selector-parser": { + "version": "6.1.2", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.1.2.tgz", + "integrity": "sha512-Q8qQfPiZ+THO/3ZrOrO0cJJKfpYCagtMUkXbnEfmgUjwXg6z/WBeOyS9APBBPCTSiDV+s4SwQGu8yFsiMRIudg==", + "license": "MIT", + "dependencies": { + "cssesc": "^3.0.0", + "util-deprecate": "^1.0.2" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/postcss-sort-media-queries": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/postcss-sort-media-queries/-/postcss-sort-media-queries-5.2.0.tgz", + "integrity": "sha512-AZ5fDMLD8SldlAYlvi8NIqo0+Z8xnXU2ia0jxmuhxAU+Lqt9K+AlmLNJ/zWEnE9x+Zx3qL3+1K20ATgNOr3fAA==", + "license": "MIT", + "dependencies": { + "sort-css-media-queries": "2.2.0" + }, + "engines": { + "node": ">=14.0.0" + }, + "peerDependencies": { + "postcss": "^8.4.23" + } + }, + "node_modules/postcss-svgo": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/postcss-svgo/-/postcss-svgo-6.0.3.tgz", + "integrity": "sha512-dlrahRmxP22bX6iKEjOM+c8/1p+81asjKT+V5lrgOH944ryx/OHpclnIbGsKVd3uWOXFLYJwCVf0eEkJGvO96g==", + "license": "MIT", + "dependencies": { + "postcss-value-parser": "^4.2.0", + "svgo": "^3.2.0" + }, + "engines": { + "node": "^14 || ^16 || >= 18" + }, + "peerDependencies": { + "postcss": "^8.4.31" + } + }, + "node_modules/postcss-unique-selectors": { + "version": "6.0.4", + "resolved": "https://registry.npmjs.org/postcss-unique-selectors/-/postcss-unique-selectors-6.0.4.tgz", + "integrity": "sha512-K38OCaIrO8+PzpArzkLKB42dSARtC2tmG6PvD4b1o1Q2E9Os8jzfWFfSy/rixsHwohtsDdFtAWGjFVFUdwYaMg==", + "license": "MIT", + "dependencies": { + "postcss-selector-parser": "^6.0.16" + }, + "engines": { + "node": "^14 || ^16 || >=18.0" + }, + "peerDependencies": { + "postcss": "^8.4.31" + } + }, + "node_modules/postcss-value-parser": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz", + "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==", + "license": "MIT" + }, + "node_modules/postcss-zindex": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/postcss-zindex/-/postcss-zindex-6.0.2.tgz", + "integrity": "sha512-5BxW9l1evPB/4ZIc+2GobEBoKC+h8gPGCMi+jxsYvd2x0mjq7wazk6DrP71pStqxE9Foxh5TVnonbWpFZzXaYg==", + "license": "MIT", + "engines": { + "node": "^14 || ^16 || >=18.0" + }, + "peerDependencies": { + "postcss": "^8.4.31" + } + }, + "node_modules/postman-code-generators": { + "version": "1.14.2", + "resolved": "https://registry.npmjs.org/postman-code-generators/-/postman-code-generators-1.14.2.tgz", + "integrity": "sha512-qZAyyowfQAFE4MSCu2KtMGGQE/+oG1JhMZMJNMdZHYCSfQiVVeKxgk3oI4+KJ3d1y5rrm2D6C6x+Z+7iyqm+fA==", + "hasInstallScript": true, + "license": "Apache-2.0", + "dependencies": { + "async": "3.2.2", + "detect-package-manager": "3.0.2", + "lodash": "4.17.21", + "path": "0.12.7", + "postman-collection": "^4.4.0", + "shelljs": "0.8.5" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/postman-code-generators/node_modules/async": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/async/-/async-3.2.2.tgz", + "integrity": "sha512-H0E+qZaDEfx/FY4t7iLRv1W2fFI6+pyCeTw1uN20AQPiwqwM6ojPxHxdLv4z8hi2DtnW9BOckSspLucW7pIE5g==", + "license": "MIT" + }, + "node_modules/postman-collection": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/postman-collection/-/postman-collection-4.5.0.tgz", + "integrity": "sha512-152JSW9pdbaoJihwjc7Q8lc3nPg/PC9lPTHdMk7SHnHhu/GBJB7b2yb9zG7Qua578+3PxkQ/HYBuXpDSvsf7GQ==", + "license": "Apache-2.0", + "dependencies": { + "@faker-js/faker": "5.5.3", + "file-type": "3.9.0", + "http-reasons": "0.1.0", + "iconv-lite": "0.6.3", + "liquid-json": "0.3.1", + "lodash": "4.17.21", + "mime-format": "2.0.1", + "mime-types": "2.1.35", + "postman-url-encoder": "3.0.5", + "semver": "7.6.3", + "uuid": "8.3.2" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/postman-collection/node_modules/semver": { + "version": "7.6.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", + "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==", + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/postman-url-encoder": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/postman-url-encoder/-/postman-url-encoder-3.0.5.tgz", + "integrity": "sha512-jOrdVvzUXBC7C+9gkIkpDJ3HIxOHTIqjpQ4C1EMt1ZGeMvSEpbFCKq23DEfgsj46vMnDgyQf+1ZLp2Wm+bKSsA==", + "license": "Apache-2.0", + "dependencies": { + "punycode": "^2.1.1" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/pretty-error": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/pretty-error/-/pretty-error-4.0.0.tgz", + "integrity": "sha512-AoJ5YMAcXKYxKhuJGdcvse+Voc6v1RgnsR3nWcYU7q4t6z0Q6T86sv5Zq8VIRbOWWFpvdGE83LtdSMNd+6Y0xw==", + "license": "MIT", + "dependencies": { + "lodash": "^4.17.20", + "renderkid": "^3.0.0" + } + }, + "node_modules/pretty-time": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/pretty-time/-/pretty-time-1.1.0.tgz", + "integrity": "sha512-28iF6xPQrP8Oa6uxE6a1biz+lWeTOAPKggvjB8HAs6nVMKZwf5bG++632Dx614hIWgUPkgivRfG+a8uAXGTIbA==", + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/prism-react-renderer": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/prism-react-renderer/-/prism-react-renderer-2.4.1.tgz", + "integrity": "sha512-ey8Ls/+Di31eqzUxC46h8MksNuGx/n0AAC8uKpwFau4RPDYLuE3EXTp8N8G2vX2N7UC/+IXeNUnlWBGGcAG+Ig==", + "license": "MIT", + "dependencies": { + "@types/prismjs": "^1.26.0", + "clsx": "^2.0.0" + }, + "peerDependencies": { + "react": ">=16.0.0" + } + }, + "node_modules/prismjs": { + "version": "1.30.0", + "resolved": "https://registry.npmjs.org/prismjs/-/prismjs-1.30.0.tgz", + "integrity": "sha512-DEvV2ZF2r2/63V+tK8hQvrR2ZGn10srHbXviTlcv7Kpzw8jWiNTqbVgjO3IY8RxrrOUF8VPMQQFysYYYv0YZxw==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/process": { + "version": "0.11.10", + "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz", + "integrity": "sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A==", + "license": "MIT", + "engines": { + "node": ">= 0.6.0" + } + }, + "node_modules/process-nextick-args": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", + "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==", + "license": "MIT" + }, + "node_modules/prompts": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/prompts/-/prompts-2.4.2.tgz", + "integrity": "sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q==", + "license": "MIT", + "dependencies": { + "kleur": "^3.0.3", + "sisteransi": "^1.0.5" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/prop-types": { + "version": "15.8.1", + "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.8.1.tgz", + "integrity": "sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==", + "license": "MIT", + "dependencies": { + "loose-envify": "^1.4.0", + "object-assign": "^4.1.1", + "react-is": "^16.13.1" + } + }, + "node_modules/property-information": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/property-information/-/property-information-7.1.0.tgz", + "integrity": "sha512-TwEZ+X+yCJmYfL7TPUOcvBZ4QfoT5YenQiJuX//0th53DE6w0xxLEtfK3iyryQFddXuvkIk51EEgrJQ0WJkOmQ==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/proto-list": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/proto-list/-/proto-list-1.2.4.tgz", + "integrity": "sha512-vtK/94akxsTMhe0/cbfpR+syPuszcuwhqVjJq26CuNDgFGj682oRBXOP5MJpv2r7JtE8MsiepGIqvvOTBwn2vA==", + "license": "ISC" + }, + "node_modules/proxy-addr": { + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz", + "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==", + "license": "MIT", + "dependencies": { + "forwarded": "0.2.0", + "ipaddr.js": "1.9.1" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/proxy-addr/node_modules/ipaddr.js": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", + "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==", + "license": "MIT", + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/punycode": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", + "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/pupa": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/pupa/-/pupa-3.3.0.tgz", + "integrity": "sha512-LjgDO2zPtoXP2wJpDjZrGdojii1uqO0cnwKoIoUzkfS98HDmbeiGmYiXo3lXeFlq2xvne1QFQhwYXSUCLKtEuA==", + "license": "MIT", + "dependencies": { + "escape-goat": "^4.0.0" + }, + "engines": { + "node": ">=12.20" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/qs": { + "version": "6.14.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.14.0.tgz", + "integrity": "sha512-YWWTjgABSKcvs/nWBi9PycY/JiPJqOD4JA6o9Sej2AtvSGarXxKC3OQSk4pAarbdQlKAh5D4FCQkJNkW+GAn3w==", + "license": "BSD-3-Clause", + "dependencies": { + "side-channel": "^1.1.0" + }, + "engines": { + "node": ">=0.6" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/queue-microtask": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", + "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT" + }, + "node_modules/quick-lru": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-5.1.1.tgz", + "integrity": "sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA==", + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/randombytes": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", + "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", + "license": "MIT", + "dependencies": { + "safe-buffer": "^5.1.0" + } + }, + "node_modules/range-parser": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.0.tgz", + "integrity": "sha512-kA5WQoNVo4t9lNx2kQNFCxKeBl5IbbSNBl1M/tLkw9WCn+hxNBAW5Qh8gdhs63CJnhjJ2zQWFoqPJP2sK1AV5A==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/raw-body": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.2.tgz", + "integrity": "sha512-8zGqypfENjCIqGhgXToC8aB2r7YrBX+AQAfIPs/Mlk+BtPTztOvTS01NRW/3Eh60J+a48lt8qsCzirQ6loCVfA==", + "license": "MIT", + "dependencies": { + "bytes": "3.1.2", + "http-errors": "2.0.0", + "iconv-lite": "0.4.24", + "unpipe": "1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/raw-body/node_modules/bytes": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", + "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/raw-body/node_modules/iconv-lite": { + "version": "0.4.24", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", + "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + "license": "MIT", + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/rc": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz", + "integrity": "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==", + "license": "(BSD-2-Clause OR MIT OR Apache-2.0)", + "dependencies": { + "deep-extend": "^0.6.0", + "ini": "~1.3.0", + "minimist": "^1.2.0", + "strip-json-comments": "~2.0.1" + }, + "bin": { + "rc": "cli.js" + } + }, + "node_modules/rc/node_modules/strip-json-comments": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", + "integrity": "sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/react": { + "version": "19.1.1", + "resolved": "https://registry.npmjs.org/react/-/react-19.1.1.tgz", + "integrity": "sha512-w8nqGImo45dmMIfljjMwOGtbmC/mk4CMYhWIicdSflH91J9TyCyczcPFXJzrZ/ZXcgGRFeP6BU0BEJTw6tZdfQ==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/react-dom": { + "version": "19.1.1", + "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-19.1.1.tgz", + "integrity": "sha512-Dlq/5LAZgF0Gaz6yiqZCf6VCcZs1ghAJyrsu84Q/GT0gV+mCxbfmKNoGRKBYMJ8IEdGPqu49YWXD02GCknEDkw==", + "license": "MIT", + "dependencies": { + "scheduler": "^0.26.0" + }, + "peerDependencies": { + "react": "^19.1.1" + } + }, + "node_modules/react-fast-compare": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/react-fast-compare/-/react-fast-compare-3.2.2.tgz", + "integrity": "sha512-nsO+KSNgo1SbJqJEYRE9ERzo7YtYbou/OqjSQKxV7jcKox7+usiUVZOAC+XnDOABXggQTno0Y1CpVnuWEc1boQ==", + "license": "MIT" + }, + "node_modules/react-helmet-async": { + "name": "@slorber/react-helmet-async", + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/@slorber/react-helmet-async/-/react-helmet-async-1.3.0.tgz", + "integrity": "sha512-e9/OK8VhwUSc67diWI8Rb3I0YgI9/SBQtnhe9aEuK6MhZm7ntZZimXgwXnd8W96YTmSOb9M4d8LwhRZyhWr/1A==", + "license": "Apache-2.0", + "dependencies": { + "@babel/runtime": "^7.12.5", + "invariant": "^2.2.4", + "prop-types": "^15.7.2", + "react-fast-compare": "^3.2.0", + "shallowequal": "^1.1.0" + }, + "peerDependencies": { + "react": "^16.6.0 || ^17.0.0 || ^18.0.0 || ^19.0.0", + "react-dom": "^16.6.0 || ^17.0.0 || ^18.0.0 || ^19.0.0" + } + }, + "node_modules/react-hook-form": { + "version": "7.63.0", + "resolved": "https://registry.npmjs.org/react-hook-form/-/react-hook-form-7.63.0.tgz", + "integrity": "sha512-ZwueDMvUeucovM2VjkCf7zIHcs1aAlDimZu2Hvel5C5907gUzMpm4xCrQXtRzCvsBqFjonB4m3x4LzCFI1ZKWA==", + "license": "MIT", + "engines": { + "node": ">=18.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/react-hook-form" + }, + "peerDependencies": { + "react": "^16.8.0 || ^17 || ^18 || ^19" + } + }, + "node_modules/react-is": { + "version": "16.13.1", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", + "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==", + "license": "MIT" + }, + "node_modules/react-json-view-lite": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/react-json-view-lite/-/react-json-view-lite-2.5.0.tgz", + "integrity": "sha512-tk7o7QG9oYyELWHL8xiMQ8x4WzjCzbWNyig3uexmkLb54r8jO0yH3WCWx8UZS0c49eSA4QUmG5caiRJ8fAn58g==", + "license": "MIT", + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "react": "^18.0.0 || ^19.0.0" + } + }, + "node_modules/react-lifecycles-compat": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/react-lifecycles-compat/-/react-lifecycles-compat-3.0.4.tgz", + "integrity": "sha512-fBASbA6LnOU9dOU2eW7aQ8xmYBSXUIWr+UmF9b1efZBazGNO+rcXT/icdKnYm2pTwcRylVUYwW7H1PHfLekVzA==", + "license": "MIT" + }, + "node_modules/react-live": { + "version": "4.1.8", + "resolved": "https://registry.npmjs.org/react-live/-/react-live-4.1.8.tgz", + "integrity": "sha512-B2SgNqwPuS2ekqj4lcxi5TibEcjWkdVyYykBEUBshPAPDQ527x2zPEZg560n8egNtAjUpwXFQm7pcXV65aAYmg==", + "license": "MIT", + "dependencies": { + "prism-react-renderer": "^2.4.0", + "sucrase": "^3.35.0", + "use-editable": "^2.3.3" + }, + "engines": { + "node": ">= 0.12.0", + "npm": ">= 2.0.0" + }, + "peerDependencies": { + "react": ">=18.0.0", + "react-dom": ">=18.0.0" + } + }, + "node_modules/react-loadable": { + "name": "@docusaurus/react-loadable", + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/@docusaurus/react-loadable/-/react-loadable-6.0.0.tgz", + "integrity": "sha512-YMMxTUQV/QFSnbgrP3tjDzLHRg7vsbMn8e9HAa8o/1iXoiomo48b7sk/kkmWEuWNDPJVlKSJRB6Y2fHqdJk+SQ==", + "license": "MIT", + "dependencies": { + "@types/react": "*" + }, + "peerDependencies": { + "react": "*" + } + }, + "node_modules/react-loadable-ssr-addon-v5-slorber": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/react-loadable-ssr-addon-v5-slorber/-/react-loadable-ssr-addon-v5-slorber-1.0.1.tgz", + "integrity": "sha512-lq3Lyw1lGku8zUEJPDxsNm1AfYHBrO9Y1+olAYwpUJ2IGFBskM0DMKok97A6LWUpHm+o7IvQBOWu9MLenp9Z+A==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.10.3" + }, + "engines": { + "node": ">=10.13.0" + }, + "peerDependencies": { + "react-loadable": "*", + "webpack": ">=4.41.1 || 5.x" + } + }, + "node_modules/react-magic-dropzone": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/react-magic-dropzone/-/react-magic-dropzone-1.0.1.tgz", + "integrity": "sha512-0BIROPARmXHpk4AS3eWBOsewxoM5ndk2psYP/JmbCq8tz3uR2LIV1XiroZ9PKrmDRMctpW+TvsBCtWasuS8vFA==", + "license": "MIT" + }, + "node_modules/react-markdown": { + "version": "8.0.7", + "resolved": "https://registry.npmjs.org/react-markdown/-/react-markdown-8.0.7.tgz", + "integrity": "sha512-bvWbzG4MtOU62XqBx3Xx+zB2raaFFsq4mYiAzfjXJMEz2sixgeAfraA3tvzULF02ZdOMUOKTBFFaZJDDrq+BJQ==", + "license": "MIT", + "dependencies": { + "@types/hast": "^2.0.0", + "@types/prop-types": "^15.0.0", + "@types/unist": "^2.0.0", + "comma-separated-tokens": "^2.0.0", + "hast-util-whitespace": "^2.0.0", + "prop-types": "^15.0.0", + "property-information": "^6.0.0", + "react-is": "^18.0.0", + "remark-parse": "^10.0.0", + "remark-rehype": "^10.0.0", + "space-separated-tokens": "^2.0.0", + "style-to-object": "^0.4.0", + "unified": "^10.0.0", + "unist-util-visit": "^4.0.0", + "vfile": "^5.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + }, + "peerDependencies": { + "@types/react": ">=16", + "react": ">=16" + } + }, + "node_modules/react-markdown/node_modules/@types/hast": { + "version": "2.3.10", + "resolved": "https://registry.npmjs.org/@types/hast/-/hast-2.3.10.tgz", + "integrity": "sha512-McWspRw8xx8J9HurkVBfYj0xKoE25tOFlHGdx4MJ5xORQrMGZNqJhVQWaIbm6Oyla5kYOXtDiopzKRJzEOkwJw==", + "license": "MIT", + "dependencies": { + "@types/unist": "^2" + } + }, + "node_modules/react-markdown/node_modules/@types/mdast": { + "version": "3.0.15", + "resolved": "https://registry.npmjs.org/@types/mdast/-/mdast-3.0.15.tgz", + "integrity": "sha512-LnwD+mUEfxWMa1QpDraczIn6k0Ee3SMicuYSSzS6ZYl2gKS09EClnJYGd8Du6rfc5r/GZEk5o1mRb8TaTj03sQ==", + "license": "MIT", + "dependencies": { + "@types/unist": "^2" + } + }, + "node_modules/react-markdown/node_modules/@types/unist": { + "version": "2.0.11", + "resolved": "https://registry.npmjs.org/@types/unist/-/unist-2.0.11.tgz", + "integrity": "sha512-CmBKiL6NNo/OqgmMn95Fk9Whlp2mtvIv+KNpQKN2F4SjvrEesubTRWGYSg+BnWZOnlCaSTU1sMpsBOzgbYhnsA==", + "license": "MIT" + }, + "node_modules/react-markdown/node_modules/hast-util-whitespace": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/hast-util-whitespace/-/hast-util-whitespace-2.0.1.tgz", + "integrity": "sha512-nAxA0v8+vXSBDt3AnRUNjyRIQ0rD+ntpbAp4LnPkumc5M9yUbSMa4XDU9Q6etY4f1Wp4bNgvc1yjiZtsTTrSng==", + "license": "MIT", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/react-markdown/node_modules/mdast-util-from-markdown": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/mdast-util-from-markdown/-/mdast-util-from-markdown-1.3.1.tgz", + "integrity": "sha512-4xTO/M8c82qBcnQc1tgpNtubGUW/Y1tBQ1B0i5CtSoelOLKFYlElIr3bvgREYYO5iRqbMY1YuqZng0GVOI8Qww==", + "license": "MIT", + "dependencies": { + "@types/mdast": "^3.0.0", + "@types/unist": "^2.0.0", + "decode-named-character-reference": "^1.0.0", + "mdast-util-to-string": "^3.1.0", + "micromark": "^3.0.0", + "micromark-util-decode-numeric-character-reference": "^1.0.0", + "micromark-util-decode-string": "^1.0.0", + "micromark-util-normalize-identifier": "^1.0.0", + "micromark-util-symbol": "^1.0.0", + "micromark-util-types": "^1.0.0", + "unist-util-stringify-position": "^3.0.0", + "uvu": "^0.5.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/react-markdown/node_modules/mdast-util-to-hast": { + "version": "12.3.0", + "resolved": "https://registry.npmjs.org/mdast-util-to-hast/-/mdast-util-to-hast-12.3.0.tgz", + "integrity": "sha512-pits93r8PhnIoU4Vy9bjW39M2jJ6/tdHyja9rrot9uujkN7UTU9SDnE6WNJz/IGyQk3XHX6yNNtrBH6cQzm8Hw==", + "license": "MIT", + "dependencies": { + "@types/hast": "^2.0.0", + "@types/mdast": "^3.0.0", + "mdast-util-definitions": "^5.0.0", + "micromark-util-sanitize-uri": "^1.1.0", + "trim-lines": "^3.0.0", + "unist-util-generated": "^2.0.0", + "unist-util-position": "^4.0.0", + "unist-util-visit": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/react-markdown/node_modules/mdast-util-to-string": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/mdast-util-to-string/-/mdast-util-to-string-3.2.0.tgz", + "integrity": "sha512-V4Zn/ncyN1QNSqSBxTrMOLpjr+IKdHl2v3KVLoWmDPscP4r9GcCi71gjgvUV1SFSKh92AjAG4peFuBl2/YgCJg==", + "license": "MIT", + "dependencies": { + "@types/mdast": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/react-markdown/node_modules/micromark": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/micromark/-/micromark-3.2.0.tgz", + "integrity": "sha512-uD66tJj54JLYq0De10AhWycZWGQNUvDI55xPgk2sQM5kn1JYlhbCMTtEeT27+vAhW2FBQxLlOmS3pmA7/2z4aA==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "@types/debug": "^4.0.0", + "debug": "^4.0.0", + "decode-named-character-reference": "^1.0.0", + "micromark-core-commonmark": "^1.0.1", + "micromark-factory-space": "^1.0.0", + "micromark-util-character": "^1.0.0", + "micromark-util-chunked": "^1.0.0", + "micromark-util-combine-extensions": "^1.0.0", + "micromark-util-decode-numeric-character-reference": "^1.0.0", + "micromark-util-encode": "^1.0.0", + "micromark-util-normalize-identifier": "^1.0.0", + "micromark-util-resolve-all": "^1.0.0", + "micromark-util-sanitize-uri": "^1.0.0", + "micromark-util-subtokenize": "^1.0.0", + "micromark-util-symbol": "^1.0.0", + "micromark-util-types": "^1.0.1", + "uvu": "^0.5.0" + } + }, + "node_modules/react-markdown/node_modules/micromark-core-commonmark": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/micromark-core-commonmark/-/micromark-core-commonmark-1.1.0.tgz", + "integrity": "sha512-BgHO1aRbolh2hcrzL2d1La37V0Aoz73ymF8rAcKnohLy93titmv62E0gP8Hrx9PKcKrqCZ1BbLGbP3bEhoXYlw==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "decode-named-character-reference": "^1.0.0", + "micromark-factory-destination": "^1.0.0", + "micromark-factory-label": "^1.0.0", + "micromark-factory-space": "^1.0.0", + "micromark-factory-title": "^1.0.0", + "micromark-factory-whitespace": "^1.0.0", + "micromark-util-character": "^1.0.0", + "micromark-util-chunked": "^1.0.0", + "micromark-util-classify-character": "^1.0.0", + "micromark-util-html-tag-name": "^1.0.0", + "micromark-util-normalize-identifier": "^1.0.0", + "micromark-util-resolve-all": "^1.0.0", + "micromark-util-subtokenize": "^1.0.0", + "micromark-util-symbol": "^1.0.0", + "micromark-util-types": "^1.0.1", + "uvu": "^0.5.0" + } + }, + "node_modules/react-markdown/node_modules/micromark-factory-destination": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/micromark-factory-destination/-/micromark-factory-destination-1.1.0.tgz", + "integrity": "sha512-XaNDROBgx9SgSChd69pjiGKbV+nfHGDPVYFs5dOoDd7ZnMAE+Cuu91BCpsY8RT2NP9vo/B8pds2VQNCLiu0zhg==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-character": "^1.0.0", + "micromark-util-symbol": "^1.0.0", + "micromark-util-types": "^1.0.0" + } + }, + "node_modules/react-markdown/node_modules/micromark-factory-label": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/micromark-factory-label/-/micromark-factory-label-1.1.0.tgz", + "integrity": "sha512-OLtyez4vZo/1NjxGhcpDSbHQ+m0IIGnT8BoPamh+7jVlzLJBH98zzuCoUeMxvM6WsNeh8wx8cKvqLiPHEACn0w==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-character": "^1.0.0", + "micromark-util-symbol": "^1.0.0", + "micromark-util-types": "^1.0.0", + "uvu": "^0.5.0" + } + }, + "node_modules/react-markdown/node_modules/micromark-factory-title": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/micromark-factory-title/-/micromark-factory-title-1.1.0.tgz", + "integrity": "sha512-J7n9R3vMmgjDOCY8NPw55jiyaQnH5kBdV2/UXCtZIpnHH3P6nHUKaH7XXEYuWwx/xUJcawa8plLBEjMPU24HzQ==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-factory-space": "^1.0.0", + "micromark-util-character": "^1.0.0", + "micromark-util-symbol": "^1.0.0", + "micromark-util-types": "^1.0.0" + } + }, + "node_modules/react-markdown/node_modules/micromark-factory-whitespace": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/micromark-factory-whitespace/-/micromark-factory-whitespace-1.1.0.tgz", + "integrity": "sha512-v2WlmiymVSp5oMg+1Q0N1Lxmt6pMhIHD457whWM7/GUlEks1hI9xj5w3zbc4uuMKXGisksZk8DzP2UyGbGqNsQ==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-factory-space": "^1.0.0", + "micromark-util-character": "^1.0.0", + "micromark-util-symbol": "^1.0.0", + "micromark-util-types": "^1.0.0" + } + }, + "node_modules/react-markdown/node_modules/micromark-util-chunked": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/micromark-util-chunked/-/micromark-util-chunked-1.1.0.tgz", + "integrity": "sha512-Ye01HXpkZPNcV6FiyoW2fGZDUw4Yc7vT0E9Sad83+bEDiCJ1uXu0S3mr8WLpsz3HaG3x2q0HM6CTuPdcZcluFQ==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-symbol": "^1.0.0" + } + }, + "node_modules/react-markdown/node_modules/micromark-util-classify-character": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/micromark-util-classify-character/-/micromark-util-classify-character-1.1.0.tgz", + "integrity": "sha512-SL0wLxtKSnklKSUplok1WQFoGhUdWYKggKUiqhX+Swala+BtptGCu5iPRc+xvzJ4PXE/hwM3FNXsfEVgoZsWbw==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-character": "^1.0.0", + "micromark-util-symbol": "^1.0.0", + "micromark-util-types": "^1.0.0" + } + }, + "node_modules/react-markdown/node_modules/micromark-util-combine-extensions": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/micromark-util-combine-extensions/-/micromark-util-combine-extensions-1.1.0.tgz", + "integrity": "sha512-Q20sp4mfNf9yEqDL50WwuWZHUrCO4fEyeDCnMGmG5Pr0Cz15Uo7KBs6jq+dq0EgX4DPwwrh9m0X+zPV1ypFvUA==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-chunked": "^1.0.0", + "micromark-util-types": "^1.0.0" + } + }, + "node_modules/react-markdown/node_modules/micromark-util-decode-numeric-character-reference": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/micromark-util-decode-numeric-character-reference/-/micromark-util-decode-numeric-character-reference-1.1.0.tgz", + "integrity": "sha512-m9V0ExGv0jB1OT21mrWcuf4QhP46pH1KkfWy9ZEezqHKAxkj4mPCy3nIH1rkbdMlChLHX531eOrymlwyZIf2iw==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-symbol": "^1.0.0" + } + }, + "node_modules/react-markdown/node_modules/micromark-util-decode-string": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/micromark-util-decode-string/-/micromark-util-decode-string-1.1.0.tgz", + "integrity": "sha512-YphLGCK8gM1tG1bd54azwyrQRjCFcmgj2S2GoJDNnh4vYtnL38JS8M4gpxzOPNyHdNEpheyWXCTnnTDY3N+NVQ==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "decode-named-character-reference": "^1.0.0", + "micromark-util-character": "^1.0.0", + "micromark-util-decode-numeric-character-reference": "^1.0.0", + "micromark-util-symbol": "^1.0.0" + } + }, + "node_modules/react-markdown/node_modules/micromark-util-encode": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/micromark-util-encode/-/micromark-util-encode-1.1.0.tgz", + "integrity": "sha512-EuEzTWSTAj9PA5GOAs992GzNh2dGQO52UvAbtSOMvXTxv3Criqb6IOzJUBCmEqrrXSblJIJBbFFv6zPxpreiJw==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, + "node_modules/react-markdown/node_modules/micromark-util-html-tag-name": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/micromark-util-html-tag-name/-/micromark-util-html-tag-name-1.2.0.tgz", + "integrity": "sha512-VTQzcuQgFUD7yYztuQFKXT49KghjtETQ+Wv/zUjGSGBioZnkA4P1XXZPT1FHeJA6RwRXSF47yvJ1tsJdoxwO+Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, + "node_modules/react-markdown/node_modules/micromark-util-normalize-identifier": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/micromark-util-normalize-identifier/-/micromark-util-normalize-identifier-1.1.0.tgz", + "integrity": "sha512-N+w5vhqrBihhjdpM8+5Xsxy71QWqGn7HYNUvch71iV2PM7+E3uWGox1Qp90loa1ephtCxG2ftRV/Conitc6P2Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-symbol": "^1.0.0" + } + }, + "node_modules/react-markdown/node_modules/micromark-util-resolve-all": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/micromark-util-resolve-all/-/micromark-util-resolve-all-1.1.0.tgz", + "integrity": "sha512-b/G6BTMSg+bX+xVCshPTPyAu2tmA0E4X98NSR7eIbeC6ycCqCeE7wjfDIgzEbkzdEVJXRtOG4FbEm/uGbCRouA==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-types": "^1.0.0" + } + }, + "node_modules/react-markdown/node_modules/micromark-util-sanitize-uri": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/micromark-util-sanitize-uri/-/micromark-util-sanitize-uri-1.2.0.tgz", + "integrity": "sha512-QO4GXv0XZfWey4pYFndLUKEAktKkG5kZTdUNaTAkzbuJxn2tNBOr+QtxR2XpWaMhbImT2dPzyLrPXLlPhph34A==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-character": "^1.0.0", + "micromark-util-encode": "^1.0.0", + "micromark-util-symbol": "^1.0.0" + } + }, + "node_modules/react-markdown/node_modules/micromark-util-subtokenize": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/micromark-util-subtokenize/-/micromark-util-subtokenize-1.1.0.tgz", + "integrity": "sha512-kUQHyzRoxvZO2PuLzMt2P/dwVsTiivCK8icYTeR+3WgbuPqfHgPPy7nFKbeqRivBvn/3N3GBiNC+JRTMSxEC7A==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-chunked": "^1.0.0", + "micromark-util-symbol": "^1.0.0", + "micromark-util-types": "^1.0.0", + "uvu": "^0.5.0" + } + }, + "node_modules/react-markdown/node_modules/micromark-util-types": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/micromark-util-types/-/micromark-util-types-1.1.0.tgz", + "integrity": "sha512-ukRBgie8TIAcacscVHSiddHjO4k/q3pnedmzMQ4iwDcK0FtFCohKOlFbaOL/mPgfnPsL3C1ZyxJa4sbWrBl3jg==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, + "node_modules/react-markdown/node_modules/property-information": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/property-information/-/property-information-6.5.0.tgz", + "integrity": "sha512-PgTgs/BlvHxOu8QuEN7wi5A0OmXaBcHpmCSTehcs6Uuu9IkDIEo13Hy7n898RHfrQ49vKCoGeWZSaAK01nwVig==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/react-markdown/node_modules/react-is": { + "version": "18.3.1", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.3.1.tgz", + "integrity": "sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==", + "license": "MIT" + }, + "node_modules/react-markdown/node_modules/remark-parse": { + "version": "10.0.2", + "resolved": "https://registry.npmjs.org/remark-parse/-/remark-parse-10.0.2.tgz", + "integrity": "sha512-3ydxgHa/ZQzG8LvC7jTXccARYDcRld3VfcgIIFs7bI6vbRSxJJmzgLEIIoYKyrfhaY+ujuWaf/PJiMZXoiCXgw==", + "license": "MIT", + "dependencies": { + "@types/mdast": "^3.0.0", + "mdast-util-from-markdown": "^1.0.0", + "unified": "^10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/react-markdown/node_modules/remark-rehype": { + "version": "10.1.0", + "resolved": "https://registry.npmjs.org/remark-rehype/-/remark-rehype-10.1.0.tgz", + "integrity": "sha512-EFmR5zppdBp0WQeDVZ/b66CWJipB2q2VLNFMabzDSGR66Z2fQii83G5gTBbgGEnEEA0QRussvrFHxk1HWGJskw==", + "license": "MIT", + "dependencies": { + "@types/hast": "^2.0.0", + "@types/mdast": "^3.0.0", + "mdast-util-to-hast": "^12.1.0", + "unified": "^10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/react-markdown/node_modules/unified": { + "version": "10.1.2", + "resolved": "https://registry.npmjs.org/unified/-/unified-10.1.2.tgz", + "integrity": "sha512-pUSWAi/RAnVy1Pif2kAoeWNBa3JVrx0MId2LASj8G+7AiHWoKZNTomq6LG326T68U7/e263X6fTdcXIy7XnF7Q==", + "license": "MIT", + "dependencies": { + "@types/unist": "^2.0.0", + "bail": "^2.0.0", + "extend": "^3.0.0", + "is-buffer": "^2.0.0", + "is-plain-obj": "^4.0.0", + "trough": "^2.0.0", + "vfile": "^5.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/react-markdown/node_modules/unist-util-is": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/unist-util-is/-/unist-util-is-5.2.1.tgz", + "integrity": "sha512-u9njyyfEh43npf1M+yGKDGVPbY/JWEemg5nH05ncKPfi+kBbKBJoTdsogMu33uhytuLlv9y0O7GH7fEdwLdLQw==", + "license": "MIT", + "dependencies": { + "@types/unist": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/react-markdown/node_modules/unist-util-position": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/unist-util-position/-/unist-util-position-4.0.4.tgz", + "integrity": "sha512-kUBE91efOWfIVBo8xzh/uZQ7p9ffYRtUbMRZBNFYwf0RK8koUMx6dGUfwylLOKmaT2cs4wSW96QoYUSXAyEtpg==", + "license": "MIT", + "dependencies": { + "@types/unist": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/react-markdown/node_modules/unist-util-stringify-position": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/unist-util-stringify-position/-/unist-util-stringify-position-3.0.3.tgz", + "integrity": "sha512-k5GzIBZ/QatR8N5X2y+drfpWG8IDBzdnVj6OInRNWm1oXrzydiaAT2OQiA8DPRRZyAKb9b6I2a6PxYklZD0gKg==", + "license": "MIT", + "dependencies": { + "@types/unist": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/react-markdown/node_modules/unist-util-visit": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/unist-util-visit/-/unist-util-visit-4.1.2.tgz", + "integrity": "sha512-MSd8OUGISqHdVvfY9TPhyK2VdUrPgxkUtWSuMHF6XAAFuL4LokseigBnZtPnJMu+FbynTkFNnFlyjxpVKujMRg==", + "license": "MIT", + "dependencies": { + "@types/unist": "^2.0.0", + "unist-util-is": "^5.0.0", + "unist-util-visit-parents": "^5.1.1" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/react-markdown/node_modules/unist-util-visit-parents": { + "version": "5.1.3", + "resolved": "https://registry.npmjs.org/unist-util-visit-parents/-/unist-util-visit-parents-5.1.3.tgz", + "integrity": "sha512-x6+y8g7wWMyQhL1iZfhIPhDAs7Xwbn9nRosDXl7qoPTSCy0yNxnKc+hWokFifWQIDGi154rdUqKvbCa4+1kLhg==", + "license": "MIT", + "dependencies": { + "@types/unist": "^2.0.0", + "unist-util-is": "^5.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/react-markdown/node_modules/vfile": { + "version": "5.3.7", + "resolved": "https://registry.npmjs.org/vfile/-/vfile-5.3.7.tgz", + "integrity": "sha512-r7qlzkgErKjobAmyNIkkSpizsFPYiUPuJb5pNW1RB4JcYVZhs4lIbVqk8XPk033CV/1z8ss5pkax8SuhGpcG8g==", + "license": "MIT", + "dependencies": { + "@types/unist": "^2.0.0", + "is-buffer": "^2.0.0", + "unist-util-stringify-position": "^3.0.0", + "vfile-message": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/react-markdown/node_modules/vfile-message": { + "version": "3.1.4", + "resolved": "https://registry.npmjs.org/vfile-message/-/vfile-message-3.1.4.tgz", + "integrity": "sha512-fa0Z6P8HUrQN4BZaX05SIVXic+7kE3b05PWAtPuYP9QLHsLKYR7/AlLW3NtOrpXRLeawpDLMsVkmk5DG0NXgWw==", + "license": "MIT", + "dependencies": { + "@types/unist": "^2.0.0", + "unist-util-stringify-position": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/react-modal": { + "version": "3.16.3", + "resolved": "https://registry.npmjs.org/react-modal/-/react-modal-3.16.3.tgz", + "integrity": "sha512-yCYRJB5YkeQDQlTt17WGAgFJ7jr2QYcWa1SHqZ3PluDmnKJ/7+tVU+E6uKyZ0nODaeEj+xCpK4LcSnKXLMC0Nw==", + "license": "MIT", + "dependencies": { + "exenv": "^1.2.0", + "prop-types": "^15.7.2", + "react-lifecycles-compat": "^3.0.0", + "warning": "^4.0.3" + }, + "peerDependencies": { + "react": "^0.14.0 || ^15.0.0 || ^16 || ^17 || ^18 || ^19", + "react-dom": "^0.14.0 || ^15.0.0 || ^16 || ^17 || ^18 || ^19" + } + }, + "node_modules/react-router": { + "version": "5.3.4", + "resolved": "https://registry.npmjs.org/react-router/-/react-router-5.3.4.tgz", + "integrity": "sha512-Ys9K+ppnJah3QuaRiLxk+jDWOR1MekYQrlytiXxC1RyfbdsZkS5pvKAzCCr031xHixZwpnsYNT5xysdFHQaYsA==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.12.13", + "history": "^4.9.0", + "hoist-non-react-statics": "^3.1.0", + "loose-envify": "^1.3.1", + "path-to-regexp": "^1.7.0", + "prop-types": "^15.6.2", + "react-is": "^16.6.0", + "tiny-invariant": "^1.0.2", + "tiny-warning": "^1.0.0" + }, + "peerDependencies": { + "react": ">=15" + } + }, + "node_modules/react-router-config": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/react-router-config/-/react-router-config-5.1.1.tgz", + "integrity": "sha512-DuanZjaD8mQp1ppHjgnnUnyOlqYXZVjnov/JzFhjLEwd3Z4dYjMSnqrEzzGThH47vpCOqPPwJM2FtthLeJ8Pbg==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.1.2" + }, + "peerDependencies": { + "react": ">=15", + "react-router": ">=5" + } + }, + "node_modules/react-router-dom": { + "version": "5.3.4", + "resolved": "https://registry.npmjs.org/react-router-dom/-/react-router-dom-5.3.4.tgz", + "integrity": "sha512-m4EqFMHv/Ih4kpcBCONHbkT68KoAeHN4p3lAGoNryfHi0dMy0kCzEZakiKRsvg5wHZ/JLrLW8o8KomWiz/qbYQ==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.12.13", + "history": "^4.9.0", + "loose-envify": "^1.3.1", + "prop-types": "^15.6.2", + "react-router": "5.3.4", + "tiny-invariant": "^1.0.2", + "tiny-warning": "^1.0.0" + }, + "peerDependencies": { + "react": ">=15" + } + }, + "node_modules/readable-stream": { + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", + "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", + "license": "MIT", + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/readdirp": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", + "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", + "license": "MIT", + "dependencies": { + "picomatch": "^2.2.1" + }, + "engines": { + "node": ">=8.10.0" + } + }, + "node_modules/rechoir": { + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.6.2.tgz", + "integrity": "sha512-HFM8rkZ+i3zrV+4LQjwQ0W+ez98pApMGM3HUrN04j3CqzPOzl9nmP15Y8YXNm8QHGv/eacOVEjqhmWpkRV0NAw==", + "dependencies": { + "resolve": "^1.1.6" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/recma-build-jsx": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/recma-build-jsx/-/recma-build-jsx-1.0.0.tgz", + "integrity": "sha512-8GtdyqaBcDfva+GUKDr3nev3VpKAhup1+RvkMvUxURHpW7QyIvk9F5wz7Vzo06CEMSilw6uArgRqhpiUcWp8ew==", + "license": "MIT", + "dependencies": { + "@types/estree": "^1.0.0", + "estree-util-build-jsx": "^3.0.0", + "vfile": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/recma-jsx": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/recma-jsx/-/recma-jsx-1.0.1.tgz", + "integrity": "sha512-huSIy7VU2Z5OLv6oFLosQGGDqPqdO1iq6bWNAdhzMxSJP7RAso4fCZ1cKu8j9YHCZf3TPrq4dw3okhrylgcd7w==", + "license": "MIT", + "dependencies": { + "acorn-jsx": "^5.0.0", + "estree-util-to-js": "^2.0.0", + "recma-parse": "^1.0.0", + "recma-stringify": "^1.0.0", + "unified": "^11.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + }, + "peerDependencies": { + "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" + } + }, + "node_modules/recma-parse": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/recma-parse/-/recma-parse-1.0.0.tgz", + "integrity": "sha512-OYLsIGBB5Y5wjnSnQW6t3Xg7q3fQ7FWbw/vcXtORTnyaSFscOtABg+7Pnz6YZ6c27fG1/aN8CjfwoUEUIdwqWQ==", + "license": "MIT", + "dependencies": { + "@types/estree": "^1.0.0", + "esast-util-from-js": "^2.0.0", + "unified": "^11.0.0", + "vfile": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/recma-stringify": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/recma-stringify/-/recma-stringify-1.0.0.tgz", + "integrity": "sha512-cjwII1MdIIVloKvC9ErQ+OgAtwHBmcZ0Bg4ciz78FtbT8In39aAYbaA7zvxQ61xVMSPE8WxhLwLbhif4Js2C+g==", + "license": "MIT", + "dependencies": { + "@types/estree": "^1.0.0", + "estree-util-to-js": "^2.0.0", + "unified": "^11.0.0", + "vfile": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/redux": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/redux/-/redux-4.2.1.tgz", + "integrity": "sha512-LAUYz4lc+Do8/g7aeRa8JkyDErK6ekstQaqWQrNRW//MY1TvCEpMtpTWvlQ+FPbWCx+Xixu/6SHt5N0HR+SB4w==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.9.2" + } + }, + "node_modules/redux-thunk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/redux-thunk/-/redux-thunk-2.4.2.tgz", + "integrity": "sha512-+P3TjtnP0k/FEjcBL5FZpoovtvrTNT/UXd4/sluaSyrURlSlhLSzEdfsTBW7WsKB6yPvgd7q/iZPICFjW4o57Q==", + "license": "MIT", + "peerDependencies": { + "redux": "^4" + } + }, + "node_modules/reftools": { + "version": "1.1.9", + "resolved": "https://registry.npmjs.org/reftools/-/reftools-1.1.9.tgz", + "integrity": "sha512-OVede/NQE13xBQ+ob5CKd5KyeJYU2YInb1bmV4nRoOfquZPkAkxuOXicSe1PvqIuZZ4kD13sPKBbR7UFDmli6w==", + "license": "BSD-3-Clause", + "funding": { + "url": "https://github.com/Mermade/oas-kit?sponsor=1" + } + }, + "node_modules/regenerate": { + "version": "1.4.2", + "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.4.2.tgz", + "integrity": "sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A==", + "license": "MIT" + }, + "node_modules/regenerate-unicode-properties": { + "version": "10.2.2", + "resolved": "https://registry.npmjs.org/regenerate-unicode-properties/-/regenerate-unicode-properties-10.2.2.tgz", + "integrity": "sha512-m03P+zhBeQd1RGnYxrGyDAPpWX/epKirLrp8e3qevZdVkKtnCrjjWczIbYc8+xd6vcTStVlqfycTx1KR4LOr0g==", + "license": "MIT", + "dependencies": { + "regenerate": "^1.4.2" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/regexpu-core": { + "version": "6.4.0", + "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-6.4.0.tgz", + "integrity": "sha512-0ghuzq67LI9bLXpOX/ISfve/Mq33a4aFRzoQYhnnok1JOFpmE/A2TBGkNVenOGEeSBCjIiWcc6MVOG5HEQv0sA==", + "license": "MIT", + "dependencies": { + "regenerate": "^1.4.2", + "regenerate-unicode-properties": "^10.2.2", + "regjsgen": "^0.8.0", + "regjsparser": "^0.13.0", + "unicode-match-property-ecmascript": "^2.0.0", + "unicode-match-property-value-ecmascript": "^2.2.1" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/registry-auth-token": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/registry-auth-token/-/registry-auth-token-5.1.0.tgz", + "integrity": "sha512-GdekYuwLXLxMuFTwAPg5UKGLW/UXzQrZvH/Zj791BQif5T05T0RsaLfHc9q3ZOKi7n+BoprPD9mJ0O0k4xzUlw==", + "license": "MIT", + "dependencies": { + "@pnpm/npm-conf": "^2.1.0" + }, + "engines": { + "node": ">=14" + } + }, + "node_modules/registry-url": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/registry-url/-/registry-url-6.0.1.tgz", + "integrity": "sha512-+crtS5QjFRqFCoQmvGduwYWEBng99ZvmFvF+cUJkGYF1L1BfU8C6Zp9T7f5vPAwyLkUExpvK+ANVZmGU49qi4Q==", + "license": "MIT", + "dependencies": { + "rc": "1.2.8" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/regjsgen": { + "version": "0.8.0", + "resolved": "https://registry.npmjs.org/regjsgen/-/regjsgen-0.8.0.tgz", + "integrity": "sha512-RvwtGe3d7LvWiDQXeQw8p5asZUmfU1G/l6WbUXeHta7Y2PEIvBTwH6E2EfmYUK8pxcxEdEmaomqyp0vZZ7C+3Q==", + "license": "MIT" + }, + "node_modules/regjsparser": { + "version": "0.13.0", + "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.13.0.tgz", + "integrity": "sha512-NZQZdC5wOE/H3UT28fVGL+ikOZcEzfMGk/c3iN9UGxzWHMa1op7274oyiUVrAG4B2EuFhus8SvkaYnhvW92p9Q==", + "license": "BSD-2-Clause", + "dependencies": { + "jsesc": "~3.1.0" + }, + "bin": { + "regjsparser": "bin/parser" + } + }, + "node_modules/rehype-raw": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/rehype-raw/-/rehype-raw-7.0.0.tgz", + "integrity": "sha512-/aE8hCfKlQeA8LmyeyQvQF3eBiLRGNlfBJEvWH7ivp9sBqs7TNqBL5X3v157rM4IFETqDnIOO+z5M/biZbo9Ww==", + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.0", + "hast-util-raw": "^9.0.0", + "vfile": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/rehype-recma": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/rehype-recma/-/rehype-recma-1.0.0.tgz", + "integrity": "sha512-lqA4rGUf1JmacCNWWZx0Wv1dHqMwxzsDWYMTowuplHF3xH0N/MmrZ/G3BDZnzAkRmxDadujCjaKM2hqYdCBOGw==", + "license": "MIT", + "dependencies": { + "@types/estree": "^1.0.0", + "@types/hast": "^3.0.0", + "hast-util-to-estree": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/relateurl": { + "version": "0.2.7", + "resolved": "https://registry.npmjs.org/relateurl/-/relateurl-0.2.7.tgz", + "integrity": "sha512-G08Dxvm4iDN3MLM0EsP62EDV9IuhXPR6blNz6Utcp7zyV3tr4HVNINt6MpaRWbxoOHT3Q7YN2P+jaHX8vUbgog==", + "license": "MIT", + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/remark-directive": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/remark-directive/-/remark-directive-3.0.1.tgz", + "integrity": "sha512-gwglrEQEZcZYgVyG1tQuA+h58EZfq5CSULw7J90AFuCTyib1thgHPoqQ+h9iFvU6R+vnZ5oNFQR5QKgGpk741A==", + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0", + "mdast-util-directive": "^3.0.0", + "micromark-extension-directive": "^3.0.0", + "unified": "^11.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/remark-emoji": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/remark-emoji/-/remark-emoji-4.0.1.tgz", + "integrity": "sha512-fHdvsTR1dHkWKev9eNyhTo4EFwbUvJ8ka9SgeWkMPYFX4WoI7ViVBms3PjlQYgw5TLvNQso3GUB/b/8t3yo+dg==", + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.2", + "emoticon": "^4.0.1", + "mdast-util-find-and-replace": "^3.0.1", + "node-emoji": "^2.1.0", + "unified": "^11.0.4" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + } + }, + "node_modules/remark-frontmatter": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/remark-frontmatter/-/remark-frontmatter-5.0.0.tgz", + "integrity": "sha512-XTFYvNASMe5iPN0719nPrdItC9aU0ssC4v14mH1BCi1u0n1gAocqcujWUrByftZTbLhRtiKRyjYTSIOcr69UVQ==", + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0", + "mdast-util-frontmatter": "^2.0.0", + "micromark-extension-frontmatter": "^2.0.0", + "unified": "^11.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/remark-gfm": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/remark-gfm/-/remark-gfm-4.0.1.tgz", + "integrity": "sha512-1quofZ2RQ9EWdeN34S79+KExV1764+wCUGop5CPL1WGdD0ocPpu91lzPGbwWMECpEpd42kJGQwzRfyov9j4yNg==", + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0", + "mdast-util-gfm": "^3.0.0", + "micromark-extension-gfm": "^3.0.0", + "remark-parse": "^11.0.0", + "remark-stringify": "^11.0.0", + "unified": "^11.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/remark-mdx": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/remark-mdx/-/remark-mdx-3.1.1.tgz", + "integrity": "sha512-Pjj2IYlUY3+D8x00UJsIOg5BEvfMyeI+2uLPn9VO9Wg4MEtN/VTIq2NEJQfde9PnX15KgtHyl9S0BcTnWrIuWg==", + "license": "MIT", + "dependencies": { + "mdast-util-mdx": "^3.0.0", + "micromark-extension-mdxjs": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/remark-parse": { + "version": "11.0.0", + "resolved": "https://registry.npmjs.org/remark-parse/-/remark-parse-11.0.0.tgz", + "integrity": "sha512-FCxlKLNGknS5ba/1lmpYijMUzX2esxW5xQqjWxw2eHFfS2MSdaHVINFmhjo+qN1WhZhNimq0dZATN9pH0IDrpA==", + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0", + "mdast-util-from-markdown": "^2.0.0", + "micromark-util-types": "^2.0.0", + "unified": "^11.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/remark-rehype": { + "version": "11.1.2", + "resolved": "https://registry.npmjs.org/remark-rehype/-/remark-rehype-11.1.2.tgz", + "integrity": "sha512-Dh7l57ianaEoIpzbp0PC9UKAdCSVklD8E5Rpw7ETfbTl3FqcOOgq5q2LVDhgGCkaBv7p24JXikPdvhhmHvKMsw==", + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.0", + "@types/mdast": "^4.0.0", + "mdast-util-to-hast": "^13.0.0", + "unified": "^11.0.0", + "vfile": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/remark-stringify": { + "version": "11.0.0", + "resolved": "https://registry.npmjs.org/remark-stringify/-/remark-stringify-11.0.0.tgz", + "integrity": "sha512-1OSmLd3awB/t8qdoEOMazZkNsfVTeY4fTsgzcQFdXNq8ToTN4ZGwrMnlda4K6smTFKD+GRV6O48i6Z4iKgPPpw==", + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0", + "mdast-util-to-markdown": "^2.0.0", + "unified": "^11.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/renderkid": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/renderkid/-/renderkid-3.0.0.tgz", + "integrity": "sha512-q/7VIQA8lmM1hF+jn+sFSPWGlMkSAeNYcPLmDQx2zzuiDfaLrOmumR8iaUKlenFgh0XRPIUeSPlH3A+AW3Z5pg==", + "license": "MIT", + "dependencies": { + "css-select": "^4.1.3", + "dom-converter": "^0.2.0", + "htmlparser2": "^6.1.0", + "lodash": "^4.17.21", + "strip-ansi": "^6.0.1" + } + }, + "node_modules/renderkid/node_modules/css-select": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/css-select/-/css-select-4.3.0.tgz", + "integrity": "sha512-wPpOYtnsVontu2mODhA19JrqWxNsfdatRKd64kmpRbQgh1KtItko5sTnEpPdpSaJszTOhEMlF/RPz28qj4HqhQ==", + "license": "BSD-2-Clause", + "dependencies": { + "boolbase": "^1.0.0", + "css-what": "^6.0.1", + "domhandler": "^4.3.1", + "domutils": "^2.8.0", + "nth-check": "^2.0.1" + }, + "funding": { + "url": "https://github.com/sponsors/fb55" + } + }, + "node_modules/renderkid/node_modules/dom-serializer": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-1.4.1.tgz", + "integrity": "sha512-VHwB3KfrcOOkelEG2ZOfxqLZdfkil8PtJi4P8N2MMXucZq2yLp75ClViUlOVwyoHEDjYU433Aq+5zWP61+RGag==", + "license": "MIT", + "dependencies": { + "domelementtype": "^2.0.1", + "domhandler": "^4.2.0", + "entities": "^2.0.0" + }, + "funding": { + "url": "https://github.com/cheeriojs/dom-serializer?sponsor=1" + } + }, + "node_modules/renderkid/node_modules/domhandler": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-4.3.1.tgz", + "integrity": "sha512-GrwoxYN+uWlzO8uhUXRl0P+kHE4GtVPfYzVLcUxPL7KNdHKj66vvlhiweIHqYYXWlw+T8iLMp42Lm67ghw4WMQ==", + "license": "BSD-2-Clause", + "dependencies": { + "domelementtype": "^2.2.0" + }, + "engines": { + "node": ">= 4" + }, + "funding": { + "url": "https://github.com/fb55/domhandler?sponsor=1" + } + }, + "node_modules/renderkid/node_modules/domutils": { + "version": "2.8.0", + "resolved": "https://registry.npmjs.org/domutils/-/domutils-2.8.0.tgz", + "integrity": "sha512-w96Cjofp72M5IIhpjgobBimYEfoPjx1Vx0BSX9P30WBdZW2WIKU0T1Bd0kz2eNZ9ikjKgHbEyKx8BB6H1L3h3A==", + "license": "BSD-2-Clause", + "dependencies": { + "dom-serializer": "^1.0.1", + "domelementtype": "^2.2.0", + "domhandler": "^4.2.0" + }, + "funding": { + "url": "https://github.com/fb55/domutils?sponsor=1" + } + }, + "node_modules/renderkid/node_modules/entities": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-2.2.0.tgz", + "integrity": "sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==", + "license": "BSD-2-Clause", + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" + } + }, + "node_modules/renderkid/node_modules/htmlparser2": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-6.1.0.tgz", + "integrity": "sha512-gyyPk6rgonLFEDGoeRgQNaEUvdJ4ktTmmUh/h2t7s+M8oPpIPxgNACWa+6ESR57kXstwqPiCut0V8NRpcwgU7A==", + "funding": [ + "https://github.com/fb55/htmlparser2?sponsor=1", + { + "type": "github", + "url": "https://github.com/sponsors/fb55" + } + ], + "license": "MIT", + "dependencies": { + "domelementtype": "^2.0.1", + "domhandler": "^4.0.0", + "domutils": "^2.5.2", + "entities": "^2.0.0" + } + }, + "node_modules/repeat-string": { + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz", + "integrity": "sha512-PV0dzCYDNfRi1jCDbJzpW7jNNDRuCOG/jI5ctQcGKt/clZD+YcPS3yIlWuTJMmESC8aevCFmWJy5wjAFgNqN6w==", + "license": "MIT", + "engines": { + "node": ">=0.10" + } + }, + "node_modules/require-directory": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", + "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/require-from-string": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", + "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/require-like": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/require-like/-/require-like-0.1.2.tgz", + "integrity": "sha512-oyrU88skkMtDdauHDuKVrgR+zuItqr6/c//FXzvmxRGMexSDc6hNvJInGW3LL46n+8b50RykrvwSUIIQH2LQ5A==", + "engines": { + "node": "*" + } + }, + "node_modules/requires-port": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz", + "integrity": "sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==", + "license": "MIT" + }, + "node_modules/reselect": { + "version": "4.1.8", + "resolved": "https://registry.npmjs.org/reselect/-/reselect-4.1.8.tgz", + "integrity": "sha512-ab9EmR80F/zQTMNeneUr4cv+jSwPJgIlvEmVwLerwrWVbpLlBuls9XHzIeTFy4cegU2NHBp3va0LKOzU5qFEYQ==", + "license": "MIT" + }, + "node_modules/resolve": { + "version": "1.22.10", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.10.tgz", + "integrity": "sha512-NPRy+/ncIMeDlTAsuqwKIiferiawhefFJtkNSW0qZJEqMEb+qBt/77B/jGeeek+F0uOeN05CDa6HXbbIgtVX4w==", + "license": "MIT", + "dependencies": { + "is-core-module": "^2.16.0", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + }, + "bin": { + "resolve": "bin/resolve" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/resolve-alpn": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/resolve-alpn/-/resolve-alpn-1.2.1.tgz", + "integrity": "sha512-0a1F4l73/ZFZOakJnQ3FvkJ2+gSTQWz/r2KE5OdDY0TxPm5h4GkqkWWfM47T7HsbnOtcJVEF4epCVy6u7Q3K+g==", + "license": "MIT" + }, + "node_modules/resolve-from": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", + "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/resolve-pathname": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/resolve-pathname/-/resolve-pathname-3.0.0.tgz", + "integrity": "sha512-C7rARubxI8bXFNB/hqcp/4iUeIXJhJZvFPFPiSPRnhU5UPxzMFIl+2E6yY6c4k9giDJAhtV+enfA+G89N6Csng==", + "license": "MIT" + }, + "node_modules/responselike": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/responselike/-/responselike-3.0.0.tgz", + "integrity": "sha512-40yHxbNcl2+rzXvZuVkrYohathsSJlMTXKryG5y8uciHv1+xDLHQpgjG64JUO9nrEq2jGLH6IZ8BcZyw3wrweg==", + "license": "MIT", + "dependencies": { + "lowercase-keys": "^3.0.0" + }, + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/retry": { + "version": "0.13.1", + "resolved": "https://registry.npmjs.org/retry/-/retry-0.13.1.tgz", + "integrity": "sha512-XQBQ3I8W1Cge0Seh+6gjj03LbmRFWuoszgK9ooCpwYIrhhoO80pfq4cUkU5DkknwfOfFteRwlZ56PYOGYyFWdg==", + "license": "MIT", + "engines": { + "node": ">= 4" + } + }, + "node_modules/reusify": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.1.0.tgz", + "integrity": "sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw==", + "license": "MIT", + "engines": { + "iojs": ">=1.0.0", + "node": ">=0.10.0" + } + }, + "node_modules/rimraf": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "deprecated": "Rimraf versions prior to v4 are no longer supported", + "license": "ISC", + "dependencies": { + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/rtlcss": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/rtlcss/-/rtlcss-4.3.0.tgz", + "integrity": "sha512-FI+pHEn7Wc4NqKXMXFM+VAYKEj/mRIcW4h24YVwVtyjI+EqGrLc2Hx/Ny0lrZ21cBWU2goLy36eqMcNj3AQJig==", + "license": "MIT", + "dependencies": { + "escalade": "^3.1.1", + "picocolors": "^1.0.0", + "postcss": "^8.4.21", + "strip-json-comments": "^3.1.1" + }, + "bin": { + "rtlcss": "bin/rtlcss.js" + }, + "engines": { + "node": ">=12.0.0" + } + }, + "node_modules/run-parallel": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", + "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT", + "dependencies": { + "queue-microtask": "^1.2.2" + } + }, + "node_modules/sade": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/sade/-/sade-1.8.1.tgz", + "integrity": "sha512-xal3CZX1Xlo/k4ApwCFrHVACi9fBqJ7V+mwhBsuf/1IOKbBy098Fex+Wa/5QMubw09pSZ/u8EY8PWgevJsXp1A==", + "license": "MIT", + "dependencies": { + "mri": "^1.1.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT" + }, + "node_modules/safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", + "license": "MIT" + }, + "node_modules/sass": { + "version": "1.93.0", + "resolved": "https://registry.npmjs.org/sass/-/sass-1.93.0.tgz", + "integrity": "sha512-CQi5/AzCwiubU3dSqRDJ93RfOfg/hhpW1l6wCIvolmehfwgCI35R/0QDs1+R+Ygrl8jFawwwIojE2w47/mf94A==", + "license": "MIT", + "dependencies": { + "chokidar": "^4.0.0", + "immutable": "^5.0.2", + "source-map-js": ">=0.6.2 <2.0.0" + }, + "bin": { + "sass": "sass.js" + }, + "engines": { + "node": ">=14.0.0" + }, + "optionalDependencies": { + "@parcel/watcher": "^2.4.1" + } + }, + "node_modules/sass-loader": { + "version": "16.0.5", + "resolved": "https://registry.npmjs.org/sass-loader/-/sass-loader-16.0.5.tgz", + "integrity": "sha512-oL+CMBXrj6BZ/zOq4os+UECPL+bWqt6OAC6DWS8Ln8GZRcMDjlJ4JC3FBDuHJdYaFWIdKNIBYmtZtK2MaMkNIw==", + "license": "MIT", + "dependencies": { + "neo-async": "^2.6.2" + }, + "engines": { + "node": ">= 18.12.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "@rspack/core": "0.x || 1.x", + "node-sass": "^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0 || ^9.0.0", + "sass": "^1.3.0", + "sass-embedded": "*", + "webpack": "^5.0.0" + }, + "peerDependenciesMeta": { + "@rspack/core": { + "optional": true + }, + "node-sass": { + "optional": true + }, + "sass": { + "optional": true + }, + "sass-embedded": { + "optional": true + }, + "webpack": { + "optional": true + } + } + }, + "node_modules/sass/node_modules/chokidar": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-4.0.3.tgz", + "integrity": "sha512-Qgzu8kfBvo+cA4962jnP1KkS6Dop5NS6g7R5LFYJr4b8Ub94PPQXUksCw9PvXoeXPRRddRNC5C1JQUR2SMGtnA==", + "license": "MIT", + "dependencies": { + "readdirp": "^4.0.1" + }, + "engines": { + "node": ">= 14.16.0" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/sass/node_modules/readdirp": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-4.1.2.tgz", + "integrity": "sha512-GDhwkLfywWL2s6vEjyhri+eXmfH6j1L7JE27WhqLeYzoh/A3DBaYGEj2H/HFZCn/kMfim73FXxEJTw06WtxQwg==", + "license": "MIT", + "engines": { + "node": ">= 14.18.0" + }, + "funding": { + "type": "individual", + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/sax": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/sax/-/sax-1.4.1.tgz", + "integrity": "sha512-+aWOz7yVScEGoKNd4PA10LZ8sk0A/z5+nXQG5giUO5rprX9jgYsTdov9qCchZiPIZezbZH+jRut8nPodFAX4Jg==", + "license": "ISC" + }, + "node_modules/scheduler": { + "version": "0.26.0", + "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.26.0.tgz", + "integrity": "sha512-NlHwttCI/l5gCPR3D1nNXtWABUmBwvZpEQiD4IXSbIDq8BzLIK/7Ir5gTFSGZDUu37K5cMNp0hFtzO38sC7gWA==", + "license": "MIT" + }, + "node_modules/schema-dts": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/schema-dts/-/schema-dts-1.1.5.tgz", + "integrity": "sha512-RJr9EaCmsLzBX2NDiO5Z3ux2BVosNZN5jo0gWgsyKvxKIUL5R3swNvoorulAeL9kLB0iTSX7V6aokhla2m7xbg==", + "license": "Apache-2.0" + }, + "node_modules/schema-utils": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.3.2.tgz", + "integrity": "sha512-Gn/JaSk/Mt9gYubxTtSn/QCV4em9mpAPiR1rqy/Ocu19u/G9J5WWdNoUT4SiV6mFC3y6cxyFcFwdzPM3FgxGAQ==", + "license": "MIT", + "dependencies": { + "@types/json-schema": "^7.0.9", + "ajv": "^8.9.0", + "ajv-formats": "^2.1.1", + "ajv-keywords": "^5.1.0" + }, + "engines": { + "node": ">= 10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } + }, + "node_modules/search-insights": { + "version": "2.17.3", + "resolved": "https://registry.npmjs.org/search-insights/-/search-insights-2.17.3.tgz", + "integrity": "sha512-RQPdCYTa8A68uM2jwxoY842xDhvx3E5LFL1LxvxCNMev4o5mLuokczhzjAgGwUZBAmOKZknArSxLKmXtIi2AxQ==", + "license": "MIT", + "peer": true + }, + "node_modules/section-matter": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/section-matter/-/section-matter-1.0.0.tgz", + "integrity": "sha512-vfD3pmTzGpufjScBh50YHKzEu2lxBWhVEHsNGoEXmCmn2hKGfeNLYMzCJpe8cD7gqX7TJluOVpBkAequ6dgMmA==", + "license": "MIT", + "dependencies": { + "extend-shallow": "^2.0.1", + "kind-of": "^6.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/select-hose": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/select-hose/-/select-hose-2.0.0.tgz", + "integrity": "sha512-mEugaLK+YfkijB4fx0e6kImuJdCIt2LxCRcbEYPqRGCs4F2ogyfZU5IAZRdjCP8JPq2AtdNoC/Dux63d9Kiryg==", + "license": "MIT" + }, + "node_modules/selfsigned": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/selfsigned/-/selfsigned-2.4.1.tgz", + "integrity": "sha512-th5B4L2U+eGLq1TVh7zNRGBapioSORUeymIydxgFpwww9d2qyKvtuPU2jJuHvYAwwqi2Y596QBL3eEqcPEYL8Q==", + "license": "MIT", + "dependencies": { + "@types/node-forge": "^1.3.0", + "node-forge": "^1" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/semver": { + "version": "7.7.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.2.tgz", + "integrity": "sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA==", + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/semver-diff": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/semver-diff/-/semver-diff-4.0.0.tgz", + "integrity": "sha512-0Ju4+6A8iOnpL/Thra7dZsSlOHYAHIeMxfhWQRI1/VLcT3WDBZKKtQt/QkBOsiIN9ZpuvHE6cGZ0x4glCMmfiA==", + "license": "MIT", + "dependencies": { + "semver": "^7.3.5" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/send": { + "version": "0.19.0", + "resolved": "https://registry.npmjs.org/send/-/send-0.19.0.tgz", + "integrity": "sha512-dW41u5VfLXu8SJh5bwRmyYUbAoSB3c9uQh6L8h/KtsFREPWpbX1lrljJo186Jc4nmci/sGUZ9a0a0J2zgfq2hw==", + "license": "MIT", + "dependencies": { + "debug": "2.6.9", + "depd": "2.0.0", + "destroy": "1.2.0", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "fresh": "0.5.2", + "http-errors": "2.0.0", + "mime": "1.6.0", + "ms": "2.1.3", + "on-finished": "2.4.1", + "range-parser": "~1.2.1", + "statuses": "2.0.1" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/send/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "license": "MIT", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/send/node_modules/debug/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "license": "MIT" + }, + "node_modules/send/node_modules/encodeurl": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", + "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/send/node_modules/range-parser": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", + "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/serialize-javascript": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.2.tgz", + "integrity": "sha512-Saa1xPByTTq2gdeFZYLLo+RFE35NHZkAbqZeWNd3BpzppeVisAqpDjcp8dyf6uIvEqJRd46jemmyA4iFIeVk8g==", + "license": "BSD-3-Clause", + "dependencies": { + "randombytes": "^2.1.0" + } + }, + "node_modules/serve-handler": { + "version": "6.1.6", + "resolved": "https://registry.npmjs.org/serve-handler/-/serve-handler-6.1.6.tgz", + "integrity": "sha512-x5RL9Y2p5+Sh3D38Fh9i/iQ5ZK+e4xuXRd/pGbM4D13tgo/MGwbttUk8emytcr1YYzBYs+apnUngBDFYfpjPuQ==", + "license": "MIT", + "dependencies": { + "bytes": "3.0.0", + "content-disposition": "0.5.2", + "mime-types": "2.1.18", + "minimatch": "3.1.2", + "path-is-inside": "1.0.2", + "path-to-regexp": "3.3.0", + "range-parser": "1.2.0" + } + }, + "node_modules/serve-handler/node_modules/brace-expansion": { + "version": "1.1.12", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz", + "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/serve-handler/node_modules/mime-db": { + "version": "1.33.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.33.0.tgz", + "integrity": "sha512-BHJ/EKruNIqJf/QahvxwQZXKygOQ256myeN/Ew+THcAa5q+PjyTTMMeNQC4DZw5AwfvelsUrA6B67NKMqXDbzQ==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/serve-handler/node_modules/mime-types": { + "version": "2.1.18", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.18.tgz", + "integrity": "sha512-lc/aahn+t4/SWV/qcmumYjymLsWfN3ELhpmVuUFjgsORruuZPVSwAQryq+HHGvO/SI2KVX26bx+En+zhM8g8hQ==", + "license": "MIT", + "dependencies": { + "mime-db": "~1.33.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/serve-handler/node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "license": "ISC", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/serve-handler/node_modules/path-to-regexp": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-3.3.0.tgz", + "integrity": "sha512-qyCH421YQPS2WFDxDjftfc1ZR5WKQzVzqsp4n9M2kQhVOo/ByahFoUNJfl58kOcEGfQ//7weFTDhm+ss8Ecxgw==", + "license": "MIT" + }, + "node_modules/serve-index": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/serve-index/-/serve-index-1.9.1.tgz", + "integrity": "sha512-pXHfKNP4qujrtteMrSBb0rc8HJ9Ms/GrXwcUtUtD5s4ewDJI8bT3Cz2zTVRMKtri49pLx2e0Ya8ziP5Ya2pZZw==", + "license": "MIT", + "dependencies": { + "accepts": "~1.3.4", + "batch": "0.6.1", + "debug": "2.6.9", + "escape-html": "~1.0.3", + "http-errors": "~1.6.2", + "mime-types": "~2.1.17", + "parseurl": "~1.3.2" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/serve-index/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "license": "MIT", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/serve-index/node_modules/depd": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", + "integrity": "sha512-7emPTl6Dpo6JRXOXjLRxck+FlLRX5847cLKEn00PLAgc3g2hTZZgr+e4c2v6QpSmLeFP3n5yUo7ft6avBK/5jQ==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/serve-index/node_modules/http-errors": { + "version": "1.6.3", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.6.3.tgz", + "integrity": "sha512-lks+lVC8dgGyh97jxvxeYTWQFvh4uw4yC12gVl63Cg30sjPX4wuGcdkICVXDAESr6OJGjqGA8Iz5mkeN6zlD7A==", + "license": "MIT", + "dependencies": { + "depd": "~1.1.2", + "inherits": "2.0.3", + "setprototypeof": "1.1.0", + "statuses": ">= 1.4.0 < 2" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/serve-index/node_modules/inherits": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "integrity": "sha512-x00IRNXNy63jwGkJmzPigoySHbaqpNuzKbBOmzK+g2OdZpQ9w+sxCN+VSB3ja7IAge2OP2qpfxTjeNcyjmW1uw==", + "license": "ISC" + }, + "node_modules/serve-index/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "license": "MIT" + }, + "node_modules/serve-index/node_modules/setprototypeof": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.0.tgz", + "integrity": "sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ==", + "license": "ISC" + }, + "node_modules/serve-index/node_modules/statuses": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", + "integrity": "sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/serve-static": { + "version": "1.16.2", + "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.16.2.tgz", + "integrity": "sha512-VqpjJZKadQB/PEbEwvFdO43Ax5dFBZ2UECszz8bQ7pi7wt//PWe1P6MN7eCnjsatYtBT6EuiClbjSWP2WrIoTw==", + "license": "MIT", + "dependencies": { + "encodeurl": "~2.0.0", + "escape-html": "~1.0.3", + "parseurl": "~1.3.3", + "send": "0.19.0" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/set-function-length": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.2.tgz", + "integrity": "sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==", + "license": "MIT", + "dependencies": { + "define-data-property": "^1.1.4", + "es-errors": "^1.3.0", + "function-bind": "^1.1.2", + "get-intrinsic": "^1.2.4", + "gopd": "^1.0.1", + "has-property-descriptors": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/setprototypeof": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", + "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==", + "license": "ISC" + }, + "node_modules/shallow-clone": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/shallow-clone/-/shallow-clone-3.0.1.tgz", + "integrity": "sha512-/6KqX+GVUdqPuPPd2LxDDxzX6CAbjJehAAOKlNpqqUpAqPM6HeL8f+o3a+JsyGjn2lv0WY8UsTgUJjU9Ok55NA==", + "license": "MIT", + "dependencies": { + "kind-of": "^6.0.2" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/shallowequal": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/shallowequal/-/shallowequal-1.1.0.tgz", + "integrity": "sha512-y0m1JoUZSlPAjXVtPPW70aZWfIL/dSP7AFkRnniLCrK/8MDKog3TySTBmckD+RObVxH0v4Tox67+F14PdED2oQ==", + "license": "MIT" + }, + "node_modules/shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "license": "MIT", + "dependencies": { + "shebang-regex": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/shell-quote": { + "version": "1.8.3", + "resolved": "https://registry.npmjs.org/shell-quote/-/shell-quote-1.8.3.tgz", + "integrity": "sha512-ObmnIF4hXNg1BqhnHmgbDETF8dLPCggZWBjkQfhZpbszZnYur5DUljTcCHii5LC3J5E0yeO/1LIMyH+UvHQgyw==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/shelljs": { + "version": "0.8.5", + "resolved": "https://registry.npmjs.org/shelljs/-/shelljs-0.8.5.tgz", + "integrity": "sha512-TiwcRcrkhHvbrZbnRcFYMLl30Dfov3HKqzp5tO5b4pt6G/SezKcYhmDg15zXVBswHmctSAQKznqNW2LO5tTDow==", + "license": "BSD-3-Clause", + "dependencies": { + "glob": "^7.0.0", + "interpret": "^1.0.0", + "rechoir": "^0.6.2" + }, + "bin": { + "shjs": "bin/shjs" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/should": { + "version": "13.2.3", + "resolved": "https://registry.npmjs.org/should/-/should-13.2.3.tgz", + "integrity": "sha512-ggLesLtu2xp+ZxI+ysJTmNjh2U0TsC+rQ/pfED9bUZZ4DKefP27D+7YJVVTvKsmjLpIi9jAa7itwDGkDDmt1GQ==", + "license": "MIT", + "dependencies": { + "should-equal": "^2.0.0", + "should-format": "^3.0.3", + "should-type": "^1.4.0", + "should-type-adaptors": "^1.0.1", + "should-util": "^1.0.0" + } + }, + "node_modules/should-equal": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/should-equal/-/should-equal-2.0.0.tgz", + "integrity": "sha512-ZP36TMrK9euEuWQYBig9W55WPC7uo37qzAEmbjHz4gfyuXrEUgF8cUvQVO+w+d3OMfPvSRQJ22lSm8MQJ43LTA==", + "license": "MIT", + "dependencies": { + "should-type": "^1.4.0" + } + }, + "node_modules/should-format": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/should-format/-/should-format-3.0.3.tgz", + "integrity": "sha512-hZ58adtulAk0gKtua7QxevgUaXTTXxIi8t41L3zo9AHvjXO1/7sdLECuHeIN2SRtYXpNkmhoUP2pdeWgricQ+Q==", + "license": "MIT", + "dependencies": { + "should-type": "^1.3.0", + "should-type-adaptors": "^1.0.1" + } + }, + "node_modules/should-type": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/should-type/-/should-type-1.4.0.tgz", + "integrity": "sha512-MdAsTu3n25yDbIe1NeN69G4n6mUnJGtSJHygX3+oN0ZbO3DTiATnf7XnYJdGT42JCXurTb1JI0qOBR65shvhPQ==", + "license": "MIT" + }, + "node_modules/should-type-adaptors": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/should-type-adaptors/-/should-type-adaptors-1.1.0.tgz", + "integrity": "sha512-JA4hdoLnN+kebEp2Vs8eBe9g7uy0zbRo+RMcU0EsNy+R+k049Ki+N5tT5Jagst2g7EAja+euFuoXFCa8vIklfA==", + "license": "MIT", + "dependencies": { + "should-type": "^1.3.0", + "should-util": "^1.0.0" + } + }, + "node_modules/should-util": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/should-util/-/should-util-1.0.1.tgz", + "integrity": "sha512-oXF8tfxx5cDk8r2kYqlkUJzZpDBqVY/II2WhvU0n9Y3XYvAYRmeaf1PvvIvTgPnv4KJ+ES5M0PyDq5Jp+Ygy2g==", + "license": "MIT" + }, + "node_modules/side-channel": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.1.0.tgz", + "integrity": "sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw==", + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "object-inspect": "^1.13.3", + "side-channel-list": "^1.0.0", + "side-channel-map": "^1.0.1", + "side-channel-weakmap": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/side-channel-list": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/side-channel-list/-/side-channel-list-1.0.0.tgz", + "integrity": "sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA==", + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "object-inspect": "^1.13.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/side-channel-map": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/side-channel-map/-/side-channel-map-1.0.1.tgz", + "integrity": "sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA==", + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.5", + "object-inspect": "^1.13.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/side-channel-weakmap": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/side-channel-weakmap/-/side-channel-weakmap-1.0.2.tgz", + "integrity": "sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==", + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.5", + "object-inspect": "^1.13.3", + "side-channel-map": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/signal-exit": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", + "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", + "license": "ISC" + }, + "node_modules/sirv": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/sirv/-/sirv-2.0.4.tgz", + "integrity": "sha512-94Bdh3cC2PKrbgSOUqTiGPWVZeSiXfKOVZNJniWoqrWrRkB1CJzBU3NEbiTsPcYy1lDsANA/THzS+9WBiy5nfQ==", + "license": "MIT", + "dependencies": { + "@polka/url": "^1.0.0-next.24", + "mrmime": "^2.0.0", + "totalist": "^3.0.0" + }, + "engines": { + "node": ">= 10" + } + }, + "node_modules/sisteransi": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/sisteransi/-/sisteransi-1.0.5.tgz", + "integrity": "sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==", + "license": "MIT" + }, + "node_modules/sitemap": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/sitemap/-/sitemap-7.1.2.tgz", + "integrity": "sha512-ARCqzHJ0p4gWt+j7NlU5eDlIO9+Rkr/JhPFZKKQ1l5GCus7rJH4UdrlVAh0xC/gDS/Qir2UMxqYNHtsKr2rpCw==", + "license": "MIT", + "dependencies": { + "@types/node": "^17.0.5", + "@types/sax": "^1.2.1", + "arg": "^5.0.0", + "sax": "^1.2.4" + }, + "bin": { + "sitemap": "dist/cli.js" + }, + "engines": { + "node": ">=12.0.0", + "npm": ">=5.6.0" + } + }, + "node_modules/sitemap/node_modules/@types/node": { + "version": "17.0.45", + "resolved": "https://registry.npmjs.org/@types/node/-/node-17.0.45.tgz", + "integrity": "sha512-w+tIMs3rq2afQdsPJlODhoUEKzFP1ayaoyl1CcnwtIlsVe7K7bA1NGm4s3PraqTLlXnbIN84zuBlxBWo1u9BLw==", + "license": "MIT" + }, + "node_modules/skin-tone": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/skin-tone/-/skin-tone-2.0.0.tgz", + "integrity": "sha512-kUMbT1oBJCpgrnKoSr0o6wPtvRWT9W9UKvGLwfJYO2WuahZRHOpEyL1ckyMGgMWh0UdpmaoFqKKD29WTomNEGA==", + "license": "MIT", + "dependencies": { + "unicode-emoji-modifier-base": "^1.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/slash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", + "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/slugify": { + "version": "1.6.6", + "resolved": "https://registry.npmjs.org/slugify/-/slugify-1.6.6.tgz", + "integrity": "sha512-h+z7HKHYXj6wJU+AnS/+IH8Uh9fdcX1Lrhg1/VMdf9PwoBQXFcXiAdsy2tSK0P6gKwJLXp02r90ahUCqHk9rrw==", + "license": "MIT", + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/snake-case": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/snake-case/-/snake-case-3.0.4.tgz", + "integrity": "sha512-LAOh4z89bGQvl9pFfNF8V146i7o7/CqFPbqzYgP+yYzDIDeS9HaNFtXABamRW+AQzEVODcvE79ljJ+8a9YSdMg==", + "license": "MIT", + "dependencies": { + "dot-case": "^3.0.4", + "tslib": "^2.0.3" + } + }, + "node_modules/sockjs": { + "version": "0.3.24", + "resolved": "https://registry.npmjs.org/sockjs/-/sockjs-0.3.24.tgz", + "integrity": "sha512-GJgLTZ7vYb/JtPSSZ10hsOYIvEYsjbNU+zPdIHcUaWVNUEPivzxku31865sSSud0Da0W4lEeOPlmw93zLQchuQ==", + "license": "MIT", + "dependencies": { + "faye-websocket": "^0.11.3", + "uuid": "^8.3.2", + "websocket-driver": "^0.7.4" + } + }, + "node_modules/sort-css-media-queries": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/sort-css-media-queries/-/sort-css-media-queries-2.2.0.tgz", + "integrity": "sha512-0xtkGhWCC9MGt/EzgnvbbbKhqWjl1+/rncmhTh5qCpbYguXh6S/qwePfv/JQ8jePXXmqingylxoC49pCkSPIbA==", + "license": "MIT", + "engines": { + "node": ">= 6.3.0" + } + }, + "node_modules/source-map": { + "version": "0.7.6", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.6.tgz", + "integrity": "sha512-i5uvt8C3ikiWeNZSVZNWcfZPItFQOsYTUAOkcUPGd8DqDy1uOUikjt5dG+uRlwyvR108Fb9DOd4GvXfT0N2/uQ==", + "license": "BSD-3-Clause", + "engines": { + "node": ">= 12" + } + }, + "node_modules/source-map-js": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz", + "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==", + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/source-map-support": { + "version": "0.5.21", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz", + "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==", + "license": "MIT", + "dependencies": { + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" + } + }, + "node_modules/source-map-support/node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/space-separated-tokens": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/space-separated-tokens/-/space-separated-tokens-2.0.2.tgz", + "integrity": "sha512-PEGlAwrG8yXGXRjW32fGbg66JAlOAwbObuqVoJpv/mRgoWDQfgH1wDPvtzWyUSNAXBGSk8h755YDbbcEy3SH2Q==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/spdy": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/spdy/-/spdy-4.0.2.tgz", + "integrity": "sha512-r46gZQZQV+Kl9oItvl1JZZqJKGr+oEkB08A6BzkiR7593/7IbtuncXHd2YoYeTsG4157ZssMu9KYvUHLcjcDoA==", + "license": "MIT", + "dependencies": { + "debug": "^4.1.0", + "handle-thing": "^2.0.0", + "http-deceiver": "^1.2.7", + "select-hose": "^2.0.0", + "spdy-transport": "^3.0.0" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/spdy-transport": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/spdy-transport/-/spdy-transport-3.0.0.tgz", + "integrity": "sha512-hsLVFE5SjA6TCisWeJXFKniGGOpBgMLmerfO2aCyCU5s7nJ/rpAepqmFifv/GCbSbueEeAJJnmSQ2rKC/g8Fcw==", + "license": "MIT", + "dependencies": { + "debug": "^4.1.0", + "detect-node": "^2.0.4", + "hpack.js": "^2.1.6", + "obuf": "^1.1.2", + "readable-stream": "^3.0.6", + "wbuf": "^1.7.3" + } + }, + "node_modules/sprintf-js": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", + "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==", + "license": "BSD-3-Clause" + }, + "node_modules/srcset": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/srcset/-/srcset-4.0.0.tgz", + "integrity": "sha512-wvLeHgcVHKO8Sc/H/5lkGreJQVeYMm9rlmt8PuR1xE31rIuXhuzznUUqAt8MqLhB3MqJdFzlNAfpcWnxiFUcPw==", + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/statuses": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", + "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/std-env": { + "version": "3.9.0", + "resolved": "https://registry.npmjs.org/std-env/-/std-env-3.9.0.tgz", + "integrity": "sha512-UGvjygr6F6tpH7o2qyqR6QYpwraIjKSdtzyBdyytFOHmPZY917kwdwLG0RbOjWOnKmnm3PeHjaoLLMie7kPLQw==", + "license": "MIT" + }, + "node_modules/string_decoder": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", + "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", + "license": "MIT", + "dependencies": { + "safe-buffer": "~5.2.0" + } + }, + "node_modules/string-width": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", + "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", + "license": "MIT", + "dependencies": { + "eastasianwidth": "^0.2.0", + "emoji-regex": "^9.2.2", + "strip-ansi": "^7.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/string-width-cjs": { + "name": "string-width", + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "license": "MIT", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/string-width-cjs/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "license": "MIT" + }, + "node_modules/string-width/node_modules/ansi-regex": { + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.2.2.tgz", + "integrity": "sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg==", + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" + } + }, + "node_modules/string-width/node_modules/strip-ansi": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.2.tgz", + "integrity": "sha512-gmBGslpoQJtgnMAvOVqGZpEz9dyoKTCzy2nfz/n8aIFhN/jCE/rCmcxabB6jOOHV+0WNnylOxaxBQPSvcWklhA==", + "license": "MIT", + "dependencies": { + "ansi-regex": "^6.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" + } + }, + "node_modules/stringify-entities": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/stringify-entities/-/stringify-entities-4.0.4.tgz", + "integrity": "sha512-IwfBptatlO+QCJUo19AqvrPNqlVMpW9YEL2LIVY+Rpv2qsjCGxaDLNRgeGsQWJhfItebuJhsGSLjaBbNSQ+ieg==", + "license": "MIT", + "dependencies": { + "character-entities-html4": "^2.0.0", + "character-entities-legacy": "^3.0.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/stringify-object": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/stringify-object/-/stringify-object-3.3.0.tgz", + "integrity": "sha512-rHqiFh1elqCQ9WPLIC8I0Q/g/wj5J1eMkyoiD6eoQApWHP0FtlK7rqnhmabL5VUY9JQCcqwwvlOaSuutekgyrw==", + "license": "BSD-2-Clause", + "dependencies": { + "get-own-enumerable-property-symbols": "^3.0.0", + "is-obj": "^1.0.1", + "is-regexp": "^1.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-ansi-cjs": { + "name": "strip-ansi", + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-bom-string": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/strip-bom-string/-/strip-bom-string-1.0.0.tgz", + "integrity": "sha512-uCC2VHvQRYu+lMh4My/sFNmF2klFymLX1wHJeXnbEJERpV/ZsVuonzerjfrGpIGF7LBVa1O7i9kjiWvJiFck8g==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/strip-final-newline": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz", + "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/strip-json-comments": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", + "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", + "license": "MIT", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/style-to-js": { + "version": "1.1.17", + "resolved": "https://registry.npmjs.org/style-to-js/-/style-to-js-1.1.17.tgz", + "integrity": "sha512-xQcBGDxJb6jjFCTzvQtfiPn6YvvP2O8U1MDIPNfJQlWMYfktPy+iGsHE7cssjs7y84d9fQaK4UF3RIJaAHSoYA==", + "license": "MIT", + "dependencies": { + "style-to-object": "1.0.9" + } + }, + "node_modules/style-to-js/node_modules/inline-style-parser": { + "version": "0.2.4", + "resolved": "https://registry.npmjs.org/inline-style-parser/-/inline-style-parser-0.2.4.tgz", + "integrity": "sha512-0aO8FkhNZlj/ZIbNi7Lxxr12obT7cL1moPfE4tg1LkX7LlLfC6DeX4l2ZEud1ukP9jNQyNnfzQVqwbwmAATY4Q==", + "license": "MIT" + }, + "node_modules/style-to-js/node_modules/style-to-object": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/style-to-object/-/style-to-object-1.0.9.tgz", + "integrity": "sha512-G4qppLgKu/k6FwRpHiGiKPaPTFcG3g4wNVX/Qsfu+RqQM30E7Tyu/TEgxcL9PNLF5pdRLwQdE3YKKf+KF2Dzlw==", + "license": "MIT", + "dependencies": { + "inline-style-parser": "0.2.4" + } + }, + "node_modules/style-to-object": { + "version": "0.4.4", + "resolved": "https://registry.npmjs.org/style-to-object/-/style-to-object-0.4.4.tgz", + "integrity": "sha512-HYNoHZa2GorYNyqiCaBgsxvcJIn7OHq6inEga+E6Ke3m5JkoqpQbnFssk4jwe+K7AhGa2fcha4wSOf1Kn01dMg==", + "license": "MIT", + "dependencies": { + "inline-style-parser": "0.1.1" + } + }, + "node_modules/stylehacks": { + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/stylehacks/-/stylehacks-6.1.1.tgz", + "integrity": "sha512-gSTTEQ670cJNoaeIp9KX6lZmm8LJ3jPB5yJmX8Zq/wQxOsAFXV3qjWzHas3YYk1qesuVIyYWWUpZ0vSE/dTSGg==", + "license": "MIT", + "dependencies": { + "browserslist": "^4.23.0", + "postcss-selector-parser": "^6.0.16" + }, + "engines": { + "node": "^14 || ^16 || >=18.0" + }, + "peerDependencies": { + "postcss": "^8.4.31" + } + }, + "node_modules/sucrase": { + "version": "3.35.0", + "resolved": "https://registry.npmjs.org/sucrase/-/sucrase-3.35.0.tgz", + "integrity": "sha512-8EbVDiu9iN/nESwxeSxDKe0dunta1GOlHufmSSXxMD2z2/tMZpDMpvXQGsc+ajGo8y2uYUmixaSRUc/QPoQ0GA==", + "license": "MIT", + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.2", + "commander": "^4.0.0", + "glob": "^10.3.10", + "lines-and-columns": "^1.1.6", + "mz": "^2.7.0", + "pirates": "^4.0.1", + "ts-interface-checker": "^0.1.9" + }, + "bin": { + "sucrase": "bin/sucrase", + "sucrase-node": "bin/sucrase-node" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + } + }, + "node_modules/sucrase/node_modules/commander": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/commander/-/commander-4.1.1.tgz", + "integrity": "sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==", + "license": "MIT", + "engines": { + "node": ">= 6" + } + }, + "node_modules/sucrase/node_modules/glob": { + "version": "10.4.5", + "resolved": "https://registry.npmjs.org/glob/-/glob-10.4.5.tgz", + "integrity": "sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==", + "license": "ISC", + "dependencies": { + "foreground-child": "^3.1.0", + "jackspeak": "^3.1.2", + "minimatch": "^9.0.4", + "minipass": "^7.1.2", + "package-json-from-dist": "^1.0.0", + "path-scurry": "^1.11.1" + }, + "bin": { + "glob": "dist/esm/bin.mjs" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/sucrase/node_modules/minimatch": { + "version": "9.0.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", + "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", + "license": "ISC", + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/supports-preserve-symlinks-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", + "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/svg-parser": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/svg-parser/-/svg-parser-2.0.4.tgz", + "integrity": "sha512-e4hG1hRwoOdRb37cIMSgzNsxyzKfayW6VOflrwvR+/bzrkyxY/31WkbgnQpgtrNp1SdpJvpUAGTa/ZoiPNDuRQ==", + "license": "MIT" + }, + "node_modules/svgo": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/svgo/-/svgo-3.3.2.tgz", + "integrity": "sha512-OoohrmuUlBs8B8o6MB2Aevn+pRIH9zDALSR+6hhqVfa6fRwG/Qw9VUMSMW9VNg2CFc/MTIfabtdOVl9ODIJjpw==", + "license": "MIT", + "dependencies": { + "@trysound/sax": "0.2.0", + "commander": "^7.2.0", + "css-select": "^5.1.0", + "css-tree": "^2.3.1", + "css-what": "^6.1.0", + "csso": "^5.0.5", + "picocolors": "^1.0.0" + }, + "bin": { + "svgo": "bin/svgo" + }, + "engines": { + "node": ">=14.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/svgo" + } + }, + "node_modules/svgo/node_modules/commander": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-7.2.0.tgz", + "integrity": "sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==", + "license": "MIT", + "engines": { + "node": ">= 10" + } + }, + "node_modules/swagger2openapi": { + "version": "7.0.8", + "resolved": "https://registry.npmjs.org/swagger2openapi/-/swagger2openapi-7.0.8.tgz", + "integrity": "sha512-upi/0ZGkYgEcLeGieoz8gT74oWHA0E7JivX7aN9mAf+Tc7BQoRBvnIGHoPDw+f9TXTW4s6kGYCZJtauP6OYp7g==", + "license": "BSD-3-Clause", + "dependencies": { + "call-me-maybe": "^1.0.1", + "node-fetch": "^2.6.1", + "node-fetch-h2": "^2.3.0", + "node-readfiles": "^0.2.0", + "oas-kit-common": "^1.0.8", + "oas-resolver": "^2.5.6", + "oas-schema-walker": "^1.1.5", + "oas-validator": "^5.0.8", + "reftools": "^1.1.9", + "yaml": "^1.10.0", + "yargs": "^17.0.1" + }, + "bin": { + "boast": "boast.js", + "oas-validate": "oas-validate.js", + "swagger2openapi": "swagger2openapi.js" + }, + "funding": { + "url": "https://github.com/Mermade/oas-kit?sponsor=1" + } + }, + "node_modules/tapable": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.2.3.tgz", + "integrity": "sha512-ZL6DDuAlRlLGghwcfmSn9sK3Hr6ArtyudlSAiCqQ6IfE+b+HHbydbYDIG15IfS5do+7XQQBdBiubF/cV2dnDzg==", + "license": "MIT", + "engines": { + "node": ">=6" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } + }, + "node_modules/terser": { + "version": "5.44.0", + "resolved": "https://registry.npmjs.org/terser/-/terser-5.44.0.tgz", + "integrity": "sha512-nIVck8DK+GM/0Frwd+nIhZ84pR/BX7rmXMfYwyg+Sri5oGVE99/E3KvXqpC2xHFxyqXyGHTKBSioxxplrO4I4w==", + "license": "BSD-2-Clause", + "dependencies": { + "@jridgewell/source-map": "^0.3.3", + "acorn": "^8.15.0", + "commander": "^2.20.0", + "source-map-support": "~0.5.20" + }, + "bin": { + "terser": "bin/terser" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/terser-webpack-plugin": { + "version": "5.3.14", + "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.3.14.tgz", + "integrity": "sha512-vkZjpUjb6OMS7dhV+tILUW6BhpDR7P2L/aQSAv+Uwk+m8KATX9EccViHTJR2qDtACKPIYndLGCyl3FMo+r2LMw==", + "license": "MIT", + "dependencies": { + "@jridgewell/trace-mapping": "^0.3.25", + "jest-worker": "^27.4.5", + "schema-utils": "^4.3.0", + "serialize-javascript": "^6.0.2", + "terser": "^5.31.1" + }, + "engines": { + "node": ">= 10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^5.1.0" + }, + "peerDependenciesMeta": { + "@swc/core": { + "optional": true + }, + "esbuild": { + "optional": true + }, + "uglify-js": { + "optional": true + } + } + }, + "node_modules/terser-webpack-plugin/node_modules/jest-worker": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-27.5.1.tgz", + "integrity": "sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg==", + "license": "MIT", + "dependencies": { + "@types/node": "*", + "merge-stream": "^2.0.0", + "supports-color": "^8.0.0" + }, + "engines": { + "node": ">= 10.13.0" + } + }, + "node_modules/terser-webpack-plugin/node_modules/supports-color": { + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", + "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/supports-color?sponsor=1" + } + }, + "node_modules/terser/node_modules/commander": { + "version": "2.20.3", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", + "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", + "license": "MIT" + }, + "node_modules/thenify": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/thenify/-/thenify-3.3.1.tgz", + "integrity": "sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==", + "license": "MIT", + "dependencies": { + "any-promise": "^1.0.0" + } + }, + "node_modules/thenify-all": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/thenify-all/-/thenify-all-1.6.0.tgz", + "integrity": "sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA==", + "license": "MIT", + "dependencies": { + "thenify": ">= 3.1.0 < 4" + }, + "engines": { + "node": ">=0.8" + } + }, + "node_modules/thunky": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/thunky/-/thunky-1.1.0.tgz", + "integrity": "sha512-eHY7nBftgThBqOyHGVN+l8gF0BucP09fMo0oO/Lb0w1OF80dJv+lDVpXG60WMQvkcxAkNybKsrEIE3ZtKGmPrA==", + "license": "MIT" + }, + "node_modules/tiny-invariant": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/tiny-invariant/-/tiny-invariant-1.3.3.tgz", + "integrity": "sha512-+FbBPE1o9QAYvviau/qC5SE3caw21q3xkvWKBtja5vgqOWIHHJ3ioaq1VPfn/Szqctz2bU/oYeKd9/z5BL+PVg==", + "license": "MIT" + }, + "node_modules/tiny-warning": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/tiny-warning/-/tiny-warning-1.0.3.tgz", + "integrity": "sha512-lBN9zLN/oAf68o3zNXYrdCt1kP8WsiGW8Oo2ka41b2IM5JL/S1CTyX1rW0mb/zSuJun0ZUrDxx4sqvYS2FWzPA==", + "license": "MIT" + }, + "node_modules/tinypool": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/tinypool/-/tinypool-1.1.1.tgz", + "integrity": "sha512-Zba82s87IFq9A9XmjiX5uZA/ARWDrB03OHlq+Vw1fSdt0I+4/Kutwy8BP4Y/y/aORMo61FQ0vIb5j44vSo5Pkg==", + "license": "MIT", + "engines": { + "node": "^18.0.0 || >=20.0.0" + } + }, + "node_modules/to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "license": "MIT", + "dependencies": { + "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/toidentifier": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", + "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==", + "license": "MIT", + "engines": { + "node": ">=0.6" + } + }, + "node_modules/totalist": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/totalist/-/totalist-3.0.1.tgz", + "integrity": "sha512-sf4i37nQ2LBx4m3wB74y+ubopq6W/dIzXg0FDGjsYnZHVa1Da8FH853wlL2gtUhg+xJXjfk3kUZS3BRoQeoQBQ==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/tr46": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", + "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==", + "license": "MIT" + }, + "node_modules/trim-lines": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/trim-lines/-/trim-lines-3.0.1.tgz", + "integrity": "sha512-kRj8B+YHZCc9kQYdWfJB2/oUl9rA99qbowYYBtr4ui4mZyAQ2JpvVBd/6U2YloATfqBhBTSMhTpgBHtU0Mf3Rg==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/trough": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/trough/-/trough-2.2.0.tgz", + "integrity": "sha512-tmMpK00BjZiUyVyvrBK7knerNgmgvcV/KLVyuma/SC+TQN167GrMRciANTz09+k3zW8L8t60jWO1GpfkZdjTaw==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/ts-interface-checker": { + "version": "0.1.13", + "resolved": "https://registry.npmjs.org/ts-interface-checker/-/ts-interface-checker-0.1.13.tgz", + "integrity": "sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==", + "license": "Apache-2.0" + }, + "node_modules/tslib": { + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", + "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", + "license": "0BSD" + }, + "node_modules/type-fest": { + "version": "2.19.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-2.19.0.tgz", + "integrity": "sha512-RAH822pAdBgcNMAfWnCBU3CFZcfZ/i1eZjwFU/dsLKumyuuP3niueg2UAukXYF0E2AAoc82ZSSf9J0WQBinzHA==", + "license": "(MIT OR CC0-1.0)", + "engines": { + "node": ">=12.20" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/type-is": { + "version": "1.6.18", + "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", + "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", + "license": "MIT", + "dependencies": { + "media-typer": "0.3.0", + "mime-types": "~2.1.24" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/typedarray-to-buffer": { + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz", + "integrity": "sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q==", + "license": "MIT", + "dependencies": { + "is-typedarray": "^1.0.0" + } + }, + "node_modules/undici": { + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/undici/-/undici-7.16.0.tgz", + "integrity": "sha512-QEg3HPMll0o3t2ourKwOeUAZ159Kn9mx5pnzHRQO8+Wixmh88YdZRiIwat0iNzNNXn0yoEtXJqFpyW7eM8BV7g==", + "license": "MIT", + "engines": { + "node": ">=20.18.1" + } + }, + "node_modules/undici-types": { + "version": "7.12.0", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-7.12.0.tgz", + "integrity": "sha512-goOacqME2GYyOZZfb5Lgtu+1IDmAlAEu5xnD3+xTzS10hT0vzpf0SPjkXwAw9Jm+4n/mQGDP3LO8CPbYROeBfQ==", + "license": "MIT" + }, + "node_modules/unicode-canonical-property-names-ecmascript": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-2.0.1.tgz", + "integrity": "sha512-dA8WbNeb2a6oQzAQ55YlT5vQAWGV9WXOsi3SskE3bcCdM0P4SDd+24zS/OCacdRq5BkdsRj9q3Pg6YyQoxIGqg==", + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/unicode-emoji-modifier-base": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unicode-emoji-modifier-base/-/unicode-emoji-modifier-base-1.0.0.tgz", + "integrity": "sha512-yLSH4py7oFH3oG/9K+XWrz1pSi3dfUrWEnInbxMfArOfc1+33BlGPQtLsOYwvdMy11AwUBetYuaRxSPqgkq+8g==", + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/unicode-match-property-ecmascript": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/unicode-match-property-ecmascript/-/unicode-match-property-ecmascript-2.0.0.tgz", + "integrity": "sha512-5kaZCrbp5mmbz5ulBkDkbY0SsPOjKqVS35VpL9ulMPfSl0J0Xsm+9Evphv9CoIZFwre7aJoa94AY6seMKGVN5Q==", + "license": "MIT", + "dependencies": { + "unicode-canonical-property-names-ecmascript": "^2.0.0", + "unicode-property-aliases-ecmascript": "^2.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/unicode-match-property-value-ecmascript": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-2.2.1.tgz", + "integrity": "sha512-JQ84qTuMg4nVkx8ga4A16a1epI9H6uTXAknqxkGF/aFfRLw1xC/Bp24HNLaZhHSkWd3+84t8iXnp1J0kYcZHhg==", + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/unicode-property-aliases-ecmascript": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-2.2.0.tgz", + "integrity": "sha512-hpbDzxUY9BFwX+UeBnxv3Sh1q7HFxj48DTmXchNgRa46lO8uj3/1iEn3MiNUYTg1g9ctIqXCCERn8gYZhHC5lQ==", + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/unified": { + "version": "11.0.5", + "resolved": "https://registry.npmjs.org/unified/-/unified-11.0.5.tgz", + "integrity": "sha512-xKvGhPWw3k84Qjh8bI3ZeJjqnyadK+GEFtazSfZv/rKeTkTjOJho6mFqh2SM96iIcZokxiOpg78GazTSg8+KHA==", + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0", + "bail": "^2.0.0", + "devlop": "^1.0.0", + "extend": "^3.0.0", + "is-plain-obj": "^4.0.0", + "trough": "^2.0.0", + "vfile": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unique-string": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/unique-string/-/unique-string-3.0.0.tgz", + "integrity": "sha512-VGXBUVwxKMBUznyffQweQABPRRW1vHZAbadFZud4pLFAqRGvv/96vafgjWFqzourzr8YonlQiPgH0YCJfawoGQ==", + "license": "MIT", + "dependencies": { + "crypto-random-string": "^4.0.0" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/unist-util-generated": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/unist-util-generated/-/unist-util-generated-2.0.1.tgz", + "integrity": "sha512-qF72kLmPxAw0oN2fwpWIqbXAVyEqUzDHMsbtPvOudIlUzXYFIeQIuxXQCRCFh22B7cixvU0MG7m3MW8FTq/S+A==", + "license": "MIT", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unist-util-is": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/unist-util-is/-/unist-util-is-6.0.0.tgz", + "integrity": "sha512-2qCTHimwdxLfz+YzdGfkqNlH0tLi9xjTnHddPmJwtIG9MGsdbutfTc4P+haPD7l7Cjxf/WZj+we5qfVPvvxfYw==", + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unist-util-position": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/unist-util-position/-/unist-util-position-5.0.0.tgz", + "integrity": "sha512-fucsC7HjXvkB5R3kTCO7kUjRdrS0BJt3M/FPxmHMBOm8JQi2BsHAHFsy27E0EolP8rp0NzXsJ+jNPyDWvOJZPA==", + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unist-util-position-from-estree": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/unist-util-position-from-estree/-/unist-util-position-from-estree-2.0.0.tgz", + "integrity": "sha512-KaFVRjoqLyF6YXCbVLNad/eS4+OfPQQn2yOd7zF/h5T/CSL2v8NpN6a5TPvtbXthAGw5nG+PuTtq+DdIZr+cRQ==", + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unist-util-stringify-position": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/unist-util-stringify-position/-/unist-util-stringify-position-4.0.0.tgz", + "integrity": "sha512-0ASV06AAoKCDkS2+xw5RXJywruurpbC4JZSm7nr7MOt1ojAzvyyaO+UxZf18j8FCF6kmzCZKcAgN/yu2gm2XgQ==", + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unist-util-visit": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/unist-util-visit/-/unist-util-visit-5.0.0.tgz", + "integrity": "sha512-MR04uvD+07cwl/yhVuVWAtw+3GOR/knlL55Nd/wAdblk27GCVt3lqpTivy/tkJcZoNPzTwS1Y+KMojlLDhoTzg==", + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0", + "unist-util-is": "^6.0.0", + "unist-util-visit-parents": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unist-util-visit-parents": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/unist-util-visit-parents/-/unist-util-visit-parents-6.0.1.tgz", + "integrity": "sha512-L/PqWzfTP9lzzEa6CKs0k2nARxTdZduw3zyh8d2NVBnsyvHjSX4TWse388YrrQKbvI8w20fGjGlhgT96WwKykw==", + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0", + "unist-util-is": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/universalify": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz", + "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==", + "license": "MIT", + "engines": { + "node": ">= 10.0.0" + } + }, + "node_modules/unpipe": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", + "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/update-browserslist-db": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.1.3.tgz", + "integrity": "sha512-UxhIZQ+QInVdunkDAaiazvvT/+fXL5Osr0JZlJulepYu6Jd7qJtDZjlur0emRlT71EN3ScPoE7gvsuIKKNavKw==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "escalade": "^3.2.0", + "picocolors": "^1.1.1" + }, + "bin": { + "update-browserslist-db": "cli.js" + }, + "peerDependencies": { + "browserslist": ">= 4.21.0" + } + }, + "node_modules/update-notifier": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/update-notifier/-/update-notifier-6.0.2.tgz", + "integrity": "sha512-EDxhTEVPZZRLWYcJ4ZXjGFN0oP7qYvbXWzEgRm/Yql4dHX5wDbvh89YHP6PK1lzZJYrMtXUuZZz8XGK+U6U1og==", + "license": "BSD-2-Clause", + "dependencies": { + "boxen": "^7.0.0", + "chalk": "^5.0.1", + "configstore": "^6.0.0", + "has-yarn": "^3.0.0", + "import-lazy": "^4.0.0", + "is-ci": "^3.0.1", + "is-installed-globally": "^0.4.0", + "is-npm": "^6.0.0", + "is-yarn-global": "^0.4.0", + "latest-version": "^7.0.0", + "pupa": "^3.1.0", + "semver": "^7.3.7", + "semver-diff": "^4.0.0", + "xdg-basedir": "^5.1.0" + }, + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/yeoman/update-notifier?sponsor=1" + } + }, + "node_modules/update-notifier/node_modules/boxen": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/boxen/-/boxen-7.1.1.tgz", + "integrity": "sha512-2hCgjEmP8YLWQ130n2FerGv7rYpfBmnmp9Uy2Le1vge6X3gZIfSmEzP5QTDElFxcvVcXlEn8Aq6MU/PZygIOog==", + "license": "MIT", + "dependencies": { + "ansi-align": "^3.0.1", + "camelcase": "^7.0.1", + "chalk": "^5.2.0", + "cli-boxes": "^3.0.0", + "string-width": "^5.1.2", + "type-fest": "^2.13.0", + "widest-line": "^4.0.1", + "wrap-ansi": "^8.1.0" + }, + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/update-notifier/node_modules/camelcase": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-7.0.1.tgz", + "integrity": "sha512-xlx1yCK2Oc1APsPXDL2LdlNP6+uu8OCDdhOBSVT279M/S+y75O30C2VuD8T2ogdePBBl7PfPF4504tnLgX3zfw==", + "license": "MIT", + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/update-notifier/node_modules/chalk": { + "version": "5.6.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.6.2.tgz", + "integrity": "sha512-7NzBL0rN6fMUW+f7A6Io4h40qQlG+xGmtMxfbnH/K7TAtt8JQWVQK+6g0UXKMeVJoyV5EkkNsErQ8pVD3bLHbA==", + "license": "MIT", + "engines": { + "node": "^12.17.0 || ^14.13 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/uri-js": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", + "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", + "license": "BSD-2-Clause", + "dependencies": { + "punycode": "^2.1.0" + } + }, + "node_modules/uri-js-replace": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/uri-js-replace/-/uri-js-replace-1.0.1.tgz", + "integrity": "sha512-W+C9NWNLFOoBI2QWDp4UT9pv65r2w5Cx+3sTYFvtMdDBxkKt1syCqsUdSFAChbEe1uK5TfS04wt/nGwmaeIQ0g==", + "license": "MIT" + }, + "node_modules/url": { + "version": "0.11.4", + "resolved": "https://registry.npmjs.org/url/-/url-0.11.4.tgz", + "integrity": "sha512-oCwdVC7mTuWiPyjLUz/COz5TLk6wgp0RCsN+wHZ2Ekneac9w8uuV0njcbbie2ME+Vs+d6duwmYuR3HgQXs1fOg==", + "license": "MIT", + "dependencies": { + "punycode": "^1.4.1", + "qs": "^6.12.3" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/url-loader": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/url-loader/-/url-loader-4.1.1.tgz", + "integrity": "sha512-3BTV812+AVHHOJQO8O5MkWgZ5aosP7GnROJwvzLS9hWDj00lZ6Z0wNak423Lp9PBZN05N+Jk/N5Si8jRAlGyWA==", + "license": "MIT", + "dependencies": { + "loader-utils": "^2.0.0", + "mime-types": "^2.1.27", + "schema-utils": "^3.0.0" + }, + "engines": { + "node": ">= 10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "file-loader": "*", + "webpack": "^4.0.0 || ^5.0.0" + }, + "peerDependenciesMeta": { + "file-loader": { + "optional": true + } + } + }, + "node_modules/url-loader/node_modules/ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "license": "MIT", + "dependencies": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/url-loader/node_modules/ajv-keywords": { + "version": "3.5.2", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", + "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==", + "license": "MIT", + "peerDependencies": { + "ajv": "^6.9.1" + } + }, + "node_modules/url-loader/node_modules/json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "license": "MIT" + }, + "node_modules/url-loader/node_modules/schema-utils": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.3.0.tgz", + "integrity": "sha512-pN/yOAvcC+5rQ5nERGuwrjLlYvLTbCibnZ1I7B1LaiAz9BRBlE9GMgE/eqV30P7aJQUf7Ddimy/RsbYO/GrVGg==", + "license": "MIT", + "dependencies": { + "@types/json-schema": "^7.0.8", + "ajv": "^6.12.5", + "ajv-keywords": "^3.5.2" + }, + "engines": { + "node": ">= 10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } + }, + "node_modules/url/node_modules/punycode": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", + "integrity": "sha512-jmYNElW7yvO7TV33CjSmvSiE2yco3bV2czu/OzDKdMNVZQWfxCblURLhf+47syQRBntjfLdd/H0egrzIG+oaFQ==", + "license": "MIT" + }, + "node_modules/use-editable": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/use-editable/-/use-editable-2.3.3.tgz", + "integrity": "sha512-7wVD2JbfAFJ3DK0vITvXBdpd9JAz5BcKAAolsnLBuBn6UDDwBGuCIAGvR3yA2BNKm578vAMVHFCWaOcA+BhhiA==", + "license": "MIT", + "peerDependencies": { + "react": ">= 16.8.0" + } + }, + "node_modules/util": { + "version": "0.10.4", + "resolved": "https://registry.npmjs.org/util/-/util-0.10.4.tgz", + "integrity": "sha512-0Pm9hTQ3se5ll1XihRic3FDIku70C+iHUdT/W926rSgHV5QgXsYbKZN8MSC3tJtSkhuROzvsQjAaFENRXr+19A==", + "license": "MIT", + "dependencies": { + "inherits": "2.0.3" + } + }, + "node_modules/util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", + "license": "MIT" + }, + "node_modules/util/node_modules/inherits": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "integrity": "sha512-x00IRNXNy63jwGkJmzPigoySHbaqpNuzKbBOmzK+g2OdZpQ9w+sxCN+VSB3ja7IAge2OP2qpfxTjeNcyjmW1uw==", + "license": "ISC" + }, + "node_modules/utila": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/utila/-/utila-0.4.0.tgz", + "integrity": "sha512-Z0DbgELS9/L/75wZbro8xAnT50pBVFQZ+hUEueGDU5FN51YSCYM+jdxsfCiHjwNP/4LCDD0i/graKpeBnOXKRA==", + "license": "MIT" + }, + "node_modules/utility-types": { + "version": "3.11.0", + "resolved": "https://registry.npmjs.org/utility-types/-/utility-types-3.11.0.tgz", + "integrity": "sha512-6Z7Ma2aVEWisaL6TvBCy7P8rm2LQoPv6dJ7ecIaIixHcwfbJ0x7mWdbcwlIM5IGQxPZSFYeqRCqlOOeKoJYMkw==", + "license": "MIT", + "engines": { + "node": ">= 4" + } + }, + "node_modules/utils-merge": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", + "integrity": "sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==", + "license": "MIT", + "engines": { + "node": ">= 0.4.0" + } + }, + "node_modules/uuid": { + "version": "8.3.2", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", + "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", + "license": "MIT", + "bin": { + "uuid": "dist/bin/uuid" + } + }, + "node_modules/uvu": { + "version": "0.5.6", + "resolved": "https://registry.npmjs.org/uvu/-/uvu-0.5.6.tgz", + "integrity": "sha512-+g8ENReyr8YsOc6fv/NVJs2vFdHBnBNdfE49rshrTzDWOlUx4Gq7KOS2GD8eqhy2j+Ejq29+SbKH8yjkAqXqoA==", + "license": "MIT", + "dependencies": { + "dequal": "^2.0.0", + "diff": "^5.0.0", + "kleur": "^4.0.3", + "sade": "^1.7.3" + }, + "bin": { + "uvu": "bin.js" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/uvu/node_modules/kleur": { + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/kleur/-/kleur-4.1.5.tgz", + "integrity": "sha512-o+NO+8WrRiQEE4/7nwRJhN1HWpVmJm511pBHUxPLtp0BUISzlBplORYSmTclCnJvQq2tKu/sgl3xVpkc7ZWuQQ==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/validate.io-array": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/validate.io-array/-/validate.io-array-1.0.6.tgz", + "integrity": "sha512-DeOy7CnPEziggrOO5CZhVKJw6S3Yi7e9e65R1Nl/RTN1vTQKnzjfvks0/8kQ40FP/dsjRAOd4hxmJ7uLa6vxkg==", + "license": "MIT" + }, + "node_modules/validate.io-function": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/validate.io-function/-/validate.io-function-1.0.2.tgz", + "integrity": "sha512-LlFybRJEriSuBnUhQyG5bwglhh50EpTL2ul23MPIuR1odjO7XaMLFV8vHGwp7AZciFxtYOeiSCT5st+XSPONiQ==" + }, + "node_modules/validate.io-integer": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/validate.io-integer/-/validate.io-integer-1.0.5.tgz", + "integrity": "sha512-22izsYSLojN/P6bppBqhgUDjCkr5RY2jd+N2a3DCAUey8ydvrZ/OkGvFPR7qfOpwR2LC5p4Ngzxz36g5Vgr/hQ==", + "dependencies": { + "validate.io-number": "^1.0.3" + } + }, + "node_modules/validate.io-integer-array": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/validate.io-integer-array/-/validate.io-integer-array-1.0.0.tgz", + "integrity": "sha512-mTrMk/1ytQHtCY0oNO3dztafHYyGU88KL+jRxWuzfOmQb+4qqnWmI+gykvGp8usKZOM0H7keJHEbRaFiYA0VrA==", + "dependencies": { + "validate.io-array": "^1.0.3", + "validate.io-integer": "^1.0.4" + } + }, + "node_modules/validate.io-number": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/validate.io-number/-/validate.io-number-1.0.3.tgz", + "integrity": "sha512-kRAyotcbNaSYoDnXvb4MHg/0a1egJdLwS6oJ38TJY7aw9n93Fl/3blIXdyYvPOp55CNxywooG/3BcrwNrBpcSg==" + }, + "node_modules/value-equal": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/value-equal/-/value-equal-1.0.1.tgz", + "integrity": "sha512-NOJ6JZCAWr0zlxZt+xqCHNTEKOsrks2HQd4MqhP1qy4z1SkbEP467eNx6TgDKXMvUOb+OENfJCZwM+16n7fRfw==", + "license": "MIT" + }, + "node_modules/vary": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", + "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/vfile": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/vfile/-/vfile-6.0.3.tgz", + "integrity": "sha512-KzIbH/9tXat2u30jf+smMwFCsno4wHVdNmzFyL+T/L3UGqqk6JKfVqOFOZEpZSHADH1k40ab6NUIXZq422ov3Q==", + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0", + "vfile-message": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/vfile-location": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/vfile-location/-/vfile-location-5.0.3.tgz", + "integrity": "sha512-5yXvWDEgqeiYiBe1lbxYF7UMAIm/IcopxMHrMQDq3nvKcjPKIhZklUKL+AE7J7uApI4kwe2snsK+eI6UTj9EHg==", + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0", + "vfile": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/vfile-message": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/vfile-message/-/vfile-message-4.0.3.tgz", + "integrity": "sha512-QTHzsGd1EhbZs4AsQ20JX1rC3cOlt/IWJruk893DfLRr57lcnOeMaWG4K0JrRta4mIJZKth2Au3mM3u03/JWKw==", + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0", + "unist-util-stringify-position": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/warning": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/warning/-/warning-4.0.3.tgz", + "integrity": "sha512-rpJyN222KWIvHJ/F53XSZv0Zl/accqHR8et1kpaMTD/fLCRxtV8iX8czMzY7sVZupTI3zcUTg8eycS2kNF9l6w==", + "license": "MIT", + "dependencies": { + "loose-envify": "^1.0.0" + } + }, + "node_modules/watchpack": { + "version": "2.4.4", + "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.4.4.tgz", + "integrity": "sha512-c5EGNOiyxxV5qmTtAB7rbiXxi1ooX1pQKMLX/MIabJjRA0SJBQOjKF+KSVfHkr9U1cADPon0mRiVe/riyaiDUA==", + "license": "MIT", + "dependencies": { + "glob-to-regexp": "^0.4.1", + "graceful-fs": "^4.1.2" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/wbuf": { + "version": "1.7.3", + "resolved": "https://registry.npmjs.org/wbuf/-/wbuf-1.7.3.tgz", + "integrity": "sha512-O84QOnr0icsbFGLS0O3bI5FswxzRr8/gHwWkDlQFskhSPryQXvrTMxjxGP4+iWYoauLoBvfDpkrOauZ+0iZpDA==", + "license": "MIT", + "dependencies": { + "minimalistic-assert": "^1.0.0" + } + }, + "node_modules/web-namespaces": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/web-namespaces/-/web-namespaces-2.0.1.tgz", + "integrity": "sha512-bKr1DkiNa2krS7qxNtdrtHAmzuYGFQLiQ13TsorsdT6ULTkPLKuu5+GsFpDlg6JFjUTwX2DyhMPG2be8uPrqsQ==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/webidl-conversions": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", + "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==", + "license": "BSD-2-Clause" + }, + "node_modules/webpack": { + "version": "5.101.3", + "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.101.3.tgz", + "integrity": "sha512-7b0dTKR3Ed//AD/6kkx/o7duS8H3f1a4w3BYpIriX4BzIhjkn4teo05cptsxvLesHFKK5KObnadmCHBwGc+51A==", + "license": "MIT", + "dependencies": { + "@types/eslint-scope": "^3.7.7", + "@types/estree": "^1.0.8", + "@types/json-schema": "^7.0.15", + "@webassemblyjs/ast": "^1.14.1", + "@webassemblyjs/wasm-edit": "^1.14.1", + "@webassemblyjs/wasm-parser": "^1.14.1", + "acorn": "^8.15.0", + "acorn-import-phases": "^1.0.3", + "browserslist": "^4.24.0", + "chrome-trace-event": "^1.0.2", + "enhanced-resolve": "^5.17.3", + "es-module-lexer": "^1.2.1", + "eslint-scope": "5.1.1", + "events": "^3.2.0", + "glob-to-regexp": "^0.4.1", + "graceful-fs": "^4.2.11", + "json-parse-even-better-errors": "^2.3.1", + "loader-runner": "^4.2.0", + "mime-types": "^2.1.27", + "neo-async": "^2.6.2", + "schema-utils": "^4.3.2", + "tapable": "^2.1.1", + "terser-webpack-plugin": "^5.3.11", + "watchpack": "^2.4.1", + "webpack-sources": "^3.3.3" + }, + "bin": { + "webpack": "bin/webpack.js" + }, + "engines": { + "node": ">=10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependenciesMeta": { + "webpack-cli": { + "optional": true + } + } + }, + "node_modules/webpack-bundle-analyzer": { + "version": "4.10.2", + "resolved": "https://registry.npmjs.org/webpack-bundle-analyzer/-/webpack-bundle-analyzer-4.10.2.tgz", + "integrity": "sha512-vJptkMm9pk5si4Bv922ZbKLV8UTT4zib4FPgXMhgzUny0bfDDkLXAVQs3ly3fS4/TN9ROFtb0NFrm04UXFE/Vw==", + "license": "MIT", + "dependencies": { + "@discoveryjs/json-ext": "0.5.7", + "acorn": "^8.0.4", + "acorn-walk": "^8.0.0", + "commander": "^7.2.0", + "debounce": "^1.2.1", + "escape-string-regexp": "^4.0.0", + "gzip-size": "^6.0.0", + "html-escaper": "^2.0.2", + "opener": "^1.5.2", + "picocolors": "^1.0.0", + "sirv": "^2.0.3", + "ws": "^7.3.1" + }, + "bin": { + "webpack-bundle-analyzer": "lib/bin/analyzer.js" + }, + "engines": { + "node": ">= 10.13.0" + } + }, + "node_modules/webpack-bundle-analyzer/node_modules/commander": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-7.2.0.tgz", + "integrity": "sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==", + "license": "MIT", + "engines": { + "node": ">= 10" + } + }, + "node_modules/webpack-dev-middleware": { + "version": "5.3.4", + "resolved": "https://registry.npmjs.org/webpack-dev-middleware/-/webpack-dev-middleware-5.3.4.tgz", + "integrity": "sha512-BVdTqhhs+0IfoeAf7EoH5WE+exCmqGerHfDM0IL096Px60Tq2Mn9MAbnaGUe6HiMa41KMCYF19gyzZmBcq/o4Q==", + "license": "MIT", + "dependencies": { + "colorette": "^2.0.10", + "memfs": "^3.4.3", + "mime-types": "^2.1.31", + "range-parser": "^1.2.1", + "schema-utils": "^4.0.0" + }, + "engines": { + "node": ">= 12.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^4.0.0 || ^5.0.0" + } + }, + "node_modules/webpack-dev-middleware/node_modules/colorette": { + "version": "2.0.20", + "resolved": "https://registry.npmjs.org/colorette/-/colorette-2.0.20.tgz", + "integrity": "sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w==", + "license": "MIT" + }, + "node_modules/webpack-dev-middleware/node_modules/range-parser": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", + "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/webpack-dev-server": { + "version": "4.15.2", + "resolved": "https://registry.npmjs.org/webpack-dev-server/-/webpack-dev-server-4.15.2.tgz", + "integrity": "sha512-0XavAZbNJ5sDrCbkpWL8mia0o5WPOd2YGtxrEiZkBK9FjLppIUK2TgxK6qGD2P3hUXTJNNPVibrerKcx5WkR1g==", + "license": "MIT", + "dependencies": { + "@types/bonjour": "^3.5.9", + "@types/connect-history-api-fallback": "^1.3.5", + "@types/express": "^4.17.13", + "@types/serve-index": "^1.9.1", + "@types/serve-static": "^1.13.10", + "@types/sockjs": "^0.3.33", + "@types/ws": "^8.5.5", + "ansi-html-community": "^0.0.8", + "bonjour-service": "^1.0.11", + "chokidar": "^3.5.3", + "colorette": "^2.0.10", + "compression": "^1.7.4", + "connect-history-api-fallback": "^2.0.0", + "default-gateway": "^6.0.3", + "express": "^4.17.3", + "graceful-fs": "^4.2.6", + "html-entities": "^2.3.2", + "http-proxy-middleware": "^2.0.3", + "ipaddr.js": "^2.0.1", + "launch-editor": "^2.6.0", + "open": "^8.0.9", + "p-retry": "^4.5.0", + "rimraf": "^3.0.2", + "schema-utils": "^4.0.0", + "selfsigned": "^2.1.1", + "serve-index": "^1.9.1", + "sockjs": "^0.3.24", + "spdy": "^4.0.2", + "webpack-dev-middleware": "^5.3.4", + "ws": "^8.13.0" + }, + "bin": { + "webpack-dev-server": "bin/webpack-dev-server.js" + }, + "engines": { + "node": ">= 12.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^4.37.0 || ^5.0.0" + }, + "peerDependenciesMeta": { + "webpack": { + "optional": true + }, + "webpack-cli": { + "optional": true + } + } + }, + "node_modules/webpack-dev-server/node_modules/colorette": { + "version": "2.0.20", + "resolved": "https://registry.npmjs.org/colorette/-/colorette-2.0.20.tgz", + "integrity": "sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w==", + "license": "MIT" + }, + "node_modules/webpack-dev-server/node_modules/ws": { + "version": "8.18.3", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.18.3.tgz", + "integrity": "sha512-PEIGCY5tSlUt50cqyMXfCzX+oOPqN0vuGqWzbcJ2xvnkzkq46oOpz7dQaTDBdfICb4N14+GARUDw2XV2N4tvzg==", + "license": "MIT", + "engines": { + "node": ">=10.0.0" + }, + "peerDependencies": { + "bufferutil": "^4.0.1", + "utf-8-validate": ">=5.0.2" + }, + "peerDependenciesMeta": { + "bufferutil": { + "optional": true + }, + "utf-8-validate": { + "optional": true + } + } + }, + "node_modules/webpack-merge": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/webpack-merge/-/webpack-merge-6.0.1.tgz", + "integrity": "sha512-hXXvrjtx2PLYx4qruKl+kyRSLc52V+cCvMxRjmKwoA+CBbbF5GfIBtR6kCvl0fYGqTUPKB+1ktVmTHqMOzgCBg==", + "license": "MIT", + "dependencies": { + "clone-deep": "^4.0.1", + "flat": "^5.0.2", + "wildcard": "^2.0.1" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/webpack-sources": { + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-3.3.3.tgz", + "integrity": "sha512-yd1RBzSGanHkitROoPFd6qsrxt+oFhg/129YzheDGqeustzX0vTZJZsSsQjVQC4yzBQ56K55XU8gaNCtIzOnTg==", + "license": "MIT", + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/webpackbar": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/webpackbar/-/webpackbar-6.0.1.tgz", + "integrity": "sha512-TnErZpmuKdwWBdMoexjio3KKX6ZtoKHRVvLIU0A47R0VVBDtx3ZyOJDktgYixhoJokZTYTt1Z37OkO9pnGJa9Q==", + "license": "MIT", + "dependencies": { + "ansi-escapes": "^4.3.2", + "chalk": "^4.1.2", + "consola": "^3.2.3", + "figures": "^3.2.0", + "markdown-table": "^2.0.0", + "pretty-time": "^1.1.0", + "std-env": "^3.7.0", + "wrap-ansi": "^7.0.0" + }, + "engines": { + "node": ">=14.21.3" + }, + "peerDependencies": { + "webpack": "3 || 4 || 5" + } + }, + "node_modules/webpackbar/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "license": "MIT" + }, + "node_modules/webpackbar/node_modules/markdown-table": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/markdown-table/-/markdown-table-2.0.0.tgz", + "integrity": "sha512-Ezda85ToJUBhM6WGaG6veasyym+Tbs3cMAw/ZhOPqXiYsr0jgocBV3j3nx+4lk47plLlIqjwuTm/ywVI+zjJ/A==", + "license": "MIT", + "dependencies": { + "repeat-string": "^1.0.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/webpackbar/node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "license": "MIT", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/webpackbar/node_modules/wrap-ansi": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/websocket-driver": { + "version": "0.7.4", + "resolved": "https://registry.npmjs.org/websocket-driver/-/websocket-driver-0.7.4.tgz", + "integrity": "sha512-b17KeDIQVjvb0ssuSDF2cYXSg2iztliJ4B9WdsuB6J952qCPKmnVq4DyW5motImXHDC1cBT/1UezrJVsKw5zjg==", + "license": "Apache-2.0", + "dependencies": { + "http-parser-js": ">=0.5.1", + "safe-buffer": ">=5.1.0", + "websocket-extensions": ">=0.1.1" + }, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/websocket-extensions": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/websocket-extensions/-/websocket-extensions-0.1.4.tgz", + "integrity": "sha512-OqedPIGOfsDlo31UNwYbCFMSaO9m9G/0faIHj5/dZFDMFqPTcx6UwqyOy3COEaEOg/9VsGIpdqn62W5KhoKSpg==", + "license": "Apache-2.0", + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/whatwg-encoding": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/whatwg-encoding/-/whatwg-encoding-3.1.1.tgz", + "integrity": "sha512-6qN4hJdMwfYBtE3YBTTHhoeuUrDBPZmbQaxWAqSALV/MeEnR5z1xd8UKud2RAkFoPkmB+hli1TZSnyi84xz1vQ==", + "license": "MIT", + "dependencies": { + "iconv-lite": "0.6.3" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/whatwg-mimetype": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/whatwg-mimetype/-/whatwg-mimetype-4.0.0.tgz", + "integrity": "sha512-QaKxh0eNIi2mE9p2vEdzfagOKHCcj1pJ56EEHGQOVxp8r9/iszLUUV7v89x9O1p/T+NlTM5W7jW6+cz4Fq1YVg==", + "license": "MIT", + "engines": { + "node": ">=18" + } + }, + "node_modules/whatwg-url": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", + "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==", + "license": "MIT", + "dependencies": { + "tr46": "~0.0.3", + "webidl-conversions": "^3.0.0" + } + }, + "node_modules/which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "license": "ISC", + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/node-which" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/widest-line": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/widest-line/-/widest-line-4.0.1.tgz", + "integrity": "sha512-o0cyEG0e8GPzT4iGHphIOh0cJOV8fivsXxddQasHPHfoZf1ZexrfeA21w2NaEN1RHE+fXlfISmOE8R9N3u3Qig==", + "license": "MIT", + "dependencies": { + "string-width": "^5.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/wildcard": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/wildcard/-/wildcard-2.0.1.tgz", + "integrity": "sha512-CC1bOL87PIWSBhDcTrdeLo6eGT7mCFtrg0uIJtqJUFyK+eJnzl8A1niH56uu7KMa5XFrtiV+AQuHO3n7DsHnLQ==", + "license": "MIT" + }, + "node_modules/wrap-ansi": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz", + "integrity": "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==", + "license": "MIT", + "dependencies": { + "ansi-styles": "^6.1.0", + "string-width": "^5.0.1", + "strip-ansi": "^7.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/wrap-ansi-cjs": { + "name": "wrap-ansi", + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/wrap-ansi-cjs/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "license": "MIT" + }, + "node_modules/wrap-ansi-cjs/node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "license": "MIT", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/wrap-ansi/node_modules/ansi-regex": { + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.2.2.tgz", + "integrity": "sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg==", + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" + } + }, + "node_modules/wrap-ansi/node_modules/ansi-styles": { + "version": "6.2.3", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.3.tgz", + "integrity": "sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg==", + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/wrap-ansi/node_modules/strip-ansi": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.2.tgz", + "integrity": "sha512-gmBGslpoQJtgnMAvOVqGZpEz9dyoKTCzy2nfz/n8aIFhN/jCE/rCmcxabB6jOOHV+0WNnylOxaxBQPSvcWklhA==", + "license": "MIT", + "dependencies": { + "ansi-regex": "^6.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" + } + }, + "node_modules/wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", + "license": "ISC" + }, + "node_modules/write-file-atomic": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-3.0.3.tgz", + "integrity": "sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q==", + "license": "ISC", + "dependencies": { + "imurmurhash": "^0.1.4", + "is-typedarray": "^1.0.0", + "signal-exit": "^3.0.2", + "typedarray-to-buffer": "^3.1.5" + } + }, + "node_modules/ws": { + "version": "7.5.10", + "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.10.tgz", + "integrity": "sha512-+dbF1tHwZpXcbOJdVOkzLDxZP1ailvSxM6ZweXTegylPny803bFhA+vqBYw4s31NSAk4S2Qz+AKXK9a4wkdjcQ==", + "license": "MIT", + "engines": { + "node": ">=8.3.0" + }, + "peerDependencies": { + "bufferutil": "^4.0.1", + "utf-8-validate": "^5.0.2" + }, + "peerDependenciesMeta": { + "bufferutil": { + "optional": true + }, + "utf-8-validate": { + "optional": true + } + } + }, + "node_modules/xdg-basedir": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/xdg-basedir/-/xdg-basedir-5.1.0.tgz", + "integrity": "sha512-GCPAHLvrIH13+c0SuacwvRYj2SxJXQ4kaVTT5xgL3kPrz56XxkF21IGhjSE1+W0aw7gpBWRGXLCPnPby6lSpmQ==", + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/xml-formatter": { + "version": "2.6.1", + "resolved": "https://registry.npmjs.org/xml-formatter/-/xml-formatter-2.6.1.tgz", + "integrity": "sha512-dOiGwoqm8y22QdTNI7A+N03tyVfBlQ0/oehAzxIZtwnFAHGeSlrfjF73YQvzSsa/Kt6+YZasKsrdu6OIpuBggw==", + "license": "MIT", + "dependencies": { + "xml-parser-xo": "^3.2.0" + }, + "engines": { + "node": ">= 10" + } + }, + "node_modules/xml-js": { + "version": "1.6.11", + "resolved": "https://registry.npmjs.org/xml-js/-/xml-js-1.6.11.tgz", + "integrity": "sha512-7rVi2KMfwfWFl+GpPg6m80IVMWXLRjO+PxTq7V2CDhoGak0wzYzFgUY2m4XJ47OGdXd8eLE8EmwfAmdjw7lC1g==", + "license": "MIT", + "dependencies": { + "sax": "^1.2.4" + }, + "bin": { + "xml-js": "bin/cli.js" + } + }, + "node_modules/xml-parser-xo": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/xml-parser-xo/-/xml-parser-xo-3.2.0.tgz", + "integrity": "sha512-8LRU6cq+d7mVsoDaMhnkkt3CTtAs4153p49fRo+HIB3I1FD1o5CeXRjRH29sQevIfVJIcPjKSsPU/+Ujhq09Rg==", + "license": "MIT", + "engines": { + "node": ">= 10" + } + }, + "node_modules/y18n": { + "version": "5.0.8", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", + "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", + "license": "ISC", + "engines": { + "node": ">=10" + } + }, + "node_modules/yallist": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", + "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", + "license": "ISC" + }, + "node_modules/yaml": { + "version": "1.10.2", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-1.10.2.tgz", + "integrity": "sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==", + "license": "ISC", + "engines": { + "node": ">= 6" + } + }, + "node_modules/yaml-ast-parser": { + "version": "0.0.43", + "resolved": "https://registry.npmjs.org/yaml-ast-parser/-/yaml-ast-parser-0.0.43.tgz", + "integrity": "sha512-2PTINUwsRqSd+s8XxKaJWQlUuEMHJQyEuh2edBbW8KNJz0SJPwUSD2zRWqezFEdN7IzAgeuYHFUCF7o8zRdZ0A==", + "license": "Apache-2.0" + }, + "node_modules/yargs": { + "version": "17.7.2", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz", + "integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==", + "license": "MIT", + "dependencies": { + "cliui": "^8.0.1", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.3", + "y18n": "^5.0.5", + "yargs-parser": "^21.1.1" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/yargs-parser": { + "version": "21.1.1", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", + "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", + "license": "ISC", + "engines": { + "node": ">=12" + } + }, + "node_modules/yargs/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "license": "MIT" + }, + "node_modules/yargs/node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "license": "MIT", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/yocto-queue": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-1.2.1.tgz", + "integrity": "sha512-AyeEbWOu/TAXdxlV9wmGcR0+yh2j3vYPGOECcIj2S7MkrLyC7ne+oye2BKTItt0ii2PHk4cDy+95+LshzbXnGg==", + "license": "MIT", + "engines": { + "node": ">=12.20" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/zwitch": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/zwitch/-/zwitch-2.0.4.tgz", + "integrity": "sha512-bXE4cR/kVZhKZX/RjPEflHaKVhUVl85noU3v6b8apfQEc1x4A+zBxjZ4lN8LqGd6WZ3dl98pY4o717VFmoPp+A==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + } + } +} diff --git a/docs/package.json b/docs/package.json new file mode 100644 index 000000000..6bbc48eb0 --- /dev/null +++ b/docs/package.json @@ -0,0 +1,44 @@ +{ + "name": "docusaurus-template-openapi-docs", + "version": "4.3.7", + "private": true, + "scripts": { + "docusaurus": "docusaurus", + "start": "docusaurus start", + "build": "docusaurus build", + "swizzle": "docusaurus swizzle", + "deploy": "docusaurus deploy", + "clear": "docusaurus clear", + "serve": "docusaurus serve", + "write-translations": "docusaurus write-translations", + "write-heading-ids": "docusaurus write-heading-ids", + "gen-api-docs": "docusaurus gen-api-docs", + "clean-api-docs": "docusaurus clean-api-docs", + "gen-api-docs:version": "docusaurus gen-api-docs:version", + "clean-api-docs:version": "docusaurus clean-api-docs:version" + }, + "dependencies": { + "@docusaurus/core": "3.8.1", + "@docusaurus/preset-classic": "3.8.1", + "@easyops-cn/docusaurus-search-local": "^0.52.1", + "@mdx-js/react": "^3.0.0", + "clsx": "^2.0.0", + "docusaurus-plugin-openapi-docs": "4.3.7", + "docusaurus-theme-openapi-docs": "4.3.7", + "prism-react-renderer": "^2.3.0", + "react": "^19.0.0", + "react-dom": "^19.0.0" + }, + "browserslist": { + "production": [ + ">0.5%", + "not dead", + "not op_mini all" + ], + "development": [ + "last 1 chrome version", + "last 1 firefox version", + "last 1 safari version" + ] + } +} diff --git a/docs/sidebars.ts b/docs/sidebars.ts new file mode 100644 index 000000000..01c1390c1 --- /dev/null +++ b/docs/sidebars.ts @@ -0,0 +1,342 @@ +import type {SidebarsConfig} from '@docusaurus/plugin-content-docs'; + +/** + * Creating a sidebar enables you to: + - create an ordered group of docs + - render a sidebar for each doc of that group + - provide next/previous navigation + + The sidebars can be generated from the filesystem, or explicitly defined here. + + Create as many sidebars as you want. + */ +const sidebars: SidebarsConfig = { + tutorialSidebar: [ + 'index', + { + type: 'category', + label: 'Getting Started', + collapsed: false, + items: [ + 'getting_started/quickstart', + 'getting_started/detailed_tutorial', + 'getting_started/libraries', + ], + }, + { + type: 'category', + label: 'Concepts', + collapsed: false, + items: [ + 'concepts/index', + 'concepts/architecture', + { + type: 'category', + label: 'APIs', + collapsed: true, + items: [ + 'concepts/apis/index', + 'concepts/apis/api_providers', + 'concepts/apis/external', + 'concepts/apis/api_leveling', + ], + }, + 'concepts/distributions', + 'concepts/resources', + ], + }, + { + type: 'category', + label: 'Distributions', + collapsed: false, + items: [ + 'distributions/index', + 'distributions/list_of_distributions', + 'distributions/building_distro', + 'distributions/customizing_run_yaml', + 'distributions/importing_as_library', + 'distributions/configuration', + 'distributions/starting_llama_stack_server', + { + type: 'category', + label: 'Self-Hosted Distributions', + collapsed: true, + items: [ + 'distributions/self_hosted_distro/starter', + 'distributions/self_hosted_distro/dell', + 'distributions/self_hosted_distro/dell-tgi', + 'distributions/self_hosted_distro/meta-reference-gpu', + 'distributions/self_hosted_distro/nvidia', + 'distributions/self_hosted_distro/passthrough', + ], + }, + { + type: 'category', + label: 'Remote-Hosted Distributions', + collapsed: true, + items: [ + 'distributions/remote_hosted_distro/index', + 'distributions/remote_hosted_distro/watsonx', + ], + }, + { + type: 'category', + label: 'On-Device Distributions', + collapsed: true, + items: [ + 'distributions/ondevice_distro/ios_sdk', + 'distributions/ondevice_distro/android_sdk', + ], + }, + ], + }, + { + type: 'category', + label: 'Providers', + collapsed: false, + items: [ + 'providers/index', + { + type: 'category', + label: 'Inference', + collapsed: true, + items: [ + 'providers/inference/index', + 'providers/inference/inline_meta-reference', + 'providers/inference/inline_sentence-transformers', + 'providers/inference/remote_anthropic', + 'providers/inference/remote_azure', + 'providers/inference/remote_bedrock', + 'providers/inference/remote_cerebras', + 'providers/inference/remote_databricks', + 'providers/inference/remote_fireworks', + 'providers/inference/remote_gemini', + 'providers/inference/remote_groq', + 'providers/inference/remote_hf_endpoint', + 'providers/inference/remote_hf_serverless', + 'providers/inference/remote_llama-openai-compat', + 'providers/inference/remote_nvidia', + 'providers/inference/remote_ollama', + 'providers/inference/remote_openai', + 'providers/inference/remote_passthrough', + 'providers/inference/remote_runpod', + 'providers/inference/remote_sambanova', + 'providers/inference/remote_sambanova-openai-compat', + 'providers/inference/remote_tgi', + 'providers/inference/remote_together', + 'providers/inference/remote_vertexai', + 'providers/inference/remote_vllm', + 'providers/inference/remote_watsonx' + ], + }, + { + type: 'category', + label: 'Safety', + collapsed: true, + items: [ + 'providers/safety/index', + 'providers/safety/inline_code-scanner', + 'providers/safety/inline_llama-guard', + 'providers/safety/inline_prompt-guard', + 'providers/safety/remote_bedrock', + 'providers/safety/remote_nvidia', + 'providers/safety/remote_sambanova' + ], + }, + { + type: 'category', + label: 'Vector IO', + collapsed: true, + items: [ + 'providers/vector_io/index', + 'providers/vector_io/inline_chromadb', + 'providers/vector_io/inline_faiss', + 'providers/vector_io/inline_meta-reference', + 'providers/vector_io/inline_milvus', + 'providers/vector_io/inline_qdrant', + 'providers/vector_io/inline_sqlite-vec', + 'providers/vector_io/remote_chromadb', + 'providers/vector_io/remote_milvus', + 'providers/vector_io/remote_pgvector', + 'providers/vector_io/remote_qdrant', + 'providers/vector_io/remote_weaviate' + ], + }, + { + type: 'category', + label: 'Tool Runtime', + collapsed: true, + items: [ + 'providers/tool_runtime/index', + 'providers/tool_runtime/inline_rag-runtime', + 'providers/tool_runtime/remote_bing-search', + 'providers/tool_runtime/remote_brave-search', + 'providers/tool_runtime/remote_model-context-protocol', + 'providers/tool_runtime/remote_tavily-search', + 'providers/tool_runtime/remote_wolfram-alpha' + ], + }, + { + type: 'category', + label: 'Agents', + collapsed: true, + items: [ + 'providers/agents/index', + 'providers/agents/inline_meta-reference' + ], + }, + { + type: 'category', + label: 'Post Training', + collapsed: true, + items: [ + 'providers/post_training/index', + 'providers/post_training/inline_huggingface', + 'providers/post_training/inline_huggingface-cpu', + 'providers/post_training/inline_huggingface-gpu', + 'providers/post_training/inline_torchtune', + 'providers/post_training/inline_torchtune-cpu', + 'providers/post_training/inline_torchtune-gpu', + 'providers/post_training/remote_nvidia' + ], + }, + { + type: 'category', + label: 'DatasetIO', + collapsed: true, + items: [ + 'providers/datasetio/index', + 'providers/datasetio/inline_localfs', + 'providers/datasetio/remote_huggingface', + 'providers/datasetio/remote_nvidia' + ], + }, + { + type: 'category', + label: 'Scoring', + collapsed: true, + items: [ + 'providers/scoring/index', + 'providers/scoring/inline_basic', + 'providers/scoring/inline_braintrust', + 'providers/scoring/inline_llm-as-judge' + ], + }, + { + type: 'category', + label: 'Files', + collapsed: true, + items: [ + 'providers/files/index', + 'providers/files/inline_localfs', + 'providers/files/remote_s3' + ], + }, + { + type: 'category', + label: 'Eval', + collapsed: true, + items: [ + 'providers/eval/index', + 'providers/eval/inline_meta-reference', + 'providers/eval/remote_nvidia' + ], + }, + { + type: 'category', + label: 'Telemetry', + collapsed: true, + items: [ + 'providers/telemetry/index', + 'providers/telemetry/inline_meta-reference' + ], + }, + { + type: 'category', + label: 'Batches', + collapsed: true, + items: [ + 'providers/batches/index', + 'providers/batches/inline_reference' + ], + }, + { + type: 'category', + label: 'External Providers', + collapsed: true, + items: [ + 'providers/external/index', + 'providers/external/external-providers-guide', + 'providers/external/external-providers-list' + ], + }, + 'providers/openai' + ], + }, + { + type: 'category', + label: 'Building Applications', + collapsed: false, + items: [ + 'building_applications/index', + 'building_applications/rag', + 'building_applications/agent', + 'building_applications/agent_execution_loop', + 'building_applications/responses_vs_agents', + 'building_applications/tools', + 'building_applications/evals', + 'building_applications/telemetry', + 'building_applications/safety', + 'building_applications/playground', + ], + }, + { + type: 'category', + label: 'Advanced APIs', + collapsed: false, + items: [ + 'advanced_apis/post_training', + 'advanced_apis/evaluation', + 'advanced_apis/scoring', + ], + }, + { + type: 'category', + label: 'Deploying', + collapsed: false, + items: [ + 'deploying/index', + 'deploying/kubernetes_deployment', + 'deploying/aws_eks_deployment', + ], + }, + { + type: 'category', + label: 'Contributing', + collapsed: false, + items: [ + 'contributing/index', + 'contributing/new_api_provider', + 'contributing/new_vector_database', + 'contributing/testing/record-replay', + ], + }, + { + type: 'category', + label: 'References', + collapsed: false, + items: [ + 'references/index', + 'references/llama_cli_reference/index', + 'references/llama_stack_client_cli_reference', + 'references/python_sdk_reference/index', + 'references/evals_reference/index', + ], + }, + ], + + // API Reference sidebar - use plugin-generated sidebar + apiSidebar: require('./docs/api/sidebar.ts').default, +}; + +export default sidebars; diff --git a/docs/src/components/HomepageFeatures/index.js b/docs/src/components/HomepageFeatures/index.js new file mode 100644 index 000000000..78f410ba6 --- /dev/null +++ b/docs/src/components/HomepageFeatures/index.js @@ -0,0 +1,64 @@ +import React from 'react'; +import clsx from 'clsx'; +import styles from './styles.module.css'; + +const FeatureList = [ + { + title: 'Easy to Use', + Svg: require('@site/static/img/undraw_docusaurus_mountain.svg').default, + description: ( + <> + Docusaurus was designed from the ground up to be easily installed and + used to get your website up and running quickly. + + ), + }, + { + title: 'Focus on What Matters', + Svg: require('@site/static/img/undraw_docusaurus_tree.svg').default, + description: ( + <> + Docusaurus lets you focus on your docs, and we'll do the chores. Go + ahead and move your docs into the docs directory. + + ), + }, + { + title: 'Powered by React', + Svg: require('@site/static/img/undraw_docusaurus_react.svg').default, + description: ( + <> + Extend or customize your website layout by reusing React. Docusaurus can + be extended while reusing the same header and footer. + + ), + }, +]; + +function Feature({Svg, title, description}) { + return ( +
+
+ +
+
+

{title}

+

{description}

+
+
+ ); +} + +export default function HomepageFeatures() { + return ( +
+
+
+ {FeatureList.map((props, idx) => ( + + ))} +
+
+
+ ); +} diff --git a/docs/src/components/HomepageFeatures/styles.module.css b/docs/src/components/HomepageFeatures/styles.module.css new file mode 100644 index 000000000..b248eb2e5 --- /dev/null +++ b/docs/src/components/HomepageFeatures/styles.module.css @@ -0,0 +1,11 @@ +.features { + display: flex; + align-items: center; + padding: 2rem 0; + width: 100%; +} + +.featureSvg { + height: 200px; + width: 200px; +} diff --git a/docs/src/css/custom.css b/docs/src/css/custom.css new file mode 100644 index 000000000..0e4d95b9b --- /dev/null +++ b/docs/src/css/custom.css @@ -0,0 +1,191 @@ +/** + * Any CSS included here will be global. The classic template + * bundles Infima by default. Infima is a CSS framework designed to + * work well for content-centric websites. + */ + +/* You can override the default Infima variables here. */ +:root { + /* Llama Stack Original Theme - Based on llamastack.github.io */ + --ifm-color-primary: #4a4a68; + --ifm-color-primary-dark: #3a3a52; + --ifm-color-primary-darker: #332735; + --ifm-color-primary-darkest: #2b2129; + --ifm-color-primary-light: #5a5a7e; + --ifm-color-primary-lighter: #6a6a94; + --ifm-color-primary-lightest: #8080aa; + + /* Additional theme colors */ + --ifm-color-secondary: #1b263c; + --ifm-color-info: #2980b9; + --ifm-color-success: #16a085; + --ifm-color-warning: #f39c12; + --ifm-color-danger: #e74c3c; + + /* Background colors */ + --ifm-background-color: #ffffff; + --ifm-background-surface-color: #f8f9fa; + + /* Code and syntax highlighting */ + --ifm-code-font-size: 95%; + --ifm-pre-background: #1b263c; + --ifm-pre-color: #e1e5e9; + --docusaurus-highlighted-code-line-bg: rgba(51, 39, 53, 0.1); + + /* Link colors */ + --ifm-link-color: var(--ifm-color-primary); + --ifm-link-hover-color: var(--ifm-color-primary-darker); + + /* Navbar */ + --ifm-navbar-background-color: rgba(255, 255, 255, 0.95); + --ifm-navbar-shadow: 0 2px 4px rgba(0, 0, 0, 0.1); + + /* Hero section gradient - matching original theme */ + --hero-gradient: linear-gradient(90deg, #332735 0%, #1b263c 100%); + + /* OpenAPI method colors */ + --openapi-code-blue: #2980b9; + --openapi-code-green: #16a085; + --openapi-code-orange: #f39c12; + --openapi-code-red: #e74c3c; + --openapi-code-purple: #332735; +} + +/* For readability concerns, you should choose a lighter palette in dark mode. */ +[data-theme='dark'] { + /* Dark theme primary colors - lighter versions of original theme */ + --ifm-color-primary: #8080aa; + --ifm-color-primary-dark: #6a6a94; + --ifm-color-primary-darker: #5a5a7e; + --ifm-color-primary-darkest: #4a4a68; + --ifm-color-primary-light: #9090ba; + --ifm-color-primary-lighter: #a0a0ca; + --ifm-color-primary-lightest: #b0b0da; + + /* Dark theme background colors */ + --ifm-background-color: #1a1a1a; + --ifm-background-surface-color: #2a2a2a; + + /* Dark theme navbar */ + --ifm-navbar-background-color: rgba(26, 26, 26, 0.95); + + /* Dark theme code highlighting */ + --docusaurus-highlighted-code-line-bg: rgba(51, 39, 53, 0.3); + + /* Dark theme text colors */ + --ifm-font-color-base: #e1e5e9; + --ifm-font-color-secondary: #a0a6ac; +} + +/* Sidebar Method labels */ +.api-method>.menu__link { + align-items: center; + justify-content: start; +} + +.api-method>.menu__link::before { + width: 50px; + height: 20px; + font-size: 12px; + line-height: 20px; + text-transform: uppercase; + font-weight: 600; + border-radius: 0.25rem; + border: 1px solid; + margin-right: var(--ifm-spacing-horizontal); + text-align: center; + flex-shrink: 0; + border-color: transparent; + color: white; +} + +.get>.menu__link::before { + content: "get"; + background-color: var(--ifm-color-primary); +} + +.put>.menu__link::before { + content: "put"; + background-color: var(--openapi-code-blue); +} + +.post>.menu__link::before { + content: "post"; + background-color: var(--openapi-code-green); +} + +.delete>.menu__link::before { + content: "del"; + background-color: var(--openapi-code-red); +} + +.patch>.menu__link::before { + content: "patch"; + background-color: var(--openapi-code-orange); +} + +.footer--dark { + --ifm-footer-link-color: #ffffff; + --ifm-footer-title-color: #ffffff; +} + +.footer--dark .footer__link-item { + color: #ffffff; +} + +.footer--dark .footer__title { + color: #ffffff; +} + +/* OpenAPI theme fixes for light mode readability */ +/* Version badge fixes */ +.openapi__version-badge, +.theme-doc-version-badge, +[class*="version-badge"], +[class*="versionBadge"] { + background-color: #ffffff !important; + color: #333333 !important; + border: 1px solid #d1d5db !important; +} + +/* OpenAPI method badges in light mode */ +.openapi__method-badge, +[class*="method-badge"] { + color: #ffffff !important; +} + +/* Button fixes for light mode */ +.openapi__button, +.theme-api-docs-demo-panel button, +[class*="api-docs"] button, +button[class*="button"], +.openapi-explorer__response-schema button, +.openapi-tabs__operation button { + color: #ffffff !important; +} + +.openapi__button:hover, +.theme-api-docs-demo-panel button:hover, +[class*="api-docs"] button:hover, +button[class*="button"]:hover, +.openapi-explorer__response-schema button:hover, +.openapi-tabs__operation button:hover { + color: #ffffff !important; +} + +/* Navigation buttons (Next/Previous) */ +.pagination-nav__link, +.pagination-nav__label { + color: #333333 !important; +} + +.pagination-nav__link--next, +.pagination-nav__link--prev { + background-color: #ffffff !important; + border: 1px solid #d1d5db !important; +} + +.pagination-nav__link--next:hover, +.pagination-nav__link--prev:hover { + background-color: #f3f4f6 !important; +} diff --git a/docs/src/pages/index.js b/docs/src/pages/index.js new file mode 100644 index 000000000..c97959d77 --- /dev/null +++ b/docs/src/pages/index.js @@ -0,0 +1,163 @@ +import React from 'react'; +import clsx from 'clsx'; +import Layout from '@theme/Layout'; +import Link from '@docusaurus/Link'; +import useDocusaurusContext from '@docusaurus/useDocusaurusContext'; +import styles from './index.module.css'; + +function HomepageHeader() { + const {siteConfig} = useDocusaurusContext(); + return ( +
+
+
+

Build AI Applications with Llama Stack

+

+ Unified APIs for Inference, RAG, Agents, Tools, Safety, and Telemetry +

+
+ + 🚀 Get Started + + + 📚 API Reference + +
+
+
+
+ ); +} + +function QuickStart() { + return ( +
+
+
+
+

Quick Start

+

+ Get up and running with Llama Stack in just a few commands. Build your first RAG application locally. +

+
+
{`# Install uv and start Ollama
+ollama run llama3.2:3b --keepalive 60m
+
+# Run Llama Stack server
+OLLAMA_URL=http://localhost:11434 \\
+  uv run --with llama-stack \\
+  llama stack build --distro starter \\
+  --image-type venv --run
+
+# Try the Python SDK
+from llama_stack_client import LlamaStackClient
+
+client = LlamaStackClient(
+  base_url="http://localhost:8321"
+)
+
+response = client.inference.chat_completion(
+  model="Llama3.2-3B-Instruct",
+  messages=[{
+    "role": "user",
+    "content": "What is machine learning?"
+  }]
+)`}
+
+
+
+

Why Llama Stack?

+
+
+
🔗
+
+

Unified APIs

+

One consistent interface for all your AI needs - inference, safety, agents, and more.

+
+
+
+
🔄
+
+

Provider Flexibility

+

Swap between providers without code changes. Start local, deploy anywhere.

+
+
+
+
🛡️
+
+

Production Ready

+

Built-in safety, monitoring, and evaluation tools for enterprise applications.

+
+
+
+
📱
+
+

Multi-Platform

+

SDKs for Python, Node.js, iOS, Android, and REST APIs for any language.

+
+
+
+
+
+
+
+ ); +} + +function CommunityLinks() { + return ( +
+ +
+ ); +} + +export default function Home() { + const {siteConfig} = useDocusaurusContext(); + return ( + + +
+ + +
+
+ ); +} diff --git a/docs/src/pages/index.module.css b/docs/src/pages/index.module.css new file mode 100644 index 000000000..c3681653b --- /dev/null +++ b/docs/src/pages/index.module.css @@ -0,0 +1,283 @@ +/** + * CSS files with the .module.css suffix will be treated as CSS modules + * and scoped locally. + */ + +.heroBanner { + padding: 4rem 0; + text-align: center; + position: relative; + overflow: hidden; + background: var(--hero-gradient); + color: white; + display: flex; + align-items: center; +} + +.heroBanner::before { + content: ''; + position: absolute; + top: 0; + left: 0; + right: 0; + bottom: 0; + background: radial-gradient(circle at 30% 20%, rgba(255, 255, 255, 0.1) 0%, transparent 50%), + radial-gradient(circle at 70% 80%, rgba(255, 255, 255, 0.05) 0%, transparent 50%); + pointer-events: none; +} + +.heroContent { + max-width: 800px; + margin: 0 auto; +} + +.heroLogo { + height: 48px; + width: auto; + margin-bottom: 1.5rem; +} + +.heroTitle { + font-size: 2.8rem; + font-weight: 700; + margin-bottom: 1rem; + line-height: 1.2; +} + +.heroSubtitle { + font-size: 1.1rem; + font-weight: 400; + margin-bottom: 2rem; + opacity: 0.9; + line-height: 1.5; + max-width: 600px; + margin-left: auto; + margin-right: auto; +} + +.buttons { + display: flex; + align-items: center; + justify-content: center; + gap: 1rem; +} + +.heroBanner .getStartedButton { + background: white; + color: #332735; + border: 2px solid white; + font-weight: 600; + transition: all 0.3s ease; +} + +.heroBanner .getStartedButton:hover { + background: rgba(255, 255, 255, 0.9); + color: #2b2129; + border-color: rgba(255, 255, 255, 0.9); + transform: translateY(-2px); + box-shadow: 0 8px 25px rgba(0, 0, 0, 0.15); +} + +.heroBanner .apiButton { + background: transparent; + color: white; + border: 2px solid white; + font-weight: 600; + transition: all 0.3s ease; +} + +.heroBanner .apiButton:hover { + background: white; + border-color: white; + color: #332735; + transform: translateY(-2px); +} + +/* Quick Start Section */ +.quickStart { + padding: 4rem 0; + background: var(--ifm-background-color); +} + +.sectionTitle { + font-size: 2rem; + font-weight: 600; + margin-bottom: 0.75rem; + color: var(--ifm-color-emphasis-800); +} + +.sectionDescription { + font-size: 1rem; + color: var(--ifm-color-emphasis-600); + margin-bottom: 1.5rem; + line-height: 1.5; +} + +.codeBlock { + background: var(--ifm-color-gray-900); + border-radius: 8px; + padding: 1.5rem; + margin-top: 1.5rem; + box-shadow: 0 2px 10px rgba(0, 0, 0, 0.1); +} + +.codeBlock pre { + margin: 0; + padding: 0; + background: none; + border: none; +} + +.codeBlock code { + color: var(--ifm-color-gray-100); + font-family: 'Fira Code', 'Consolas', 'Monaco', monospace; + font-size: 0.9rem; + line-height: 1.6; +} + +/* Features */ +.features { + display: flex; + flex-direction: column; + gap: 1rem; + margin-top: 1.5rem; +} + +.feature { + display: flex; + align-items: flex-start; + gap: 1rem; + padding: 1rem; + border-radius: 8px; + background: var(--ifm-color-gray-50); + border: 1px solid var(--ifm-color-gray-200); + transition: all 0.2s ease; +} + +.feature:hover { + transform: translateY(-2px); + box-shadow: 0 8px 25px rgba(0, 0, 0, 0.1); + border-color: var(--ifm-color-primary-lighter); +} + +.featureIcon { + font-size: 2rem; + width: 3rem; + height: 3rem; + display: flex; + align-items: center; + justify-content: center; + background: var(--ifm-color-primary-lightest); + border-radius: 50%; + flex-shrink: 0; +} + +.feature h4 { + margin: 0 0 0.5rem 0; + font-size: 1.1rem; + font-weight: 600; + color: var(--ifm-color-emphasis-800); +} + +.feature p { + margin: 0; + color: var(--ifm-color-emphasis-600); + line-height: 1.5; +} + +/* Community Section */ +.community { + padding: 3rem 0; + background: var(--ifm-color-gray-50); + border-top: 1px solid var(--ifm-color-gray-200); +} + +.communityContent { + text-align: center; + max-width: 600px; + margin: 0 auto; +} + +.communityLinks { + display: flex; + justify-content: center; + gap: 1rem; + margin-top: 2rem; +} + +.communityButton { + display: flex; + align-items: center; + gap: 0.5rem; + font-weight: 600; + transition: all 0.3s ease; +} + +.communityButton:hover { + transform: translateY(-2px); + box-shadow: 0 8px 25px rgba(0, 0, 0, 0.1); +} + +.communityIcon { + font-size: 1.2rem; +} + +/* Responsive Design */ +@media screen and (max-width: 996px) { + .heroBanner { + padding: 3rem 2rem; + } + + .heroTitle { + font-size: 2.2rem; + } + + .heroSubtitle { + font-size: 1rem; + } + + .buttons { + flex-direction: column; + gap: 1rem; + } + + .quickStart { + padding: 3rem 0; + } + + .sectionTitle { + font-size: 1.75rem; + } + + .communityLinks { + flex-direction: column; + align-items: center; + } + + .communityButton { + width: 200px; + justify-content: center; + } +} + +@media screen and (max-width: 768px) { + .heroLogo { + height: 40px; + } + + .heroTitle { + font-size: 1.8rem; + } + + .codeBlock { + padding: 1rem; + } + + .codeBlock code { + font-size: 0.8rem; + } + + .feature { + padding: 0.75rem; + } +} diff --git a/docs/src/pages/markdown-page.md b/docs/src/pages/markdown-page.md new file mode 100644 index 000000000..9756c5b66 --- /dev/null +++ b/docs/src/pages/markdown-page.md @@ -0,0 +1,7 @@ +--- +title: Markdown page example +--- + +# Markdown page example + +You don't need React to write simple standalone pages. diff --git a/docs/tsconfig.json b/docs/tsconfig.json new file mode 100644 index 000000000..6f3b11cdb --- /dev/null +++ b/docs/tsconfig.json @@ -0,0 +1,7 @@ +{ + "extends": "@docusaurus/tsconfig", + "compilerOptions": { + "baseUrl": "." + }, + "exclude": [".docusaurus", "build"] +} From 8537ada11ba223dc7318e59f3b55b358c61d800c Mon Sep 17 00:00:00 2001 From: Alexey Rybak <50731695+reluctantfuturist@users.noreply.github.com> Date: Wed, 24 Sep 2025 14:14:32 -0700 Subject: [PATCH 143/150] docs: MDX leftover fixes (#3536) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit # What does this PR do? - Fixes Docusaurus build errors ## Test Plan - `npm run build`​ compiles the build properly - Broken links expected and will be fixed in a follow-on PR --- docs/docs/contributing/index.mdx | 2 +- docs/docs/contributing/new_api_provider.mdx | 14 ++-- .../docs/contributing/new_vector_database.mdx | 8 +- docs/docs/distributions/building_distro.mdx | 40 +++++----- docs/docs/distributions/configuration.mdx | 8 +- .../getting_started/detailed_tutorial.mdx | 78 +++++++------------ .../post_training/inline_huggingface-cpu.mdx | 7 +- .../post_training/inline_huggingface-gpu.mdx | 4 +- .../post_training/inline_huggingface.mdx | 7 +- .../providers/vector_io/remote_milvus.mdx | 2 +- scripts/provider_codegen.py | 36 ++++++--- 11 files changed, 96 insertions(+), 110 deletions(-) diff --git a/docs/docs/contributing/index.mdx b/docs/docs/contributing/index.mdx index 7f50a058e..03aeebc23 100644 --- a/docs/docs/contributing/index.mdx +++ b/docs/docs/contributing/index.mdx @@ -75,7 +75,7 @@ outlined on that page and do not file a public issue. In order to accept your pull request, we need you to submit a CLA. You only need to do this once to work on any of Meta's open source projects. -Complete your CLA here: +Complete your CLA here: [https://code.facebook.com/cla](https://code.facebook.com/cla) **I'd like to contribute!** diff --git a/docs/docs/contributing/new_api_provider.mdx b/docs/docs/contributing/new_api_provider.mdx index 9d9e4653a..95ef0c4f6 100644 --- a/docs/docs/contributing/new_api_provider.mdx +++ b/docs/docs/contributing/new_api_provider.mdx @@ -12,9 +12,9 @@ This guide will walk you through the process of adding a new API provider to Lla - Begin by reviewing the [core concepts](../concepts/index.md) of Llama Stack and choose the API your provider belongs to (Inference, Safety, VectorIO, etc.) -- Determine the provider type ({repopath}`Remote::llama_stack/providers/remote` or {repopath}`Inline::llama_stack/providers/inline`). Remote providers make requests to external services, while inline providers execute implementation locally. -- Add your provider to the appropriate {repopath}`Registry::llama_stack/providers/registry/`. Specify pip dependencies necessary. -- Update any distribution {repopath}`Templates::llama_stack/distributions/` `build.yaml` and `run.yaml` files if they should include your provider by default. Run {repopath}`./scripts/distro_codegen.py` if necessary. Note that `distro_codegen.py` will fail if the new provider causes any distribution template to attempt to import provider-specific dependencies. This usually means the distribution's `get_distribution_template()` code path should only import any necessary Config or model alias definitions from each provider and not the provider's actual implementation. +- Determine the provider type ([Remote](https://github.com/meta-llama/llama-stack/tree/main/llama_stack/providers/remote) or [Inline](https://github.com/meta-llama/llama-stack/tree/main/llama_stack/providers/inline)). Remote providers make requests to external services, while inline providers execute implementation locally. +- Add your provider to the appropriate [Registry](https://github.com/meta-llama/llama-stack/tree/main/llama_stack/providers/registry/). Specify pip dependencies necessary. +- Update any distribution [Templates](https://github.com/meta-llama/llama-stack/tree/main/llama_stack/distributions/) `build.yaml` and `run.yaml` files if they should include your provider by default. Run [./scripts/distro_codegen.py](https://github.com/meta-llama/llama-stack/blob/main/scripts/distro_codegen.py) if necessary. Note that `distro_codegen.py` will fail if the new provider causes any distribution template to attempt to import provider-specific dependencies. This usually means the distribution's `get_distribution_template()` code path should only import any necessary Config or model alias definitions from each provider and not the provider's actual implementation. Here are some example PRs to help you get started: @@ -71,9 +71,9 @@ Before running tests, you must have required dependencies installed. This depend ### 1. Integration Testing -Integration tests are located in {repopath}`tests/integration`. These tests use the python client-SDK APIs (from the `llama_stack_client` package) to test functionality. Since these tests use client APIs, they can be run either by pointing to an instance of the Llama Stack server or "inline" by using `LlamaStackAsLibraryClient`. +Integration tests are located in [tests/integration](https://github.com/meta-llama/llama-stack/tree/main/tests/integration). These tests use the python client-SDK APIs (from the `llama_stack_client` package) to test functionality. Since these tests use client APIs, they can be run either by pointing to an instance of the Llama Stack server or "inline" by using `LlamaStackAsLibraryClient`. -Consult {repopath}`tests/integration/README.md` for more details on how to run the tests. +Consult [tests/integration/README.md](https://github.com/meta-llama/llama-stack/blob/main/tests/integration/README.md) for more details on how to run the tests. Note that each provider's `sample_run_config()` method (in the configuration class for that provider) typically references some environment variables for specifying API keys and the like. You can set these in the environment or pass these via the `--env` flag to the test command. @@ -81,9 +81,9 @@ Note that each provider's `sample_run_config()` method (in the configuration cla ### 2. Unit Testing -Unit tests are located in {repopath}`tests/unit`. Provider-specific unit tests are located in {repopath}`tests/unit/providers`. These tests are all run automatically as part of the CI process. +Unit tests are located in [tests/unit](https://github.com/meta-llama/llama-stack/tree/main/tests/unit). Provider-specific unit tests are located in [tests/unit/providers](https://github.com/meta-llama/llama-stack/tree/main/tests/unit/providers). These tests are all run automatically as part of the CI process. -Consult {repopath}`tests/unit/README.md` for more details on how to run the tests manually. +Consult [tests/unit/README.md](https://github.com/meta-llama/llama-stack/blob/main/tests/unit/README.md) for more details on how to run the tests manually. ### 3. Additional end-to-end testing diff --git a/docs/docs/contributing/new_vector_database.mdx b/docs/docs/contributing/new_vector_database.mdx index 040cee6d3..044e2f672 100644 --- a/docs/docs/contributing/new_vector_database.mdx +++ b/docs/docs/contributing/new_vector_database.mdx @@ -39,7 +39,7 @@ filtering, sorting, and aggregating vectors. - `YourVectorIOAdapter.query_chunks()` - `YourVectorIOAdapter.delete_chunks()` 3. **Add to Registry**: Register your provider in the appropriate registry file. - - Update {repopath}`llama_stack/providers/registry/vector_io.py` to include your new provider. + - Update [llama_stack/providers/registry/vector_io.py](https://github.com/meta-llama/llama-stack/blob/main/llama_stack/providers/registry/vector_io.py) to include your new provider. ```python from llama_stack.providers.registry.specs import InlineProviderSpec from llama_stack.providers.registry.api import Api @@ -65,7 +65,7 @@ InlineProviderSpec( 5. Add your provider to the `vector_io_providers` fixture dictionary. - Please follow the naming convention of `your_vectorprovider_index` and `your_vectorprovider_adapter` as the tests require this to execute properly. - Integration Tests - - Integration tests are located in {repopath}`tests/integration`. These tests use the python client-SDK APIs (from the `llama_stack_client` package) to test functionality. + - Integration tests are located in [tests/integration](https://github.com/meta-llama/llama-stack/tree/main/tests/integration). These tests use the python client-SDK APIs (from the `llama_stack_client` package) to test functionality. - The two set of integration tests are: - `tests/integration/vector_io/test_vector_io.py`: This file tests registration, insertion, and retrieval. - `tests/integration/vector_io/test_openai_vector_stores.py`: These tests are for OpenAI-compatible vector stores and test the OpenAI API compatibility. @@ -79,5 +79,5 @@ InlineProviderSpec( - If you are adding tests for the `remote` provider you will have to update the `test` group, which is used in the GitHub CI for integration tests. - `uv add new_pip_package --group test` 5. **Update Documentation**: Please update the documentation for end users - - Generate the provider documentation by running {repopath}`./scripts/provider_codegen.py`. - - Update the autogenerated content in the registry/vector_io.py file with information about your provider. Please see other providers for examples. + - Generate the provider documentation by running [./scripts/provider_codegen.py](https://github.com/meta-llama/llama-stack/blob/main/scripts/provider_codegen.py). + - Update the autogenerated content in the registry/vector_io.py file with information about your provider. Please see other providers for examples. diff --git a/docs/docs/distributions/building_distro.mdx b/docs/docs/distributions/building_distro.mdx index 90cac7363..d9a8048fc 100644 --- a/docs/docs/distributions/building_distro.mdx +++ b/docs/docs/distributions/building_distro.mdx @@ -86,8 +86,11 @@ options: After this step is complete, a file named `-build.yaml` and template file `-run.yaml` will be generated and saved at the output file path specified at the end of the command. -::::{tab-set} -:::{tab-item} Building from a template +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; + + + To build from alternative API providers, we provide distribution templates for users to get started building a distribution backed by different providers. The following command will allow you to see the available templates and their corresponding providers. @@ -160,8 +163,8 @@ You can now edit ~/.llama/distributions/llamastack-starter/starter-run.yaml and ```{tip} The generated `run.yaml` file is a starting point for your configuration. For comprehensive guidance on customizing it for your specific needs, infrastructure, and deployment scenarios, see [Customizing Your run.yaml Configuration](customizing_run_yaml.md). ``` -::: -:::{tab-item} Building from Scratch + + If the provided templates do not fit your use case, you could start off with running `llama stack build` which will allow you to a interactively enter wizard where you will be prompted to enter build configurations. @@ -190,9 +193,8 @@ Tip: use to see options for the providers. You can now edit ~/.llama/distributions/llamastack-my-local-stack/my-local-stack-run.yaml and run `llama stack run ~/.llama/distributions/llamastack-my-local-stack/my-local-stack-run.yaml` ``` -::: - -:::{tab-item} Building from a pre-existing build config file + + - In addition to templates, you may customize the build to your liking through editing config files and build from config files with the following command. - The config file will be of contents like the ones in `llama_stack/distributions/*build.yaml`. @@ -200,9 +202,8 @@ You can now edit ~/.llama/distributions/llamastack-my-local-stack/my-local-stack ``` llama stack build --config llama_stack/distributions/starter/build.yaml ``` -::: - -:::{tab-item} Building with External Providers + + Llama Stack supports external providers that live outside of the main codebase. This allows you to create and maintain your own providers independently or use community-provided providers. @@ -251,15 +252,12 @@ llama stack build --config my-external-stack.yaml ``` For more information on external providers, including directory structure, provider types, and implementation requirements, see the [External Providers documentation](../providers/external.md). -::: - -:::{tab-item} Building Container - -```{admonition} Podman Alternative -:class: tip + + +:::tip Podman Alternative Podman is supported as an alternative to Docker. Set `CONTAINER_BINARY` to `podman` in your environment to use Podman. -``` +::: To build a container image, you may start off from a template and use the `--image-type container` flag to specify `container` as the build image type. @@ -278,7 +276,8 @@ You can now edit ~/meta-llama/llama-stack/tmp/configs/ollama-run.yaml and run `l ``` Now set some environment variables for the inference model ID and Llama Stack Port and create a local directory to mount into the container's file system. -``` + +```bash export INFERENCE_MODEL="llama3.2:3b" export LLAMA_STACK_PORT=8321 mkdir -p ~/.llama @@ -312,9 +311,8 @@ Here are the docker flags and their uses: * `--env OLLAMA_URL=http://host.docker.internal:11434`: Configures the URL for the Ollama service -::: - -:::: + + ### Running your Stack server diff --git a/docs/docs/distributions/configuration.mdx b/docs/docs/distributions/configuration.mdx index 73a4837a1..4cd093ef0 100644 --- a/docs/docs/distributions/configuration.mdx +++ b/docs/docs/distributions/configuration.mdx @@ -478,12 +478,12 @@ A rule may also specify a condition, either a 'when' or an 'unless', with additional constraints as to where the rule applies. The constraints supported at present are: - - 'user with in ' - - 'user with not in ' + - 'user with `` in ``' + - 'user with `` not in ``' - 'user is owner' - 'user is not owner' - - 'user in owners ' - - 'user not in owners ' + - 'user in owners ``' + - 'user not in owners ``' The attributes defined for a user will depend on how the auth configuration is defined. diff --git a/docs/docs/getting_started/detailed_tutorial.mdx b/docs/docs/getting_started/detailed_tutorial.mdx index 5bf009efe..3db63176c 100644 --- a/docs/docs/getting_started/detailed_tutorial.mdx +++ b/docs/docs/getting_started/detailed_tutorial.mdx @@ -31,23 +31,21 @@ ollama run llama3.2:3b --keepalive 60m Install [uv](https://docs.astral.sh/uv/) to setup your virtual environment -::::{tab-set} - -:::{tab-item} macOS and Linux + + Use `curl` to download the script and execute it with `sh`: ```console curl -LsSf https://astral.sh/uv/install.sh | sh ``` -::: - -:::{tab-item} Windows + + Use `irm` to download the script and execute it with `iex`: ```console powershell -ExecutionPolicy ByPass -c "irm https://astral.sh/uv/install.ps1 | iex" ``` -::: -:::: + + Setup your virtual environment. @@ -58,9 +56,8 @@ source .venv/bin/activate ### Step 2: Run Llama Stack Llama Stack is a server that exposes multiple APIs, you connect with it using the Llama Stack client SDK. -::::{tab-set} - -:::{tab-item} Using `venv` + + You can use Python to build and run the Llama Stack server, which is useful for testing and development. Llama Stack uses a [YAML configuration file](../distributions/configuration.md) to specify the stack setup, @@ -71,19 +68,8 @@ We use `starter` as template. By default all providers are disabled, this requir ```bash llama stack build --distro starter --image-type venv --run ``` -::: -:::{tab-item} Using `venv` -You can use Python to build and run the Llama Stack server, which is useful for testing and development. - -Llama Stack uses a [YAML configuration file](../distributions/configuration.md) to specify the stack setup, -which defines the providers and their settings. -Now let's build and run the Llama Stack config for Ollama. - -```bash -llama stack build --distro starter --image-type venv --run -``` -::: -:::{tab-item} Using a Container + + You can use a container image to run the Llama Stack server. We provide several container images for the server component that works with different inference providers out of the box. For this guide, we will use `llamastack/distribution-starter` as the container image. If you'd like to build your own image or customize the @@ -110,9 +96,8 @@ with `host.containers.internal`. The configuration YAML for the Ollama distribution is available at `distributions/ollama/run.yaml`. -```{tip} - -Docker containers run in their own isolated network namespaces on Linux. To allow the container to communicate with services running on the host via `localhost`, you need `--network=host`. This makes the container use the host’s network directly so it can connect to Ollama running on `localhost:11434`. +:::tip +Docker containers run in their own isolated network namespaces on Linux. To allow the container to communicate with services running on the host via `localhost`, you need `--network=host`. This makes the container use the host's network directly so it can connect to Ollama running on `localhost:11434`. Linux users having issues running the above command should instead try the following: ```bash @@ -126,7 +111,6 @@ docker run -it \ --env OLLAMA_URL=http://localhost:11434 ``` ::: -:::: You will see output like below: ``` INFO: Application startup complete. @@ -137,31 +121,29 @@ Now you can use the Llama Stack client to run inference and build agents! You can reuse the server setup or use the [Llama Stack Client](https://github.com/meta-llama/llama-stack-client-python/). Note that the client package is already included in the `llama-stack` package. + + ### Step 3: Run Client CLI Open a new terminal and navigate to the same directory you started the server from. Then set up a new or activate your existing server virtual environment. -::::{tab-set} - -:::{tab-item} Reuse Server `venv` + + ```bash # The client is included in the llama-stack package so we just activate the server venv source .venv/bin/activate ``` -::: - -:::{tab-item} Install with `venv` + + ```bash uv venv client --python 3.12 source client/bin/activate pip install llama-stack-client ``` -::: - - -:::: + + Now let's use the `llama-stack-client` [CLI](../references/llama_stack_client_cli_reference.md) to check the connectivity to the server. @@ -237,9 +219,8 @@ OpenAIChatCompletion( Note that these demos show the [Python Client SDK](../references/python_sdk_reference/index.md). Other SDKs are also available, please refer to the [Client SDK](../index.md#client-sdks) list for the complete options. -::::{tab-set} - -:::{tab-item} Basic Inference + + Now you can run inference using the Llama Stack client SDK. #### i. Create the Script @@ -279,9 +260,8 @@ Which will output: Model: ollama/llama3.2:3b OpenAIChatCompletion(id='chatcmpl-30cd0f28-a2ad-4b6d-934b-13707fc60ebf', choices=[OpenAIChatCompletionChoice(finish_reason='stop', index=0, message=OpenAIChatCompletionChoiceMessageOpenAIAssistantMessageParam(role='assistant', content="Lines of code unfold\nAlgorithms dance with ease\nLogic's gentle kiss", name=None, tool_calls=None, refusal=None, annotations=None, audio=None, function_call=None), logprobs=None)], created=1751732480, model='llama3.2:3b', object='chat.completion', service_tier=None, system_fingerprint='fp_ollama', usage={'completion_tokens': 16, 'prompt_tokens': 37, 'total_tokens': 53, 'completion_tokens_details': None, 'prompt_tokens_details': None}) ``` -::: - -:::{tab-item} Build a Simple Agent + + Next we can move beyond simple inference and build an agent that can perform tasks using the Llama Stack server. #### i. Create the Script Create a file `agent.py` and add the following code: @@ -449,9 +429,8 @@ uv run python agent.py So, that's me in a nutshell! ``` -::: - -:::{tab-item} Build a RAG Agent + + For our last demo, we can build a RAG agent that can answer questions about the Torchtune project using the documents in a vector database. @@ -554,9 +533,8 @@ uv run python rag_agent.py ... Overall, DORA is a powerful reinforcement learning algorithm that can learn complex tasks from human demonstrations. However, it requires careful consideration of the challenges and limitations to achieve optimal results. ``` -::: - -:::: + + **You're Ready to Build Your Own Apps!** diff --git a/docs/docs/providers/post_training/inline_huggingface-cpu.mdx b/docs/docs/providers/post_training/inline_huggingface-cpu.mdx index 9b5f2a091..4e64d571a 100644 --- a/docs/docs/providers/post_training/inline_huggingface-cpu.mdx +++ b/docs/docs/providers/post_training/inline_huggingface-cpu.mdx @@ -11,11 +11,8 @@ HuggingFace-based post-training provider for fine-tuning models using the Huggin | `device` | `` | No | cuda | | | `distributed_backend` | `Literal['fsdp', 'deepspeed'` | No | | | | `checkpoint_format` | `Literal['full_state', 'huggingface'` | No | huggingface | | -| `chat_template` | `` | No | <|user|> -{input} -<|assistant|> -{output} | | -| `model_specific_config` | `` | No | {'trust_remote_code': True, 'attn_implementation': 'sdpa'} | | +| `chat_template` | `` | No | `<|user|>`
`{input}`
`<|assistant|>`
`{output}` | | +| `model_specific_config` | `` | No | `{'trust_remote_code': True, 'attn_implementation': 'sdpa'}` | | | `max_seq_length` | `` | No | 2048 | | | `gradient_checkpointing` | `` | No | False | | | `save_total_limit` | `` | No | 3 | | diff --git a/docs/docs/providers/post_training/inline_huggingface-gpu.mdx b/docs/docs/providers/post_training/inline_huggingface-gpu.mdx index 530ac5c4d..ac7644de7 100644 --- a/docs/docs/providers/post_training/inline_huggingface-gpu.mdx +++ b/docs/docs/providers/post_training/inline_huggingface-gpu.mdx @@ -17,8 +17,8 @@ HuggingFace-based post-training provider for fine-tuning models using the Huggin | `device` | `` | No | cuda | | | `distributed_backend` | `Literal['fsdp', 'deepspeed'` | No | | | | `checkpoint_format` | `Literal['full_state', 'huggingface'` | No | huggingface | | -| `chat_template` | `` | No | <|user|><br/>{input}<br/><|assistant|><br/>{output} | | -| `model_specific_config` | `` | No | {'trust_remote_code': True, 'attn_implementation': 'sdpa'} | | +| `chat_template` | `` | No | `<|user|>`
`{input}`
`<|assistant|>`
`{output}` | | +| `model_specific_config` | `` | No | `{'trust_remote_code': True, 'attn_implementation': 'sdpa'}` | | | `max_seq_length` | `` | No | 2048 | | | `gradient_checkpointing` | `` | No | False | | | `save_total_limit` | `` | No | 3 | | diff --git a/docs/docs/providers/post_training/inline_huggingface.mdx b/docs/docs/providers/post_training/inline_huggingface.mdx index 37c113c6f..870ff6ec5 100644 --- a/docs/docs/providers/post_training/inline_huggingface.mdx +++ b/docs/docs/providers/post_training/inline_huggingface.mdx @@ -11,11 +11,8 @@ HuggingFace-based post-training provider for fine-tuning models using the Huggin | `device` | `` | No | cuda | | | `distributed_backend` | `Literal['fsdp', 'deepspeed'` | No | | | | `checkpoint_format` | `Literal['full_state', 'huggingface'` | No | huggingface | | -| `chat_template` | `` | No | <|user|> -{input} -<|assistant|> -{output} | | -| `model_specific_config` | `` | No | {'trust_remote_code': True, 'attn_implementation': 'sdpa'} | | +| `chat_template` | `` | No | `<|user|>`
`{input}`
`<|assistant|>`
`{output}` | | +| `model_specific_config` | `` | No | `{'trust_remote_code': True, 'attn_implementation': 'sdpa'}` | | | `max_seq_length` | `` | No | 2048 | | | `gradient_checkpointing` | `` | No | False | | | `save_total_limit` | `` | No | 3 | | diff --git a/docs/docs/providers/vector_io/remote_milvus.mdx b/docs/docs/providers/vector_io/remote_milvus.mdx index ae796837d..7f7c08122 100644 --- a/docs/docs/providers/vector_io/remote_milvus.mdx +++ b/docs/docs/providers/vector_io/remote_milvus.mdx @@ -409,7 +409,7 @@ For more details on TLS configuration, refer to the [TLS setup guide](https://mi | `token` | `str \| None` | No | | The token of the Milvus server | | `consistency_level` | `` | No | Strong | The consistency level of the Milvus server | | `kvstore` | `utils.kvstore.config.RedisKVStoreConfig \| utils.kvstore.config.SqliteKVStoreConfig \| utils.kvstore.config.PostgresKVStoreConfig \| utils.kvstore.config.MongoDBKVStoreConfig` | No | sqlite | Config for KV store backend | -| `config` | `dict` | No | {} | This configuration allows additional fields to be passed through to the underlying Milvus client. See the [Milvus](https://milvus.io/docs/install-overview.md) documentation for more details about Milvus in general. | +| `config` | `dict` | No | `{}` | This configuration allows additional fields to be passed through to the underlying Milvus client. See the [Milvus](https://milvus.io/docs/install-overview.md) documentation for more details about Milvus in general. | :::note This configuration class accepts additional fields beyond those listed above. You can pass any additional configuration options that will be forwarded to the underlying provider. diff --git a/scripts/provider_codegen.py b/scripts/provider_codegen.py index 207840d49..531d53eb3 100755 --- a/scripts/provider_codegen.py +++ b/scripts/provider_codegen.py @@ -229,17 +229,33 @@ def generate_provider_docs(progress, provider_spec: Any, api_name: str) -> str: # Handle multiline default values and escape problematic characters for MDX if "\n" in default: - default = ( - default.replace("\n", "
") - .replace("<", "<") - .replace(">", ">") - .replace("{", "{") - .replace("}", "}") - ) + # For multiline defaults, escape angle brackets and use
for line breaks + lines = default.split("\n") + escaped_lines = [] + for line in lines: + if line.strip(): + # Escape angle brackets and wrap template tokens in backticks + escaped_line = line.strip().replace("<", "<").replace(">", ">") + if ("{" in escaped_line and "}" in escaped_line) or ( + "<|" in escaped_line and "|>" in escaped_line + ): + escaped_lines.append(f"`{escaped_line}`") + else: + escaped_lines.append(escaped_line) + else: + escaped_lines.append("") + default = "
".join(escaped_lines) else: - default = ( - default.replace("<", "<").replace(">", ">").replace("{", "{").replace("}", "}") - ) + # For single line defaults, escape angle brackets first + escaped_default = default.replace("<", "<").replace(">", ">") + # Then wrap template tokens in backticks + if ("{" in escaped_default and "}" in escaped_default) or ( + "<|" in escaped_default and "|>" in escaped_default + ): + default = f"`{escaped_default}`" + else: + # Apply additional escaping for curly braces + default = escaped_default.replace("{", "{").replace("}", "}") description_text = field_info["description"] or "" # Escape curly braces in description text for MDX compatibility From 6101c8e01585b4cda7ab648d163b711a27865bc3 Mon Sep 17 00:00:00 2001 From: Alexey Rybak <50731695+reluctantfuturist@users.noreply.github.com> Date: Wed, 24 Sep 2025 14:16:31 -0700 Subject: [PATCH 144/150] docs: fix broken links (#3540) # What does this PR do? - Fixes broken links and Docusaurus search Closes #3518 ## Test Plan The following should produce a clean build with no warnings and search enabled: ``` npm install npm run gen-api-docs all npm run build npm run serve ``` --- docs/docs/advanced_apis/post_training.mdx | 2 +- docs/docs/advanced_apis/scoring.mdx | 4 +- docs/docs/building_applications/evals.mdx | 4 +- docs/docs/building_applications/index.mdx | 22 +- .../docs/building_applications/playground.mdx | 4 +- .../responses_vs_agents.mdx | 4 +- docs/docs/concepts/apis/external.mdx | 2 +- docs/docs/concepts/distributions.mdx | 2 +- docs/docs/concepts/evaluation_concepts.mdx | 78 +++++ docs/docs/concepts/index.mdx | 48 ++- docs/docs/concepts/resources.mdx | 2 +- docs/docs/contributing/index.mdx | 27 +- docs/docs/contributing/new_api_provider.mdx | 2 +- docs/docs/deploying/kubernetes_deployment.mdx | 2 +- docs/docs/distributions/building_distro.mdx | 2 +- docs/docs/distributions/configuration.mdx | 2 +- .../distributions/importing_as_library.mdx | 2 +- docs/docs/distributions/index.mdx | 12 +- .../distributions/list_of_distributions.mdx | 6 +- .../ondevice_distro/android_sdk.md | 2 +- .../self_hosted_distro/starter.md | 30 +- .../starting_llama_stack_server.mdx | 4 +- .../getting_started/detailed_tutorial.mdx | 16 +- docs/docs/getting_started/quickstart.mdx | 2 +- docs/docs/providers/agents/index.mdx | 4 - docs/docs/providers/batches/index.mdx | 4 - docs/docs/providers/datasetio/index.md | 16 - docs/docs/providers/datasetio/index.mdx | 6 - docs/docs/providers/eval/index.mdx | 5 - docs/docs/providers/external/index.mdx | 4 +- docs/docs/providers/files/index.mdx | 5 - docs/docs/providers/index.mdx | 20 +- docs/docs/providers/inference/index.mdx | 27 -- docs/docs/providers/openai.mdx | 5 + docs/docs/providers/post_training/index.mdx | 7 - docs/docs/providers/safety/index.mdx | 9 - docs/docs/providers/scoring/index.mdx | 6 - docs/docs/providers/telemetry/index.mdx | 4 - docs/docs/providers/tool_runtime/index.mdx | 9 - docs/docs/providers/vector_io/index.mdx | 15 - docs/docs/references/index.mdx | 6 +- .../references/llama_cli_reference/index.md | 2 +- docs/docusaurus.config.ts | 5 - docs/static/img/llama-stack-logo.png | Bin 0 -> 18601 bytes docs/static/llama-stack-logo.png | Bin 71620 -> 0 bytes .../src/components/HomepageFeatures/index.js | 64 ---- .../HomepageFeatures/styles.module.css | 11 - docs/static/src/css/custom.css | 191 ------------ docs/static/src/pages/index.js | 163 ---------- docs/static/src/pages/index.module.css | 283 ------------------ docs/static/src/pages/markdown-page.md | 7 - scripts/provider_codegen.py | 10 - 52 files changed, 188 insertions(+), 981 deletions(-) create mode 100644 docs/docs/concepts/evaluation_concepts.mdx delete mode 100644 docs/docs/providers/datasetio/index.md create mode 100644 docs/static/img/llama-stack-logo.png delete mode 100644 docs/static/llama-stack-logo.png delete mode 100644 docs/static/src/components/HomepageFeatures/index.js delete mode 100644 docs/static/src/components/HomepageFeatures/styles.module.css delete mode 100644 docs/static/src/css/custom.css delete mode 100644 docs/static/src/pages/index.js delete mode 100644 docs/static/src/pages/index.module.css delete mode 100644 docs/static/src/pages/markdown-page.md diff --git a/docs/docs/advanced_apis/post_training.mdx b/docs/docs/advanced_apis/post_training.mdx index 43359d741..516ac07e1 100644 --- a/docs/docs/advanced_apis/post_training.mdx +++ b/docs/docs/advanced_apis/post_training.mdx @@ -302,4 +302,4 @@ customizer_url: ${env.NVIDIA_CUSTOMIZER_URL:=http://nemo.test} - Check out the [Building Applications - Fine-tuning](../building_applications/index.mdx) guide for application-level examples - See the [Providers](../providers/post_training/index.mdx) section for detailed provider documentation -- Review the [API Reference](../api_reference/post_training.mdx) for complete API documentation +- Review the [API Reference](../advanced_apis/post_training.mdx) for complete API documentation diff --git a/docs/docs/advanced_apis/scoring.mdx b/docs/docs/advanced_apis/scoring.mdx index 15c09fa8a..0ce787e80 100644 --- a/docs/docs/advanced_apis/scoring.mdx +++ b/docs/docs/advanced_apis/scoring.mdx @@ -189,5 +189,5 @@ The Scoring API works closely with the [Evaluation](./evaluation.mdx) API to pro - Check out the [Evaluation](./evaluation.mdx) guide for running complete evaluations - See the [Building Applications - Evaluation](../building_applications/evals.mdx) guide for application examples -- Review the [Evaluation Reference](../references/evals_reference.mdx) for comprehensive scoring function usage -- Explore the [Evaluation Concepts](../concepts/evaluation_concepts.mdx) for detailed conceptual information +- Review the [Evaluation Reference](../references/evals_reference/) for comprehensive scoring function usage +- Explore the [Evaluation Concepts](../concepts/evaluation_concepts) for detailed conceptual information diff --git a/docs/docs/building_applications/evals.mdx b/docs/docs/building_applications/evals.mdx index 899c75dd4..d2eb0bd31 100644 --- a/docs/docs/building_applications/evals.mdx +++ b/docs/docs/building_applications/evals.mdx @@ -8,7 +8,7 @@ sidebar_position: 7 import Tabs from '@theme/Tabs'; import TabItem from '@theme/TabItem'; -This guide walks you through the process of evaluating an LLM application built using Llama Stack. For detailed API reference, check out the [Evaluation Reference](/docs/references/evals-reference) guide that covers the complete set of APIs and developer experience flow. +This guide walks you through the process of evaluating an LLM application built using Llama Stack. For detailed API reference, check out the [Evaluation Reference](../references/evals_reference/) guide that covers the complete set of APIs and developer experience flow. :::tip[Interactive Examples] Check out our [Colab notebook](https://colab.research.google.com/drive/10CHyykee9j2OigaIcRv47BKG9mrNm0tJ?usp=sharing) for working examples with evaluations, or try the [Getting Started notebook](https://colab.research.google.com/github/meta-llama/llama-stack/blob/main/docs/getting_started.ipynb). @@ -251,6 +251,6 @@ results = client.scoring.score( - **[Agents](./agent)** - Building agents for evaluation - **[Tools Integration](./tools)** - Using tools in evaluated agents -- **[Evaluation Reference](/docs/references/evals-reference)** - Complete API reference for evaluations +- **[Evaluation Reference](../references/evals_reference/)** - Complete API reference for evaluations - **[Getting Started Notebook](https://colab.research.google.com/github/meta-llama/llama-stack/blob/main/docs/getting_started.ipynb)** - Interactive examples - **[Evaluation Examples](https://colab.research.google.com/drive/10CHyykee9j2OigaIcRv47BKG9mrNm0tJ?usp=sharing)** - Additional evaluation scenarios diff --git a/docs/docs/building_applications/index.mdx b/docs/docs/building_applications/index.mdx index 0b9cb20fb..a4b71efd7 100644 --- a/docs/docs/building_applications/index.mdx +++ b/docs/docs/building_applications/index.mdx @@ -20,23 +20,23 @@ The best way to get started is to look at this comprehensive notebook which walk Here are the key topics that will help you build effective AI applications: ### 🤖 **Agent Development** -- **[Agent Framework](./agent)** - Understand the components and design patterns of the Llama Stack agent framework -- **[Agent Execution Loop](./agent_execution_loop)** - How agents process information, make decisions, and execute actions -- **[Agents vs Responses API](./responses_vs_agents)** - Learn when to use each API for different use cases +- **[Agent Framework](./agent.mdx)** - Understand the components and design patterns of the Llama Stack agent framework +- **[Agent Execution Loop](./agent_execution_loop.mdx)** - How agents process information, make decisions, and execute actions +- **[Agents vs Responses API](./responses_vs_agents.mdx)** - Learn when to use each API for different use cases ### 📚 **Knowledge Integration** -- **[RAG (Retrieval-Augmented Generation)](./rag)** - Enhance your agents with external knowledge through retrieval mechanisms +- **[RAG (Retrieval-Augmented Generation)](./rag.mdx)** - Enhance your agents with external knowledge through retrieval mechanisms ### 🛠️ **Capabilities & Extensions** -- **[Tools](./tools)** - Extend your agents' capabilities by integrating with external tools and APIs +- **[Tools](./tools.mdx)** - Extend your agents' capabilities by integrating with external tools and APIs ### 📊 **Quality & Monitoring** -- **[Evaluations](./evals)** - Evaluate your agents' effectiveness and identify areas for improvement -- **[Telemetry](./telemetry)** - Monitor and analyze your agents' performance and behavior -- **[Safety](./safety)** - Implement guardrails and safety measures to ensure responsible AI behavior +- **[Evaluations](./evals.mdx)** - Evaluate your agents' effectiveness and identify areas for improvement +- **[Telemetry](./telemetry.mdx)** - Monitor and analyze your agents' performance and behavior +- **[Safety](./safety.mdx)** - Implement guardrails and safety measures to ensure responsible AI behavior ### 🎮 **Interactive Development** -- **[Playground](./playground)** - Interactive environment for testing and developing applications +- **[Playground](./playground.mdx)** - Interactive environment for testing and developing applications ## Application Patterns @@ -77,7 +77,7 @@ Build production-ready systems with: ## Related Resources -- **[Getting Started](/docs/getting-started/)** - Basic setup and concepts +- **[Getting Started](/docs/getting_started/quickstart)** - Basic setup and concepts - **[Providers](/docs/providers/)** - Available AI service providers - **[Distributions](/docs/distributions/)** - Pre-configured deployment packages -- **[API Reference](/docs/api/)** - Complete API documentation +- **[API Reference](/docs/api/llama-stack-specification)** - Complete API documentation diff --git a/docs/docs/building_applications/playground.mdx b/docs/docs/building_applications/playground.mdx index d9d3ba275..b2aa1b4a5 100644 --- a/docs/docs/building_applications/playground.mdx +++ b/docs/docs/building_applications/playground.mdx @@ -291,9 +291,9 @@ llama stack run meta-reference ## Related Resources -- **[Getting Started Guide](/docs/getting-started)** - Complete setup and introduction +- **[Getting Started Guide](../getting_started/quickstart)** - Complete setup and introduction - **[Core Concepts](/docs/concepts)** - Understanding Llama Stack fundamentals - **[Agents](./agent)** - Building intelligent agents - **[RAG (Retrieval Augmented Generation)](./rag)** - Knowledge-enhanced applications - **[Evaluations](./evals)** - Comprehensive evaluation framework -- **[API Reference](/docs/api-reference)** - Complete API documentation +- **[API Reference](/docs/api/llama-stack-specification)** - Complete API documentation diff --git a/docs/docs/building_applications/responses_vs_agents.mdx b/docs/docs/building_applications/responses_vs_agents.mdx index c04cd2ce8..4cf7620e7 100644 --- a/docs/docs/building_applications/responses_vs_agents.mdx +++ b/docs/docs/building_applications/responses_vs_agents.mdx @@ -13,7 +13,7 @@ import TabItem from '@theme/TabItem'; Llama Stack (LLS) provides two different APIs for building AI applications with tool calling capabilities: the **Agents API** and the **OpenAI Responses API**. While both enable AI systems to use tools, and maintain full conversation history, they serve different use cases and have distinct characteristics. :::note -**Note:** For simple and basic inferencing, you may want to use the [Chat Completions API](/docs/providers/openai-compatibility#chat-completions) directly, before progressing to Agents or Responses API. +**Note:** For simple and basic inferencing, you may want to use the [Chat Completions API](../providers/openai#chat-completions) directly, before progressing to Agents or Responses API. ::: ## Overview @@ -217,5 +217,5 @@ Use this framework to choose the right API for your use case: - **[Agents](./agent)** - Understanding the Agents API fundamentals - **[Agent Execution Loop](./agent_execution_loop)** - How agents process turns and steps - **[Tools Integration](./tools)** - Adding capabilities to both APIs -- **[OpenAI Compatibility](/docs/providers/openai-compatibility)** - Using OpenAI-compatible endpoints +- **[OpenAI Compatibility](../providers/openai)** - Using OpenAI-compatible endpoints - **[Safety Guardrails](./safety)** - Implementing safety measures in agents diff --git a/docs/docs/concepts/apis/external.mdx b/docs/docs/concepts/apis/external.mdx index 722e8226c..7b4a3e8d5 100644 --- a/docs/docs/concepts/apis/external.mdx +++ b/docs/docs/concepts/apis/external.mdx @@ -2,7 +2,7 @@ title: External APIs description: Understanding external APIs in Llama Stack sidebar_label: External APIs -sidebar_position: 4 +sidebar_position: 3 --- # External APIs diff --git a/docs/docs/concepts/distributions.mdx b/docs/docs/concepts/distributions.mdx index 3b911ed7c..568099664 100644 --- a/docs/docs/concepts/distributions.mdx +++ b/docs/docs/concepts/distributions.mdx @@ -2,7 +2,7 @@ title: Distributions description: Pre-packaged provider configurations for different deployment scenarios sidebar_label: Distributions -sidebar_position: 5 +sidebar_position: 3 --- # Distributions diff --git a/docs/docs/concepts/evaluation_concepts.mdx b/docs/docs/concepts/evaluation_concepts.mdx new file mode 100644 index 000000000..c7a13fd70 --- /dev/null +++ b/docs/docs/concepts/evaluation_concepts.mdx @@ -0,0 +1,78 @@ +--- +title: Evaluation Concepts +description: Running evaluations on Llama Stack +sidebar_label: Evaluation Concepts +sidebar_position: 5 +--- + +# Evaluation Concepts + +The Llama Stack Evaluation flow allows you to run evaluations on your GenAI application datasets or pre-registered benchmarks. + +We introduce a set of APIs in Llama Stack for supporting running evaluations of LLM applications: +- `/datasetio` + `/datasets` API +- `/scoring` + `/scoring_functions` API +- `/eval` + `/benchmarks` API + +This guide goes over the sets of APIs and developer experience flow of using Llama Stack to run evaluations for different use cases. Checkout our Colab notebook on working examples with evaluations [here](https://colab.research.google.com/drive/10CHyykee9j2OigaIcRv47BKG9mrNm0tJ?usp=sharing). + +The Evaluation APIs are associated with a set of Resources. Please visit the Resources section in our [Core Concepts](./index.mdx) guide for better high-level understanding. + +- **DatasetIO**: defines interface with datasets and data loaders. + - Associated with `Dataset` resource. +- **Scoring**: evaluate outputs of the system. + - Associated with `ScoringFunction` resource. We provide a suite of out-of-the box scoring functions and also the ability for you to add custom evaluators. These scoring functions are the core part of defining an evaluation task to output evaluation metrics. +- **Eval**: generate outputs (via Inference or Agents) and perform scoring. + - Associated with `Benchmark` resource. + +## Open-benchmark Eval + +### List of open-benchmarks Llama Stack support + +Llama stack pre-registers several popular open-benchmarks to easily evaluate model perfomance via CLI. + +The list of open-benchmarks we currently support: +- [MMLU-COT](https://arxiv.org/abs/2009.03300) (Measuring Massive Multitask Language Understanding): Benchmark designed to comprehensively evaluate the breadth and depth of a model's academic and professional understanding +- [GPQA-COT](https://arxiv.org/abs/2311.12022) (A Graduate-Level Google-Proof Q&A Benchmark): A challenging benchmark of 448 multiple-choice questions written by domain experts in biology, physics, and chemistry. +- [SimpleQA](https://openai.com/index/introducing-simpleqa/): Benchmark designed to access models to answer short, fact-seeking questions. +- [MMMU](https://arxiv.org/abs/2311.16502) (A Massive Multi-discipline Multimodal Understanding and Reasoning Benchmark for Expert AGI)]: Benchmark designed to evaluate multimodal models. + +You can follow this [contributing guide](../references/evals_reference/#open-benchmark-contributing-guide) to add more open-benchmarks to Llama Stack + +### Run evaluation on open-benchmarks via CLI + +We have built-in functionality to run the supported open-benckmarks using llama-stack-client CLI + +#### Spin up Llama Stack server + +Spin up llama stack server with 'open-benchmark' template +```bash +llama stack run llama_stack/distributions/open-benchmark/run.yaml +``` + +#### Run eval CLI +There are 3 necessary inputs to run a benchmark eval +- `list of benchmark_ids`: The list of benchmark ids to run evaluation on +- `model-id`: The model id to evaluate on +- `output_dir`: Path to store the evaluate results + +```bash +llama-stack-client eval run-benchmark ... \ +--model_id \ +--output_dir +``` + +You can run +```bash +llama-stack-client eval run-benchmark help +``` +to see the description of all the flags that eval run-benchmark has + +In the output log, you can find the file path that has your evaluation results. Open that file and you can see you aggregate +evaluation results over there. + +## What's Next? + +- Check out our Colab notebook on working examples with running benchmark evaluations [here](https://colab.research.google.com/github/meta-llama/llama-stack/blob/main/docs/notebooks/Llama_Stack_Benchmark_Evals.ipynb#scrollTo=mxLCsP4MvFqP). +- Check out our [Building Applications - Evaluation](../building_applications/evals.mdx) guide for more details on how to use the Evaluation APIs to evaluate your applications. +- Check out our [Evaluation Reference](../references/evals_reference/) for more details on the APIs. diff --git a/docs/docs/concepts/index.mdx b/docs/docs/concepts/index.mdx index d76a0c039..1278ef98e 100644 --- a/docs/docs/concepts/index.mdx +++ b/docs/docs/concepts/index.mdx @@ -1,4 +1,9 @@ -# Core Concepts +--- +title: Core Concepts +description: Understanding Llama Stack's service-oriented philosophy and key concepts +sidebar_label: Overview +sidebar_position: 1 +--- Given Llama Stack's service-oriented philosophy, a few concepts and workflows arise which may not feel completely natural in the LLM landscape, especially if you are coming with a background in other frameworks. @@ -6,38 +11,21 @@ Given Llama Stack's service-oriented philosophy, a few concepts and workflows ar This section covers the fundamental concepts of Llama Stack: -- **[Architecture](./architecture.md)** - Learn about Llama Stack's architectural design and principles -- **[APIs](./apis/index.mdx)** - Understanding the core APIs and their stability levels - - [API Overview](./apis/index.mdx) - Core APIs available in Llama Stack - - [API Providers](./apis/api_providers.mdx) - How providers implement APIs - - [API Stability Leveling](./apis/api_leveling.mdx) - API stability and versioning -- **[Distributions](./distributions.md)** - Pre-configured deployment packages -- **[Resources](./resources.md)** - Understanding Llama Stack resources and their lifecycle -- **[External Integration](./external.md)** - Integrating with external services and providers +- **[Architecture](architecture.mdx)** - Learn about Llama Stack's architectural design and principles +- **[APIs](/docs/concepts/apis/)** - Understanding the core APIs and their stability levels + - [API Overview](apis/index.mdx) - Core APIs available in Llama Stack + - [API Providers](apis/api_providers.mdx) - How providers implement APIs + - [External APIs](apis/external.mdx) - External APIs available in Llama Stack + - [API Stability Leveling](apis/api_leveling.mdx) - API stability and versioning +- **[Distributions](distributions.mdx)** - Pre-configured deployment packages +- **[Resources](resources.mdx)** - Understanding Llama Stack resources and their lifecycle ## Getting Started If you're new to Llama Stack, we recommend starting with: -1. **[Architecture](./architecture.md)** - Understand the overall system design -2. **[APIs](./apis/index.mdx)** - Learn about the available APIs and their purpose -3. **[Distributions](./distributions.md)** - Choose a pre-configured setup for your use case +1. **[Architecture](architecture.mdx)** - Understand the overall system design +2. **[APIs](apis/index.mdx)** - Learn about the available APIs and their purpose +3. **[Distributions](distributions.mdx)** - Choose a pre-configured setup for your use case -Each concept builds upon the previous ones to give you a comprehensive understanding of how Llama Stack works and how to use it effectively.--- -title: Core Concepts -description: Understanding Llama Stack's service-oriented philosophy and key concepts -sidebar_label: Overview -sidebar_position: 1 ---- - -# Core Concepts - -Given Llama Stack's service-oriented philosophy, a few concepts and workflows arise which may not feel completely natural in the LLM landscape, especially if you are coming with a background in other frameworks. - -This section covers the key concepts you need to understand to work effectively with Llama Stack: - -- **[Architecture](./architecture)** - Llama Stack's service-oriented design and benefits -- **[APIs](./apis)** - Available REST APIs and planned capabilities -- **[API Providers](./api_providers)** - Remote vs inline provider implementations -- **[Distributions](./distributions)** - Pre-packaged provider configurations -- **[Resources](./resources)** - Resource federation and registration +Each concept builds upon the previous ones to give you a comprehensive understanding of how Llama Stack works and how to use it effectively. diff --git a/docs/docs/concepts/resources.mdx b/docs/docs/concepts/resources.mdx index 323902a4a..8d1bd221b 100644 --- a/docs/docs/concepts/resources.mdx +++ b/docs/docs/concepts/resources.mdx @@ -2,7 +2,7 @@ title: Resources description: Resource federation and registration in Llama Stack sidebar_label: Resources -sidebar_position: 6 +sidebar_position: 4 --- # Resources diff --git a/docs/docs/contributing/index.mdx b/docs/docs/contributing/index.mdx index 03aeebc23..263900ecc 100644 --- a/docs/docs/contributing/index.mdx +++ b/docs/docs/contributing/index.mdx @@ -148,7 +148,7 @@ As a general guideline: that describes the configuration. These descriptions will be used to generate the provider documentation. * When possible, use keyword arguments only when calling functions. -* Llama Stack utilizes [custom Exception classes](llama_stack/apis/common/errors.py) for certain Resources that should be used where applicable. +* Llama Stack utilizes custom Exception classes for certain Resources that should be used where applicable. ### License By contributing to Llama, you agree that your contributions will be licensed @@ -212,35 +212,22 @@ The generated API schema will be available in `docs/static/`. Make sure to revie ## Adding a New Provider See: -- [Adding a New API Provider Page](new_api_provider.md) which describes how to add new API providers to the Stack. -- [Vector Database Page](new_vector_database.md) which describes how to add a new vector databases with Llama Stack. -- [External Provider Page](../providers/external/index.md) which describes how to add external providers to the Stack. +- [Adding a New API Provider Page](./new_api_provider.mdx) which describes how to add new API providers to the Stack. +- [Vector Database Page](./new_vector_database.mdx) which describes how to add a new vector databases with Llama Stack. +- [External Provider Page](/docs/providers/external/) which describes how to add external providers to the Stack. -```{toctree} -:maxdepth: 1 -:hidden: - -new_api_provider -new_vector_database -``` ## Testing -```{include} ../../../tests/README.md -``` +See the [Testing README](https://github.com/meta-llama/llama-stack/blob/main/tests/README.md) for detailed testing information. ## Advanced Topics For developers who need deeper understanding of the testing system internals: -```{toctree} -:maxdepth: 1 - -testing/record-replay -``` +- [Record-Replay Testing](./testing/record-replay.mdx) ### Benchmarking -```{include} ../../../benchmarking/k8s-benchmark/README.md -``` +See the [Benchmarking README](https://github.com/meta-llama/llama-stack/blob/main/benchmarking/k8s-benchmark/README.md) for benchmarking information. diff --git a/docs/docs/contributing/new_api_provider.mdx b/docs/docs/contributing/new_api_provider.mdx index 95ef0c4f6..4ae6d5e72 100644 --- a/docs/docs/contributing/new_api_provider.mdx +++ b/docs/docs/contributing/new_api_provider.mdx @@ -11,7 +11,7 @@ import TabItem from '@theme/TabItem'; This guide will walk you through the process of adding a new API provider to Llama Stack. -- Begin by reviewing the [core concepts](../concepts/index.md) of Llama Stack and choose the API your provider belongs to (Inference, Safety, VectorIO, etc.) +- Begin by reviewing the [core concepts](../concepts/) of Llama Stack and choose the API your provider belongs to (Inference, Safety, VectorIO, etc.) - Determine the provider type ([Remote](https://github.com/meta-llama/llama-stack/tree/main/llama_stack/providers/remote) or [Inline](https://github.com/meta-llama/llama-stack/tree/main/llama_stack/providers/inline)). Remote providers make requests to external services, while inline providers execute implementation locally. - Add your provider to the appropriate [Registry](https://github.com/meta-llama/llama-stack/tree/main/llama_stack/providers/registry/). Specify pip dependencies necessary. - Update any distribution [Templates](https://github.com/meta-llama/llama-stack/tree/main/llama_stack/distributions/) `build.yaml` and `run.yaml` files if they should include your provider by default. Run [./scripts/distro_codegen.py](https://github.com/meta-llama/llama-stack/blob/main/scripts/distro_codegen.py) if necessary. Note that `distro_codegen.py` will fail if the new provider causes any distribution template to attempt to import provider-specific dependencies. This usually means the distribution's `get_distribution_template()` code path should only import any necessary Config or model alias definitions from each provider and not the provider's actual implementation. diff --git a/docs/docs/deploying/kubernetes_deployment.mdx b/docs/docs/deploying/kubernetes_deployment.mdx index b50926455..a937ce355 100644 --- a/docs/docs/deploying/kubernetes_deployment.mdx +++ b/docs/docs/deploying/kubernetes_deployment.mdx @@ -219,6 +219,6 @@ kubectl run -it --rm debug --image=curlimages/curl --restart=Never -- curl http: ## Related Resources -- **[Deployment Overview](./index)** - Overview of deployment options +- **[Deployment Overview](/docs/deploying/)** - Overview of deployment options - **[Distributions](/docs/distributions)** - Understanding Llama Stack distributions - **[Configuration](/docs/distributions/configuration)** - Detailed configuration options diff --git a/docs/docs/distributions/building_distro.mdx b/docs/docs/distributions/building_distro.mdx index d9a8048fc..5b65b7f16 100644 --- a/docs/docs/distributions/building_distro.mdx +++ b/docs/docs/distributions/building_distro.mdx @@ -251,7 +251,7 @@ directory or a git repository (git must be installed on the build environment). llama stack build --config my-external-stack.yaml ``` -For more information on external providers, including directory structure, provider types, and implementation requirements, see the [External Providers documentation](../providers/external.md). +For more information on external providers, including directory structure, provider types, and implementation requirements, see the [External Providers documentation](../providers/external/). diff --git a/docs/docs/distributions/configuration.mdx b/docs/docs/distributions/configuration.mdx index 4cd093ef0..d87c7f64b 100644 --- a/docs/docs/distributions/configuration.mdx +++ b/docs/docs/distributions/configuration.mdx @@ -206,7 +206,7 @@ models: provider_model_id: null model_type: llm ``` -A Model is an instance of a "Resource" (see [Concepts](../concepts/index)) and is associated with a specific inference provider (in this case, the provider with identifier `ollama`). This is an instance of a "pre-registered" model. While we always encourage the clients to register models before using them, some Stack servers may come up a list of "already known and available" models. +A Model is an instance of a "Resource" (see [Concepts](../concepts/)) and is associated with a specific inference provider (in this case, the provider with identifier `ollama`). This is an instance of a "pre-registered" model. While we always encourage the clients to register models before using them, some Stack servers may come up a list of "already known and available" models. What's with the `provider_model_id` field? This is an identifier for the model inside the provider's model catalog. Contrast it with `model_id` which is the identifier for the same model for Llama Stack's purposes. For example, you may want to name "llama3.2:vision-11b" as "image_captioning_model" when you use it in your Stack interactions. When omitted, the server will set `provider_model_id` to be the same as `model_id`. diff --git a/docs/docs/distributions/importing_as_library.mdx b/docs/docs/distributions/importing_as_library.mdx index b87bb80a4..122e5220f 100644 --- a/docs/docs/distributions/importing_as_library.mdx +++ b/docs/docs/distributions/importing_as_library.mdx @@ -33,7 +33,7 @@ Then, you can access the APIs like `models` and `inference` on the client and ca response = client.models.list() ``` -If you've created a [custom distribution](building_distro.md), you can also use the run.yaml configuration file directly: +If you've created a [custom distribution](./building_distro), you can also use the run.yaml configuration file directly: ```python client = LlamaStackAsLibraryClient(config_path) diff --git a/docs/docs/distributions/index.mdx b/docs/docs/distributions/index.mdx index 97be14910..0149f143f 100644 --- a/docs/docs/distributions/index.mdx +++ b/docs/docs/distributions/index.mdx @@ -13,9 +13,9 @@ This section provides an overview of the distributions available in Llama Stack. ## Distribution Guides -- **[Available Distributions](./list_of_distributions)** - Complete list and comparison of all distributions -- **[Building Custom Distributions](./building_distro)** - Create your own distribution from scratch -- **[Customizing Configuration](./customizing_run_yaml)** - Customize run.yaml for your needs -- **[Starting Llama Stack Server](./starting_llama_stack_server)** - How to run distributions -- **[Importing as Library](./importing_as_library)** - Use distributions in your code -- **[Configuration Reference](./configuration)** - Configuration file format details +- **[Available Distributions](./list_of_distributions.mdx)** - Complete list and comparison of all distributions +- **[Building Custom Distributions](./building_distro.mdx)** - Create your own distribution from scratch +- **[Customizing Configuration](./customizing_run_yaml.mdx)** - Customize run.yaml for your needs +- **[Starting Llama Stack Server](./starting_llama_stack_server.mdx)** - How to run distributions +- **[Importing as Library](./importing_as_library.mdx)** - Use distributions in your code +- **[Configuration Reference](./configuration.mdx)** - Configuration file format details diff --git a/docs/docs/distributions/list_of_distributions.mdx b/docs/docs/distributions/list_of_distributions.mdx index 7e8f56a16..813d3c721 100644 --- a/docs/docs/distributions/list_of_distributions.mdx +++ b/docs/docs/distributions/list_of_distributions.mdx @@ -62,7 +62,7 @@ docker pull llama-stack/distribution-meta-reference-gpu **Partners:** [Fireworks.ai](https://fireworks.ai) and [Together.xyz](https://together.xyz) -**Guides:** [Remote-Hosted Endpoints](remote_hosted_distro/index) +**Guides:** [Remote-Hosted Endpoints](./remote_hosted_distro/) ### 📱 Mobile Development @@ -81,7 +81,7 @@ docker pull llama-stack/distribution-meta-reference-gpu - You need custom configurations - You want to optimize for your specific use case -**Guides:** [Building Custom Distributions](building_distro.md) +**Guides:** [Building Custom Distributions](./building_distro) ## Detailed Documentation @@ -131,4 +131,4 @@ graph TD 3. **Configure your providers** with API keys or local models 4. **Start building** with Llama Stack! -For help choosing or troubleshooting, check our [Getting Started Guide](../getting_started/index.md) or [Community Support](https://github.com/llama-stack/llama-stack/discussions). +For help choosing or troubleshooting, check our [Getting Started Guide](/docs/getting_started/quickstart) or [Community Support](https://github.com/llama-stack/llama-stack/discussions). diff --git a/docs/docs/distributions/ondevice_distro/android_sdk.md b/docs/docs/distributions/ondevice_distro/android_sdk.md index ad86fa5f3..bfa294e45 100644 --- a/docs/docs/distributions/ondevice_distro/android_sdk.md +++ b/docs/docs/distributions/ondevice_distro/android_sdk.md @@ -66,7 +66,7 @@ llama stack run starter --port 5050 Ensure the Llama Stack server version is the same as the Kotlin SDK Library for maximum compatibility. -Other inference providers: [Table](../../index.md#supported-llama-stack-implementations) +Other inference providers: [Table](/docs/) How to set remote localhost in Demo App: [Settings](https://github.com/meta-llama/llama-stack-client-kotlin/tree/latest-release/examples/android_app#settings) diff --git a/docs/docs/distributions/self_hosted_distro/starter.md b/docs/docs/distributions/self_hosted_distro/starter.md index 9218f7f81..faa82bcfa 100644 --- a/docs/docs/distributions/self_hosted_distro/starter.md +++ b/docs/docs/distributions/self_hosted_distro/starter.md @@ -36,25 +36,25 @@ The starter distribution includes a comprehensive set of inference providers: ### Hosted Providers - **[OpenAI](https://openai.com/api/)**: GPT-4, GPT-3.5, O1, O3, O4 models and text embeddings - - provider ID: `openai` - reference documentation: [openai](../../providers/inference/remote_openai.md) + provider ID: `openai` - reference documentation: [openai](../../providers/inference/remote_openai) - **[Fireworks](https://fireworks.ai/)**: Llama 3.1, 3.2, 3.3, 4 Scout, 4 Maverick models and - embeddings - provider ID: `fireworks` - reference documentation: [fireworks](../../providers/inference/remote_fireworks.md) + embeddings - provider ID: `fireworks` - reference documentation: [fireworks](../../providers/inference/remote_fireworks) - **[Together](https://together.ai/)**: Llama 3.1, 3.2, 3.3, 4 Scout, 4 Maverick models and - embeddings - provider ID: `together` - reference documentation: [together](../../providers/inference/remote_together.md) -- **[Anthropic](https://www.anthropic.com/)**: Claude 3.5 Sonnet, Claude 3.7 Sonnet, Claude 3.5 Haiku, and Voyage embeddings - provider ID: `anthropic` - reference documentation: [anthropic](../../providers/inference/remote_anthropic.md) -- **[Gemini](https://gemini.google.com/)**: Gemini 1.5, 2.0, 2.5 models and text embeddings - provider ID: `gemini` - reference documentation: [gemini](../../providers/inference/remote_gemini.md) -- **[Groq](https://groq.com/)**: Fast Llama models (3.1, 3.2, 3.3, 4 Scout, 4 Maverick) - provider ID: `groq` - reference documentation: [groq](../../providers/inference/remote_groq.md) -- **[SambaNova](https://www.sambanova.ai/)**: Llama 3.1, 3.2, 3.3, 4 Scout, 4 Maverick models - provider ID: `sambanova` - reference documentation: [sambanova](../../providers/inference/remote_sambanova.md) -- **[Cerebras](https://www.cerebras.ai/)**: Cerebras AI models - provider ID: `cerebras` - reference documentation: [cerebras](../../providers/inference/remote_cerebras.md) -- **[NVIDIA](https://www.nvidia.com/)**: NVIDIA NIM - provider ID: `nvidia` - reference documentation: [nvidia](../../providers/inference/remote_nvidia.md) -- **[HuggingFace](https://huggingface.co/)**: Serverless and endpoint models - provider ID: `hf::serverless` and `hf::endpoint` - reference documentation: [huggingface-serverless](../../providers/inference/remote_hf_serverless.md) and [huggingface-endpoint](../../providers/inference/remote_hf_endpoint.md) -- **[Bedrock](https://aws.amazon.com/bedrock/)**: AWS Bedrock models - provider ID: `bedrock` - reference documentation: [bedrock](../../providers/inference/remote_bedrock.md) + embeddings - provider ID: `together` - reference documentation: [together](../../providers/inference/remote_together) +- **[Anthropic](https://www.anthropic.com/)**: Claude 3.5 Sonnet, Claude 3.7 Sonnet, Claude 3.5 Haiku, and Voyage embeddings - provider ID: `anthropic` - reference documentation: [anthropic](../../providers/inference/remote_anthropic) +- **[Gemini](https://gemini.google.com/)**: Gemini 1.5, 2.0, 2.5 models and text embeddings - provider ID: `gemini` - reference documentation: [gemini](../../providers/inference/remote_gemini) +- **[Groq](https://groq.com/)**: Fast Llama models (3.1, 3.2, 3.3, 4 Scout, 4 Maverick) - provider ID: `groq` - reference documentation: [groq](../../providers/inference/remote_groq) +- **[SambaNova](https://www.sambanova.ai/)**: Llama 3.1, 3.2, 3.3, 4 Scout, 4 Maverick models - provider ID: `sambanova` - reference documentation: [sambanova](../../providers/inference/remote_sambanova) +- **[Cerebras](https://www.cerebras.ai/)**: Cerebras AI models - provider ID: `cerebras` - reference documentation: [cerebras](../../providers/inference/remote_cerebras) +- **[NVIDIA](https://www.nvidia.com/)**: NVIDIA NIM - provider ID: `nvidia` - reference documentation: [nvidia](../../providers/inference/remote_nvidia) +- **[HuggingFace](https://huggingface.co/)**: Serverless and endpoint models - provider ID: `hf::serverless` and `hf::endpoint` - reference documentation: [huggingface-serverless](../../providers/inference/remote_hf_serverless) and [huggingface-endpoint](../../providers/inference/remote_hf_endpoint) +- **[Bedrock](https://aws.amazon.com/bedrock/)**: AWS Bedrock models - provider ID: `bedrock` - reference documentation: [bedrock](../../providers/inference/remote_bedrock) ### Local/Remote Providers -- **[Ollama](https://ollama.ai/)**: Local Ollama models - provider ID: `ollama` - reference documentation: [ollama](../../providers/inference/remote_ollama.md) -- **[vLLM](https://docs.vllm.ai/en/latest/)**: Local or remote vLLM server - provider ID: `vllm` - reference documentation: [vllm](../../providers/inference/remote_vllm.md) -- **[TGI](https://github.com/huggingface/text-generation-inference)**: Text Generation Inference server - Dell Enterprise Hub's custom TGI container too (use `DEH_URL`) - provider ID: `tgi` - reference documentation: [tgi](../../providers/inference/remote_tgi.md) -- **[Sentence Transformers](https://www.sbert.net/)**: Local embedding models - provider ID: `sentence-transformers` - reference documentation: [sentence-transformers](../../providers/inference/inline_sentence-transformers.md) +- **[Ollama](https://ollama.ai/)**: Local Ollama models - provider ID: `ollama` - reference documentation: [ollama](../../providers/inference/remote_ollama) +- **[vLLM](https://docs.vllm.ai/en/latest/)**: Local or remote vLLM server - provider ID: `vllm` - reference documentation: [vllm](../../providers/inference/remote_vllm) +- **[TGI](https://github.com/huggingface/text-generation-inference)**: Text Generation Inference server - Dell Enterprise Hub's custom TGI container too (use `DEH_URL`) - provider ID: `tgi` - reference documentation: [tgi](../../providers/inference/remote_tgi) +- **[Sentence Transformers](https://www.sbert.net/)**: Local embedding models - provider ID: `sentence-transformers` - reference documentation: [sentence-transformers](../../providers/inference/inline_sentence-transformers) All providers are disabled by default. So you need to enable them by setting the environment variables. diff --git a/docs/docs/distributions/starting_llama_stack_server.mdx b/docs/docs/distributions/starting_llama_stack_server.mdx index 8ca1ca3ce..0260692b3 100644 --- a/docs/docs/distributions/starting_llama_stack_server.mdx +++ b/docs/docs/distributions/starting_llama_stack_server.mdx @@ -16,11 +16,11 @@ This is the simplest way to get started. Using Llama Stack as a library means yo ## Container: -Another simple way to start interacting with Llama Stack is to just spin up a container (via Docker or Podman) which is pre-built with all the providers you need. We provide a number of pre-built images so you can start a Llama Stack server instantly. You can also build your own custom container. Which distribution to choose depends on the hardware you have. See [Selection of a Distribution](selection) for more details. +Another simple way to start interacting with Llama Stack is to just spin up a container (via Docker or Podman) which is pre-built with all the providers you need. We provide a number of pre-built images so you can start a Llama Stack server instantly. You can also build your own custom container. Which distribution to choose depends on the hardware you have. See [Selection of a Distribution](./list_of_distributions) for more details. ## Kubernetes: -If you have built a container image and want to deploy it in a Kubernetes cluster instead of starting the Llama Stack server locally. See [Kubernetes Deployment Guide](kubernetes_deployment) for more details. +If you have built a container image and want to deploy it in a Kubernetes cluster instead of starting the Llama Stack server locally. See [Kubernetes Deployment Guide](../deploying/kubernetes_deployment) for more details. ```{toctree} diff --git a/docs/docs/getting_started/detailed_tutorial.mdx b/docs/docs/getting_started/detailed_tutorial.mdx index 3db63176c..33786ac0e 100644 --- a/docs/docs/getting_started/detailed_tutorial.mdx +++ b/docs/docs/getting_started/detailed_tutorial.mdx @@ -18,7 +18,7 @@ In Llama Stack, we provide a server exposing multiple APIs. These APIs are backe Llama Stack is a stateful service with REST APIs to support seamless transition of AI applications across different environments. The server can be run in a variety of ways, including as a standalone binary, Docker container, or hosted service. You can build and test using a local server first and deploy to a hosted endpoint for production. In this guide, we'll walk through how to build a RAG agent locally using Llama Stack with [Ollama](https://ollama.com/) -as the inference [provider](../providers/index.md#inference) for a Llama Model. +as the inference [provider](/docs/providers/inference/) for a Llama Model. ### Step 1: Installation and Setup @@ -60,8 +60,8 @@ Llama Stack is a server that exposes multiple APIs, you connect with it using th You can use Python to build and run the Llama Stack server, which is useful for testing and development. -Llama Stack uses a [YAML configuration file](../distributions/configuration.md) to specify the stack setup, -which defines the providers and their settings. The generated configuration serves as a starting point that you can [customize for your specific needs](../distributions/customizing_run_yaml.md). +Llama Stack uses a [YAML configuration file](../distributions/configuration) to specify the stack setup, +which defines the providers and their settings. The generated configuration serves as a starting point that you can [customize for your specific needs](../distributions/customizing_run_yaml). Now let's build and run the Llama Stack config for Ollama. We use `starter` as template. By default all providers are disabled, this requires enable ollama by passing environment variables. @@ -73,7 +73,7 @@ llama stack build --distro starter --image-type venv --run You can use a container image to run the Llama Stack server. We provide several container images for the server component that works with different inference providers out of the box. For this guide, we will use `llamastack/distribution-starter` as the container image. If you'd like to build your own image or customize the -configurations, please check out [this guide](../distributions/building_distro.md). +configurations, please check out [this guide](../distributions/building_distro). First lets setup some environment variables and create a local directory to mount into the container’s file system. ```bash export LLAMA_STACK_PORT=8321 @@ -145,7 +145,7 @@ pip install llama-stack-client -Now let's use the `llama-stack-client` [CLI](../references/llama_stack_client_cli_reference.md) to check the +Now let's use the `llama-stack-client` [CLI](../references/llama_stack_client_cli_reference) to check the connectivity to the server. ```bash @@ -216,8 +216,8 @@ OpenAIChatCompletion( ### Step 4: Run the Demos -Note that these demos show the [Python Client SDK](../references/python_sdk_reference/index.md). -Other SDKs are also available, please refer to the [Client SDK](../index.md#client-sdks) list for the complete options. +Note that these demos show the [Python Client SDK](../references/python_sdk_reference/). +Other SDKs are also available, please refer to the [Client SDK](/docs/) list for the complete options. @@ -538,4 +538,4 @@ uv run python rag_agent.py **You're Ready to Build Your Own Apps!** -Congrats! 🥳 Now you're ready to [build your own Llama Stack applications](../building_applications/index)! 🚀 +Congrats! 🥳 Now you're ready to [build your own Llama Stack applications](../building_applications/)! 🚀 diff --git a/docs/docs/getting_started/quickstart.mdx b/docs/docs/getting_started/quickstart.mdx index fbc86cc2e..b885f3c66 100644 --- a/docs/docs/getting_started/quickstart.mdx +++ b/docs/docs/getting_started/quickstart.mdx @@ -140,7 +140,7 @@ If you are getting a **401 Client Error** from HuggingFace for the **all-MiniLM- ### Next Steps Now you're ready to dive deeper into Llama Stack! -- Explore the [Detailed Tutorial](/docs/detailed_tutorial). +- Explore the [Detailed Tutorial](./detailed_tutorial). - Try the [Getting Started Notebook](https://github.com/meta-llama/llama-stack/blob/main/docs/getting_started.ipynb). - Browse more [Notebooks on GitHub](https://github.com/meta-llama/llama-stack/tree/main/docs/notebooks). - Learn about Llama Stack [Concepts](/docs/concepts). diff --git a/docs/docs/providers/agents/index.mdx b/docs/docs/providers/agents/index.mdx index df020f284..5cd37776d 100644 --- a/docs/docs/providers/agents/index.mdx +++ b/docs/docs/providers/agents/index.mdx @@ -25,7 +25,3 @@ Agents API for creating and interacting with agentic systems. - Agents can also use Memory to retrieve information from knowledge bases. See the RAG Tool and Vector IO APIs for more details. This section contains documentation for all available providers for the **agents** API. - -## Providers - -- [Meta-Reference](./inline_meta-reference) diff --git a/docs/docs/providers/batches/index.mdx b/docs/docs/providers/batches/index.mdx index a966cc153..2c64b277f 100644 --- a/docs/docs/providers/batches/index.mdx +++ b/docs/docs/providers/batches/index.mdx @@ -29,7 +29,3 @@ The Batches API enables efficient processing of multiple requests in a single op Note: This API is currently under active development and may undergo changes. This section contains documentation for all available providers for the **batches** API. - -## Providers - -- [Reference](./inline_reference) diff --git a/docs/docs/providers/datasetio/index.md b/docs/docs/providers/datasetio/index.md deleted file mode 100644 index 6c02acf6c..000000000 --- a/docs/docs/providers/datasetio/index.md +++ /dev/null @@ -1,16 +0,0 @@ ---- -sidebar_label: Datasetio -title: Datasetio ---- - -# Datasetio - -## Overview - -This section contains documentation for all available providers for the **datasetio** API. - -## Providers - -- [Localfs](./inline_localfs) -- [Remote - Huggingface](./remote_huggingface) -- [Remote - Nvidia](./remote_nvidia) diff --git a/docs/docs/providers/datasetio/index.mdx b/docs/docs/providers/datasetio/index.mdx index 6c02acf6c..aeeb01980 100644 --- a/docs/docs/providers/datasetio/index.mdx +++ b/docs/docs/providers/datasetio/index.mdx @@ -8,9 +8,3 @@ title: Datasetio ## Overview This section contains documentation for all available providers for the **datasetio** API. - -## Providers - -- [Localfs](./inline_localfs) -- [Remote - Huggingface](./remote_huggingface) -- [Remote - Nvidia](./remote_nvidia) diff --git a/docs/docs/providers/eval/index.mdx b/docs/docs/providers/eval/index.mdx index e486814de..73b0b89aa 100644 --- a/docs/docs/providers/eval/index.mdx +++ b/docs/docs/providers/eval/index.mdx @@ -11,8 +11,3 @@ title: Eval Llama Stack Evaluation API for running evaluations on model and agent candidates. This section contains documentation for all available providers for the **eval** API. - -## Providers - -- [Meta-Reference](./inline_meta-reference) -- [Remote - Nvidia](./remote_nvidia) diff --git a/docs/docs/providers/external/index.mdx b/docs/docs/providers/external/index.mdx index 375a97c82..28a9a1147 100644 --- a/docs/docs/providers/external/index.mdx +++ b/docs/docs/providers/external/index.mdx @@ -7,5 +7,5 @@ Llama Stack supports external providers that live outside of the main codebase. ## External Provider Documentation -- [Known External Providers](external-providers-list) -- [Creating External Providers](external-providers-guide) +- [Known External Providers](./external-providers-list.mdx) +- [Creating External Providers](./external-providers-guide.mdx) diff --git a/docs/docs/providers/files/index.mdx b/docs/docs/providers/files/index.mdx index 98bd89633..7d729d90f 100644 --- a/docs/docs/providers/files/index.mdx +++ b/docs/docs/providers/files/index.mdx @@ -8,8 +8,3 @@ title: Files ## Overview This section contains documentation for all available providers for the **files** API. - -## Providers - -- [Localfs](./inline_localfs) -- [Remote - S3](./remote_s3) diff --git a/docs/docs/providers/index.mdx b/docs/docs/providers/index.mdx index d275ac1a3..9c560fe32 100644 --- a/docs/docs/providers/index.mdx +++ b/docs/docs/providers/index.mdx @@ -21,13 +21,13 @@ Importantly, Llama Stack always strives to provide at least one fully inline pro ## Provider Categories -- **[External Providers](./external/)** - Guide for building and using external providers -- **[OpenAI Compatibility](./openai)** - OpenAI API compatibility layer -- **[Inference](./inference/)** - LLM and embedding model providers -- **[Agents](./agents/)** - Agentic system providers -- **[DatasetIO](./datasetio/)** - Dataset and data loader providers -- **[Safety](./safety/)** - Content moderation and safety providers -- **[Telemetry](./telemetry/)** - Monitoring and observability providers -- **[Vector IO](./vector-io/)** - Vector database providers -- **[Tool Runtime](./tool-runtime/)** - Tool and protocol providers -- **[Files](./files/)** - File system and storage providers +- **[External Providers](external/index.mdx)** - Guide for building and using external providers +- **[OpenAI Compatibility](./openai.mdx)** - OpenAI API compatibility layer +- **[Inference](inference/index.mdx)** - LLM and embedding model providers +- **[Agents](agents/index.mdx)** - Agentic system providers +- **[DatasetIO](datasetio/index.mdx)** - Dataset and data loader providers +- **[Safety](safety/index.mdx)** - Content moderation and safety providers +- **[Telemetry](telemetry/index.mdx)** - Monitoring and observability providers +- **[Vector IO](vector_io/index.mdx)** - Vector database providers +- **[Tool Runtime](tool_runtime/index.mdx)** - Tool and protocol providers +- **[Files](files/index.mdx)** - File system and storage providers diff --git a/docs/docs/providers/inference/index.mdx b/docs/docs/providers/inference/index.mdx index a9365c5f2..ebbaf1be1 100644 --- a/docs/docs/providers/inference/index.mdx +++ b/docs/docs/providers/inference/index.mdx @@ -19,30 +19,3 @@ Llama Stack Inference API for generating completions, chat completions, and embe - Embedding models: these models generate embeddings to be used for semantic search. This section contains documentation for all available providers for the **inference** API. - -## Providers - -- [Meta-Reference](./inline_meta-reference) -- [Sentence-Transformers](./inline_sentence-transformers) -- [Remote - Anthropic](./remote_anthropic) -- [Remote - Azure](./remote_azure) -- [Remote - Bedrock](./remote_bedrock) -- [Remote - Cerebras](./remote_cerebras) -- [Remote - Databricks](./remote_databricks) -- [Remote - Fireworks](./remote_fireworks) -- [Remote - Gemini](./remote_gemini) -- [Remote - Groq](./remote_groq) -- [Remote - Hf - Endpoint](./remote_hf_endpoint) -- [Remote - Hf - Serverless](./remote_hf_serverless) -- [Remote - Llama-Openai-Compat](./remote_llama-openai-compat) -- [Remote - Nvidia](./remote_nvidia) -- [Remote - Ollama](./remote_ollama) -- [Remote - Openai](./remote_openai) -- [Remote - Passthrough](./remote_passthrough) -- [Remote - Runpod](./remote_runpod) -- [Remote - Sambanova](./remote_sambanova) -- [Remote - Tgi](./remote_tgi) -- [Remote - Together](./remote_together) -- [Remote - Vertexai](./remote_vertexai) -- [Remote - Vllm](./remote_vllm) -- [Remote - Watsonx](./remote_watsonx) diff --git a/docs/docs/providers/openai.mdx b/docs/docs/providers/openai.mdx index 1a907152f..bcff5873c 100644 --- a/docs/docs/providers/openai.mdx +++ b/docs/docs/providers/openai.mdx @@ -1,3 +1,8 @@ +title: OpenAI Compatibility +description: OpenAI API Compatibility +sidebar_label: OpenAI Compatibility +sidebar_position: 1 +--- ## OpenAI API Compatibility ### Server path diff --git a/docs/docs/providers/post_training/index.mdx b/docs/docs/providers/post_training/index.mdx index 6faab7a05..e3c8ba0e8 100644 --- a/docs/docs/providers/post_training/index.mdx +++ b/docs/docs/providers/post_training/index.mdx @@ -8,10 +8,3 @@ title: Post_Training ## Overview This section contains documentation for all available providers for the **post_training** API. - -## Providers - -- [Huggingface-Gpu](./inline_huggingface-gpu) -- [Torchtune-Cpu](./inline_torchtune-cpu) -- [Torchtune-Gpu](./inline_torchtune-gpu) -- [Remote - Nvidia](./remote_nvidia) diff --git a/docs/docs/providers/safety/index.mdx b/docs/docs/providers/safety/index.mdx index 591b92b8d..3445b17e6 100644 --- a/docs/docs/providers/safety/index.mdx +++ b/docs/docs/providers/safety/index.mdx @@ -8,12 +8,3 @@ title: Safety ## Overview This section contains documentation for all available providers for the **safety** API. - -## Providers - -- [Code-Scanner](./inline_code-scanner) -- [Llama-Guard](./inline_llama-guard) -- [Prompt-Guard](./inline_prompt-guard) -- [Remote - Bedrock](./remote_bedrock) -- [Remote - Nvidia](./remote_nvidia) -- [Remote - Sambanova](./remote_sambanova) diff --git a/docs/docs/providers/scoring/index.mdx b/docs/docs/providers/scoring/index.mdx index cb9bc539b..41d63b4ad 100644 --- a/docs/docs/providers/scoring/index.mdx +++ b/docs/docs/providers/scoring/index.mdx @@ -8,9 +8,3 @@ title: Scoring ## Overview This section contains documentation for all available providers for the **scoring** API. - -## Providers - -- [Basic](./inline_basic) -- [Braintrust](./inline_braintrust) -- [Llm-As-Judge](./inline_llm-as-judge) diff --git a/docs/docs/providers/telemetry/index.mdx b/docs/docs/providers/telemetry/index.mdx index a13481e13..07190d625 100644 --- a/docs/docs/providers/telemetry/index.mdx +++ b/docs/docs/providers/telemetry/index.mdx @@ -8,7 +8,3 @@ title: Telemetry ## Overview This section contains documentation for all available providers for the **telemetry** API. - -## Providers - -- [Meta-Reference](./inline_meta-reference) diff --git a/docs/docs/providers/tool_runtime/index.mdx b/docs/docs/providers/tool_runtime/index.mdx index 051a8c436..ab5050952 100644 --- a/docs/docs/providers/tool_runtime/index.mdx +++ b/docs/docs/providers/tool_runtime/index.mdx @@ -8,12 +8,3 @@ title: Tool_Runtime ## Overview This section contains documentation for all available providers for the **tool_runtime** API. - -## Providers - -- [Rag-Runtime](./inline_rag-runtime) -- [Remote - Bing-Search](./remote_bing-search) -- [Remote - Brave-Search](./remote_brave-search) -- [Remote - Model-Context-Protocol](./remote_model-context-protocol) -- [Remote - Tavily-Search](./remote_tavily-search) -- [Remote - Wolfram-Alpha](./remote_wolfram-alpha) diff --git a/docs/docs/providers/vector_io/index.mdx b/docs/docs/providers/vector_io/index.mdx index 58dca2d13..4c4c81ef8 100644 --- a/docs/docs/providers/vector_io/index.mdx +++ b/docs/docs/providers/vector_io/index.mdx @@ -8,18 +8,3 @@ title: Vector_Io ## Overview This section contains documentation for all available providers for the **vector_io** API. - -## Providers - -- [Chromadb](./inline_chromadb) -- [Faiss](./inline_faiss) -- [Meta-Reference](./inline_meta-reference) -- [Milvus](./inline_milvus) -- [Qdrant](./inline_qdrant) -- [Sqlite-Vec](./inline_sqlite-vec) -- [Sqlite Vec](./inline_sqlite_vec) -- [Remote - Chromadb](./remote_chromadb) -- [Remote - Milvus](./remote_milvus) -- [Remote - Pgvector](./remote_pgvector) -- [Remote - Qdrant](./remote_qdrant) -- [Remote - Weaviate](./remote_weaviate) diff --git a/docs/docs/references/index.mdx b/docs/docs/references/index.mdx index 9bf41b6d5..dd6ab21cf 100644 --- a/docs/docs/references/index.mdx +++ b/docs/docs/references/index.mdx @@ -7,6 +7,6 @@ sidebar_position: 1 # References -- [Python SDK Reference](python_sdk_reference/index) -- [Llama CLI](llama_cli_reference/index) for building and running your Llama Stack server -- [Llama Stack Client CLI](llama_stack_client_cli_reference) for interacting with your Llama Stack server +- [Python SDK Reference](/docs/references/python_sdk_reference/) +- [Llama CLI](/docs/references/llama_cli_reference/) for building and running your Llama Stack server +- [Llama Stack Client CLI](./llama_stack_client_cli_reference.md) for interacting with your Llama Stack server diff --git a/docs/docs/references/llama_cli_reference/index.md b/docs/docs/references/llama_cli_reference/index.md index 09a8b7177..fe3aa51ab 100644 --- a/docs/docs/references/llama_cli_reference/index.md +++ b/docs/docs/references/llama_cli_reference/index.md @@ -29,7 +29,7 @@ You have two ways to install Llama Stack: ## `llama` subcommands 1. `download`: Supports downloading models from Meta or Hugging Face. [Downloading models](#downloading-models) 2. `model`: Lists available models and their properties. [Understanding models](#understand-the-models) -3. `stack`: Allows you to build a stack using the `llama stack` distribution and run a Llama Stack server. You can read more about how to build a Llama Stack distribution in the [Build your own Distribution](../../distributions/building_distro) documentation. +3. `stack`: Allows you to build a stack using the `llama stack` distribution and run a Llama Stack server. You can read more about how to build a Llama Stack distribution in the [Build your own Distribution](../distributions/building_distro) documentation. ### Sample Usage diff --git a/docs/docusaurus.config.ts b/docs/docusaurus.config.ts index 42498fa9f..f4420df87 100644 --- a/docs/docusaurus.config.ts +++ b/docs/docusaurus.config.ts @@ -217,11 +217,6 @@ const config: Config = { ignoreFiles: [ "node_modules/**/*", ], - - // Exclude OpenAPI generated docs from search to avoid duplicates - searchContextByPaths: [ - "docs", - ], }, ], ], diff --git a/docs/static/img/llama-stack-logo.png b/docs/static/img/llama-stack-logo.png new file mode 100644 index 0000000000000000000000000000000000000000..d08f13ae16320866956dd38e11dc715227b30336 GIT binary patch literal 18601 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 AuK)l5 literal 0 HcmV?d00001 diff --git a/docs/static/llama-stack-logo.png b/docs/static/llama-stack-logo.png deleted file mode 100644 index 1899a0fc7f4a814f358e54ed3539fc29c681216b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 71620 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

#9!>tOniSDP*0sPwR~6a@p&@1 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 diff --git a/docs/static/src/components/HomepageFeatures/index.js b/docs/static/src/components/HomepageFeatures/index.js deleted file mode 100644 index 78f410ba6..000000000 --- a/docs/static/src/components/HomepageFeatures/index.js +++ /dev/null @@ -1,64 +0,0 @@ -import React from 'react'; -import clsx from 'clsx'; -import styles from './styles.module.css'; - -const FeatureList = [ - { - title: 'Easy to Use', - Svg: require('@site/static/img/undraw_docusaurus_mountain.svg').default, - description: ( - <> - Docusaurus was designed from the ground up to be easily installed and - used to get your website up and running quickly. - - ), - }, - { - title: 'Focus on What Matters', - Svg: require('@site/static/img/undraw_docusaurus_tree.svg').default, - description: ( - <> - Docusaurus lets you focus on your docs, and we'll do the chores. Go - ahead and move your docs into the docs directory. - - ), - }, - { - title: 'Powered by React', - Svg: require('@site/static/img/undraw_docusaurus_react.svg').default, - description: ( - <> - Extend or customize your website layout by reusing React. Docusaurus can - be extended while reusing the same header and footer. - - ), - }, -]; - -function Feature({Svg, title, description}) { - return ( -
-
- -
-
-

{title}

-

{description}

-
-
- ); -} - -export default function HomepageFeatures() { - return ( -
-
-
- {FeatureList.map((props, idx) => ( - - ))} -
-
-
- ); -} diff --git a/docs/static/src/components/HomepageFeatures/styles.module.css b/docs/static/src/components/HomepageFeatures/styles.module.css deleted file mode 100644 index b248eb2e5..000000000 --- a/docs/static/src/components/HomepageFeatures/styles.module.css +++ /dev/null @@ -1,11 +0,0 @@ -.features { - display: flex; - align-items: center; - padding: 2rem 0; - width: 100%; -} - -.featureSvg { - height: 200px; - width: 200px; -} diff --git a/docs/static/src/css/custom.css b/docs/static/src/css/custom.css deleted file mode 100644 index 0e4d95b9b..000000000 --- a/docs/static/src/css/custom.css +++ /dev/null @@ -1,191 +0,0 @@ -/** - * Any CSS included here will be global. The classic template - * bundles Infima by default. Infima is a CSS framework designed to - * work well for content-centric websites. - */ - -/* You can override the default Infima variables here. */ -:root { - /* Llama Stack Original Theme - Based on llamastack.github.io */ - --ifm-color-primary: #4a4a68; - --ifm-color-primary-dark: #3a3a52; - --ifm-color-primary-darker: #332735; - --ifm-color-primary-darkest: #2b2129; - --ifm-color-primary-light: #5a5a7e; - --ifm-color-primary-lighter: #6a6a94; - --ifm-color-primary-lightest: #8080aa; - - /* Additional theme colors */ - --ifm-color-secondary: #1b263c; - --ifm-color-info: #2980b9; - --ifm-color-success: #16a085; - --ifm-color-warning: #f39c12; - --ifm-color-danger: #e74c3c; - - /* Background colors */ - --ifm-background-color: #ffffff; - --ifm-background-surface-color: #f8f9fa; - - /* Code and syntax highlighting */ - --ifm-code-font-size: 95%; - --ifm-pre-background: #1b263c; - --ifm-pre-color: #e1e5e9; - --docusaurus-highlighted-code-line-bg: rgba(51, 39, 53, 0.1); - - /* Link colors */ - --ifm-link-color: var(--ifm-color-primary); - --ifm-link-hover-color: var(--ifm-color-primary-darker); - - /* Navbar */ - --ifm-navbar-background-color: rgba(255, 255, 255, 0.95); - --ifm-navbar-shadow: 0 2px 4px rgba(0, 0, 0, 0.1); - - /* Hero section gradient - matching original theme */ - --hero-gradient: linear-gradient(90deg, #332735 0%, #1b263c 100%); - - /* OpenAPI method colors */ - --openapi-code-blue: #2980b9; - --openapi-code-green: #16a085; - --openapi-code-orange: #f39c12; - --openapi-code-red: #e74c3c; - --openapi-code-purple: #332735; -} - -/* For readability concerns, you should choose a lighter palette in dark mode. */ -[data-theme='dark'] { - /* Dark theme primary colors - lighter versions of original theme */ - --ifm-color-primary: #8080aa; - --ifm-color-primary-dark: #6a6a94; - --ifm-color-primary-darker: #5a5a7e; - --ifm-color-primary-darkest: #4a4a68; - --ifm-color-primary-light: #9090ba; - --ifm-color-primary-lighter: #a0a0ca; - --ifm-color-primary-lightest: #b0b0da; - - /* Dark theme background colors */ - --ifm-background-color: #1a1a1a; - --ifm-background-surface-color: #2a2a2a; - - /* Dark theme navbar */ - --ifm-navbar-background-color: rgba(26, 26, 26, 0.95); - - /* Dark theme code highlighting */ - --docusaurus-highlighted-code-line-bg: rgba(51, 39, 53, 0.3); - - /* Dark theme text colors */ - --ifm-font-color-base: #e1e5e9; - --ifm-font-color-secondary: #a0a6ac; -} - -/* Sidebar Method labels */ -.api-method>.menu__link { - align-items: center; - justify-content: start; -} - -.api-method>.menu__link::before { - width: 50px; - height: 20px; - font-size: 12px; - line-height: 20px; - text-transform: uppercase; - font-weight: 600; - border-radius: 0.25rem; - border: 1px solid; - margin-right: var(--ifm-spacing-horizontal); - text-align: center; - flex-shrink: 0; - border-color: transparent; - color: white; -} - -.get>.menu__link::before { - content: "get"; - background-color: var(--ifm-color-primary); -} - -.put>.menu__link::before { - content: "put"; - background-color: var(--openapi-code-blue); -} - -.post>.menu__link::before { - content: "post"; - background-color: var(--openapi-code-green); -} - -.delete>.menu__link::before { - content: "del"; - background-color: var(--openapi-code-red); -} - -.patch>.menu__link::before { - content: "patch"; - background-color: var(--openapi-code-orange); -} - -.footer--dark { - --ifm-footer-link-color: #ffffff; - --ifm-footer-title-color: #ffffff; -} - -.footer--dark .footer__link-item { - color: #ffffff; -} - -.footer--dark .footer__title { - color: #ffffff; -} - -/* OpenAPI theme fixes for light mode readability */ -/* Version badge fixes */ -.openapi__version-badge, -.theme-doc-version-badge, -[class*="version-badge"], -[class*="versionBadge"] { - background-color: #ffffff !important; - color: #333333 !important; - border: 1px solid #d1d5db !important; -} - -/* OpenAPI method badges in light mode */ -.openapi__method-badge, -[class*="method-badge"] { - color: #ffffff !important; -} - -/* Button fixes for light mode */ -.openapi__button, -.theme-api-docs-demo-panel button, -[class*="api-docs"] button, -button[class*="button"], -.openapi-explorer__response-schema button, -.openapi-tabs__operation button { - color: #ffffff !important; -} - -.openapi__button:hover, -.theme-api-docs-demo-panel button:hover, -[class*="api-docs"] button:hover, -button[class*="button"]:hover, -.openapi-explorer__response-schema button:hover, -.openapi-tabs__operation button:hover { - color: #ffffff !important; -} - -/* Navigation buttons (Next/Previous) */ -.pagination-nav__link, -.pagination-nav__label { - color: #333333 !important; -} - -.pagination-nav__link--next, -.pagination-nav__link--prev { - background-color: #ffffff !important; - border: 1px solid #d1d5db !important; -} - -.pagination-nav__link--next:hover, -.pagination-nav__link--prev:hover { - background-color: #f3f4f6 !important; -} diff --git a/docs/static/src/pages/index.js b/docs/static/src/pages/index.js deleted file mode 100644 index fe14e920c..000000000 --- a/docs/static/src/pages/index.js +++ /dev/null @@ -1,163 +0,0 @@ -import React from 'react'; -import clsx from 'clsx'; -import Layout from '@theme/Layout'; -import Link from '@docusaurus/Link'; -import useDocusaurusContext from '@docusaurus/useDocusaurusContext'; -import styles from './index.module.css'; - -function HomepageHeader() { - const {siteConfig} = useDocusaurusContext(); - return ( -
-
-
-

Build AI Applications with Llama Stack

-

- Unified APIs for Inference, RAG, Agents, Tools, Safety, and Telemetry -

-
- - 🚀 Get Started - - - 📚 API Reference - -
-
-
-
- ); -} - -function QuickStart() { - return ( -
-
-
-
-

Quick Start

-

- Get up and running with Llama Stack in just a few commands. Build your first RAG application locally. -

-
-
{`# Install uv and start Ollama
-ollama run llama3.2:3b --keepalive 60m
-
-# Run Llama Stack server
-OLLAMA_URL=http://localhost:11434 \\
-  uv run --with llama-stack \\
-  llama stack build --distro starter \\
-  --image-type venv --run
-
-# Try the Python SDK
-from llama_stack_client import LlamaStackClient
-
-client = LlamaStackClient(
-  base_url="http://localhost:8321"
-)
-
-response = client.inference.chat_completion(
-  model="Llama3.2-3B-Instruct",
-  messages=[{
-    "role": "user",
-    "content": "What is machine learning?"
-  }]
-)`}
-
-
-
-

Why Llama Stack?

-
-
-
🔗
-
-

Unified APIs

-

One consistent interface for all your AI needs - inference, safety, agents, and more.

-
-
-
-
🔄
-
-

Provider Flexibility

-

Swap between providers without code changes. Start local, deploy anywhere.

-
-
-
-
🛡️
-
-

Production Ready

-

Built-in safety, monitoring, and evaluation tools for enterprise applications.

-
-
-
-
📱
-
-

Multi-Platform

-

SDKs for Python, Node.js, iOS, Android, and REST APIs for any language.

-
-
-
-
-
-
-
- ); -} - -function CommunityLinks() { - return ( -
- ); -} - -export default function Home() { - const {siteConfig} = useDocusaurusContext(); - return ( - - -
- - -
-
- ); -} diff --git a/docs/static/src/pages/index.module.css b/docs/static/src/pages/index.module.css deleted file mode 100644 index c3681653b..000000000 --- a/docs/static/src/pages/index.module.css +++ /dev/null @@ -1,283 +0,0 @@ -/** - * CSS files with the .module.css suffix will be treated as CSS modules - * and scoped locally. - */ - -.heroBanner { - padding: 4rem 0; - text-align: center; - position: relative; - overflow: hidden; - background: var(--hero-gradient); - color: white; - display: flex; - align-items: center; -} - -.heroBanner::before { - content: ''; - position: absolute; - top: 0; - left: 0; - right: 0; - bottom: 0; - background: radial-gradient(circle at 30% 20%, rgba(255, 255, 255, 0.1) 0%, transparent 50%), - radial-gradient(circle at 70% 80%, rgba(255, 255, 255, 0.05) 0%, transparent 50%); - pointer-events: none; -} - -.heroContent { - max-width: 800px; - margin: 0 auto; -} - -.heroLogo { - height: 48px; - width: auto; - margin-bottom: 1.5rem; -} - -.heroTitle { - font-size: 2.8rem; - font-weight: 700; - margin-bottom: 1rem; - line-height: 1.2; -} - -.heroSubtitle { - font-size: 1.1rem; - font-weight: 400; - margin-bottom: 2rem; - opacity: 0.9; - line-height: 1.5; - max-width: 600px; - margin-left: auto; - margin-right: auto; -} - -.buttons { - display: flex; - align-items: center; - justify-content: center; - gap: 1rem; -} - -.heroBanner .getStartedButton { - background: white; - color: #332735; - border: 2px solid white; - font-weight: 600; - transition: all 0.3s ease; -} - -.heroBanner .getStartedButton:hover { - background: rgba(255, 255, 255, 0.9); - color: #2b2129; - border-color: rgba(255, 255, 255, 0.9); - transform: translateY(-2px); - box-shadow: 0 8px 25px rgba(0, 0, 0, 0.15); -} - -.heroBanner .apiButton { - background: transparent; - color: white; - border: 2px solid white; - font-weight: 600; - transition: all 0.3s ease; -} - -.heroBanner .apiButton:hover { - background: white; - border-color: white; - color: #332735; - transform: translateY(-2px); -} - -/* Quick Start Section */ -.quickStart { - padding: 4rem 0; - background: var(--ifm-background-color); -} - -.sectionTitle { - font-size: 2rem; - font-weight: 600; - margin-bottom: 0.75rem; - color: var(--ifm-color-emphasis-800); -} - -.sectionDescription { - font-size: 1rem; - color: var(--ifm-color-emphasis-600); - margin-bottom: 1.5rem; - line-height: 1.5; -} - -.codeBlock { - background: var(--ifm-color-gray-900); - border-radius: 8px; - padding: 1.5rem; - margin-top: 1.5rem; - box-shadow: 0 2px 10px rgba(0, 0, 0, 0.1); -} - -.codeBlock pre { - margin: 0; - padding: 0; - background: none; - border: none; -} - -.codeBlock code { - color: var(--ifm-color-gray-100); - font-family: 'Fira Code', 'Consolas', 'Monaco', monospace; - font-size: 0.9rem; - line-height: 1.6; -} - -/* Features */ -.features { - display: flex; - flex-direction: column; - gap: 1rem; - margin-top: 1.5rem; -} - -.feature { - display: flex; - align-items: flex-start; - gap: 1rem; - padding: 1rem; - border-radius: 8px; - background: var(--ifm-color-gray-50); - border: 1px solid var(--ifm-color-gray-200); - transition: all 0.2s ease; -} - -.feature:hover { - transform: translateY(-2px); - box-shadow: 0 8px 25px rgba(0, 0, 0, 0.1); - border-color: var(--ifm-color-primary-lighter); -} - -.featureIcon { - font-size: 2rem; - width: 3rem; - height: 3rem; - display: flex; - align-items: center; - justify-content: center; - background: var(--ifm-color-primary-lightest); - border-radius: 50%; - flex-shrink: 0; -} - -.feature h4 { - margin: 0 0 0.5rem 0; - font-size: 1.1rem; - font-weight: 600; - color: var(--ifm-color-emphasis-800); -} - -.feature p { - margin: 0; - color: var(--ifm-color-emphasis-600); - line-height: 1.5; -} - -/* Community Section */ -.community { - padding: 3rem 0; - background: var(--ifm-color-gray-50); - border-top: 1px solid var(--ifm-color-gray-200); -} - -.communityContent { - text-align: center; - max-width: 600px; - margin: 0 auto; -} - -.communityLinks { - display: flex; - justify-content: center; - gap: 1rem; - margin-top: 2rem; -} - -.communityButton { - display: flex; - align-items: center; - gap: 0.5rem; - font-weight: 600; - transition: all 0.3s ease; -} - -.communityButton:hover { - transform: translateY(-2px); - box-shadow: 0 8px 25px rgba(0, 0, 0, 0.1); -} - -.communityIcon { - font-size: 1.2rem; -} - -/* Responsive Design */ -@media screen and (max-width: 996px) { - .heroBanner { - padding: 3rem 2rem; - } - - .heroTitle { - font-size: 2.2rem; - } - - .heroSubtitle { - font-size: 1rem; - } - - .buttons { - flex-direction: column; - gap: 1rem; - } - - .quickStart { - padding: 3rem 0; - } - - .sectionTitle { - font-size: 1.75rem; - } - - .communityLinks { - flex-direction: column; - align-items: center; - } - - .communityButton { - width: 200px; - justify-content: center; - } -} - -@media screen and (max-width: 768px) { - .heroLogo { - height: 40px; - } - - .heroTitle { - font-size: 1.8rem; - } - - .codeBlock { - padding: 1rem; - } - - .codeBlock code { - font-size: 0.8rem; - } - - .feature { - padding: 0.75rem; - } -} diff --git a/docs/static/src/pages/markdown-page.md b/docs/static/src/pages/markdown-page.md deleted file mode 100644 index 9756c5b66..000000000 --- a/docs/static/src/pages/markdown-page.md +++ /dev/null @@ -1,7 +0,0 @@ ---- -title: Markdown page example ---- - -# Markdown page example - -You don't need React to write simple standalone pages. diff --git a/scripts/provider_codegen.py b/scripts/provider_codegen.py index 531d53eb3..34e4c0687 100755 --- a/scripts/provider_codegen.py +++ b/scripts/provider_codegen.py @@ -358,16 +358,6 @@ def generate_index_docs(api_name: str, api_docstring: str | None, provider_entri md_lines.append("") md_lines.append(f"This section contains documentation for all available providers for the **{api_name}** API.") - md_lines.append("") - - md_lines.append("## Providers") - md_lines.append("") - - # For Docusaurus, create a simple list of links instead of toctree - for entry in provider_entries: - provider_name = entry["display_name"] - filename = entry["filename"] - md_lines.append(f"- [{provider_name}](./{filename})") return "\n".join(md_lines) + "\n" From a50b63906cd3392cd2ffdf18e52afa2aafffc999 Mon Sep 17 00:00:00 2001 From: Matthew Farrellee Date: Wed, 24 Sep 2025 19:33:02 -0400 Subject: [PATCH 145/150] chore: use ollama/all-minilm:l6-v2 for ollama tests (#3537) # What does this PR do? use ollama embedding models for ollama test, previously using sentence-transformer recordings: - ./scripts/integration-tests.sh --stack-config server:ci-tests --suite base --setup ollama --inference-mode record - ./scripts/integration-tests.sh --stack-config server:ci-tests --suite vision --setup ollama-vision --inference-mode record ## Test Plan ci w/ added skip base64 embedding test --- .../inference/test_openai_embeddings.py | 1 + .../recordings/responses/4d438c6bbaed.json | 422 ++++++ .../recordings/responses/4ebcaf6c2aee.json | 53 + .../recordings/responses/4f00cf740aba.json | 420 ++++++ .../recordings/responses/517505777888.json | 420 ++++++ .../recordings/responses/58c8091104ff.json | 56 + .../recordings/responses/590d43ed64b8.json | 420 ++++++ .../recordings/responses/63aa4590a38a.json | 421 ++++++ .../recordings/responses/72dc126ecb92.json | 422 ++++++ .../recordings/responses/80311f244b55.json | 1204 +++++++++++++++++ .../recordings/responses/8ce928ad0b85.json | 421 ++++++ .../recordings/responses/9e9665e16597.json | 422 ++++++ .../recordings/responses/a1ea41fbf9a2.json | 422 ++++++ .../recordings/responses/c13d7510774c.json | 420 ++++++ .../recordings/responses/c48eb1cb6e1c.json | 422 ++++++ .../recordings/responses/dc978ebb7159.json | 422 ++++++ .../recordings/responses/dee1518c6628.json | 422 ++++++ .../recordings/responses/f23defea82ec.json | 53 + .../recordings/responses/fbc7b626714d.json | 422 ++++++ tests/integration/suites.py | 4 +- 20 files changed, 7267 insertions(+), 2 deletions(-) create mode 100644 tests/integration/recordings/responses/4d438c6bbaed.json create mode 100644 tests/integration/recordings/responses/4ebcaf6c2aee.json create mode 100644 tests/integration/recordings/responses/4f00cf740aba.json create mode 100644 tests/integration/recordings/responses/517505777888.json create mode 100644 tests/integration/recordings/responses/58c8091104ff.json create mode 100644 tests/integration/recordings/responses/590d43ed64b8.json create mode 100644 tests/integration/recordings/responses/63aa4590a38a.json create mode 100644 tests/integration/recordings/responses/72dc126ecb92.json create mode 100644 tests/integration/recordings/responses/80311f244b55.json create mode 100644 tests/integration/recordings/responses/8ce928ad0b85.json create mode 100644 tests/integration/recordings/responses/9e9665e16597.json create mode 100644 tests/integration/recordings/responses/a1ea41fbf9a2.json create mode 100644 tests/integration/recordings/responses/c13d7510774c.json create mode 100644 tests/integration/recordings/responses/c48eb1cb6e1c.json create mode 100644 tests/integration/recordings/responses/dc978ebb7159.json create mode 100644 tests/integration/recordings/responses/dee1518c6628.json create mode 100644 tests/integration/recordings/responses/f23defea82ec.json create mode 100644 tests/integration/recordings/responses/fbc7b626714d.json diff --git a/tests/integration/inference/test_openai_embeddings.py b/tests/integration/inference/test_openai_embeddings.py index ff18c0418..0598919a1 100644 --- a/tests/integration/inference/test_openai_embeddings.py +++ b/tests/integration/inference/test_openai_embeddings.py @@ -44,6 +44,7 @@ def skip_if_model_doesnt_support_encoding_format_base64(client, model_id): "remote::together", # param silently ignored, always returns floats "remote::databricks", # param silently ignored, always returns floats "remote::fireworks", # param silently ignored, always returns list of floats + "remote::ollama", # param silently ignored, always returns list of floats ): pytest.skip(f"Model {model_id} hosted by {provider.provider_type} does not support encoding_format='base64'.") diff --git a/tests/integration/recordings/responses/4d438c6bbaed.json b/tests/integration/recordings/responses/4d438c6bbaed.json new file mode 100644 index 000000000..f5e4809dd --- /dev/null +++ b/tests/integration/recordings/responses/4d438c6bbaed.json @@ -0,0 +1,422 @@ +{ + "request": { + "method": "POST", + "url": "http://0.0.0.0:11434/v1/v1/embeddings", + "headers": {}, + "body": { + "model": "all-minilm:l6-v2", + "input": [ + "What makes Python different from C++ and Java?" + ], + "encoding_format": "float" + }, + "endpoint": "/v1/embeddings", + "model": "all-minilm:l6-v2" + }, + "response": { + "body": { + "__type__": "openai.types.create_embedding_response.CreateEmbeddingResponse", + "__data__": { + "data": [ + { + "embedding": [ + -0.10118824, + 0.03903895, + -0.013634503, + -0.007292888, + -0.029636545, + -0.084174395, + -0.09112228, + 0.04528188, + -0.014384496, + -0.0319548, + -0.05629092, + 0.007849695, + 0.04510336, + 0.016430292, + 0.03918052, + -0.117774546, + -0.03887417, + -0.001986278, + 0.024091367, + -0.065562785, + -0.017041149, + -0.019297333, + -0.021055115, + -0.05226532, + 0.091480814, + 0.015253761, + -0.001796204, + -0.040122062, + 0.009265925, + 0.0020377012, + -0.010954453, + 0.04418117, + 0.021545967, + -0.013009354, + -0.06874439, + 0.021751178, + -0.0032608712, + -0.08501772, + -0.053137373, + -0.015450434, + -0.085525215, + 0.07160664, + -0.05478504, + 0.0016480179, + -0.07703412, + 0.034932982, + -0.013334636, + 0.0048056873, + -0.017465629, + -0.023633484, + -0.06934235, + 0.039600387, + -0.06340865, + -0.08479012, + -0.008927469, + -0.009415297, + 0.021252826, + 0.028662452, + -0.0071771694, + -0.10053554, + -0.08403626, + 0.0006694508, + 0.049527504, + 0.091747105, + -0.040061295, + -0.08370871, + 0.0113953585, + 0.02787908, + 0.08032625, + -0.08153772, + -0.1382779, + 0.0020262296, + -0.013319839, + 0.06469724, + 0.011705844, + -0.06847945, + -0.008103585, + -0.007311759, + -0.049259696, + -0.01681834, + -0.0023633156, + 0.04625241, + -0.09155687, + 0.070435375, + 0.047461532, + -0.033975255, + 0.030877052, + 0.06223708, + -0.075257495, + 0.022192439, + 0.072569355, + -0.05940421, + -0.016665697, + 0.027913835, + -0.03033027, + 0.026433375, + -0.024091143, + 0.027967717, + 0.0018184112, + 0.005459501, + 0.01782243, + -0.05497604, + 0.10015024, + 0.060212452, + 0.095859, + 0.0045665796, + 0.022342399, + -0.0730747, + 0.07155068, + -0.005780182, + -0.027565235, + -0.07226932, + 0.0022492912, + -0.056467265, + 0.056729913, + 0.04964385, + -0.0359193, + 0.073877, + 0.01857968, + -0.020147907, + 0.025378013, + -0.03853255, + 0.0004536945, + -0.0197987, + -0.052165885, + 0.08353086, + -0.0831229, + -3.4495407e-33, + -7.5219294e-05, + -0.10703243, + 0.00059167214, + 0.022338398, + 0.0678739, + -0.009247927, + 0.010432039, + 0.06904043, + 0.008255852, + -0.027097296, + -0.020995656, + 0.051348615, + 0.021222726, + 0.103795454, + 0.051715724, + -0.016371982, + -0.005419388, + 0.018027242, + -0.012436884, + -0.016733842, + 0.02889153, + 0.030293668, + 0.052271575, + 0.07004435, + 0.03884479, + -0.012782247, + 0.010923908, + 0.009464883, + -0.031190552, + 0.012386214, + -0.04372491, + -0.06606855, + -0.048366148, + 0.061396204, + 0.04782467, + 0.03706411, + -0.0107052075, + -0.11111459, + 0.010835082, + -0.056167886, + -0.06988011, + -0.0075372676, + 0.017734634, + -0.05035381, + -0.001275386, + 0.014617504, + -0.02860837, + -0.037023265, + -0.12981883, + 0.011362826, + 0.016434444, + 0.024155455, + 0.06692448, + 0.11011648, + 0.00242381, + 0.029336166, + 0.06456758, + 0.025459351, + -0.06523983, + -0.003042015, + -0.014494944, + 0.17165202, + 0.09502477, + 0.004603603, + 0.03468188, + 0.08069984, + 0.028353227, + 0.078386195, + 0.0052070855, + 0.10746326, + 0.0007272075, + 0.048997436, + -0.026183812, + 0.024859238, + 0.019962046, + 0.0024938937, + -0.0088306535, + -0.12398559, + 0.013511732, + 0.01252341, + -0.06526936, + 0.0025227254, + 0.012404745, + -0.052903768, + -0.060306206, + -0.06609536, + 0.02255224, + 0.034741614, + 0.07141327, + -0.042214733, + -0.046732914, + -0.013089334, + 0.050667133, + 0.009732704, + -0.065844536, + -7.632026e-34, + -0.04897036, + 0.0010008155, + -0.027726196, + -0.0041715573, + -0.0784953, + -0.014502005, + -0.0032161039, + -0.0036510653, + 0.0063989596, + -0.0049795345, + -0.025816346, + -0.057969686, + 0.089522816, + 0.03228869, + 0.09730419, + 0.014945059, + -0.09055132, + 0.048780665, + 0.017307585, + 0.001894757, + -0.018043697, + 0.076129794, + -0.03805571, + -0.033610735, + 0.024954053, + -0.021428565, + -0.089604266, + -0.017775265, + -0.0053226994, + 0.0390506, + 0.03933108, + 0.09031938, + -0.08847496, + 0.018907558, + 0.044635687, + -0.022590302, + -0.032498624, + -0.025523473, + 0.025916386, + -0.0015925332, + 0.12204004, + 0.0071080993, + 0.091284856, + 0.088366255, + 0.02900987, + 0.053944837, + -0.025523532, + 0.07882233, + 0.021127652, + -0.10109029, + 0.017844606, + 0.036310278, + 0.05826466, + -0.039195944, + -0.009919533, + -0.034366168, + 0.049801596, + 0.053652726, + -0.06546624, + -0.009100376, + -0.045472123, + -0.076298825, + 0.049355358, + 0.004085976, + -0.049639836, + 0.036183506, + -0.04978166, + -0.01432043, + -0.048737127, + -0.13183917, + 0.09263645, + 0.023257703, + -0.015932027, + 0.012102949, + -0.067271985, + 0.024819551, + -0.00095338933, + 0.005278276, + -0.034407213, + 0.048385736, + 0.015527778, + 0.03753987, + -0.029208956, + 0.035676524, + -0.08918091, + 0.03421899, + -0.0790197, + -0.029945001, + -0.0045615, + -0.0059501184, + 0.02928693, + 0.09815437, + -0.033618566, + 0.015624564, + -0.018528337, + -1.6825586e-08, + 0.055643573, + 0.00905882, + 0.0065201567, + 0.012434381, + 0.044175223, + 0.0383832, + -0.040846422, + -0.010427501, + -0.0080066, + 0.01712656, + -0.036492564, + -0.00024521624, + -0.07382413, + -0.059322976, + 0.01264377, + 0.086423, + -0.06100275, + -0.059789356, + 0.009266419, + 0.07025341, + 0.050013755, + -0.018513031, + -0.07250875, + 0.11642345, + -0.09448821, + -0.044915877, + 0.0534502, + 0.01637104, + 0.036045168, + -0.037487727, + 0.0030642638, + 0.0030473603, + -0.050864283, + 0.030525306, + -0.0034795292, + -0.006219593, + 0.029881494, + -0.0397122, + -0.041857515, + 0.022612296, + -0.037165, + -0.009100636, + -0.008052333, + 0.006499901, + 0.04141586, + 0.03798403, + -0.044131294, + -0.01770224, + -0.07094963, + -0.02103003, + -0.012339185, + 0.011356932, + 0.07049362, + -0.058278922, + 0.034775678, + 0.018039506, + -0.12438333, + -0.05090711, + 0.006098656, + 0.05028239, + -0.0049530324, + -0.015935287, + 0.18108557, + 0.023910096 + ], + "index": 0, + "object": "embedding" + } + ], + "model": "all-minilm:l6-v2", + "object": "list", + "usage": { + "prompt_tokens": 11, + "total_tokens": 11 + } + } + }, + "is_streaming": false + } +} diff --git a/tests/integration/recordings/responses/4ebcaf6c2aee.json b/tests/integration/recordings/responses/4ebcaf6c2aee.json new file mode 100644 index 000000000..41dc9ab1a --- /dev/null +++ b/tests/integration/recordings/responses/4ebcaf6c2aee.json @@ -0,0 +1,53 @@ +{ + "request": { + "method": "POST", + "url": "http://0.0.0.0:11434/v1/v1/embeddings", + "headers": {}, + "body": { + "model": "all-minilm:l6-v2", + "input": "Test dimensions parameter", + "encoding_format": "base64", + "dimensions": 16 + }, + "endpoint": "/v1/embeddings", + "model": "all-minilm:l6-v2" + }, + "response": { + "body": { + "__type__": "openai.types.create_embedding_response.CreateEmbeddingResponse", + "__data__": { + "data": [ + { + "embedding": [ + 0.253706, + 0.016367152, + -0.29664654, + 0.31654558, + -0.18624601, + 0.07602756, + -0.031531323, + 0.2986085, + -0.49672848, + -0.36617878, + 0.25328273, + -0.33349335, + 0.0060151755, + 0.14081024, + -0.13757885, + -0.14679416 + ], + "index": 0, + "object": "embedding" + } + ], + "model": "all-minilm:l6-v2", + "object": "list", + "usage": { + "prompt_tokens": 3, + "total_tokens": 3 + } + } + }, + "is_streaming": false + } +} diff --git a/tests/integration/recordings/responses/4f00cf740aba.json b/tests/integration/recordings/responses/4f00cf740aba.json new file mode 100644 index 000000000..85a5e18fb --- /dev/null +++ b/tests/integration/recordings/responses/4f00cf740aba.json @@ -0,0 +1,420 @@ +{ + "request": { + "method": "POST", + "url": "http://0.0.0.0:11434/v1/v1/embeddings", + "headers": {}, + "body": { + "model": "all-minilm:l6-v2", + "input": "Hello, world!", + "encoding_format": "float" + }, + "endpoint": "/v1/embeddings", + "model": "all-minilm:l6-v2" + }, + "response": { + "body": { + "__type__": "openai.types.create_embedding_response.CreateEmbeddingResponse", + "__data__": { + "data": [ + { + "embedding": [ + -0.038157914, + 0.03290493, + -0.0055371798, + 0.014353213, + -0.040209096, + -0.11667767, + 0.03170551, + 0.0019347348, + -0.04254092, + 0.029190615, + 0.042559944, + 0.032130145, + 0.02983921, + 0.010979105, + -0.053759154, + -0.05030495, + -0.023470305, + 0.010730486, + -0.1377361, + 0.0039985846, + 0.029267203, + 0.066698566, + -0.015405643, + 0.04843479, + -0.0881545, + -0.012694429, + 0.041265942, + 0.04089442, + -0.05000745, + -0.05805947, + 0.048748765, + 0.06891688, + 0.058812816, + 0.008785837, + -0.016080279, + 0.08517403, + -0.07814158, + -0.077435054, + 0.020808736, + 0.016186161, + 0.032549612, + -0.05344129, + -0.062166847, + -0.0242584, + 0.007393759, + 0.024064584, + 0.0064619263, + 0.051204458, + 0.072843835, + 0.034658417, + -0.05477693, + -0.05941287, + -0.007262739, + 0.020149412, + 0.035835978, + 0.0056162532, + 0.010803632, + -0.052724347, + 0.010110615, + -0.0087345, + -0.06285489, + 0.038390912, + -0.013975588, + 0.0734118, + 0.090072334, + -0.07995426, + -0.016420014, + 0.044813525, + -0.06888206, + -0.033037275, + -0.015467736, + 0.01130628, + 0.036483694, + 0.0663459, + -0.054344203, + 0.008723171, + 0.012078509, + -0.038129516, + 0.006938081, + 0.051155496, + 0.07745829, + -0.122897476, + 0.01635594, + 0.04956378, + 0.031677794, + -0.03963372, + 0.0016560612, + 0.0095810415, + -0.032620687, + -0.03396473, + -0.13327733, + 0.0072318353, + -0.010225149, + 0.038535405, + -0.09343492, + -0.04173385, + 0.06996305, + -0.026312327, + -0.14973918, + 0.13443227, + 0.03750676, + 0.052842483, + 0.045053005, + 0.018721534, + 0.05443072, + 0.017290117, + -0.03255681, + 0.046160772, + -0.046711024, + -0.030576464, + -0.018258592, + -0.048711784, + 0.033041865, + -0.003856249, + 0.05003307, + -0.05821012, + -0.00994153, + 0.0106995255, + -0.04008794, + -0.0015539092, + 0.060838487, + -0.04559896, + 0.04924722, + 0.026119638, + 0.019796783, + -0.0016312932, + 0.05955464, + -6.527786e-33, + 0.063555494, + 0.003072545, + 0.0290068, + 0.17338625, + 0.0029474646, + 0.027745575, + -0.095103905, + -0.031165987, + 0.026719859, + -0.010799976, + 0.023851028, + 0.02375357, + -0.031152952, + 0.049497593, + -0.025005657, + 0.10176666, + -0.079190366, + -0.0032479328, + 0.042849813, + 0.09489888, + -0.066508934, + 0.00632239, + 0.022188535, + 0.06996212, + -0.007491268, + -0.001777037, + 0.027047161, + -0.07536194, + 0.11401931, + 0.008564227, + -0.02371391, + -0.046974454, + 0.0144310715, + 0.019899534, + -0.0046927175, + 0.0013119543, + -0.03432107, + -0.054212432, + -0.09418897, + -0.028963951, + -0.018907014, + 0.045735538, + 0.04757043, + -0.003132595, + -0.033231355, + -0.013520351, + 0.051010653, + 0.03111525, + 0.015257217, + 0.054166727, + -0.085080594, + 0.013355202, + -0.04763934, + 0.07099156, + -0.01309272, + -0.0023823304, + 0.050339438, + -0.041624993, + -0.014171974, + 0.032421313, + 0.005414455, + 0.09128853, + 0.0045168963, + -0.018196244, + -0.015225792, + -0.04635148, + 0.038764603, + 0.014739169, + 0.052030377, + 0.0017809072, + -0.014930553, + 0.027100598, + 0.031190928, + 0.02379928, + -0.0045879, + 0.03622444, + 0.066800386, + -0.0018508516, + 0.021243243, + -0.0575494, + 0.019077979, + 0.031474162, + -0.018456634, + -0.04083116, + 0.10387791, + 0.011981423, + -0.014923204, + -0.10519511, + -0.012293124, + -0.00042049217, + -0.09506704, + 0.058275525, + 0.042611193, + -0.025061507, + -0.094545335, + 4.010606e-33, + 0.13226718, + 0.0053517097, + -0.03314567, + -0.09099676, + -0.031551942, + -0.033939674, + -0.071981214, + 0.12595285, + -0.08333936, + 0.052855294, + 0.001036374, + 0.021973396, + 0.104020424, + 0.013031712, + 0.040921222, + 0.018695012, + 0.114233166, + 0.024822846, + 0.014595918, + 0.00621894, + -0.011220824, + -0.035742316, + -0.03801776, + 0.011226576, + -0.051305167, + 0.007892534, + 0.06734842, + 0.0033567564, + -0.09286571, + 0.03701943, + -0.022331072, + 0.040051647, + -0.030764744, + -0.011390678, + -0.014426033, + 0.024999708, + -0.09751172, + -0.03538673, + -0.03757043, + -0.010174254, + -0.06396341, + 0.025548752, + 0.020661479, + 0.03752242, + -0.10438308, + -0.028266912, + -0.052153755, + 0.012830027, + -0.05125152, + -0.029009243, + -0.09633578, + -0.042322997, + 0.06716196, + -0.030903742, + -0.010314011, + 0.027343867, + -0.028119028, + 0.010296558, + 0.043072425, + 0.022286164, + 0.007943, + 0.056093868, + 0.040728126, + 0.09295372, + 0.016456816, + -0.053744446, + 0.00047035623, + 0.050744157, + 0.04246857, + -0.029237023, + 0.009294763, + -0.010624897, + -0.037202932, + 0.00220195, + -0.030278567, + 0.07457478, + 0.0026277148, + -0.017591486, + 0.0028708735, + 0.03840644, + 0.0072204536, + 0.045653794, + 0.039947055, + 0.014161398, + -0.014247232, + 0.058465447, + 0.036360227, + 0.055268615, + -0.02004829, + -0.08043532, + -0.030213723, + -0.0148566915, + 0.022293866, + 0.011908896, + -0.06907556, + -1.8805048e-08, + -0.078408636, + 0.046699222, + -0.023894435, + 0.06347232, + 0.02395583, + 0.0014103559, + -0.090737104, + -0.06684135, + -0.080118775, + 0.0054891296, + 0.05368204, + 0.10478211, + -0.066875115, + 0.015525915, + 0.06710851, + 0.07083251, + -0.03199485, + 0.020825442, + -0.021920865, + -0.0072890157, + -0.01058703, + 0.004174248, + 0.033155944, + -0.07901077, + 0.038750935, + -0.07521113, + -0.015731987, + 0.005987591, + 0.0051212795, + -0.061557226, + 0.04203319, + 0.09544439, + -0.04317485, + 0.014446859, + -0.10614051, + -0.028011814, + 0.01101727, + 0.069552526, + 0.0669063, + -0.0747214, + -0.078444764, + 0.042728573, + -0.034634914, + -0.106056124, + -0.0357495, + 0.05155015, + 0.068699375, + -0.049968246, + 0.015420614, + -0.06460179, + -0.07601102, + 0.026022797, + 0.07440251, + -0.0124161495, + 0.1332999, + 0.07480527, + 0.051343314, + 0.02094546, + -0.026808253, + 0.08892536, + 0.03996125, + -0.041000355, + 0.03187991, + 0.018108707 + ], + "index": 0, + "object": "embedding" + } + ], + "model": "all-minilm:l6-v2", + "object": "list", + "usage": { + "prompt_tokens": 4, + "total_tokens": 4 + } + } + }, + "is_streaming": false + } +} diff --git a/tests/integration/recordings/responses/517505777888.json b/tests/integration/recordings/responses/517505777888.json new file mode 100644 index 000000000..f556ba743 --- /dev/null +++ b/tests/integration/recordings/responses/517505777888.json @@ -0,0 +1,420 @@ +{ + "request": { + "method": "POST", + "url": "http://0.0.0.0:11434/v1/v1/embeddings", + "headers": {}, + "body": { + "model": "all-minilm:l6-v2", + "input": "Test encoding format", + "encoding_format": "float" + }, + "endpoint": "/v1/embeddings", + "model": "all-minilm:l6-v2" + }, + "response": { + "body": { + "__type__": "openai.types.create_embedding_response.CreateEmbeddingResponse", + "__data__": { + "data": [ + { + "embedding": [ + 0.019099757, + -0.020513054, + -0.07147724, + -0.02305817, + -0.06570441, + -0.0057285326, + -0.029366547, + -0.031833924, + -0.015779832, + -0.03914512, + 0.02689602, + -0.064181775, + 0.013521624, + 0.050362427, + -0.031129995, + -0.08321027, + -0.031968866, + 0.074996136, + -0.016394366, + -0.0013953616, + 0.038505327, + -0.03440395, + -0.004868513, + -0.03093635, + 0.051909875, + 0.0091652395, + 0.0072081746, + 0.066338904, + 0.024595087, + -0.047721148, + 0.0376462, + -0.04257363, + 0.078928985, + 0.048257265, + 0.1338569, + 0.013975464, + 0.03242688, + -0.08888101, + -0.0141724255, + 0.035531398, + -0.024727112, + -0.028608425, + 0.047635823, + 0.026230432, + 0.048455644, + 0.066589415, + -0.013602744, + 0.07181793, + -0.073052436, + -0.05030391, + 0.0039422787, + 0.033050794, + -0.047844775, + -0.017648827, + 0.010261714, + -0.105268046, + -0.010029887, + 0.014589762, + -0.05330117, + 0.0603304, + -0.10082026, + 0.0113420375, + -0.007233272, + 0.053468946, + -0.006834623, + 0.036973044, + 0.024037901, + 0.02391513, + -0.011360713, + -0.119559266, + -0.115714155, + -0.06674816, + -0.042340416, + 0.09301382, + 0.024868665, + 0.08405043, + 0.0030069647, + -0.06605422, + 0.027435942, + -0.03239928, + -0.025572078, + -0.06587331, + 0.0678087, + 0.09763614, + 0.07363481, + 0.034110706, + 0.056513038, + 0.07671608, + -0.05176071, + 0.05367774, + 0.00541266, + 0.015987717, + 0.0035527307, + 0.063338846, + -0.015986515, + 0.052941773, + 0.11543519, + 0.05519716, + 0.037675396, + 0.08086703, + 0.035557747, + -0.07983684, + -0.012073549, + -0.076086745, + -0.06961062, + -0.017908957, + 0.1699312, + -0.0047792625, + 0.090708405, + -0.071956836, + 0.020046378, + -0.05956393, + -0.06314912, + -0.07718947, + 0.015107324, + -0.05031658, + -0.05448986, + -0.023088248, + -0.035414543, + -0.030637579, + -0.053294946, + -0.06745031, + -0.08055133, + 0.0028445483, + -0.011376515, + -0.029895633, + 0.024240365, + -1.5095563e-33, + -0.029858422, + -0.00030224613, + 0.0030705915, + 0.023098653, + -0.04807201, + -0.0027389736, + -0.03748221, + 0.016176483, + -0.029994667, + 0.015707478, + 0.0096614035, + -0.039872784, + -0.029488137, + 0.03840971, + -0.0052404203, + 0.06854292, + -0.007897781, + -0.0018805856, + -0.0352267, + 0.036267247, + 0.05868197, + 0.023763478, + 0.044439625, + -0.02601301, + -0.025314424, + -0.02679121, + -0.023682553, + -0.09437374, + 0.0016686164, + 0.0065181926, + -0.097118795, + -0.053507585, + -0.08239408, + 0.023490923, + -0.02402227, + 0.015966628, + 0.0050696856, + 0.030458245, + -0.08839895, + 0.11425429, + 0.028386213, + 0.0298561, + 0.02285531, + 0.01873392, + 0.05632994, + -0.020208938, + -0.0006685065, + -0.08638551, + 0.020276291, + -0.0039841584, + 0.0009751431, + 0.06544227, + -0.03650517, + 0.032318577, + 0.023104826, + 0.04446683, + 0.09645086, + -0.072731785, + 0.033722512, + 0.042799864, + -0.05276349, + 0.00033437353, + 0.061005846, + -0.019637244, + -0.02327577, + -0.1160437, + 0.007917702, + -0.12529376, + 0.017027825, + 0.013484424, + -0.030528279, + -0.024288423, + 0.006258758, + -0.015579525, + -0.07281456, + 0.012983996, + 0.01599799, + 0.0051952074, + -0.002588768, + -0.059567206, + 0.063699834, + -0.0019145603, + 0.018687418, + -0.009282711, + -0.05884746, + -0.03251431, + -0.0095772855, + -0.047396615, + 0.020575106, + -0.0071638324, + 0.050119117, + 0.016082546, + -0.0058797863, + -0.07660506, + 0.082072616, + 1.6049304e-33, + -0.0056975842, + 0.06717823, + -0.01155973, + 0.055897184, + -0.08883816, + -0.03651865, + 0.12133234, + 0.028983265, + 0.022465894, + 0.047318526, + 0.07625107, + -0.07938655, + 0.0020323857, + -0.023503296, + -0.029780442, + -0.048816763, + -0.034901213, + 0.06463424, + 0.05149456, + 0.008271398, + -0.031762894, + 0.097970895, + 0.008115042, + 0.010324485, + 0.059439637, + 0.051759075, + 0.04295602, + 0.006951762, + 0.027330121, + 0.039248228, + 0.062386345, + 0.05181691, + 0.0053548445, + 0.059656292, + -0.008941856, + -0.013595369, + 0.08731477, + 0.028409526, + -0.0068070823, + 0.052146304, + 0.04951788, + 0.055161525, + -0.016772978, + 0.07788952, + 0.02612108, + 0.031371117, + 0.011792192, + -0.034147624, + 0.052822903, + 0.0035044928, + 0.098160714, + 0.029717103, + -0.031353023, + -0.012088347, + 0.018629983, + -0.03261934, + -0.09641058, + 0.033934057, + -0.078907624, + -0.008301054, + -0.04919879, + 0.0200944, + 0.061727397, + -0.018450737, + -0.033557754, + -0.09088319, + 0.021116594, + -0.022466624, + -0.011860241, + -0.04879352, + 0.04824181, + -0.0729504, + -0.021986347, + 0.062490568, + 0.02329735, + -0.052139174, + -0.05413272, + 0.062326364, + 0.052311692, + 0.051399846, + -0.024238104, + -0.018776463, + -0.01662191, + 0.093347155, + 0.00853553, + 0.06343568, + 0.0193722, + 0.047052696, + -0.0058736033, + -0.0034484447, + 0.079545766, + 0.102156945, + 0.015278317, + 0.040921766, + 0.038883872, + -1.2710007e-08, + -0.019322075, + -0.12182595, + -0.04798032, + -0.05338353, + -0.113173604, + 0.05179994, + -0.104975395, + -0.08526829, + 0.0062153414, + -0.029902961, + 0.064573385, + -0.028757203, + -0.06474069, + -0.024915313, + 0.002619679, + -0.008791377, + 0.03023946, + 0.009847454, + 0.004436367, + 0.085081235, + -0.026139142, + 0.11358947, + -0.004590704, + -0.03662597, + -0.09077296, + 0.081458576, + 0.012074041, + 0.07286008, + 0.004093267, + -0.050678167, + 0.06875128, + 0.029115168, + 0.014813955, + -0.11862927, + -0.0504244, + 0.053776395, + 0.04568957, + 0.07408053, + 0.02851353, + 0.039401993, + 0.029147856, + -0.035721682, + -0.091308504, + -0.047723882, + -0.00082008925, + -0.073683135, + 0.010977384, + 0.015688991, + -0.035924956, + -0.0811892, + 0.020371897, + -0.045275442, + -0.024963016, + 0.0011709725, + 0.00041111733, + -0.026408581, + -0.03244672, + 0.0034135028, + -0.0070261946, + 0.024263272, + 0.07635933, + 0.03955913, + 0.036027964, + -0.07081866 + ], + "index": 0, + "object": "embedding" + } + ], + "model": "all-minilm:l6-v2", + "object": "list", + "usage": { + "prompt_tokens": 3, + "total_tokens": 3 + } + } + }, + "is_streaming": false + } +} diff --git a/tests/integration/recordings/responses/58c8091104ff.json b/tests/integration/recordings/responses/58c8091104ff.json new file mode 100644 index 000000000..a0625b0c3 --- /dev/null +++ b/tests/integration/recordings/responses/58c8091104ff.json @@ -0,0 +1,56 @@ +{ + "request": { + "method": "POST", + "url": "http://0.0.0.0:11434/v1/v1/chat/completions", + "headers": {}, + "body": { + "model": "llama3.2:3b-instruct-fp16", + "messages": [ + { + "role": "user", + "content": "Hello" + } + ], + "max_tokens": 10 + }, + "endpoint": "/v1/chat/completions", + "model": "llama3.2:3b-instruct-fp16" + }, + "response": { + "body": { + "__type__": "openai.types.chat.chat_completion.ChatCompletion", + "__data__": { + "id": "chatcmpl-981", + "choices": [ + { + "finish_reason": "length", + "index": 0, + "logprobs": null, + "message": { + "content": "Hello! It's nice to meet you. Is", + "refusal": null, + "role": "assistant", + "annotations": null, + "audio": null, + "function_call": null, + "tool_calls": null + } + } + ], + "created": 1758712191, + "model": "llama3.2:3b-instruct-fp16", + "object": "chat.completion", + "service_tier": null, + "system_fingerprint": "fp_ollama", + "usage": { + "completion_tokens": 10, + "prompt_tokens": 26, + "total_tokens": 36, + "completion_tokens_details": null, + "prompt_tokens_details": null + } + } + }, + "is_streaming": false + } +} diff --git a/tests/integration/recordings/responses/590d43ed64b8.json b/tests/integration/recordings/responses/590d43ed64b8.json new file mode 100644 index 000000000..136f240d3 --- /dev/null +++ b/tests/integration/recordings/responses/590d43ed64b8.json @@ -0,0 +1,420 @@ +{ + "request": { + "method": "POST", + "url": "http://0.0.0.0:11434/v1/v1/embeddings", + "headers": {}, + "body": { + "model": "all-minilm:l6-v2", + "input": "This is completely different content", + "encoding_format": "float" + }, + "endpoint": "/v1/embeddings", + "model": "all-minilm:l6-v2" + }, + "response": { + "body": { + "__type__": "openai.types.create_embedding_response.CreateEmbeddingResponse", + "__data__": { + "data": [ + { + "embedding": [ + 0.050928835, + 0.03843035, + -0.055596404, + -0.1059845, + 0.06945118, + -0.08052125, + -0.025887776, + -0.045172054, + 0.06875915, + 0.01652947, + -0.0011730668, + 0.023417989, + -0.0033977597, + 0.06804529, + -0.022007054, + -0.014133858, + 0.12357166, + -0.06538498, + -0.08264784, + 0.042988714, + -0.039530188, + 0.05546846, + -0.008847637, + 0.020928107, + 0.016257003, + 0.0963241, + -0.022833107, + 0.09176138, + 0.06406277, + -0.062280413, + 0.010846775, + 0.07830326, + 0.08847168, + -0.008453102, + -0.075440355, + 0.048030853, + 0.0042642253, + 0.037893716, + 0.0023323877, + 0.032253597, + 0.0047477684, + -0.07042877, + -0.0651552, + 0.061071083, + 0.021506561, + 0.10113442, + -0.07538611, + -0.0407162, + -0.0055698017, + -0.003700082, + -0.021267522, + -0.018197505, + -0.033238053, + -0.015680185, + 0.0032980912, + 0.037441716, + -0.02103593, + 0.052548602, + 0.10207184, + -0.018667448, + 0.036124475, + 0.08958934, + 0.050691247, + 0.019807478, + 0.102209404, + -0.0590646, + -0.045566943, + -0.024122052, + -0.059902284, + -0.097920865, + -0.0020646898, + 0.032239985, + 0.048603263, + 0.080615476, + 0.022587052, + 0.0005647973, + -0.0015346111, + 0.009996407, + -0.08974319, + 0.023848958, + -0.0152271725, + -0.020556787, + 0.085268654, + -0.080245204, + -0.0021987888, + 0.064997524, + -0.023079548, + -0.061999504, + -0.06548528, + -0.029944805, + 0.004539428, + 0.09720334, + 0.09151462, + -0.0059590363, + -0.04822175, + -0.011798011, + -0.031697348, + -0.010327684, + 0.02968527, + 0.103371136, + -0.029089179, + 0.0055756853, + -0.030742139, + -0.011057862, + -0.03863044, + -0.015891504, + 0.00083265523, + 0.03479572, + 0.0039244313, + -0.020057123, + -0.048189417, + 0.026513426, + -0.061180107, + -0.04695217, + 0.021450046, + -0.04841946, + 0.022005452, + 0.015729656, + 0.056378406, + 0.055330493, + 0.037143476, + -0.088711694, + 0.011780864, + 0.0064585637, + -0.020630004, + -0.05936413, + 0.012287869, + -2.4293852e-33, + 0.06838332, + -0.053025596, + 0.011507658, + 0.06950136, + 0.01331995, + 0.0020193695, + -0.02080692, + 0.028949803, + 0.034665402, + -0.0327198, + 0.000949148, + 0.008664251, + 0.0076103383, + -0.024554089, + 0.030275982, + -0.034142904, + -0.031511948, + 0.11051145, + 0.034964334, + 0.045093905, + 0.0004536878, + 0.0514407, + 0.015040795, + -0.008992289, + 0.023123777, + 0.051383648, + -0.004154813, + 0.0047568153, + -0.016239677, + -0.025685828, + -0.02406427, + -0.009563573, + 0.050677244, + -0.058350526, + 0.049024463, + 0.079643525, + 0.036008406, + -0.06540527, + -0.035393585, + -0.07027483, + -0.009768918, + -0.0318898, + -0.04104297, + -0.041093245, + -0.036317065, + 0.06686649, + 0.016687784, + -0.048496265, + -0.015432587, + -0.0004885036, + 0.032693844, + -0.0108784195, + 0.016624164, + -0.057286467, + 0.008053993, + 0.008824837, + -0.061545905, + -0.0108399745, + 0.07171203, + 0.08609233, + 0.014049224, + 0.014907912, + -0.09828269, + -0.046647478, + 0.03361861, + 0.064744, + -0.007506857, + 0.025442023, + 0.04172483, + -0.033108808, + -0.01457406, + 0.024897074, + 0.04562778, + -0.042942565, + -0.040469114, + -0.06307098, + -0.02242408, + 0.010597915, + -0.03252762, + -0.03145859, + 0.00820347, + 0.021108724, + 0.009504359, + -0.08292171, + -0.02136818, + 0.008753057, + 0.06017692, + -0.062192526, + 0.0045083114, + 0.056810796, + -0.012999816, + 0.01868933, + -0.008973792, + -0.076788835, + 0.051616713, + 1.6926322e-33, + -0.12587416, + 0.011702123, + -0.07986232, + 0.023053063, + 0.029265704, + 0.08719514, + 0.06907015, + 0.03254812, + 0.047793373, + 0.13217501, + 0.031299006, + -0.012535935, + 0.0035618816, + -0.0163916, + -0.03853783, + 0.01597904, + 0.09169072, + 0.04756113, + -0.054968182, + 0.067977056, + 0.017965809, + 0.11863936, + -0.0693313, + 0.043811284, + 0.041538227, + -0.017813183, + 0.051730298, + 0.067949936, + 0.080519445, + 0.0053662807, + 0.088820346, + -0.036024984, + -0.077107176, + -0.09097472, + -0.09598897, + -0.09376241, + -0.06202675, + 0.06723746, + -0.00064578716, + 0.029109621, + 0.08179942, + -0.06487821, + -0.050387383, + -0.0023782111, + -0.026097134, + -0.0076310094, + 0.011977006, + -0.08573459, + 0.041102324, + 0.024716543, + -0.022249049, + -0.11560483, + 0.0067691505, + -0.045894623, + -0.0637051, + 0.05357708, + 0.00577345, + 0.06321221, + 0.004861166, + -0.05710446, + 0.04190449, + 0.022335436, + -0.1471083, + 0.026351552, + 0.10623104, + -0.005882123, + 0.019992633, + 0.034953646, + -0.03338853, + -0.038839623, + -0.076065235, + -0.11174125, + -0.038965553, + -0.102677576, + 0.04711777, + -0.049392425, + 0.07477134, + 0.04174287, + -0.031087497, + 0.0033754015, + 0.055780858, + -0.03184862, + -0.02541985, + 0.05011349, + 0.03596857, + 0.091428444, + -0.07583281, + -0.050592963, + 0.0074175335, + -0.0013578966, + -0.050366234, + -0.0015045146, + 0.0054275827, + 0.07685381, + 0.014169269, + -1.8297998e-08, + 0.029916301, + -0.057940822, + -0.06847671, + 0.026218578, + -0.0034848938, + 0.113768935, + 0.056854554, + -0.093155205, + 0.0028038986, + 0.10895503, + -0.033018846, + 0.0050494163, + -0.043625794, + -0.048996136, + 0.0118943965, + 0.059736334, + -0.08662527, + -0.052732464, + 0.026333557, + 0.042200398, + -0.0035924676, + 0.037994288, + 0.022570506, + -0.061503205, + 0.012634007, + 0.040854853, + -0.084876895, + 0.041194208, + -0.038179893, + 0.008360482, + 0.010148832, + 0.024984034, + -0.012506054, + -0.045101274, + 0.010266152, + -0.046285193, + 0.061415587, + 0.016212178, + -0.0011856663, + 0.0074200486, + -0.019432405, + -0.068008475, + 0.05477893, + 0.0964552, + -0.04710964, + 0.060082186, + 0.003054353, + -0.08875195, + 0.03727946, + -0.0099389665, + 0.003561616, + -0.07834196, + 0.021697106, + -0.013061282, + 0.0725091, + -0.06500139, + -0.029938946, + -0.017758802, + 0.033857197, + 0.029207738, + 0.08792652, + 0.00846041, + 0.06444677, + -0.016519535 + ], + "index": 0, + "object": "embedding" + } + ], + "model": "all-minilm:l6-v2", + "object": "list", + "usage": { + "prompt_tokens": 5, + "total_tokens": 5 + } + } + }, + "is_streaming": false + } +} diff --git a/tests/integration/recordings/responses/63aa4590a38a.json b/tests/integration/recordings/responses/63aa4590a38a.json new file mode 100644 index 000000000..9e3b275db --- /dev/null +++ b/tests/integration/recordings/responses/63aa4590a38a.json @@ -0,0 +1,421 @@ +{ + "request": { + "method": "POST", + "url": "http://0.0.0.0:11434/v1/v1/embeddings", + "headers": {}, + "body": { + "model": "all-minilm:l6-v2", + "input": "Test user parameter", + "encoding_format": "base64", + "user": "test-user-123" + }, + "endpoint": "/v1/embeddings", + "model": "all-minilm:l6-v2" + }, + "response": { + "body": { + "__type__": "openai.types.create_embedding_response.CreateEmbeddingResponse", + "__data__": { + "data": [ + { + "embedding": [ + 0.043770123, + 0.021501394, + -0.081300564, + 0.010615138, + -0.07908651, + -0.03219175, + 0.13090447, + 0.042329222, + -0.11600146, + -0.07588096, + 0.041826088, + -0.080617175, + 0.038125783, + -0.01069657, + 0.01577377, + -0.04196888, + 0.043099895, + -0.033355612, + 0.013571747, + -0.0103924, + 0.015561896, + -0.03786113, + -0.050319925, + -0.02566629, + -0.047868017, + -0.08717805, + 0.01685358, + -0.03676223, + 0.0063788705, + 0.020863743, + 0.11264443, + -0.0021451844, + -0.07911777, + 0.038758967, + 0.115321144, + -0.019753717, + 0.0067159277, + -0.02115779, + -0.0144774495, + -0.0027154125, + -0.034384295, + -0.052576542, + -0.030578543, + 0.04745372, + -0.024294367, + 0.01091144, + -0.03947583, + 0.07183755, + -0.020715859, + 0.018965777, + 0.04292474, + -0.007755194, + 0.0025708016, + -0.058263537, + 0.0117485095, + -0.022703577, + 0.001755438, + -0.012628832, + 0.030728007, + 0.017719304, + -0.061525322, + -0.036568273, + 0.025831668, + 0.025376469, + 0.012137967, + 0.009102949, + -0.027313529, + -0.093379095, + 0.0052120173, + 0.0074658697, + -0.07538, + 0.010161349, + -0.028439516, + 0.03026334, + 0.0036700817, + -0.022599109, + -0.037862476, + -0.08384314, + -0.0124443015, + -0.048889726, + 0.029131662, + -0.044443335, + -0.07518736, + -0.020938978, + 0.063386515, + 0.16294138, + 0.060580015, + -0.01281573, + -0.031040885, + 0.018372353, + 0.11225789, + 0.072922915, + -0.06272038, + -0.031792488, + -0.017476005, + 0.04846264, + -0.04116229, + -0.041834168, + -0.059919056, + 0.15907861, + -0.027786179, + -0.012492541, + 0.05599519, + -0.019895995, + 0.022076221, + 0.006363836, + 0.046413723, + -0.0731325, + 0.03326452, + 0.059475966, + -0.033314705, + 0.030761855, + 0.00819013, + -0.020254606, + 0.05658313, + -0.08153619, + 0.023402533, + 0.0060753864, + -0.07993489, + 0.013990512, + 0.052254565, + 0.027170746, + -0.049271967, + 0.02814688, + 0.019500777, + 0.054206643, + 0.082691684, + -1.8817448e-33, + 0.013630832, + -0.010863344, + 0.015899567, + 0.06938339, + -0.05113185, + 0.08995833, + 0.04450505, + 0.08101549, + 0.018903807, + -0.020960161, + -0.017933648, + -0.02174221, + 0.010988686, + 0.015100026, + 0.017031211, + 0.09433042, + 0.003454907, + 0.010199729, + -0.0446973, + 0.0018167854, + 0.015817188, + -0.06576281, + -0.004943305, + 0.004393494, + -0.019598262, + -0.092797264, + -0.025917865, + 0.04409669, + 0.054165967, + -0.007365383, + -0.021470547, + -0.03683317, + -0.091507494, + 0.08402351, + -0.01809901, + 0.0038072586, + 0.020236026, + 0.0439697, + -0.077322714, + 0.0057473024, + -0.054513566, + -0.024854423, + 0.075270385, + 0.034554463, + -0.08118007, + -0.12208905, + -0.0052893, + 0.0078005046, + 0.05028763, + 0.015558154, + -0.056349996, + 0.0398076, + 0.012997719, + -0.040145177, + 0.014409028, + -0.033200737, + -0.008437484, + -0.037582297, + -0.019651853, + 0.017285295, + -0.008976723, + -0.0018494898, + -0.0030671947, + 0.03046138, + -0.051143825, + -0.08688155, + -0.018344227, + -0.113307714, + 0.073259674, + 0.04602224, + 0.012651309, + -0.063435435, + -0.028471926, + 0.020155901, + -0.078830436, + -0.00069818215, + -0.03156303, + 0.123062745, + 0.0042949035, + -0.026413191, + 0.07838535, + -0.07747411, + -0.02126005, + 0.048919026, + 0.02919413, + -0.009296978, + -0.030687347, + -0.041037664, + -0.038565576, + -0.08043238, + 0.023225678, + 0.041928973, + -0.05812511, + 0.058555346, + 0.07633673, + 4.4510456e-34, + -0.019582625, + 0.040237214, + 0.01455587, + 0.034353998, + 0.043911777, + -0.023234777, + 0.0677493, + -0.030089214, + -0.09076478, + -0.019257858, + -0.02767876, + -0.00065146026, + 0.0043030144, + 0.05363546, + 0.04073387, + 0.03255476, + -0.10712685, + -0.050083157, + -0.016644027, + -0.0077649173, + -0.11153465, + 0.07478277, + -0.015999233, + -0.050547555, + -0.113217294, + -0.006174145, + 0.050873067, + -0.030284155, + 0.04314861, + 0.033020362, + 0.023671353, + 0.04654029, + -0.03415647, + 0.03614603, + 0.023047049, + -0.02677317, + 0.063607745, + 0.09978129, + 0.03527302, + 0.15538219, + 0.08349002, + 0.10931568, + 0.04684532, + -0.010147538, + -0.03256112, + 0.12924333, + 0.031221064, + -0.099673584, + 0.010860566, + 0.02326085, + -0.011916549, + 0.010135849, + 0.06884636, + 0.009350001, + -0.0226591, + -0.04280281, + -0.04821317, + -0.08508304, + 0.051028382, + 0.045148462, + -0.03566162, + 0.06547104, + 0.048883036, + 0.03793435, + -0.1407055, + -0.06711337, + 0.009881868, + -0.0049659596, + -0.044289522, + 0.0039236215, + -0.02692826, + -0.066134326, + 0.04076233, + -0.05222117, + 0.060488354, + -0.04113724, + -0.04314174, + -0.025147837, + 0.085597694, + -0.044939328, + 0.06395307, + -0.024218159, + -0.050523587, + -0.0020718095, + -0.07894165, + 0.0026805927, + 0.020709056, + 0.1026727, + -0.012374822, + 0.056179732, + 0.06552235, + 0.030915475, + -0.077197015, + -0.061245024, + -0.016111895, + -1.3512232e-08, + -0.05040501, + -0.033646606, + 0.04670903, + 0.047397695, + -0.044165645, + 0.046301767, + -0.006073457, + -0.053902794, + 0.013089125, + 0.050438043, + -0.009894958, + -0.0041677835, + 0.0723306, + 0.021069802, + 0.02670403, + -0.074845195, + -0.026750853, + 0.052738186, + -0.03469103, + 0.039813705, + -0.01640883, + 0.045899663, + -0.0224731, + 0.02387658, + 0.049145795, + 0.09110705, + -0.0025007618, + 0.04937552, + -0.03864697, + 0.020868128, + 0.07605537, + 0.08488945, + -0.05197299, + -0.06879239, + -0.06136516, + 0.077237174, + -0.06451729, + 0.04453416, + 0.008209786, + 0.015886698, + -0.04280691, + 0.005315579, + 0.0034463098, + 0.0031776188, + -0.013040836, + -0.091359615, + 0.0642767, + -0.054965723, + 0.0007161393, + -0.06260912, + -0.03496602, + -0.029944083, + 0.04422821, + 0.017855663, + -0.027972128, + -0.03656317, + 0.02111413, + 0.060607255, + -0.031320468, + -0.014338154, + 0.034649797, + 0.052279983, + -0.036579564, + 0.028179456 + ], + "index": 0, + "object": "embedding" + } + ], + "model": "all-minilm:l6-v2", + "object": "list", + "usage": { + "prompt_tokens": 3, + "total_tokens": 3 + } + } + }, + "is_streaming": false + } +} diff --git a/tests/integration/recordings/responses/72dc126ecb92.json b/tests/integration/recordings/responses/72dc126ecb92.json new file mode 100644 index 000000000..1132283bb --- /dev/null +++ b/tests/integration/recordings/responses/72dc126ecb92.json @@ -0,0 +1,422 @@ +{ + "request": { + "method": "POST", + "url": "http://0.0.0.0:11434/v1/v1/embeddings", + "headers": {}, + "body": { + "model": "all-minilm:l6-v2", + "input": [ + "What is the capital of France?" + ], + "encoding_format": "float" + }, + "endpoint": "/v1/embeddings", + "model": "all-minilm:l6-v2" + }, + "response": { + "body": { + "__type__": "openai.types.create_embedding_response.CreateEmbeddingResponse", + "__data__": { + "data": [ + { + "embedding": [ + 0.08202976, + 0.036049414, + -0.0038694388, + -0.004861482, + 0.025693247, + -0.057166435, + 0.012161705, + 0.00467127, + 0.03505895, + -0.022435311, + -0.008085767, + -0.10931756, + 0.022722982, + -0.029302586, + -0.04346896, + -0.12028496, + -0.0008543458, + -0.018142797, + 0.056229446, + 0.0030836044, + 0.0022986692, + -0.016883435, + 0.063618116, + -0.023674846, + 0.03150837, + -0.03492346, + -0.02059899, + -0.0028085383, + -0.011096673, + -0.036125362, + 0.05411302, + -0.03660111, + -0.025032759, + -0.03826603, + -0.04968481, + -0.015202328, + 0.021395631, + -0.012792473, + 0.07668721, + 0.044378605, + -0.010861103, + -0.02969732, + -0.01693457, + -0.02468242, + 0.008050823, + 0.043557983, + 0.00716306, + 0.07550757, + 0.032823652, + -0.062019415, + 0.06670169, + 0.02702069, + -0.045678847, + -0.031471908, + -0.031157935, + 0.09160007, + -0.0017839444, + -0.011266827, + 0.036512397, + 0.056955945, + 0.0023172228, + -0.037797417, + -0.015496572, + 0.05239146, + 0.060355853, + -0.016556436, + 0.008859441, + -0.006693228, + -0.10623182, + 0.0016843195, + -0.048475303, + -0.029751357, + 0.0043055434, + -0.085694805, + 0.06622337, + -0.055170245, + -0.113299794, + 0.050824273, + -0.0093362145, + 0.005925067, + 0.020988274, + -0.022545837, + 0.0005047343, + 0.056380495, + 0.045526545, + -0.0052237497, + 0.093625955, + 0.027504839, + 0.029391509, + -0.045657262, + -0.04896369, + 0.0014494687, + -0.012873971, + 0.07979804, + -0.119054265, + 0.06877414, + -0.02276175, + 0.04496259, + -0.08137766, + 0.04399991, + 0.0029155004, + 0.017608844, + 0.08313841, + -0.018102929, + -0.047927402, + 0.058765113, + 0.006293192, + -0.014731239, + -0.0073064007, + -0.0781359, + -0.10074126, + -0.033533756, + -0.00088698306, + -0.051110234, + 0.027163483, + 0.070813894, + 0.0473974, + -0.10459239, + 0.004466598, + -0.02877272, + -0.018381905, + -0.05058398, + -0.03153154, + -0.009511212, + -0.060586177, + 0.021100093, + -0.046674214, + -7.7591076e-33, + -0.031355448, + 0.056446515, + 0.07743158, + 0.063853666, + -0.046656296, + -0.0076402966, + -0.055335216, + 0.040273033, + -0.031546857, + -0.0070960633, + 0.03947221, + -0.13172576, + -0.066130824, + 0.021737415, + 0.09697953, + 0.011744081, + 0.08902659, + 0.034691017, + -0.043833185, + -0.00030143902, + 0.014647222, + -0.0027022636, + -0.0033283983, + 0.017359877, + 0.060070343, + 0.039406266, + -0.0016976525, + 0.07733255, + 0.014587377, + -0.0022474623, + -0.0018583275, + 0.015027343, + 0.021683114, + 0.007410058, + 0.018048959, + 0.04978414, + 0.012675927, + -0.0025086475, + 0.043455686, + 0.06298341, + 0.06654817, + -0.03632864, + -0.038746156, + 0.04404243, + 0.0055982894, + 0.0056101615, + -0.034923486, + -0.07149955, + 0.100819185, + -0.024829678, + 0.014776356, + -0.025867768, + -0.07273216, + -0.017346835, + 0.0260487, + 0.11415772, + -0.07090699, + 0.017925302, + -0.0033817997, + 0.008448176, + -0.003143632, + 0.0058723576, + -0.022942929, + 0.077535555, + 0.034722377, + 0.08747513, + 0.046323698, + 0.018648349, + 0.0110834995, + -0.04582314, + -0.04647318, + 0.026527299, + 0.07395089, + 0.06561257, + 0.062683366, + 0.072362706, + -0.008941885, + -0.03541281, + -0.0053030164, + -0.0031686015, + -0.037939887, + -0.041367147, + -0.09659676, + 0.044178847, + -0.033438113, + -0.071386814, + -0.011716445, + -0.0071186274, + 0.00061640673, + -0.08835511, + -0.113242365, + -0.12120535, + -0.0013521842, + -0.044262983, + -0.08664051, + 3.99678e-33, + 0.02535338, + -0.0026378247, + -0.08111579, + 0.02547826, + 0.0013276006, + 0.016020937, + 0.09552779, + 0.033251505, + -0.011988348, + 0.017077431, + -0.08302871, + -0.12451176, + 0.04389814, + 0.012018027, + 0.0658185, + 0.10058191, + 0.072872765, + -0.026890267, + -0.032213055, + -0.053589094, + -0.12635043, + 0.0054604914, + -0.035322428, + -0.0042595062, + -0.025021179, + 0.04156106, + -0.099938765, + -0.04764939, + -0.023992214, + 0.0026479033, + -0.055134412, + 0.0135903545, + 0.048992496, + 0.08496887, + -0.042019308, + 0.076698534, + 0.033193503, + 0.0013002069, + 0.040013336, + 0.06456136, + -0.043408506, + -0.04966869, + 0.057963107, + 0.112575926, + 0.07073235, + 0.008212935, + 0.04400269, + -0.02254505, + -0.0072481814, + 0.0499455, + 0.03863049, + 0.067862414, + -0.040987622, + 0.0057318085, + 0.017909586, + 0.049269967, + -0.051384907, + 0.051039662, + -0.09386297, + -0.068170875, + 0.06535989, + 0.075474136, + -0.01684931, + 0.066068135, + -0.002895765, + -0.020654289, + -0.12704009, + 0.06156587, + -0.009830676, + -0.01469639, + 0.13543925, + 0.03414061, + -0.06482569, + 0.050997727, + -0.06645151, + 0.02918515, + 0.07946983, + 0.0144163035, + -0.027290653, + 0.0053189695, + -0.06757613, + -0.020426784, + -0.02716044, + -0.026120126, + -0.07056778, + 0.034710903, + 0.0075686374, + -0.1021992, + 0.058452472, + -0.07478862, + -0.022035357, + -0.006788853, + -0.051244825, + -0.036997046, + 0.025655027, + -1.7503632e-08, + 0.068089955, + 0.045014948, + -0.04406171, + 0.012893553, + -0.057842314, + -0.09545587, + 0.062147193, + -0.0042322013, + -0.008608291, + 0.00019173615, + -0.073625155, + 0.0560322, + -0.069646716, + -0.051114324, + -0.041078486, + -0.0047770296, + -0.032476347, + 0.043077406, + 0.00868246, + 0.022775955, + -0.0048412583, + 0.023340825, + -0.045659505, + -0.0580905, + 0.012541833, + -0.0990428, + 0.040609814, + 0.04566485, + 0.002689006, + -0.005311531, + 0.06633719, + -0.027349183, + -0.050051387, + -0.09029445, + -0.03615204, + 0.012671408, + -0.005864395, + -0.0049427897, + 0.009419004, + -0.029023463, + 0.095057935, + 0.06193272, + 0.0124788815, + -0.011969339, + 0.024483038, + 0.045374334, + 0.05381008, + -0.035192177, + 0.11459818, + -0.0890104, + -0.11138818, + 0.099403016, + 0.0039248187, + 0.0044726846, + 0.003338095, + 0.07087381, + -0.0513449, + -0.012656336, + 0.021826852, + -0.0200563, + -0.014921589, + 0.049172193, + 0.08935325, + -0.011052536 + ], + "index": 0, + "object": "embedding" + } + ], + "model": "all-minilm:l6-v2", + "object": "list", + "usage": { + "prompt_tokens": 7, + "total_tokens": 7 + } + } + }, + "is_streaming": false + } +} diff --git a/tests/integration/recordings/responses/80311f244b55.json b/tests/integration/recordings/responses/80311f244b55.json new file mode 100644 index 000000000..707befc07 --- /dev/null +++ b/tests/integration/recordings/responses/80311f244b55.json @@ -0,0 +1,1204 @@ +{ + "request": { + "method": "POST", + "url": "http://0.0.0.0:11434/v1/v1/embeddings", + "headers": {}, + "body": { + "model": "all-minilm:l6-v2", + "input": [ + "Hello, world!", + "How are you today?", + "This is a test." + ], + "encoding_format": "float" + }, + "endpoint": "/v1/embeddings", + "model": "all-minilm:l6-v2" + }, + "response": { + "body": { + "__type__": "openai.types.create_embedding_response.CreateEmbeddingResponse", + "__data__": { + "data": [ + { + "embedding": [ + -0.038157914, + 0.03290493, + -0.0055371798, + 0.014353213, + -0.040209096, + -0.11667767, + 0.03170551, + 0.0019347348, + -0.04254092, + 0.029190615, + 0.042559944, + 0.032130145, + 0.02983921, + 0.010979105, + -0.053759154, + -0.05030495, + -0.023470305, + 0.010730486, + -0.1377361, + 0.0039985846, + 0.029267203, + 0.066698566, + -0.015405643, + 0.04843479, + -0.0881545, + -0.012694429, + 0.041265942, + 0.04089442, + -0.05000745, + -0.05805947, + 0.048748765, + 0.06891688, + 0.058812816, + 0.008785837, + -0.016080279, + 0.08517403, + -0.07814158, + -0.077435054, + 0.020808736, + 0.016186161, + 0.032549612, + -0.05344129, + -0.062166847, + -0.0242584, + 0.007393759, + 0.024064584, + 0.0064619263, + 0.051204458, + 0.072843835, + 0.034658417, + -0.05477693, + -0.05941287, + -0.007262739, + 0.020149412, + 0.035835978, + 0.0056162532, + 0.010803632, + -0.052724347, + 0.010110615, + -0.0087345, + -0.06285489, + 0.038390912, + -0.013975588, + 0.0734118, + 0.090072334, + -0.07995426, + -0.016420014, + 0.044813525, + -0.06888206, + -0.033037275, + -0.015467736, + 0.01130628, + 0.036483694, + 0.0663459, + -0.054344203, + 0.008723171, + 0.012078509, + -0.038129516, + 0.006938081, + 0.051155496, + 0.07745829, + -0.122897476, + 0.01635594, + 0.04956378, + 0.031677794, + -0.03963372, + 0.0016560612, + 0.0095810415, + -0.032620687, + -0.03396473, + -0.13327733, + 0.0072318353, + -0.010225149, + 0.038535405, + -0.09343492, + -0.04173385, + 0.06996305, + -0.026312327, + -0.14973918, + 0.13443227, + 0.03750676, + 0.052842483, + 0.045053005, + 0.018721534, + 0.05443072, + 0.017290117, + -0.03255681, + 0.046160772, + -0.046711024, + -0.030576464, + -0.018258592, + -0.048711784, + 0.033041865, + -0.003856249, + 0.05003307, + -0.05821012, + -0.00994153, + 0.0106995255, + -0.04008794, + -0.0015539092, + 0.060838487, + -0.04559896, + 0.04924722, + 0.026119638, + 0.019796783, + -0.0016312932, + 0.05955464, + -6.527786e-33, + 0.063555494, + 0.003072545, + 0.0290068, + 0.17338625, + 0.0029474646, + 0.027745575, + -0.095103905, + -0.031165987, + 0.026719859, + -0.010799976, + 0.023851028, + 0.02375357, + -0.031152952, + 0.049497593, + -0.025005657, + 0.10176666, + -0.079190366, + -0.0032479328, + 0.042849813, + 0.09489888, + -0.066508934, + 0.00632239, + 0.022188535, + 0.06996212, + -0.007491268, + -0.001777037, + 0.027047161, + -0.07536194, + 0.11401931, + 0.008564227, + -0.02371391, + -0.046974454, + 0.0144310715, + 0.019899534, + -0.0046927175, + 0.0013119543, + -0.03432107, + -0.054212432, + -0.09418897, + -0.028963951, + -0.018907014, + 0.045735538, + 0.04757043, + -0.003132595, + -0.033231355, + -0.013520351, + 0.051010653, + 0.03111525, + 0.015257217, + 0.054166727, + -0.085080594, + 0.013355202, + -0.04763934, + 0.07099156, + -0.01309272, + -0.0023823304, + 0.050339438, + -0.041624993, + -0.014171974, + 0.032421313, + 0.005414455, + 0.09128853, + 0.0045168963, + -0.018196244, + -0.015225792, + -0.04635148, + 0.038764603, + 0.014739169, + 0.052030377, + 0.0017809072, + -0.014930553, + 0.027100598, + 0.031190928, + 0.02379928, + -0.0045879, + 0.03622444, + 0.066800386, + -0.0018508516, + 0.021243243, + -0.0575494, + 0.019077979, + 0.031474162, + -0.018456634, + -0.04083116, + 0.10387791, + 0.011981423, + -0.014923204, + -0.10519511, + -0.012293124, + -0.00042049217, + -0.09506704, + 0.058275525, + 0.042611193, + -0.025061507, + -0.094545335, + 4.010606e-33, + 0.13226718, + 0.0053517097, + -0.03314567, + -0.09099676, + -0.031551942, + -0.033939674, + -0.071981214, + 0.12595285, + -0.08333936, + 0.052855294, + 0.001036374, + 0.021973396, + 0.104020424, + 0.013031712, + 0.040921222, + 0.018695012, + 0.114233166, + 0.024822846, + 0.014595918, + 0.00621894, + -0.011220824, + -0.035742316, + -0.03801776, + 0.011226576, + -0.051305167, + 0.007892534, + 0.06734842, + 0.0033567564, + -0.09286571, + 0.03701943, + -0.022331072, + 0.040051647, + -0.030764744, + -0.011390678, + -0.014426033, + 0.024999708, + -0.09751172, + -0.03538673, + -0.03757043, + -0.010174254, + -0.06396341, + 0.025548752, + 0.020661479, + 0.03752242, + -0.10438308, + -0.028266912, + -0.052153755, + 0.012830027, + -0.05125152, + -0.029009243, + -0.09633578, + -0.042322997, + 0.06716196, + -0.030903742, + -0.010314011, + 0.027343867, + -0.028119028, + 0.010296558, + 0.043072425, + 0.022286164, + 0.007943, + 0.056093868, + 0.040728126, + 0.09295372, + 0.016456816, + -0.053744446, + 0.00047035623, + 0.050744157, + 0.04246857, + -0.029237023, + 0.009294763, + -0.010624897, + -0.037202932, + 0.00220195, + -0.030278567, + 0.07457478, + 0.0026277148, + -0.017591486, + 0.0028708735, + 0.03840644, + 0.0072204536, + 0.045653794, + 0.039947055, + 0.014161398, + -0.014247232, + 0.058465447, + 0.036360227, + 0.055268615, + -0.02004829, + -0.08043532, + -0.030213723, + -0.0148566915, + 0.022293866, + 0.011908896, + -0.06907556, + -1.8805048e-08, + -0.078408636, + 0.046699222, + -0.023894435, + 0.06347232, + 0.02395583, + 0.0014103559, + -0.090737104, + -0.06684135, + -0.080118775, + 0.0054891296, + 0.05368204, + 0.10478211, + -0.066875115, + 0.015525915, + 0.06710851, + 0.07083251, + -0.03199485, + 0.020825442, + -0.021920865, + -0.0072890157, + -0.01058703, + 0.004174248, + 0.033155944, + -0.07901077, + 0.038750935, + -0.07521113, + -0.015731987, + 0.005987591, + 0.0051212795, + -0.061557226, + 0.04203319, + 0.09544439, + -0.04317485, + 0.014446859, + -0.10614051, + -0.028011814, + 0.01101727, + 0.069552526, + 0.0669063, + -0.0747214, + -0.078444764, + 0.042728573, + -0.034634914, + -0.106056124, + -0.0357495, + 0.05155015, + 0.068699375, + -0.049968246, + 0.015420614, + -0.06460179, + -0.07601102, + 0.026022797, + 0.07440251, + -0.0124161495, + 0.1332999, + 0.07480527, + 0.051343314, + 0.02094546, + -0.026808253, + 0.08892536, + 0.03996125, + -0.041000355, + 0.03187991, + 0.018108707 + ], + "index": 0, + "object": "embedding" + }, + { + "embedding": [ + -0.009823841, + 0.06685394, + 0.08489411, + 0.03813849, + 0.032225974, + -0.034307797, + 0.107310556, + -0.046902046, + -0.102643676, + -0.003702005, + -0.0023676767, + 0.012173647, + -0.046961293, + 0.08201565, + 0.04295503, + -0.027037757, + 0.0070437216, + -0.104356326, + -0.12175826, + 0.07269557, + -0.079771765, + -0.003676955, + -0.0044014333, + 0.06784145, + -0.020959238, + 0.05777534, + -0.008483368, + -0.013391308, + 0.0052807773, + -0.09834358, + -0.13073047, + 0.008964234, + -0.057907283, + -0.05804121, + -0.05626149, + -0.042638198, + 3.184936e-05, + -0.14460282, + 0.007979306, + 0.022538451, + 0.048148528, + -0.039077234, + -0.012783144, + 0.007688736, + 0.05792521, + -0.027782526, + -0.019818667, + 0.09386619, + 0.14314687, + -0.023420751, + -0.10621568, + 0.026846798, + -0.05543366, + 0.017867815, + 0.021250507, + 0.041602414, + 0.0033089865, + 0.016080648, + 0.083043434, + -0.014604297, + 0.027198244, + 0.014271484, + -0.0062427525, + 0.06058171, + 0.03864093, + 0.0060196337, + -0.10089876, + -0.05285287, + -0.0797282, + 0.01671729, + -0.054698065, + -0.073024616, + 0.04547561, + -0.009560945, + -0.010386015, + -0.064177126, + 0.0011365172, + -0.036887243, + 0.06302413, + -0.0016032788, + 0.057869848, + -0.026043506, + -0.000536635, + 0.021403369, + -0.05001242, + -0.011384805, + -0.008799393, + 0.09338713, + 0.010654576, + -0.0006147975, + -0.056140404, + 0.043459535, + 0.0037720772, + 0.027983129, + 0.020964785, + -0.038642954, + 0.019421708, + 0.023177834, + -0.051029585, + 0.13815063, + 0.022802453, + 0.13100733, + 0.042305406, + 0.012445653, + 0.022351589, + 0.014143133, + -0.09037672, + 0.07454903, + -0.062642604, + -0.08922512, + 0.005484734, + 0.03850994, + -0.03628572, + -0.009195987, + 0.09181748, + -0.012547894, + 0.026162561, + 0.08752062, + -0.010926715, + 0.09250321, + 0.02097545, + 0.052515954, + 0.028899532, + 0.039395254, + -0.010501714, + 0.077294946, + 0.0715375, + -7.66496e-33, + 0.100804806, + 0.00073826336, + 0.057312902, + 0.117006026, + -0.060187068, + -0.02796235, + -0.041741833, + -0.018912861, + 0.050848745, + -0.06301131, + 0.036858555, + -0.045183055, + -0.005223951, + 0.0064753974, + -0.03198189, + 0.028979877, + -0.09603434, + 0.057345662, + 0.008110953, + 0.12529288, + -0.021994175, + -0.047584984, + -0.04379391, + 0.021993084, + 0.051113907, + -0.014501653, + -0.021036316, + -0.0667254, + -0.026064333, + -0.008694687, + -0.036617454, + -0.008719971, + 0.115688674, + -0.00289865, + 0.025261829, + -0.0076816385, + -0.008632856, + -0.0036519386, + -0.04257167, + -0.037688565, + 0.03307097, + -0.024961809, + 0.05859159, + -0.06178797, + -0.04673158, + -0.027886666, + -0.035025608, + 0.055327583, + -0.002065147, + -0.022386257, + -0.10152246, + 0.029717246, + -0.06324088, + -0.0055829133, + -0.048448645, + -0.04066708, + -0.07524254, + 0.03743904, + 0.016060878, + 0.084327556, + 0.012047858, + 0.055406, + 0.009235782, + -0.07829579, + -0.105074205, + -0.023971796, + -0.017086953, + -0.018263351, + 0.041692156, + -0.00606311, + 0.012483653, + -0.035019528, + 0.024491172, + 0.06318314, + 0.065662295, + 0.052476574, + 0.038394902, + -0.07514326, + -0.012202919, + -0.0064696297, + 0.049809776, + 0.05707129, + -0.0019637872, + -0.049091708, + 0.054853234, + 0.052796733, + 0.007638584, + -0.009890581, + 0.0022318119, + 0.022781821, + -0.06865972, + 0.06054869, + 0.070527636, + -0.04190614, + -0.024943016, + 5.210683e-33, + 0.09748425, + 0.015037715, + -0.0950651, + 0.05163348, + -0.09946082, + -0.046801973, + -0.045799557, + 0.04598005, + -0.021040877, + 0.048971444, + 0.085892275, + 0.031846974, + 0.010494827, + -0.011657944, + 0.023827314, + -0.0036091327, + 0.05379242, + 0.0051917112, + -0.020764181, + 0.011931169, + -0.09782392, + 0.06021868, + -0.027618488, + 0.06742346, + 4.5418237e-05, + 0.06255733, + 0.024763351, + 0.05360233, + -0.037187718, + -0.015447758, + -0.015347547, + -0.021288762, + -0.03981676, + 0.04994158, + 0.019988623, + 0.058448106, + 0.0017628162, + -0.074512705, + -0.015785523, + -0.10013551, + -0.10497206, + 0.030029353, + 0.00386666, + 0.065692, + 0.053144414, + 0.009848025, + -0.023745444, + -0.02572956, + -0.0091416575, + 0.06447014, + 0.008398887, + -0.03277235, + -0.0017416656, + 0.017433915, + 0.02735147, + -0.003945162, + -0.07797209, + -0.061111048, + -0.018393502, + 0.019164208, + -0.10231785, + 0.0048785545, + -0.039205246, + -0.00983978, + 0.024287809, + -0.02257733, + -0.016971176, + -0.03401973, + -0.052132465, + -0.031842116, + -0.034754753, + 0.0082540605, + 0.0013724067, + -0.06360571, + -0.028295932, + 0.050363123, + 0.023888446, + 0.005894443, + -0.0116009535, + -0.0004876411, + -0.07163071, + 0.041449234, + 0.05440186, + -0.10820097, + -0.081358775, + -0.069281794, + 0.08610945, + -0.0035109764, + 0.031017194, + 0.08359787, + -0.028458066, + 0.008852798, + -0.027919184, + 0.04985712, + 0.011562651, + -1.5342355e-08, + 0.054318756, + 0.045345105, + -0.07638805, + 0.052091047, + -0.01236827, + 0.060296044, + -0.004145201, + -0.017390434, + -0.014107871, + -0.01709858, + 0.075827934, + 0.007903074, + -0.06532883, + -0.04752482, + 0.038101584, + -0.050273094, + 0.02193425, + 0.068476826, + -0.037231524, + -0.049334478, + 0.057314597, + 0.008028915, + -0.042897243, + 0.09775371, + 0.05817249, + 0.052902617, + 0.024731442, + 0.03277874, + -0.0062142154, + 0.082389385, + 0.037153333, + 0.108709686, + -0.05776975, + 0.036667187, + -0.018986559, + -0.08550582, + 0.059112605, + -0.045709446, + 0.025215724, + 0.022489667, + -0.007955196, + 0.0031373778, + -0.047831737, + -0.01862743, + 0.048644323, + -0.032836094, + 0.054563984, + -0.037403505, + -0.07471283, + -0.019280152, + 0.0060565346, + 0.04239159, + 0.06738598, + 0.04457912, + 0.03311975, + 0.033673216, + 0.0012720197, + 0.033221062, + -0.04845177, + -0.0056105815, + -0.008513508, + -0.016865257, + -0.07558049, + 0.0035253412 + ], + "index": 1, + "object": "embedding" + }, + { + "embedding": [ + 0.033612337, + 0.010374505, + -0.01756061, + 0.029361853, + -0.009454598, + -0.037026335, + -0.02555746, + 0.0086515825, + 0.019154208, + 0.03955405, + -0.02469497, + -0.0126976445, + -0.0065836124, + 0.043807767, + -0.036032367, + -0.056751598, + 0.005685301, + -0.048611272, + -0.01940104, + 0.051023778, + 0.06368657, + 0.04569995, + -0.025642192, + 0.02090835, + 0.023841413, + -0.011006624, + -0.06968253, + 0.008696027, + -0.0100323185, + -0.004299733, + -0.013709692, + 0.060795236, + 0.054181676, + 0.030621745, + 0.032446172, + 0.023919526, + 0.09566865, + 0.041953687, + 0.00087092275, + 0.04335, + 0.03367777, + -0.09001533, + 0.021590438, + 0.04053571, + -0.002674088, + 0.031825043, + -0.045521177, + 0.047551177, + -0.07043583, + -0.013617987, + -0.0102603305, + -0.016518736, + -0.07214938, + -0.055422474, + 0.03316378, + -0.0076137385, + 0.050792947, + -0.04655027, + 0.064705744, + 0.08078938, + -0.053805117, + -0.013050277, + -0.023942292, + 0.0726168, + 0.07433478, + 0.050372824, + -0.03490959, + -0.101285346, + -0.016964512, + -0.054189693, + 0.005499785, + 0.006458164, + 0.055815514, + 0.048383262, + 0.040276967, + 0.0056121964, + -0.024112493, + -0.10037388, + 0.07864023, + 0.04749725, + -0.083059065, + -0.05695486, + -0.007121432, + 0.03499301, + 0.0130494, + 0.047826655, + 0.07769031, + -0.0050768964, + -0.088448934, + 0.0034568575, + -0.023282519, + 0.045576394, + -0.042316645, + -0.024240615, + 0.017663328, + -0.024584634, + -0.032086663, + -0.009175009, + -0.060619276, + 0.0788936, + -0.007151155, + -0.0018835695, + -0.024150992, + 0.035605535, + -0.097886965, + -0.07463594, + 0.036441684, + -0.061645452, + 0.06754617, + 0.0037501638, + -0.050999243, + -0.023512185, + 0.04400348, + 0.042692684, + 0.020495275, + -0.0098657925, + -0.10782902, + 0.041300014, + 0.029186765, + 0.045622177, + 0.0951987, + -0.020906197, + 0.00027652894, + -0.05796104, + 0.022876726, + -0.043638688, + 0.021679614, + -8.721427e-33, + -0.0012232207, + -0.038046468, + 0.04248091, + 0.08773161, + -0.0042147394, + 0.00010909877, + -0.06459573, + 0.061631102, + -0.0035571777, + -0.0057670954, + -0.010751822, + -0.06539647, + 0.0026381642, + 0.006108226, + 0.07177802, + 0.099656485, + -0.028420987, + 0.0886893, + -0.06579721, + 0.0577445, + -0.057205524, + 0.036075067, + -0.02090538, + -0.09164578, + -0.07255028, + -0.075212136, + -0.006453883, + 0.010381722, + -0.0037261078, + 0.020341685, + -0.039610952, + 0.048633367, + -0.057997692, + 0.04580804, + -0.002834594, + -0.026399026, + 0.011338722, + -0.008768234, + -0.012484398, + 0.0030163776, + -0.050530374, + -0.043636482, + -0.024315875, + 0.065459326, + 0.050444957, + -0.031544425, + -0.00075475493, + -0.04531901, + 0.058805995, + 0.0012770096, + -0.019136755, + 0.012550491, + 0.040011447, + -0.022380024, + -0.030805111, + 0.04761777, + 0.036087062, + -0.00771528, + -0.042050246, + 0.09727571, + 0.011417657, + 0.027789006, + -0.08352716, + 0.019375375, + -0.05415718, + 0.014092975, + -0.04270275, + -0.007896535, + 0.029720219, + 0.07610263, + 0.031358883, + -0.04178186, + 0.0016060148, + 0.03870257, + -0.059810083, + -0.07050183, + -0.051603932, + 0.06843783, + -0.0037906233, + -0.012867741, + 0.035064667, + -0.112596914, + 0.053979058, + -0.11403874, + -0.033291597, + -0.011375664, + -0.022975085, + -0.0874419, + 0.0009676586, + -0.07040301, + -0.034353334, + 0.028341567, + -0.003938582, + -0.065418504, + 0.05670526, + 4.4032913e-33, + -0.06758047, + 0.07452212, + -0.04625966, + 0.110544346, + 0.08249691, + -0.035985246, + 0.112199076, + -0.010368401, + -0.09361668, + 0.15915231, + 0.005810317, + 0.041577023, + 0.041846495, + -0.0221648, + 0.0180787, + 0.01732049, + 0.031424496, + -0.07654498, + 0.011575445, + -0.04279533, + -0.077900656, + 0.12441581, + 0.036161043, + 0.09728094, + -0.06544197, + 0.051177975, + 0.030517569, + -0.06477891, + 0.0033884735, + -0.0065040532, + 0.002094866, + 0.0057612373, + -0.07176532, + 0.01457261, + 0.0111329, + -0.012400559, + 0.09850194, + -0.05333344, + -0.059571583, + 0.027873877, + 0.013967755, + 0.0973726, + 0.14173166, + 0.09823832, + -0.00076127227, + 0.036324706, + 0.013391566, + -0.11345763, + 0.015459011, + 0.04547403, + -0.05844395, + -0.011545099, + 0.026310358, + 0.055226807, + -0.05014672, + 0.014071454, + -0.04505251, + 0.0055593317, + 0.017989416, + 0.01946363, + -0.08633586, + 0.08156571, + -0.012573777, + 0.03409684, + -0.017857939, + -0.031390663, + -0.08447243, + 0.07359053, + 0.03050787, + 0.014397102, + 0.085515074, + -0.0014615763, + -0.117197014, + -0.071065396, + 0.08322675, + -0.077766545, + -0.04483503, + -0.009105399, + 0.031649765, + -0.03719005, + -0.05655446, + -0.07973028, + 0.0033281972, + 0.039855074, + -0.05885036, + 0.09728466, + -0.016143035, + 0.02778064, + -0.06544481, + 0.040895227, + 0.009707747, + -0.012031996, + -0.0087121, + -0.050623253, + -0.024199592, + -1.8976149e-08, + -0.024199035, + -0.05503201, + -0.014488159, + 0.017767312, + -0.014441727, + 0.06777053, + 0.032016836, + -0.04272461, + -0.056400675, + 0.00891021, + 0.09656018, + 0.06953362, + -0.09056004, + 0.018509604, + 0.0636711, + -0.07154264, + -0.004792113, + -0.008434159, + -0.016066523, + 0.08377477, + -0.08183436, + 0.050272364, + 0.020495478, + 0.027959472, + -0.023466159, + 0.074599385, + 0.03680873, + 0.08727076, + 0.0132746175, + 0.027399603, + 0.06736775, + 0.039569516, + -0.044155512, + -0.051341295, + -0.013279262, + 0.06611269, + 0.0431739, + -0.036882088, + 0.02478827, + 0.0406888, + -0.1132855, + 0.027976915, + 0.0070727277, + 0.039784174, + -0.027419532, + -0.05590226, + -0.08574367, + -0.02544574, + -0.021121135, + -0.05820989, + -0.025676778, + 0.017944483, + 0.04889649, + -0.036834445, + 0.012973257, + -0.06298454, + -0.03954017, + -0.0035980341, + -0.06945554, + 0.042370543, + 0.1125106, + -0.0015144089, + 0.08769291, + -0.041732 + ], + "index": 2, + "object": "embedding" + } + ], + "model": "all-minilm:l6-v2", + "object": "list", + "usage": { + "prompt_tokens": 14, + "total_tokens": 14 + } + } + }, + "is_streaming": false + } +} diff --git a/tests/integration/recordings/responses/8ce928ad0b85.json b/tests/integration/recordings/responses/8ce928ad0b85.json new file mode 100644 index 000000000..e15dad63e --- /dev/null +++ b/tests/integration/recordings/responses/8ce928ad0b85.json @@ -0,0 +1,421 @@ +{ + "request": { + "method": "POST", + "url": "http://0.0.0.0:11434/v1/v1/embeddings", + "headers": {}, + "body": { + "model": "all-minilm:l6-v2", + "input": "Test user parameter", + "encoding_format": "float", + "user": "test-user-123" + }, + "endpoint": "/v1/embeddings", + "model": "all-minilm:l6-v2" + }, + "response": { + "body": { + "__type__": "openai.types.create_embedding_response.CreateEmbeddingResponse", + "__data__": { + "data": [ + { + "embedding": [ + 0.043770123, + 0.021501394, + -0.081300564, + 0.010615138, + -0.07908651, + -0.03219175, + 0.13090447, + 0.042329222, + -0.11600146, + -0.07588096, + 0.041826088, + -0.080617175, + 0.038125783, + -0.01069657, + 0.01577377, + -0.04196888, + 0.043099895, + -0.033355612, + 0.013571747, + -0.0103924, + 0.015561896, + -0.03786113, + -0.050319925, + -0.02566629, + -0.047868017, + -0.08717805, + 0.01685358, + -0.03676223, + 0.0063788705, + 0.020863743, + 0.11264443, + -0.0021451844, + -0.07911777, + 0.038758967, + 0.115321144, + -0.019753717, + 0.0067159277, + -0.02115779, + -0.0144774495, + -0.0027154125, + -0.034384295, + -0.052576542, + -0.030578543, + 0.04745372, + -0.024294367, + 0.01091144, + -0.03947583, + 0.07183755, + -0.020715859, + 0.018965777, + 0.04292474, + -0.007755194, + 0.0025708016, + -0.058263537, + 0.0117485095, + -0.022703577, + 0.001755438, + -0.012628832, + 0.030728007, + 0.017719304, + -0.061525322, + -0.036568273, + 0.025831668, + 0.025376469, + 0.012137967, + 0.009102949, + -0.027313529, + -0.093379095, + 0.0052120173, + 0.0074658697, + -0.07538, + 0.010161349, + -0.028439516, + 0.03026334, + 0.0036700817, + -0.022599109, + -0.037862476, + -0.08384314, + -0.0124443015, + -0.048889726, + 0.029131662, + -0.044443335, + -0.07518736, + -0.020938978, + 0.063386515, + 0.16294138, + 0.060580015, + -0.01281573, + -0.031040885, + 0.018372353, + 0.11225789, + 0.072922915, + -0.06272038, + -0.031792488, + -0.017476005, + 0.04846264, + -0.04116229, + -0.041834168, + -0.059919056, + 0.15907861, + -0.027786179, + -0.012492541, + 0.05599519, + -0.019895995, + 0.022076221, + 0.006363836, + 0.046413723, + -0.0731325, + 0.03326452, + 0.059475966, + -0.033314705, + 0.030761855, + 0.00819013, + -0.020254606, + 0.05658313, + -0.08153619, + 0.023402533, + 0.0060753864, + -0.07993489, + 0.013990512, + 0.052254565, + 0.027170746, + -0.049271967, + 0.02814688, + 0.019500777, + 0.054206643, + 0.082691684, + -1.8817448e-33, + 0.013630832, + -0.010863344, + 0.015899567, + 0.06938339, + -0.05113185, + 0.08995833, + 0.04450505, + 0.08101549, + 0.018903807, + -0.020960161, + -0.017933648, + -0.02174221, + 0.010988686, + 0.015100026, + 0.017031211, + 0.09433042, + 0.003454907, + 0.010199729, + -0.0446973, + 0.0018167854, + 0.015817188, + -0.06576281, + -0.004943305, + 0.004393494, + -0.019598262, + -0.092797264, + -0.025917865, + 0.04409669, + 0.054165967, + -0.007365383, + -0.021470547, + -0.03683317, + -0.091507494, + 0.08402351, + -0.01809901, + 0.0038072586, + 0.020236026, + 0.0439697, + -0.077322714, + 0.0057473024, + -0.054513566, + -0.024854423, + 0.075270385, + 0.034554463, + -0.08118007, + -0.12208905, + -0.0052893, + 0.0078005046, + 0.05028763, + 0.015558154, + -0.056349996, + 0.0398076, + 0.012997719, + -0.040145177, + 0.014409028, + -0.033200737, + -0.008437484, + -0.037582297, + -0.019651853, + 0.017285295, + -0.008976723, + -0.0018494898, + -0.0030671947, + 0.03046138, + -0.051143825, + -0.08688155, + -0.018344227, + -0.113307714, + 0.073259674, + 0.04602224, + 0.012651309, + -0.063435435, + -0.028471926, + 0.020155901, + -0.078830436, + -0.00069818215, + -0.03156303, + 0.123062745, + 0.0042949035, + -0.026413191, + 0.07838535, + -0.07747411, + -0.02126005, + 0.048919026, + 0.02919413, + -0.009296978, + -0.030687347, + -0.041037664, + -0.038565576, + -0.08043238, + 0.023225678, + 0.041928973, + -0.05812511, + 0.058555346, + 0.07633673, + 4.4510456e-34, + -0.019582625, + 0.040237214, + 0.01455587, + 0.034353998, + 0.043911777, + -0.023234777, + 0.0677493, + -0.030089214, + -0.09076478, + -0.019257858, + -0.02767876, + -0.00065146026, + 0.0043030144, + 0.05363546, + 0.04073387, + 0.03255476, + -0.10712685, + -0.050083157, + -0.016644027, + -0.0077649173, + -0.11153465, + 0.07478277, + -0.015999233, + -0.050547555, + -0.113217294, + -0.006174145, + 0.050873067, + -0.030284155, + 0.04314861, + 0.033020362, + 0.023671353, + 0.04654029, + -0.03415647, + 0.03614603, + 0.023047049, + -0.02677317, + 0.063607745, + 0.09978129, + 0.03527302, + 0.15538219, + 0.08349002, + 0.10931568, + 0.04684532, + -0.010147538, + -0.03256112, + 0.12924333, + 0.031221064, + -0.099673584, + 0.010860566, + 0.02326085, + -0.011916549, + 0.010135849, + 0.06884636, + 0.009350001, + -0.0226591, + -0.04280281, + -0.04821317, + -0.08508304, + 0.051028382, + 0.045148462, + -0.03566162, + 0.06547104, + 0.048883036, + 0.03793435, + -0.1407055, + -0.06711337, + 0.009881868, + -0.0049659596, + -0.044289522, + 0.0039236215, + -0.02692826, + -0.066134326, + 0.04076233, + -0.05222117, + 0.060488354, + -0.04113724, + -0.04314174, + -0.025147837, + 0.085597694, + -0.044939328, + 0.06395307, + -0.024218159, + -0.050523587, + -0.0020718095, + -0.07894165, + 0.0026805927, + 0.020709056, + 0.1026727, + -0.012374822, + 0.056179732, + 0.06552235, + 0.030915475, + -0.077197015, + -0.061245024, + -0.016111895, + -1.3512232e-08, + -0.05040501, + -0.033646606, + 0.04670903, + 0.047397695, + -0.044165645, + 0.046301767, + -0.006073457, + -0.053902794, + 0.013089125, + 0.050438043, + -0.009894958, + -0.0041677835, + 0.0723306, + 0.021069802, + 0.02670403, + -0.074845195, + -0.026750853, + 0.052738186, + -0.03469103, + 0.039813705, + -0.01640883, + 0.045899663, + -0.0224731, + 0.02387658, + 0.049145795, + 0.09110705, + -0.0025007618, + 0.04937552, + -0.03864697, + 0.020868128, + 0.07605537, + 0.08488945, + -0.05197299, + -0.06879239, + -0.06136516, + 0.077237174, + -0.06451729, + 0.04453416, + 0.008209786, + 0.015886698, + -0.04280691, + 0.005315579, + 0.0034463098, + 0.0031776188, + -0.013040836, + -0.091359615, + 0.0642767, + -0.054965723, + 0.0007161393, + -0.06260912, + -0.03496602, + -0.029944083, + 0.04422821, + 0.017855663, + -0.027972128, + -0.03656317, + 0.02111413, + 0.060607255, + -0.031320468, + -0.014338154, + 0.034649797, + 0.052279983, + -0.036579564, + 0.028179456 + ], + "index": 0, + "object": "embedding" + } + ], + "model": "all-minilm:l6-v2", + "object": "list", + "usage": { + "prompt_tokens": 3, + "total_tokens": 3 + } + } + }, + "is_streaming": false + } +} diff --git a/tests/integration/recordings/responses/9e9665e16597.json b/tests/integration/recordings/responses/9e9665e16597.json new file mode 100644 index 000000000..a3e34d1bd --- /dev/null +++ b/tests/integration/recordings/responses/9e9665e16597.json @@ -0,0 +1,422 @@ +{ + "request": { + "method": "POST", + "url": "http://0.0.0.0:11434/v1/v1/embeddings", + "headers": {}, + "body": { + "model": "all-minilm:l6-v2", + "input": [ + "Why are data structures important in computer science?" + ], + "encoding_format": "float" + }, + "endpoint": "/v1/embeddings", + "model": "all-minilm:l6-v2" + }, + "response": { + "body": { + "__type__": "openai.types.create_embedding_response.CreateEmbeddingResponse", + "__data__": { + "data": [ + { + "embedding": [ + -0.012128477, + 0.06527823, + -0.031809483, + -0.050526526, + -0.0005586695, + -0.117261976, + -0.043081608, + 0.024609145, + 0.08321573, + 0.033838283, + -0.023870444, + 0.020454653, + 0.032279976, + 0.012203663, + 0.028937394, + 0.029961895, + -0.09961831, + 0.0141193895, + -0.021553658, + -0.07066728, + -0.02873006, + -0.029528745, + -0.068298884, + 0.0031958553, + -0.022202335, + 0.13836044, + -0.034372807, + -0.03989439, + -0.016163597, + -0.042044215, + -0.0016031979, + 0.03265711, + 0.12287486, + 0.053505898, + -0.08694122, + 0.042619474, + 0.10286983, + -0.021920446, + -0.06450256, + 0.025313437, + -0.0964511, + 0.035419725, + 0.021049967, + 0.062087003, + 0.032521646, + 0.017943505, + -0.006459364, + -0.06203872, + -0.013574074, + 0.024539992, + -0.13688074, + 0.034410667, + -0.027617542, + 0.03409185, + 0.020446204, + 0.077928044, + 0.09399848, + 0.003975386, + -0.043136317, + 0.0031040143, + -0.017540144, + -0.03424077, + -0.068318866, + 0.005061085, + 0.08829544, + -0.012408556, + -0.0016823813, + 0.007591063, + 0.034699216, + 0.010171645, + 0.018427595, + -0.007851212, + -0.023401242, + 0.07745935, + 0.039882705, + -0.010903346, + -0.053599168, + -0.029966023, + 0.033182297, + 0.0051609245, + 0.013949411, + 0.017829804, + -0.029286042, + 0.07984294, + 0.042010676, + -0.0025307727, + 0.027901225, + -0.03822856, + -0.080078274, + -0.030328913, + 0.09236672, + -0.033835273, + -0.00033364468, + 0.029182306, + -0.04279952, + -0.0029906866, + 0.03665573, + -0.056330174, + 0.07478027, + 0.007321523, + 0.046409536, + 0.023820953, + 0.06267657, + 0.071830586, + -0.06049986, + -0.10113381, + 0.04797238, + -0.010384649, + 0.0008945393, + -0.06017545, + -0.033510443, + 0.047712646, + -0.055030894, + -0.047685586, + -0.03805009, + -0.12862371, + -0.08072417, + 0.0048694503, + -0.021217689, + -0.027110996, + 0.002140792, + -0.03098654, + -0.039278872, + 0.0143353, + -0.0035598644, + -0.071865514, + -0.14747895, + -3.6233633e-33, + -0.017464003, + -0.029053442, + -0.025221748, + 0.06710367, + 0.022286726, + -0.030096456, + -0.004590723, + -0.04471534, + -0.0029244933, + 0.040142074, + -0.026988953, + 0.052587368, + 0.041354593, + 0.039806347, + 0.12857036, + 0.024866242, + -0.010497711, + 0.0713523, + -0.03402195, + -0.03354482, + 0.07337487, + -0.02804671, + 0.07398319, + -0.029162133, + 0.030897863, + 0.026442021, + -0.012924316, + -0.004779478, + -0.0066290544, + 0.0010669982, + 0.02442126, + -0.019298507, + -0.0010162054, + 0.026722405, + 0.123015314, + 0.066879444, + -0.004604402, + -0.11145285, + 0.06524651, + -0.06938033, + 0.03159686, + 0.0365362, + 0.027604872, + 0.03813194, + -0.044194933, + -0.026800867, + 0.022335347, + -0.030788116, + -0.0070202574, + -0.09740058, + 0.028278269, + 0.015338586, + 0.047182743, + 0.04034929, + 0.044180423, + 0.044752665, + -0.028346116, + -0.09805642, + -0.03536096, + 0.06581017, + -0.069448434, + 0.052013367, + 0.056201097, + 0.033995215, + 0.00519787, + 0.07888512, + -0.019000722, + 8.0344194e-05, + 0.110052355, + 0.005598096, + -0.019291203, + 0.0260335, + -0.061335884, + -0.011191793, + -0.032474954, + 0.026703535, + -0.038857695, + -0.07600434, + -0.0060966127, + 0.049430415, + -0.05585763, + -0.024964364, + 0.03721157, + 0.013983276, + -0.021332601, + -0.02459227, + 0.050077077, + -0.031562295, + -0.048190966, + -0.022175686, + -0.02291134, + -0.012059778, + 0.01774164, + -0.019271614, + -0.018707262, + 5.8759317e-34, + -0.027778838, + -0.01629238, + -0.030639471, + 0.0030956517, + -0.013600445, + 0.013610428, + 0.012467948, + -0.12637076, + 0.003133677, + 0.020737566, + 0.0032866234, + 0.009551662, + 0.040670644, + -0.06273018, + 0.043455947, + 0.05110034, + -0.027151333, + -0.07152962, + -0.04858435, + -0.039853398, + -0.021122044, + 0.08141459, + -0.080552705, + -0.035274338, + 0.028709702, + -0.017908616, + -0.1056214, + -0.14565709, + 0.05107322, + 0.037748225, + -0.018399585, + -0.04667668, + -0.010029709, + 0.0070766853, + 0.017215423, + -0.015265576, + 0.06257449, + -0.010665833, + 0.055490427, + 0.0076262103, + -0.0129058715, + 0.11340158, + 0.0062427726, + -0.023597918, + 0.04516201, + 0.040879074, + -0.012557521, + 0.1070603, + -0.040827584, + -0.039590783, + 0.08694622, + 0.024637919, + 0.029732363, + -0.07417592, + 0.08613935, + 0.012553578, + -0.04852132, + 0.021330798, + 0.015399935, + 0.05207805, + -0.059071112, + -0.04029849, + 0.045327052, + 0.05088802, + -0.025812214, + -0.020503126, + -0.066600144, + -0.058700442, + -0.04682153, + -0.12240272, + 0.039613813, + 0.06064703, + -0.02098424, + 0.056387424, + -0.12134772, + -0.029882085, + -0.025266815, + 0.013461971, + -0.0036088703, + 0.08080393, + -0.004056028, + 0.0043978477, + 0.0064231018, + 0.034481037, + 0.0026119966, + 0.036488745, + 0.06241491, + -0.06867501, + -0.021493748, + -0.08815687, + -0.06678143, + -0.02508211, + -0.043641888, + 0.07306818, + -0.050304804, + -1.624133e-08, + -0.048611593, + -0.056216497, + 0.017130926, + -0.058177624, + 0.023788815, + -0.012684911, + -0.010927002, + 0.12155309, + -0.008483258, + 0.013140599, + 0.05642416, + 0.001749309, + -0.06338417, + 0.0011953749, + 0.07965269, + 0.03217091, + 0.093799464, + -0.08279611, + -0.03880581, + 0.055997517, + 0.050195538, + -0.00020960325, + -0.089916974, + 0.0820357, + 0.0659547, + -0.03231384, + 0.049111042, + 0.055394094, + -0.03215183, + 0.019463245, + 0.0094351815, + -0.04652837, + 0.048488617, + 0.068895265, + 0.10356095, + 0.018122325, + 0.06454431, + 0.029776301, + -0.046313405, + -0.11385151, + -0.011925911, + 0.020713827, + -0.03263382, + 0.091360845, + 0.0919104, + 0.02281533, + -0.0705449, + 0.08715759, + -0.03233197, + 0.025567707, + -0.04827432, + 0.031276073, + 0.002320722, + -0.0062292, + -0.020309383, + 0.012879511, + 0.01099674, + -0.04382443, + -0.016720371, + 0.041349057, + 0.0059064166, + 0.015646098, + 0.038090054, + -0.073881686 + ], + "index": 0, + "object": "embedding" + } + ], + "model": "all-minilm:l6-v2", + "object": "list", + "usage": { + "prompt_tokens": 9, + "total_tokens": 9 + } + } + }, + "is_streaming": false + } +} diff --git a/tests/integration/recordings/responses/a1ea41fbf9a2.json b/tests/integration/recordings/responses/a1ea41fbf9a2.json new file mode 100644 index 000000000..666180964 --- /dev/null +++ b/tests/integration/recordings/responses/a1ea41fbf9a2.json @@ -0,0 +1,422 @@ +{ + "request": { + "method": "POST", + "url": "http://0.0.0.0:11434/v1/v1/embeddings", + "headers": {}, + "body": { + "model": "all-minilm:l6-v2", + "input": [ + "How does machine learning improve over time?" + ], + "encoding_format": "float" + }, + "endpoint": "/v1/embeddings", + "model": "all-minilm:l6-v2" + }, + "response": { + "body": { + "__type__": "openai.types.create_embedding_response.CreateEmbeddingResponse", + "__data__": { + "data": [ + { + "embedding": [ + -0.0144412955, + -0.009650282, + 0.10598198, + 0.033821642, + 0.08256133, + -0.016125076, + -0.105696015, + -0.04119764, + -0.037104737, + -0.04235663, + -0.09278584, + 0.14735937, + 0.020735627, + -0.045876633, + -0.018912466, + 0.005711242, + -0.009913563, + 0.024871927, + -0.06426609, + -0.15703933, + -0.041478276, + -0.025513092, + 0.004146446, + 0.0027369705, + 0.0152090555, + 0.004832916, + -0.008007824, + 0.013515605, + 0.020614728, + -0.02136369, + -0.008227903, + 0.016406456, + 0.024098337, + 0.046697818, + -0.120193906, + 0.027101057, + 0.009577714, + 0.07102963, + -0.007563173, + 0.0075349766, + -0.046593536, + -0.06467278, + -0.017010622, + -0.033196267, + 0.097371556, + 0.023502331, + 0.033317775, + -0.07454437, + -0.014935438, + -0.0039703106, + -0.14381815, + -0.049301352, + 0.03187916, + -0.037372917, + -0.01412705, + 0.06712808, + 0.032425713, + 0.10737386, + 0.00763008, + -0.034527462, + -0.013202629, + -0.080443025, + -0.08540038, + 0.020914724, + 0.058374967, + -0.06886805, + -0.011377637, + 0.03356643, + -0.0036231182, + 0.0322898, + -0.0031708612, + 0.10451793, + -0.035254233, + -0.004960671, + 0.030832782, + 0.033010393, + 0.0014911285, + -0.016038226, + 0.09518363, + -0.012361809, + 0.056895707, + 0.0018552992, + -0.014633688, + 0.053164434, + 0.05655298, + -0.0752723, + 0.00476245, + -0.04156457, + -0.07343076, + -0.06410675, + 0.08829294, + -0.03837702, + -0.045774795, + -0.0535434, + -0.009111199, + 0.017617762, + -0.0067038187, + -0.032136917, + 0.03719991, + 0.11071319, + -0.057429407, + 0.08084802, + 0.009762534, + -0.031580847, + 0.05513017, + 0.0073544895, + 0.08761669, + 0.051413193, + 0.053174715, + -0.04282332, + -0.002029271, + 0.045968805, + -0.03927135, + -0.014048125, + 0.0013097908, + -0.031032057, + -0.044477988, + 0.027116014, + -0.036825214, + 0.10271662, + -0.0018023226, + -0.0014636678, + -0.006019342, + 0.0044439677, + -0.033970047, + 0.016475804, + -0.029752878, + -2.942642e-33, + -0.030636843, + -0.06274741, + -0.020331798, + 0.03409229, + -0.020994574, + -0.088351555, + -0.0338517, + -0.0656598, + 0.05194619, + -0.0248902, + -0.0019359031, + 0.03725905, + 0.0057854285, + 0.042536482, + 0.065458804, + 0.0020972108, + -0.07831122, + 0.040395204, + 0.048486684, + 0.00687325, + 0.04522804, + -0.08206775, + 0.015138996, + -0.032257374, + -0.0019286879, + 0.026958553, + 0.060303353, + 0.050539102, + -0.038990505, + 0.00901784, + 0.04728673, + 0.027277624, + -0.116268836, + 0.03641615, + 0.06792425, + 0.044476334, + 0.04822962, + -0.01417434, + 0.07136797, + 0.009212642, + -0.03981787, + -0.03105692, + 0.043964684, + -0.0550663, + 0.004194295, + 0.011075167, + 0.024179665, + -0.104039185, + -0.094535016, + -0.01598998, + -0.00955013, + -0.035388414, + -0.095118746, + -0.00013354272, + -0.02610455, + 0.08766882, + -0.012012526, + -0.058645394, + -0.013742904, + 0.01895158, + 0.10382739, + -0.0028419443, + 0.005811753, + 0.017534103, + 0.04102487, + 0.11672246, + 0.09343793, + 0.028574567, + 0.043363564, + 0.049141977, + 0.024069116, + -0.010946938, + -0.06667827, + -0.08498697, + 0.06469552, + -0.052791074, + 0.045889318, + -0.044994276, + 0.015019975, + 0.010133334, + 0.0097814165, + -0.051068403, + 0.0036321485, + -0.061966382, + 0.036911227, + -0.0015979146, + 0.01169187, + -0.08576613, + 0.018774707, + -0.007562373, + -0.091671936, + -0.038212627, + 0.020174108, + 0.018156078, + -0.04092911, + 1.0051959e-33, + -0.08226659, + 0.0099736005, + -0.0074784867, + 0.13932815, + -0.063385926, + -0.022954706, + -0.12405802, + 0.047431163, + -0.041625854, + -0.013952695, + 0.0074911104, + -0.00723795, + 0.059791762, + 0.038565084, + -0.0055844127, + 0.05114055, + -0.017901178, + 0.009323372, + -0.04395451, + -0.024585819, + -1.2245854e-06, + 0.09352475, + 0.0047693932, + -0.0018991354, + 0.008013757, + 0.011220997, + -0.091332994, + 0.068223536, + 0.007186999, + -0.03087612, + -0.051925, + -0.027689163, + -0.03313748, + 0.055571433, + 0.023570623, + 0.037202746, + 0.004727846, + -0.080162, + 0.025005471, + 0.06744095, + 0.0331283, + 0.0002482217, + -0.045369137, + -0.06479025, + 0.02353955, + -0.007544223, + -0.04817079, + 0.021955613, + 0.07905839, + -0.03857465, + 0.10292412, + 0.03352054, + -0.016577441, + -0.07671339, + -0.03904085, + 0.008326937, + 0.014512891, + -0.02780937, + -0.02199285, + 0.11556582, + -0.11817719, + -0.02172188, + 0.01028131, + 0.027112944, + 0.017912412, + 0.022188837, + 0.00472762, + 0.030003453, + -0.024873868, + -0.016057493, + 0.05167464, + 0.022278845, + -0.093714975, + 0.027581427, + -0.08995269, + 0.01922919, + 0.011267925, + -0.019333998, + -0.107179746, + -0.007825687, + -0.06112819, + -0.07851147, + -0.012788895, + 0.015774399, + -0.023736876, + 0.06481075, + 0.0530216, + -0.040838096, + -0.009374445, + -0.015252525, + -0.03356652, + 0.0034916159, + -0.106078364, + -0.0037814653, + -0.057664383, + -1.4659457e-08, + -0.013685479, + 0.038693503, + 0.055525444, + 0.01427137, + 0.106904596, + -0.024592703, + -0.05212622, + 0.14767331, + -0.04477857, + -0.06558989, + 0.09031646, + 0.0032307915, + 0.021561448, + 0.01542169, + 0.0686726, + 0.07787745, + 0.018880507, + 0.0329181, + -0.030444186, + 0.028748954, + 0.07327947, + -0.00473439, + 0.099678375, + -0.02951805, + 0.0157886, + -0.062414743, + -0.009774238, + 0.057640694, + 0.008111299, + 0.047539655, + -0.03485159, + 0.0672076, + -0.0011908566, + 0.0096628135, + 0.064021304, + -0.0030786463, + 0.020940661, + -0.05225545, + -0.06604623, + 0.025438625, + -0.037236795, + 0.10400888, + -0.045393974, + 0.010468508, + 0.042776387, + 0.0060471105, + 0.030909447, + 0.008940785, + -0.046136875, + -0.012257952, + 0.07956265, + 0.09894607, + 0.043950185, + 0.033127937, + 0.054626264, + 0.013538762, + 0.032767043, + -0.055712108, + -0.011724154, + 0.07334705, + -0.019697897, + -0.03568817, + -0.038236745, + -0.025074048 + ], + "index": 0, + "object": "embedding" + } + ], + "model": "all-minilm:l6-v2", + "object": "list", + "usage": { + "prompt_tokens": 8, + "total_tokens": 8 + } + } + }, + "is_streaming": false + } +} diff --git a/tests/integration/recordings/responses/c13d7510774c.json b/tests/integration/recordings/responses/c13d7510774c.json new file mode 100644 index 000000000..00e9659e9 --- /dev/null +++ b/tests/integration/recordings/responses/c13d7510774c.json @@ -0,0 +1,420 @@ +{ + "request": { + "method": "POST", + "url": "http://0.0.0.0:11434/v1/v1/embeddings", + "headers": {}, + "body": { + "model": "all-minilm:l6-v2", + "input": "This is the first text", + "encoding_format": "float" + }, + "endpoint": "/v1/embeddings", + "model": "all-minilm:l6-v2" + }, + "response": { + "body": { + "__type__": "openai.types.create_embedding_response.CreateEmbeddingResponse", + "__data__": { + "data": [ + { + "embedding": [ + -0.0011296043, + 0.06740522, + 0.015186453, + 0.037259158, + 0.02935556, + 0.015181291, + 0.07432997, + -0.0033194474, + 0.0658106, + -0.021833794, + 0.034404922, + 0.05099269, + -0.011411872, + -0.025082853, + -0.051754408, + 0.027195254, + 0.07849019, + -0.06000248, + 0.010478361, + -0.003392346, + 0.043441977, + 0.12292443, + 9.388175e-05, + 0.0021187037, + 0.018079525, + 0.045084555, + -0.097606525, + 0.11185215, + 0.049650617, + -0.0348426, + -0.039580915, + 0.0035499185, + 0.15893514, + 0.063421525, + 0.047970187, + 0.011613767, + 0.009793674, + 0.01536712, + 0.009413064, + 0.07999014, + 0.01915802, + -0.13722447, + 0.017290922, + 0.013689777, + 0.014259784, + -0.00021621982, + -0.017730612, + 0.022902183, + 0.035927463, + -0.015361024, + -0.00975885, + -0.040180918, + -0.011500755, + 0.00012558368, + 0.08540788, + 0.08731169, + 0.004690206, + 0.006160604, + 0.003023499, + 0.008887178, + -0.006278653, + 0.050593477, + 0.00053471717, + 0.04677382, + 0.09365536, + -0.012813678, + 0.0177166, + -0.06271032, + -0.11535796, + 0.04110661, + -0.014942371, + 0.044813167, + -0.020877626, + 0.04299617, + -0.06107898, + 0.01997848, + -0.0687263, + -0.035494387, + 0.04186985, + 0.012177578, + -0.029081868, + -0.066437304, + 0.030620316, + 0.05150629, + -0.12813967, + 0.06819209, + -0.047090717, + -0.032926783, + 0.007485966, + -0.017814271, + 0.038294822, + -0.015788501, + 0.07054281, + 0.03807343, + -0.114283286, + 0.042118594, + -0.111601785, + -0.04573834, + -0.02895515, + 0.12735783, + -0.013941619, + -0.027150463, + 0.072897464, + 0.024098374, + -0.054044593, + -0.13128933, + 0.030136578, + -0.023237763, + -0.019079136, + -0.0078745885, + -0.021944366, + -0.053324133, + -0.070892006, + -0.011552823, + -0.023377078, + -0.01562657, + 0.051452935, + 0.029251281, + 0.06480842, + 0.06403676, + 0.014424153, + -0.057994097, + -0.06993807, + -0.023921017, + -0.08493092, + -0.087801315, + 0.048142783, + -6.124397e-33, + 0.0103092175, + 0.038688924, + 0.003180582, + 0.03575604, + 0.005059993, + -0.0041896994, + -0.05389261, + -0.029881287, + -0.075520456, + -0.07879111, + -0.012291425, + -0.05053033, + 0.020719253, + -0.05190443, + -0.05927485, + -0.05987536, + -0.05572788, + 0.03220933, + -0.006331632, + -0.021651596, + -0.059913907, + 0.051977657, + 0.05122985, + -0.06350782, + -0.04872765, + -0.014282773, + 0.0025304393, + -0.024342295, + -0.0055265254, + 0.020074077, + -0.10194665, + 0.010741537, + -0.02318619, + -0.08105595, + -0.014973416, + 0.0017918752, + 0.045083463, + -0.05282281, + -0.053680934, + -0.013229242, + -0.019794637, + 0.020036008, + -0.00081875344, + -0.10115686, + -0.0006884125, + 0.09664284, + -0.03943104, + 0.04955554, + 0.042241447, + 0.007962193, + -0.052323878, + 0.05189162, + 0.037112337, + 0.034818016, + 0.063431285, + -0.02657652, + -0.009212341, + -0.0025556423, + -0.05609933, + 0.0020433308, + -0.020113751, + 0.0012227942, + -0.0017669081, + 0.019119242, + 0.016553605, + -0.011386767, + 0.010368127, + -0.00788346, + 0.046651863, + -0.046871297, + -0.085224025, + -0.008958986, + 0.012052177, + 0.013311017, + 0.015157192, + 0.03708167, + 0.026588887, + 0.014486772, + -0.013955214, + 0.019986698, + -0.06885552, + -0.07106239, + 0.012334861, + 0.03284816, + -0.03151976, + 0.045773514, + 0.067994975, + -0.077492714, + 0.018440822, + 0.06622958, + -0.08641996, + 0.008967366, + 0.04134085, + 0.009518882, + 0.006565088, + 4.711897e-33, + -0.02617601, + 0.0013207985, + -0.014141556, + -0.024331013, + 0.06929469, + 0.03143924, + 0.03726272, + 0.064707026, + 0.049426436, + 0.11073603, + 0.0498569, + 0.066796474, + 0.04154851, + -0.034098588, + 0.07028382, + 0.034863915, + 0.12904617, + -0.021078404, + 0.008925486, + 0.03016334, + -0.02286831, + 0.03649071, + -0.13193603, + 0.045608096, + -0.012805477, + 0.041747537, + 0.12321406, + -0.013507891, + -0.007307474, + -0.02975696, + 0.025006123, + -0.009506256, + 0.024761083, + 0.023204166, + -0.019123148, + 0.02259915, + 0.013744109, + -0.03847919, + -0.014476444, + 0.07522499, + 0.13586833, + 0.009872778, + -0.03752485, + -0.0273059, + -0.016470777, + -0.048831154, + -0.03521732, + -0.054363117, + -0.0017890002, + 0.035665076, + -0.010268516, + -0.018602924, + -0.036469962, + -0.055976517, + -0.007821111, + 0.00907826, + -0.0073335953, + 0.050373644, + -0.00025981313, + -0.036349144, + -0.024950698, + 0.058883175, + -0.07245624, + 0.07399545, + 0.053919416, + -0.051881794, + -0.0063462397, + 0.07852022, + -0.016959544, + -0.0066832895, + 0.01265072, + -0.014152041, + -0.13643119, + -0.085250236, + -0.017519519, + -0.00466121, + 0.0136799645, + 0.0009118405, + -0.071966685, + -0.06886893, + 0.14207116, + 0.03186518, + -0.05592076, + 0.030404905, + 0.061872244, + 0.029894035, + -0.00096155383, + -0.06500391, + -0.020616096, + 0.039591115, + -0.12383165, + 0.0028830946, + 0.051231142, + 0.13391772, + -0.08845233, + -1.7589368e-08, + -0.025769057, + -0.080324695, + -0.09164953, + 0.032005485, + 0.005889216, + 0.114638664, + 0.0233727, + -0.069048144, + -0.05594302, + -0.05788277, + 0.014665582, + 0.080326974, + 0.0036707798, + -0.030798541, + 0.024442635, + 0.008542568, + -0.05288123, + -0.06640491, + 0.00074039627, + -0.023801958, + 0.030778948, + 0.054075025, + -0.0027453878, + -0.09929041, + -0.0150463935, + 0.01624328, + -0.0015419688, + 0.011909824, + 0.007890519, + 0.0489657, + 0.004866092, + 0.08265809, + -0.0145542445, + -0.04386104, + 0.004611713, + 0.024626419, + 0.023854014, + 0.0236921, + 0.05076065, + -0.051832993, + 0.021252805, + -0.0033932943, + -0.021158189, + 0.020595197, + -0.06475187, + 0.054174356, + 0.027812954, + -0.05294382, + 0.015094968, + -0.119794324, + -0.034157146, + -0.012219483, + 0.047453884, + 0.020896995, + -0.026357891, + 0.015037571, + 0.033969007, + 0.05981613, + -0.052542053, + 0.033553857, + 0.06119396, + 0.09635468, + 0.11632743, + -0.016134953 + ], + "index": 0, + "object": "embedding" + } + ], + "model": "all-minilm:l6-v2", + "object": "list", + "usage": { + "prompt_tokens": 5, + "total_tokens": 5 + } + } + }, + "is_streaming": false + } +} diff --git a/tests/integration/recordings/responses/c48eb1cb6e1c.json b/tests/integration/recordings/responses/c48eb1cb6e1c.json new file mode 100644 index 000000000..b0a85a9c0 --- /dev/null +++ b/tests/integration/recordings/responses/c48eb1cb6e1c.json @@ -0,0 +1,422 @@ +{ + "request": { + "method": "POST", + "url": "http://0.0.0.0:11434/v1/v1/embeddings", + "headers": {}, + "body": { + "model": "all-minilm:l6-v2", + "input": [ + "What is the biological inspiration for neural networks?" + ], + "encoding_format": "float" + }, + "endpoint": "/v1/embeddings", + "model": "all-minilm:l6-v2" + }, + "response": { + "body": { + "__type__": "openai.types.create_embedding_response.CreateEmbeddingResponse", + "__data__": { + "data": [ + { + "embedding": [ + -0.10230838, + -0.08224274, + 0.02386987, + -0.03541601, + -0.01849779, + 0.05787613, + -0.031342823, + 0.030891433, + 0.07037451, + -0.027736247, + -0.047175303, + -0.0047223344, + -0.016741188, + 0.017356846, + -0.100889295, + 0.026418544, + -0.0675857, + 0.09431865, + -0.020842675, + -0.022413163, + -0.009295194, + 0.043116357, + 0.011911383, + 0.008668753, + -0.047908504, + 0.06344468, + -0.029300436, + 0.004667068, + 0.0005209494, + -0.03084027, + 0.096635215, + -0.009580088, + 0.010731579, + 0.020481875, + -0.08412081, + 0.059937492, + -0.088260904, + -0.0016671015, + 0.021768492, + -0.003979325, + -0.021763379, + -0.014259657, + 0.048000462, + 0.015427136, + 0.09755958, + 0.010355332, + 0.02050438, + -0.041266255, + 0.033273138, + -0.013968384, + -0.08825624, + -0.033225473, + -0.02127378, + 0.024471933, + 0.06127936, + 0.06119299, + -0.026490718, + 0.0151210865, + -0.06972876, + -0.010437868, + 0.040213317, + -0.011723281, + -0.06904643, + 0.020810815, + 0.037842188, + 0.022579413, + -0.055453606, + 0.023251032, + 0.08011199, + -0.044877384, + 0.088408746, + 0.02067646, + -0.051436704, + 0.025897857, + 0.018288882, + 0.065622754, + 0.065107845, + 0.03978978, + 0.019740887, + -0.072253615, + 5.9544687e-05, + -0.008543701, + 0.021967534, + 0.046294566, + 0.06427795, + 0.035292417, + 0.0147250565, + 0.03066073, + -0.07762946, + 0.00029099756, + -0.034139138, + -0.024901435, + -0.029611107, + -0.10678479, + -0.060683943, + -0.0017934343, + -0.023385558, + -0.078432895, + 0.002060721, + 0.028867336, + -0.02819569, + 0.009272651, + -0.017985396, + 0.014983593, + 0.07562587, + -0.017170474, + 0.064670265, + 0.002128402, + 0.1310938, + -0.06151175, + -0.06497303, + 0.051440425, + -0.05313471, + 0.016812937, + 0.04933477, + -0.023115465, + 0.0087483935, + -0.015650563, + 0.08556065, + 0.07376518, + -0.04275521, + -0.023489155, + -0.10277512, + -0.04004294, + -0.037418038, + 0.0035999252, + -0.15967175, + -5.147516e-33, + -0.0137625635, + 0.008369806, + 0.050065957, + 0.009015812, + 0.077434964, + -0.07842769, + 0.033915173, + -0.07100398, + 0.07608262, + -0.02990977, + -0.12365782, + 0.057408407, + -0.017269323, + 0.12205155, + 0.070205435, + -0.07705926, + -0.103943996, + -0.018815603, + 0.03340639, + -0.07087323, + -0.009640286, + 0.009892021, + 0.042712446, + -0.012349303, + -0.045281444, + -0.02289145, + -0.045452908, + 0.012000943, + 0.00091420225, + 0.008680777, + -0.0048628636, + 0.04511048, + -0.06120187, + -0.01901521, + 0.029624766, + 0.016965946, + 0.022491941, + -0.05770287, + 0.039217677, + 0.05591199, + 0.022302346, + -0.021667656, + 0.044868935, + -0.038508117, + 0.05678148, + 0.024347577, + -0.038980145, + 0.007459784, + -0.0036730687, + -0.028568147, + -0.008362538, + 0.012113232, + 0.03273877, + -0.107404694, + 0.027158631, + 0.00079790066, + -0.034335967, + 0.0028799083, + 0.004109312, + 0.06683407, + -0.021135451, + 0.03233578, + -0.0019597805, + 0.046820994, + 0.09051345, + 0.034042653, + -0.03681609, + -0.08244526, + 0.03867095, + 0.039461687, + 0.0073160445, + 0.052984253, + -0.07250948, + -0.115641944, + -0.06545622, + -0.0007324139, + -0.049901687, + -0.059578393, + -0.0645108, + 0.036021687, + -0.024459476, + -0.013289271, + -0.065466486, + 0.06002278, + -0.04428054, + 0.07694785, + 0.048521705, + -0.054440495, + -0.018412473, + -0.0016149838, + -0.06097182, + -0.038716663, + 0.06802589, + -0.05799783, + -0.08039679, + 3.611379e-33, + -0.08262067, + -0.03204657, + -0.028822388, + 0.048980672, + 0.030796362, + 0.07780006, + -0.021972818, + -0.002271387, + -0.03426234, + 0.080625765, + 0.031121854, + 0.047162402, + 0.07163762, + -0.0013501514, + 0.02559714, + -0.041637477, + -0.054521292, + -0.009806028, + 0.08774922, + -0.07525572, + 0.012750029, + 0.17170253, + -0.07512768, + -0.022949748, + 0.033555392, + 0.035889816, + -0.08415535, + 0.12036529, + -0.033030294, + 0.034908433, + -0.062138494, + 0.00796357, + -0.043817557, + 0.015032237, + 0.054430354, + 0.14010938, + 0.045014434, + -0.0058209584, + 0.01732776, + -0.039730564, + 0.028245388, + 0.01422878, + 0.012688427, + 0.03063463, + 0.039065775, + -0.044635378, + -0.052242752, + 0.040875368, + -0.040194053, + 0.061812058, + 0.05500572, + 0.019187871, + -0.045823988, + -0.06838901, + -0.024126342, + -0.0009639306, + 0.061077226, + -0.018251002, + 0.07766169, + -0.00567422, + -0.061061647, + -0.08588942, + 0.032846175, + -0.024012743, + -0.049680676, + 0.05839058, + -0.014167444, + 0.097144075, + 0.010775226, + -0.052071147, + 0.04610895, + 0.07335612, + 0.07120399, + 0.1028226, + -0.07930675, + -0.03850769, + -0.03020882, + -0.0041234274, + -0.04933009, + -0.036251605, + -0.0590083, + -0.07667668, + 0.004786309, + 0.004954009, + 0.0908305, + 0.0596148, + -0.039207857, + 0.011206131, + 0.030405426, + 0.018793559, + -0.0015877335, + 0.041109823, + -0.031416893, + 0.0556611, + -0.02737557, + -1.6181557e-08, + 0.007685041, + 0.01949905, + 0.07300238, + 0.020899568, + 0.052970223, + -0.03996715, + 0.04867212, + 0.0088583315, + -0.04270171, + -0.037400525, + 0.050844476, + 0.04526676, + -0.0035515544, + 0.034569085, + 0.08018272, + 0.0038954662, + 0.024755714, + 0.01738288, + -0.01202052, + 0.00085969194, + 0.036901433, + 0.031121632, + -0.052757226, + 0.030107595, + 0.09174762, + -0.09346625, + -0.03547636, + 0.03205761, + -0.004919257, + 0.048456274, + 0.009815509, + 0.071357235, + 0.038992055, + -0.033071395, + 0.00020657796, + 0.060076863, + -0.0016239597, + -0.0673076, + -0.10155186, + -0.06703537, + -0.06509405, + 0.031468824, + 0.012775417, + 0.0046917466, + 0.016282141, + -0.04024359, + 0.05850968, + -0.05423275, + 0.046367962, + 0.0020157802, + -0.038429447, + 0.040971108, + 0.011054457, + -0.0250188, + -0.041018736, + -0.015747897, + -0.03137312, + -0.08782612, + -0.06839822, + 0.051101774, + 0.0068214918, + 0.121207915, + 0.04955481, + -0.05083888 + ], + "index": 0, + "object": "embedding" + } + ], + "model": "all-minilm:l6-v2", + "object": "list", + "usage": { + "prompt_tokens": 9, + "total_tokens": 9 + } + } + }, + "is_streaming": false + } +} diff --git a/tests/integration/recordings/responses/dc978ebb7159.json b/tests/integration/recordings/responses/dc978ebb7159.json new file mode 100644 index 000000000..bd394a843 --- /dev/null +++ b/tests/integration/recordings/responses/dc978ebb7159.json @@ -0,0 +1,422 @@ +{ + "request": { + "method": "POST", + "url": "http://0.0.0.0:11434/v1/v1/embeddings", + "headers": {}, + "body": { + "model": "all-minilm:l6-v2", + "input": [ + "How do systems learn without explicit programming?" + ], + "encoding_format": "float" + }, + "endpoint": "/v1/embeddings", + "model": "all-minilm:l6-v2" + }, + "response": { + "body": { + "__type__": "openai.types.create_embedding_response.CreateEmbeddingResponse", + "__data__": { + "data": [ + { + "embedding": [ + 0.04984423, + -0.0065021752, + -0.07637173, + 0.03917369, + 0.00031861305, + -0.04042923, + 0.0011150879, + 0.003936656, + -0.019640122, + 0.06384856, + -0.023051452, + 0.037558515, + 0.047722198, + -0.03396131, + 0.0019017205, + -0.05376357, + -0.08049833, + 0.029636204, + 0.03433438, + -0.10370592, + -0.012407874, + -0.036972973, + -0.03961349, + -0.010151935, + 0.014429107, + 0.08523679, + -0.00839657, + 0.020103412, + 0.01863058, + -0.004850945, + 0.052703105, + 0.03198295, + 0.09851406, + -0.021857157, + -0.030757615, + 0.029216181, + 0.007728418, + -0.023179187, + -0.024685089, + -0.00815707, + -0.13637935, + 0.043761857, + -0.02209246, + 0.039698977, + 0.09477744, + 0.019010609, + -0.04610655, + -0.043215692, + -0.045460463, + -0.06836739, + -0.1530461, + -0.034367662, + 0.013275635, + -0.03926102, + -0.019648515, + 0.028101413, + 0.025540326, + 0.089463815, + -0.06327886, + -0.02595456, + -0.11979868, + -0.12334712, + -0.087600626, + -0.013221264, + 0.013799792, + 0.015545913, + 0.00064019626, + 0.040825542, + 0.07697552, + -0.030981697, + -0.06173165, + 0.0036019792, + -0.022016058, + 0.0018515446, + 0.05704056, + -0.06933254, + 0.020957416, + 0.064757325, + -0.0020772594, + -0.0064814533, + -0.06261177, + -0.015868051, + -0.037469238, + 0.07497992, + 0.065091245, + 0.039346796, + 0.012607916, + 0.08583316, + 0.06540376, + 0.0011848691, + -0.00564589, + -0.08397946, + -0.059715644, + -0.031260643, + 0.056604136, + 0.029362248, + 0.087739736, + -0.08420318, + -0.04931336, + 0.09726916, + -0.0017463911, + 0.019265981, + 0.057564486, + -0.008517195, + -0.040554836, + 0.02923812, + 0.061266143, + 0.02060355, + 0.076881945, + -0.12177566, + -0.024966033, + 0.00019745702, + 0.005747222, + 0.014114126, + -0.03401446, + -0.0013969344, + 0.01964643, + -0.047716763, + 0.031978507, + 0.028447492, + -0.009964347, + -0.017102454, + -4.63913e-07, + 0.08103938, + -0.0346138, + -0.009416571, + -0.066550575, + -3.9539905e-33, + -0.007294673, + 0.0067699, + 0.06725818, + 0.03072976, + -0.0117797265, + -0.041026328, + 0.06852793, + -0.037222322, + 0.027420986, + 0.066954724, + 0.043863658, + 0.0061272033, + 0.061314374, + 0.10138567, + 0.08718787, + 0.037215915, + -0.06740457, + 0.023863165, + 0.014470287, + -0.02899169, + 0.0893073, + 0.035965327, + 0.005637208, + -0.10819648, + 0.023759954, + 0.051624484, + -0.011389106, + -0.016350063, + 0.035536684, + 0.0097545255, + -0.030856358, + 0.04067114, + -0.02971763, + 0.0697159, + 0.061810073, + 0.025801104, + 0.03703326, + -0.0021732633, + 0.08720141, + -0.053768326, + 0.06975253, + -0.044379126, + 0.05350251, + -0.014546655, + 0.0019427998, + 0.022796933, + 0.02047684, + -0.02788562, + -0.11744917, + -0.008886625, + -0.030535355, + 0.0013790294, + -0.016426755, + -0.07323933, + 0.010640432, + 0.08230106, + -0.012989938, + -0.015557066, + -0.044253703, + 0.06853842, + 0.0044834577, + 0.027410327, + 0.07402351, + 0.04888233, + -0.0063870386, + 0.046451516, + -0.057963096, + 0.059795424, + 0.086261205, + 0.025499415, + -0.057358176, + 0.045224484, + -0.07970627, + -0.036587525, + 0.02942726, + -0.038539898, + 0.06695297, + -0.08024641, + 0.03596079, + 0.04907759, + 0.029716326, + -0.03762173, + 0.03575466, + 0.001120044, + -0.031716947, + 0.0017757203, + -0.017645523, + 0.00049374095, + -0.036480494, + -0.07056745, + -0.04874728, + -0.05242818, + -0.06110843, + 0.037233498, + 0.04336727, + 1.5320788e-33, + -3.120197e-05, + 0.034649298, + -0.06958097, + -0.036047626, + -0.06801936, + 0.025326911, + -0.026467822, + -0.048150625, + -0.0030122146, + -0.02290719, + -0.03227551, + 0.0039322567, + -0.011214182, + 0.0614351, + -0.0037066569, + 0.039574537, + -0.09324765, + 0.067733236, + 0.013552073, + 0.04235003, + -0.04189811, + 0.049444646, + -0.065833166, + -0.01233075, + 0.026274677, + 0.036287695, + -0.0334494, + 0.10760298, + -0.030157905, + 0.05457912, + 0.030266814, + -0.048794933, + -0.025447104, + 0.020995017, + 0.016946187, + 0.031217054, + -0.014045975, + 0.054221038, + -0.07935839, + 0.033861484, + 0.040884778, + -0.014036171, + -0.048716463, + 0.006645244, + 0.027014922, + -0.01226374, + -0.05664712, + 0.012521781, + 0.012314198, + 0.010800098, + 0.05154809, + -0.03332023, + -0.038100664, + -0.09299292, + -0.038066074, + -0.028879175, + 0.052126266, + 0.040313665, + 0.050321303, + -0.008574894, + -0.051285632, + -0.08658571, + 0.0047743064, + 0.0066671823, + -0.037727214, + -0.024325253, + -0.04543155, + 0.0031582855, + 0.02749873, + -0.038236838, + 0.0398463, + 0.077743076, + -0.06533558, + -0.043217026, + 0.03869133, + 0.053244475, + -0.08044849, + -0.040810138, + -0.09834583, + -0.0861473, + 0.0520938, + 0.024795571, + 0.047273915, + 0.040170223, + -0.04087483, + 0.065172985, + 0.012024152, + -0.007874287, + -0.008081423, + -0.055300366, + 0.0023381007, + 0.028444031, + 0.02559316, + 0.011821741, + -0.1240692, + -1.5521888e-08, + -0.006481896, + -0.03777657, + 0.059614006, + -0.028193146, + 0.08015819, + 0.08605758, + -0.031213695, + 0.024660977, + -0.0601782, + -0.020654697, + -0.011957175, + 0.017313287, + 0.037322048, + 0.018506147, + 0.06202185, + 0.14393596, + 0.08757671, + 0.046496816, + -0.07269094, + 0.015122184, + 0.08358854, + -0.033304404, + -0.017314732, + 0.07350395, + 0.0056664916, + -0.08582263, + -0.045254916, + 0.062497266, + 0.09928107, + 0.08590313, + 0.033792242, + -0.008237271, + 0.0032627704, + -0.012479878, + 0.02377827, + 0.04318741, + 0.03469096, + -0.06260408, + -0.042039912, + -0.12014508, + -0.14268656, + 0.068984255, + 0.0037130509, + -0.01937347, + -0.03493163, + 0.01472315, + -0.063192435, + -0.09795864, + -0.033808086, + -0.010213174, + 0.033770446, + 0.07557054, + -0.041042008, + 0.022023367, + 0.05567624, + 0.02822099, + -0.025627017, + -0.043879252, + -0.044397317, + 0.119338974, + -0.08721394, + 0.07055854, + 0.04949986, + -0.039747704 + ], + "index": 0, + "object": "embedding" + } + ], + "model": "all-minilm:l6-v2", + "object": "list", + "usage": { + "prompt_tokens": 8, + "total_tokens": 8 + } + } + }, + "is_streaming": false + } +} diff --git a/tests/integration/recordings/responses/dee1518c6628.json b/tests/integration/recordings/responses/dee1518c6628.json new file mode 100644 index 000000000..9457a291b --- /dev/null +++ b/tests/integration/recordings/responses/dee1518c6628.json @@ -0,0 +1,422 @@ +{ + "request": { + "method": "POST", + "url": "http://0.0.0.0:11434/v1/v1/embeddings", + "headers": {}, + "body": { + "model": "all-minilm:l6-v2", + "input": [ + "precomputed embedding test" + ], + "encoding_format": "float" + }, + "endpoint": "/v1/embeddings", + "model": "all-minilm:l6-v2" + }, + "response": { + "body": { + "__type__": "openai.types.create_embedding_response.CreateEmbeddingResponse", + "__data__": { + "data": [ + { + "embedding": [ + 0.018036319, + -0.012765047, + 0.03125965, + -0.02375151, + 0.025379343, + 0.060499735, + -0.02026708, + -0.012985666, + -0.043284714, + -0.024622917, + 0.02486436, + -0.03497649, + 0.027742712, + 0.032537967, + -0.07889987, + 0.009495538, + 0.108338796, + 0.07935357, + -0.05853841, + -0.017992375, + -0.06673812, + -0.0032593964, + 0.0132823065, + -0.0308506, + 0.044666506, + -0.06442589, + -0.041590516, + 0.057770588, + 0.111606374, + -0.051381156, + 0.12421504, + -0.018106857, + -0.0020854468, + 0.08215056, + -0.015330762, + 0.0479669, + 0.020125136, + -0.048337292, + -0.018317815, + 0.059444938, + 0.00047365576, + -0.012958252, + 0.028859986, + 0.040130712, + 0.029784055, + -0.015360712, + 0.008897483, + 0.008520841, + -0.101540424, + -0.039096564, + -0.0021748266, + 0.0013204592, + -0.05096974, + -0.055848837, + -0.057836458, + -0.0626853, + 0.021702537, + -0.050089337, + 0.04033438, + 0.03354133, + -0.010003805, + -0.08682413, + 0.07376202, + 0.008009445, + 0.022172567, + 0.023164645, + 0.027895318, + 0.035225768, + 0.017997501, + 0.09853605, + -0.020658517, + 0.027008843, + -0.050064307, + 0.04682815, + 0.00912333, + 0.07885718, + -0.018593438, + -0.07773581, + 0.109442696, + -0.11206324, + 0.010433095, + -0.073395275, + -0.006636955, + -0.042505022, + 0.12505825, + 0.097990945, + 0.06610694, + -0.0039949734, + -0.0817807, + -0.009407832, + 0.043290764, + -0.017194442, + -0.079182185, + 0.08731865, + -0.0055716676, + -0.024277646, + -0.026291223, + -0.021169199, + 0.027703164, + 0.11184553, + 0.008138305, + 0.00927679, + 0.060843308, + 0.031740803, + -0.027763257, + -0.067542285, + 0.083235115, + -0.010722409, + -0.003596879, + -0.03731031, + 0.0005883539, + -0.063687496, + 0.008766459, + 0.032250904, + -0.03564036, + -0.07344927, + 0.04179759, + 0.02855851, + -0.024623597, + -0.023432637, + 0.028878128, + 0.041853584, + 0.0432781, + 0.007851593, + 0.022038134, + -0.05595884, + 0.016461687, + 2.7094954e-33, + 0.006504033, + -0.051044505, + 0.021099899, + 0.07969017, + -0.04368391, + 0.014904434, + -0.032851998, + 0.13599935, + -0.05613122, + 0.06516371, + -0.020240407, + 0.05305463, + -0.044792183, + 0.08281265, + -0.01823444, + 0.033745598, + -0.016067084, + -0.039737612, + -0.05091073, + -0.003835655, + 0.015519713, + -0.030288516, + -0.050942086, + -0.11592442, + -0.07665286, + -0.06567756, + 0.019765161, + -0.06823771, + -0.07424318, + 0.025792379, + -0.14317486, + -0.07891553, + -0.021228878, + 0.039634928, + -0.016802909, + -0.044120707, + 0.006634243, + 0.0058715795, + -0.07995874, + 0.002443334, + -0.026899977, + -0.0013412291, + 0.002038266, + -0.03384139, + 0.005931528, + -0.046065018, + -0.034714635, + 0.025317542, + 0.01906024, + -0.024228983, + 0.019573852, + 0.03944586, + -0.03334646, + -0.0768601, + 0.005452342, + -0.003161199, + 0.000542002, + 0.018255332, + 0.074605905, + 0.025135716, + -0.10989631, + 0.011247026, + -0.050927915, + 0.07583658, + -0.12486867, + -0.05912801, + -0.0036061911, + -0.085416466, + 0.03914342, + 0.072747745, + 0.011503597, + 0.027539955, + -0.08109587, + -0.03039898, + -0.034653284, + 0.03224371, + -0.035028238, + 0.010218407, + -0.021780575, + 0.0010573319, + 0.013816383, + -0.028883183, + 0.017164033, + -0.052959263, + -0.012570558, + -0.16902319, + 0.030648956, + -0.10055485, + 0.026650762, + -0.071228996, + 0.00929425, + 0.017895814, + -0.035329636, + -0.038097598, + 0.116071835, + -2.2713515e-33, + 0.04127089, + 0.0837146, + 0.00899163, + 0.1357995, + -0.009237686, + 0.0038942713, + 0.061383113, + 0.014725109, + -0.08240016, + 0.05106149, + 0.052162398, + -0.0912485, + 0.01875351, + -0.050305407, + -0.0038576927, + 0.008774803, + -0.081945315, + -0.060020786, + 0.0164221, + 0.043100134, + -0.04116915, + 0.045944594, + 0.03755043, + 0.03274042, + -0.0074182185, + 0.08625352, + 0.037703313, + -0.00028144967, + -0.03562357, + 0.020237584, + -0.0062212464, + -0.019175837, + -0.05541716, + 0.034526624, + -0.02858707, + 0.0044915355, + 0.07259016, + 0.041983698, + 0.011109383, + 0.01880668, + 0.097080804, + 0.09413544, + -0.12913938, + 0.035041332, + -0.004425682, + -0.012205947, + -0.0016557154, + -0.05068707, + 0.15884145, + -0.012549114, + -0.021348534, + 0.03251363, + 0.04628448, + 0.054376245, + 0.006818182, + -0.027170561, + -0.061862, + -0.04534394, + -0.008363168, + 0.04019932, + -0.016715363, + -0.040953267, + 0.039559525, + -0.021472331, + 0.0055409903, + -0.08493741, + -0.03832763, + 0.1039703, + -0.020331193, + 0.02971218, + -0.0398032, + 0.03509529, + -0.0034297209, + -0.0068248124, + 0.053155076, + 0.011865219, + 0.04659949, + 0.02414787, + 0.068505645, + -0.00950228, + -0.006530904, + -0.03784911, + -0.013784687, + 0.021332197, + 0.030621022, + 0.10304789, + 0.0277674, + 0.007172984, + 0.0043231216, + 0.009159756, + 0.069140956, + 0.087634236, + -0.04637307, + 0.01820922, + 0.065394066, + -1.7640973e-08, + -0.06085519, + -0.07559385, + 0.044326548, + -0.02475008, + -0.061372478, + -0.045398142, + 0.020677099, + -0.034321737, + -0.03518944, + -0.023759514, + 0.027770184, + -0.0021794396, + -0.053482134, + -0.01962642, + -0.041778073, + -0.00094788696, + -0.043084495, + -0.011593622, + -0.0050855135, + 0.065776914, + -0.057164006, + 0.09555621, + 0.088908434, + -0.022197992, + -0.06730014, + -0.022787703, + 0.018815845, + 0.029995734, + 0.055323604, + 0.050712243, + 0.02092121, + 0.06544876, + -0.037383437, + -0.078021176, + -0.039648075, + 0.095848694, + 0.06603057, + -0.010790092, + -0.047517296, + 0.034212835, + -0.059543293, + -0.020928971, + 0.0043123127, + -0.09709055, + 0.06944257, + -0.046936724, + 0.0026605395, + 0.014065412, + 0.0018252941, + -0.014995255, + 0.018496186, + -0.02638827, + -0.06663817, + 0.03671545, + -0.006582465, + 0.015744653, + 0.024058202, + 0.038391512, + -0.06430364, + 0.013741025, + 0.0057411646, + -0.025728337, + 0.07752631, + -0.014778744 + ], + "index": 0, + "object": "embedding" + } + ], + "model": "all-minilm:l6-v2", + "object": "list", + "usage": { + "prompt_tokens": 7, + "total_tokens": 7 + } + } + }, + "is_streaming": false + } +} diff --git a/tests/integration/recordings/responses/f23defea82ec.json b/tests/integration/recordings/responses/f23defea82ec.json new file mode 100644 index 000000000..1e964af04 --- /dev/null +++ b/tests/integration/recordings/responses/f23defea82ec.json @@ -0,0 +1,53 @@ +{ + "request": { + "method": "POST", + "url": "http://0.0.0.0:11434/v1/v1/embeddings", + "headers": {}, + "body": { + "model": "all-minilm:l6-v2", + "input": "Test dimensions parameter", + "encoding_format": "float", + "dimensions": 16 + }, + "endpoint": "/v1/embeddings", + "model": "all-minilm:l6-v2" + }, + "response": { + "body": { + "__type__": "openai.types.create_embedding_response.CreateEmbeddingResponse", + "__data__": { + "data": [ + { + "embedding": [ + 0.253706, + 0.016367152, + -0.29664654, + 0.31654558, + -0.18624601, + 0.07602756, + -0.031531323, + 0.2986085, + -0.49672848, + -0.36617878, + 0.25328273, + -0.33349335, + 0.0060151755, + 0.14081024, + -0.13757885, + -0.14679416 + ], + "index": 0, + "object": "embedding" + } + ], + "model": "all-minilm:l6-v2", + "object": "list", + "usage": { + "prompt_tokens": 3, + "total_tokens": 3 + } + } + }, + "is_streaming": false + } +} diff --git a/tests/integration/recordings/responses/fbc7b626714d.json b/tests/integration/recordings/responses/fbc7b626714d.json new file mode 100644 index 000000000..5a19f77e5 --- /dev/null +++ b/tests/integration/recordings/responses/fbc7b626714d.json @@ -0,0 +1,422 @@ +{ + "request": { + "method": "POST", + "url": "http://0.0.0.0:11434/v1/v1/embeddings", + "headers": {}, + "body": { + "model": "all-minilm:l6-v2", + "input": [ + "duplicate" + ], + "encoding_format": "float" + }, + "endpoint": "/v1/embeddings", + "model": "all-minilm:l6-v2" + }, + "response": { + "body": { + "__type__": "openai.types.create_embedding_response.CreateEmbeddingResponse", + "__data__": { + "data": [ + { + "embedding": [ + -0.07723481, + -0.052392416, + -0.018403785, + 0.018809898, + -0.06850049, + -0.08415798, + 0.08627596, + 0.057042625, + 0.1137151, + -0.035988595, + 0.008720381, + -0.014372572, + 0.003901994, + 0.004317388, + -0.03761112, + -0.010990604, + -0.030473465, + -0.056204744, + -0.08675482, + -0.0040784916, + 0.005927903, + 0.015254265, + -0.056596924, + 0.047575373, + -0.016673235, + 0.02939919, + -0.022867588, + 0.07794844, + -0.021308443, + -0.104720965, + -0.0044066194, + 0.020771164, + 0.041487455, + -0.002801806, + 0.026976122, + 0.031067945, + -0.015480108, + 0.015977077, + 0.048875555, + -0.049825303, + -0.026281167, + -0.094117, + -0.025465509, + 0.014173141, + -0.010752944, + 0.066996746, + -0.018940678, + 0.03369072, + 0.040881984, + 0.02594592, + -0.012495756, + -0.02398617, + -0.026922934, + -0.0543868, + 0.12576863, + 0.014073914, + -0.076657854, + 0.042456653, + 0.019858882, + -0.014813843, + 0.04136103, + 0.070308894, + -0.0505636, + 0.08274185, + 0.049387515, + 0.01242514, + -0.004342139, + 0.0060508037, + -0.06873101, + -0.044221923, + 0.0111296205, + 0.099277854, + 0.002195328, + 0.08264344, + 0.026029712, + -0.031148281, + -0.0066806604, + -0.02216516, + 0.017202012, + 0.039319362, + -0.08426506, + -0.070138715, + -0.04162779, + -0.030229673, + 0.04802304, + 0.008936529, + 0.059146732, + -0.005168819, + -0.063863754, + -0.047433022, + -0.076941736, + 0.10710207, + 0.028398348, + -0.045075897, + -0.09501521, + 0.0014021338, + 0.018752577, + 0.053793173, + -0.058218755, + 0.23251592, + 0.014802284, + 0.04777388, + 0.015468174, + 0.011517924, + 0.0057089743, + -0.06294971, + -0.029086681, + 0.047267407, + 0.0013279485, + -0.043141574, + -0.030762771, + 0.006162875, + -0.016028566, + 0.034785092, + 0.06278112, + 0.0028944365, + 0.010565067, + 0.027719874, + 0.050682083, + -0.051462214, + 0.007760078, + 0.0027973612, + 0.035400815, + -0.002197845, + -0.053151082, + -0.10212597, + 0.037041765, + -2.672083e-33, + 0.0018480063, + -0.06453657, + 0.083521925, + 0.0075648427, + 0.037389643, + -0.050077397, + 0.0140220765, + 0.020539388, + -0.07190968, + 0.011489869, + 0.02256463, + 0.031297375, + -0.01618283, + 0.01542062, + 0.008930395, + -0.021195678, + 0.03439526, + 0.07886608, + -0.071329735, + 0.03709414, + -0.0140279215, + 0.114675336, + 0.0277295, + 0.10310165, + 0.0020623626, + -0.011630357, + 0.023930384, + -0.11260563, + 0.044674613, + 0.02574306, + 0.014368915, + 0.010857506, + -0.0005184862, + 0.12752494, + -0.004782285, + 0.009942966, + 0.083977275, + -0.071016215, + -0.019095415, + -0.040561743, + -0.05932095, + -0.010432282, + -0.071015865, + -0.040670767, + 0.085865766, + -0.018423026, + -0.015194733, + -0.052006386, + 0.043850828, + 0.014281553, + 0.020744322, + -0.0415732, + -0.050111413, + -0.014709909, + -0.08761856, + -0.043001, + 0.043047283, + -0.05384068, + -0.015601679, + 0.11197424, + 0.06798796, + 0.10911268, + -0.06948746, + 0.008946114, + 0.015466258, + -0.03691151, + 0.085061856, + -0.05947063, + 0.015293544, + -0.060189657, + -0.0060416507, + -0.09115727, + -0.013619676, + -0.037012577, + 0.04787018, + -0.10025333, + -0.019801194, + 0.07995546, + -0.012938982, + -0.018830338, + -0.05902157, + 0.0025186618, + -0.014529196, + -0.021240592, + -0.0017719648, + 0.07715808, + -0.050996855, + -0.10497942, + -0.0074073984, + 0.052044842, + 0.016423032, + -0.00921913, + 0.05524721, + 0.0038194568, + -0.020100316, + 2.5461884e-33, + -0.03895339, + -0.043895483, + 0.037901826, + 0.07469894, + 0.014612607, + -0.031076996, + 0.03934075, + 0.008711932, + -0.079657085, + 0.009069497, + 0.018917, + -0.04523579, + 0.08417748, + -0.032511797, + -0.014312169, + 0.031856265, + 0.055124972, + 0.008299075, + -0.086495705, + 0.03355531, + -0.038741786, + 0.011819997, + 0.008630874, + 0.040437095, + -0.029615412, + 0.015536198, + 0.017026586, + 0.008211814, + 0.055457912, + -0.047788087, + 0.12585849, + 0.001235511, + -0.056634903, + -0.049676068, + 0.019741468, + 0.10201284, + 0.05258106, + 0.0051925797, + -0.007739067, + 0.031301394, + 0.1017691, + -0.0090217255, + 0.012812148, + 0.11790627, + 0.020575516, + -0.042215355, + -0.006931973, + 0.022653406, + 0.047333714, + -0.022842428, + -0.05133142, + -0.0052753934, + -0.07623422, + -0.042385325, + 0.019540586, + -0.06629356, + 0.021332396, + 0.030484285, + 0.050311048, + -0.09921724, + 0.047778424, + 0.023995804, + -0.09240823, + 0.05245915, + -0.027156133, + -0.0349422, + -0.035126984, + 0.07986612, + 0.012397284, + -0.016370183, + -0.114555776, + -0.011922229, + -0.048613384, + -0.009849635, + 0.008354489, + -0.040733486, + 0.012452433, + 0.117823996, + -0.083515376, + 0.021853834, + 0.016437136, + -0.067386985, + -0.057326417, + 0.022280162, + -0.09073611, + -0.012396659, + 0.08770095, + 0.037985563, + -0.008248762, + -0.033765234, + -0.06454174, + 0.075496756, + -0.06106373, + 0.03420569, + -0.03459085, + -1.4668667e-08, + 0.01014663, + 0.094229266, + -0.0064371885, + 0.044077396, + 0.07245818, + -0.022373974, + -0.023869356, + -0.022925967, + -0.008693665, + 0.05403153, + 0.01552644, + -0.008120085, + -0.023631452, + 0.05658223, + 0.04775426, + -0.07261641, + -0.08463776, + -0.028445715, + 0.038068987, + 0.05120579, + 0.008737017, + 0.020222854, + 0.032309767, + -0.029347662, + -0.00843886, + -0.030422177, + -0.0018208751, + 0.04668449, + -0.014278727, + -0.011475838, + -0.012052811, + 0.039978012, + -0.048512205, + -0.05465097, + -0.037458897, + -0.025823507, + 0.008056201, + 0.0097499145, + -0.011502389, + 0.017063541, + 0.0016953654, + -0.0576531, + 0.09602806, + 0.0087568015, + 0.012305608, + -0.015205382, + 0.066060565, + -0.09770103, + 0.0019023182, + 0.011779348, + -0.032897696, + 0.018646581, + 0.097607486, + 0.030113736, + 0.07676848, + 0.016403947, + 0.022269176, + -0.009697165, + -0.031065438, + 0.05420531, + 0.14508335, + -0.049234875, + 0.05420719, + 0.054204132 + ], + "index": 0, + "object": "embedding" + } + ], + "model": "all-minilm:l6-v2", + "object": "list", + "usage": { + "prompt_tokens": 1, + "total_tokens": 1 + } + } + }, + "is_streaming": false + } +} diff --git a/tests/integration/suites.py b/tests/integration/suites.py index 649cd1c2e..860b8c6ba 100644 --- a/tests/integration/suites.py +++ b/tests/integration/suites.py @@ -55,7 +55,7 @@ SETUP_DEFINITIONS: dict[str, Setup] = { }, defaults={ "text_model": "ollama/llama3.2:3b-instruct-fp16", - "embedding_model": "sentence-transformers/all-MiniLM-L6-v2", + "embedding_model": "ollama/all-minilm:l6-v2", "safety_model": "ollama/llama-guard3:1b", "safety_shield": "llama-guard", }, @@ -68,7 +68,7 @@ SETUP_DEFINITIONS: dict[str, Setup] = { }, defaults={ "vision_model": "ollama/llama3.2-vision:11b", - "embedding_model": "sentence-transformers/all-MiniLM-L6-v2", + "embedding_model": "ollama/all-minilm:l6-v2", }, ), "vllm": Setup( From b67aef2fc42b4f8cbddf0bec2c846234c869e04c Mon Sep 17 00:00:00 2001 From: Matthew Farrellee Date: Thu, 25 Sep 2025 17:17:00 -0400 Subject: [PATCH 146/150] feat: add static embedding metadata to dynamic model listings for providers using OpenAIMixin (#3547) # What does this PR do? - remove auto-download of ollama embedding models - add embedding model metadata to dynamic listing w/ unit test - add support and tests for allowed_models - removed inference provider models.py files where dynamic listing is enabled - store embedding metadata in embedding_model_metadata field on inference providers - make model_entries optional on ModelRegistryHelper and LiteLLMOpenAIMixin - make OpenAIMixin a ModelRegistryHelper - skip base64 embedding test for remote::ollama, always returns floats - only use OpenAI client for ollama model listing - remove unused build_model_entry function - remove unused get_huggingface_repo function ## Test Plan ci w/ new tests --- .../self_hosted_distro/nvidia.md | 19 --- llama_stack/distributions/nvidia/nvidia.py | 9 +- llama_stack/distributions/nvidia/run.yaml | 85 +---------- .../providers/remote/eval/nvidia/eval.py | 3 +- .../remote/inference/anthropic/anthropic.py | 14 +- .../remote/inference/anthropic/models.py | 40 ----- .../providers/remote/inference/azure/azure.py | 2 - .../remote/inference/azure/models.py | 28 ---- .../remote/inference/bedrock/bedrock.py | 2 +- .../remote/inference/cerebras/cerebras.py | 5 - .../remote/inference/cerebras/models.py | 28 ---- .../remote/inference/databricks/databricks.py | 43 ++---- .../remote/inference/fireworks/fireworks.py | 7 +- .../remote/inference/fireworks/models.py | 70 --------- .../remote/inference/gemini/gemini.py | 6 +- .../remote/inference/gemini/models.py | 34 ----- .../providers/remote/inference/groq/groq.py | 3 - .../providers/remote/inference/groq/models.py | 48 ------ .../inference/llama_openai_compat/llama.py | 3 - .../inference/llama_openai_compat/models.py | 25 ---- .../remote/inference/nvidia/models.py | 109 -------------- .../remote/inference/nvidia/nvidia.py | 17 ++- .../remote/inference/ollama/models.py | 106 -------------- .../remote/inference/ollama/ollama.py | 138 +++++++----------- .../remote/inference/openai/models.py | 60 -------- .../remote/inference/openai/openai.py | 7 +- .../inference/passthrough/passthrough.py | 2 +- .../remote/inference/sambanova/models.py | 28 ---- .../remote/inference/sambanova/sambanova.py | 2 - .../remote/inference/together/models.py | 103 ------------- .../remote/inference/together/together.py | 18 ++- .../remote/inference/vertexai/models.py | 20 --- .../remote/inference/vertexai/vertexai.py | 2 - .../providers/remote/inference/vllm/vllm.py | 2 +- .../remote/inference/watsonx/watsonx.py | 2 +- .../utils/inference/litellm_openai_mixin.py | 6 +- .../utils/inference/model_registry.py | 27 +--- .../providers/utils/inference/openai_mixin.py | 47 ++++-- .../models-bd032f995f2a-3255f444.json | 96 ++++++++++++ .../inference/test_litellm_openai_mixin.py | 1 - tests/unit/providers/nvidia/test_eval.py | 2 +- .../utils/inference/test_openai_mixin.py | 110 +++++++++++++- .../providers/utils/test_model_registry.py | 4 +- 43 files changed, 368 insertions(+), 1015 deletions(-) delete mode 100644 llama_stack/providers/remote/inference/anthropic/models.py delete mode 100644 llama_stack/providers/remote/inference/azure/models.py delete mode 100644 llama_stack/providers/remote/inference/cerebras/models.py delete mode 100644 llama_stack/providers/remote/inference/fireworks/models.py delete mode 100644 llama_stack/providers/remote/inference/gemini/models.py delete mode 100644 llama_stack/providers/remote/inference/groq/models.py delete mode 100644 llama_stack/providers/remote/inference/llama_openai_compat/models.py delete mode 100644 llama_stack/providers/remote/inference/nvidia/models.py delete mode 100644 llama_stack/providers/remote/inference/ollama/models.py delete mode 100644 llama_stack/providers/remote/inference/openai/models.py delete mode 100644 llama_stack/providers/remote/inference/sambanova/models.py delete mode 100644 llama_stack/providers/remote/inference/together/models.py delete mode 100644 llama_stack/providers/remote/inference/vertexai/models.py create mode 100644 tests/integration/recordings/responses/models-bd032f995f2a-3255f444.json diff --git a/docs/docs/distributions/self_hosted_distro/nvidia.md b/docs/docs/distributions/self_hosted_distro/nvidia.md index fba411640..1e52797db 100644 --- a/docs/docs/distributions/self_hosted_distro/nvidia.md +++ b/docs/docs/distributions/self_hosted_distro/nvidia.md @@ -37,25 +37,6 @@ The following environment variables can be configured: - `INFERENCE_MODEL`: Inference model (default: `Llama3.1-8B-Instruct`) - `SAFETY_MODEL`: Name of the model to use for safety (default: `meta/llama-3.1-8b-instruct`) -### Models - -The following models are available by default: - -- `meta/llama3-8b-instruct ` -- `meta/llama3-70b-instruct ` -- `meta/llama-3.1-8b-instruct ` -- `meta/llama-3.1-70b-instruct ` -- `meta/llama-3.1-405b-instruct ` -- `meta/llama-3.2-1b-instruct ` -- `meta/llama-3.2-3b-instruct ` -- `meta/llama-3.2-11b-vision-instruct ` -- `meta/llama-3.2-90b-vision-instruct ` -- `meta/llama-3.3-70b-instruct ` -- `nvidia/vila ` -- `nvidia/llama-3.2-nv-embedqa-1b-v2 ` -- `nvidia/nv-embedqa-e5-v5 ` -- `nvidia/nv-embedqa-mistral-7b-v2 ` -- `snowflake/arctic-embed-l ` ## Prerequisites diff --git a/llama_stack/distributions/nvidia/nvidia.py b/llama_stack/distributions/nvidia/nvidia.py index 779fabf2c..b41eea130 100644 --- a/llama_stack/distributions/nvidia/nvidia.py +++ b/llama_stack/distributions/nvidia/nvidia.py @@ -7,12 +7,11 @@ from pathlib import Path from llama_stack.core.datatypes import BuildProvider, ModelInput, Provider, ShieldInput, ToolGroupInput -from llama_stack.distributions.template import DistributionTemplate, RunConfigSettings, get_model_registry +from llama_stack.distributions.template import DistributionTemplate, RunConfigSettings from llama_stack.providers.inline.files.localfs.config import LocalfsFilesImplConfig from llama_stack.providers.remote.datasetio.nvidia import NvidiaDatasetIOConfig from llama_stack.providers.remote.eval.nvidia import NVIDIAEvalConfig from llama_stack.providers.remote.inference.nvidia import NVIDIAConfig -from llama_stack.providers.remote.inference.nvidia.models import MODEL_ENTRIES from llama_stack.providers.remote.safety.nvidia import NVIDIASafetyConfig @@ -68,9 +67,6 @@ def get_distribution_template(name: str = "nvidia") -> DistributionTemplate: provider_id="nvidia", ) - available_models = { - "nvidia": MODEL_ENTRIES, - } default_tool_groups = [ ToolGroupInput( toolgroup_id="builtin::rag", @@ -78,7 +74,6 @@ def get_distribution_template(name: str = "nvidia") -> DistributionTemplate: ), ] - default_models, _ = get_model_registry(available_models) return DistributionTemplate( name=name, distro_type="self_hosted", @@ -86,7 +81,6 @@ def get_distribution_template(name: str = "nvidia") -> DistributionTemplate: container_image=None, template_path=Path(__file__).parent / "doc_template.md", providers=providers, - available_models_by_provider=available_models, run_configs={ "run.yaml": RunConfigSettings( provider_overrides={ @@ -95,7 +89,6 @@ def get_distribution_template(name: str = "nvidia") -> DistributionTemplate: "eval": [eval_provider], "files": [files_provider], }, - default_models=default_models, default_tool_groups=default_tool_groups, ), "run-with-safety.yaml": RunConfigSettings( diff --git a/llama_stack/distributions/nvidia/run.yaml b/llama_stack/distributions/nvidia/run.yaml index 362970d2e..3f3cfc514 100644 --- a/llama_stack/distributions/nvidia/run.yaml +++ b/llama_stack/distributions/nvidia/run.yaml @@ -92,90 +92,7 @@ metadata_store: inference_store: type: sqlite db_path: ${env.SQLITE_STORE_DIR:=~/.llama/distributions/nvidia}/inference_store.db -models: -- metadata: {} - model_id: meta/llama3-8b-instruct - provider_id: nvidia - provider_model_id: meta/llama3-8b-instruct - model_type: llm -- metadata: {} - model_id: meta/llama3-70b-instruct - provider_id: nvidia - provider_model_id: meta/llama3-70b-instruct - model_type: llm -- metadata: {} - model_id: meta/llama-3.1-8b-instruct - provider_id: nvidia - provider_model_id: meta/llama-3.1-8b-instruct - model_type: llm -- metadata: {} - model_id: meta/llama-3.1-70b-instruct - provider_id: nvidia - provider_model_id: meta/llama-3.1-70b-instruct - model_type: llm -- metadata: {} - model_id: meta/llama-3.1-405b-instruct - provider_id: nvidia - provider_model_id: meta/llama-3.1-405b-instruct - model_type: llm -- metadata: {} - model_id: meta/llama-3.2-1b-instruct - provider_id: nvidia - provider_model_id: meta/llama-3.2-1b-instruct - model_type: llm -- metadata: {} - model_id: meta/llama-3.2-3b-instruct - provider_id: nvidia - provider_model_id: meta/llama-3.2-3b-instruct - model_type: llm -- metadata: {} - model_id: meta/llama-3.2-11b-vision-instruct - provider_id: nvidia - provider_model_id: meta/llama-3.2-11b-vision-instruct - model_type: llm -- metadata: {} - model_id: meta/llama-3.2-90b-vision-instruct - provider_id: nvidia - provider_model_id: meta/llama-3.2-90b-vision-instruct - model_type: llm -- metadata: {} - model_id: meta/llama-3.3-70b-instruct - provider_id: nvidia - provider_model_id: meta/llama-3.3-70b-instruct - model_type: llm -- metadata: {} - model_id: nvidia/vila - provider_id: nvidia - provider_model_id: nvidia/vila - model_type: llm -- metadata: - embedding_dimension: 2048 - context_length: 8192 - model_id: nvidia/llama-3.2-nv-embedqa-1b-v2 - provider_id: nvidia - provider_model_id: nvidia/llama-3.2-nv-embedqa-1b-v2 - model_type: embedding -- metadata: - embedding_dimension: 1024 - context_length: 512 - model_id: nvidia/nv-embedqa-e5-v5 - provider_id: nvidia - provider_model_id: nvidia/nv-embedqa-e5-v5 - model_type: embedding -- metadata: - embedding_dimension: 4096 - context_length: 512 - model_id: nvidia/nv-embedqa-mistral-7b-v2 - provider_id: nvidia - provider_model_id: nvidia/nv-embedqa-mistral-7b-v2 - model_type: embedding -- metadata: - embedding_dimension: 1024 - context_length: 512 - model_id: snowflake/arctic-embed-l - provider_id: nvidia - provider_model_id: snowflake/arctic-embed-l - model_type: embedding +models: [] shields: [] vector_dbs: [] datasets: [] diff --git a/llama_stack/providers/remote/eval/nvidia/eval.py b/llama_stack/providers/remote/eval/nvidia/eval.py index a474e78e3..8fc7ffdd3 100644 --- a/llama_stack/providers/remote/eval/nvidia/eval.py +++ b/llama_stack/providers/remote/eval/nvidia/eval.py @@ -14,7 +14,6 @@ from llama_stack.apis.datasets import Datasets from llama_stack.apis.inference import Inference from llama_stack.apis.scoring import Scoring, ScoringResult from llama_stack.providers.datatypes import BenchmarksProtocolPrivate -from llama_stack.providers.remote.inference.nvidia.models import MODEL_ENTRIES from llama_stack.providers.utils.inference.model_registry import ModelRegistryHelper from .....apis.common.job_types import Job, JobStatus @@ -45,7 +44,7 @@ class NVIDIAEvalImpl( self.inference_api = inference_api self.agents_api = agents_api - ModelRegistryHelper.__init__(self, model_entries=MODEL_ENTRIES) + ModelRegistryHelper.__init__(self) async def initialize(self) -> None: ... diff --git a/llama_stack/providers/remote/inference/anthropic/anthropic.py b/llama_stack/providers/remote/inference/anthropic/anthropic.py index 0f247218d..cdde4a411 100644 --- a/llama_stack/providers/remote/inference/anthropic/anthropic.py +++ b/llama_stack/providers/remote/inference/anthropic/anthropic.py @@ -8,14 +8,24 @@ from llama_stack.providers.utils.inference.litellm_openai_mixin import LiteLLMOp from llama_stack.providers.utils.inference.openai_mixin import OpenAIMixin from .config import AnthropicConfig -from .models import MODEL_ENTRIES class AnthropicInferenceAdapter(OpenAIMixin, LiteLLMOpenAIMixin): + # source: https://docs.claude.com/en/docs/build-with-claude/embeddings + # TODO: add support for voyageai, which is where these models are hosted + # embedding_model_metadata = { + # "voyage-3-large": {"embedding_dimension": 1024, "context_length": 32000}, # supports dimensions 256, 512, 1024, 2048 + # "voyage-3.5": {"embedding_dimension": 1024, "context_length": 32000}, # supports dimensions 256, 512, 1024, 2048 + # "voyage-3.5-lite": {"embedding_dimension": 1024, "context_length": 32000}, # supports dimensions 256, 512, 1024, 2048 + # "voyage-code-3": {"embedding_dimension": 1024, "context_length": 32000}, # supports dimensions 256, 512, 1024, 2048 + # "voyage-finance-2": {"embedding_dimension": 1024, "context_length": 32000}, + # "voyage-law-2": {"embedding_dimension": 1024, "context_length": 16000}, + # "voyage-multimodal-3": {"embedding_dimension": 1024, "context_length": 32000}, + # } + def __init__(self, config: AnthropicConfig) -> None: LiteLLMOpenAIMixin.__init__( self, - MODEL_ENTRIES, litellm_provider_name="anthropic", api_key_from_config=config.api_key, provider_data_api_key_field="anthropic_api_key", diff --git a/llama_stack/providers/remote/inference/anthropic/models.py b/llama_stack/providers/remote/inference/anthropic/models.py deleted file mode 100644 index 4cbe44b02..000000000 --- a/llama_stack/providers/remote/inference/anthropic/models.py +++ /dev/null @@ -1,40 +0,0 @@ -# Copyright (c) Meta Platforms, Inc. and affiliates. -# All rights reserved. -# -# This source code is licensed under the terms described in the LICENSE file in -# the root directory of this source tree. - -from llama_stack.apis.models import ModelType -from llama_stack.providers.utils.inference.model_registry import ( - ProviderModelEntry, -) - -LLM_MODEL_IDS = [ - "claude-3-5-sonnet-latest", - "claude-3-7-sonnet-latest", - "claude-3-5-haiku-latest", -] - -SAFETY_MODELS_ENTRIES = [] - -MODEL_ENTRIES = ( - [ProviderModelEntry(provider_model_id=m) for m in LLM_MODEL_IDS] - + [ - ProviderModelEntry( - provider_model_id="voyage-3", - model_type=ModelType.embedding, - metadata={"embedding_dimension": 1024, "context_length": 32000}, - ), - ProviderModelEntry( - provider_model_id="voyage-3-lite", - model_type=ModelType.embedding, - metadata={"embedding_dimension": 512, "context_length": 32000}, - ), - ProviderModelEntry( - provider_model_id="voyage-code-3", - model_type=ModelType.embedding, - metadata={"embedding_dimension": 1024, "context_length": 32000}, - ), - ] - + SAFETY_MODELS_ENTRIES -) diff --git a/llama_stack/providers/remote/inference/azure/azure.py b/llama_stack/providers/remote/inference/azure/azure.py index 449bbbb1c..a2c69b69c 100644 --- a/llama_stack/providers/remote/inference/azure/azure.py +++ b/llama_stack/providers/remote/inference/azure/azure.py @@ -14,14 +14,12 @@ from llama_stack.providers.utils.inference.litellm_openai_mixin import ( from llama_stack.providers.utils.inference.openai_mixin import OpenAIMixin from .config import AzureConfig -from .models import MODEL_ENTRIES class AzureInferenceAdapter(OpenAIMixin, LiteLLMOpenAIMixin): def __init__(self, config: AzureConfig) -> None: LiteLLMOpenAIMixin.__init__( self, - MODEL_ENTRIES, litellm_provider_name="azure", api_key_from_config=config.api_key.get_secret_value(), provider_data_api_key_field="azure_api_key", diff --git a/llama_stack/providers/remote/inference/azure/models.py b/llama_stack/providers/remote/inference/azure/models.py deleted file mode 100644 index 64c87969b..000000000 --- a/llama_stack/providers/remote/inference/azure/models.py +++ /dev/null @@ -1,28 +0,0 @@ -# Copyright (c) Meta Platforms, Inc. and affiliates. -# All rights reserved. -# -# This source code is licensed under the terms described in the LICENSE file in -# the root directory of this source tree. - -from llama_stack.providers.utils.inference.model_registry import ( - ProviderModelEntry, -) - -# https://learn.microsoft.com/en-us/azure/ai-foundry/openai/concepts/models?tabs=global-standard%2Cstandard-chat-completions -LLM_MODEL_IDS = [ - "gpt-5", - "gpt-5-mini", - "gpt-5-nano", - "gpt-5-chat", - "o1", - "o1-mini", - "o3-mini", - "o4-mini", - "gpt-4.1", - "gpt-4.1-mini", - "gpt-4.1-nano", -] - -SAFETY_MODELS_ENTRIES = list[ProviderModelEntry]() - -MODEL_ENTRIES = [ProviderModelEntry(provider_model_id=m) for m in LLM_MODEL_IDS] + SAFETY_MODELS_ENTRIES diff --git a/llama_stack/providers/remote/inference/bedrock/bedrock.py b/llama_stack/providers/remote/inference/bedrock/bedrock.py index 106caed9b..29b935bbd 100644 --- a/llama_stack/providers/remote/inference/bedrock/bedrock.py +++ b/llama_stack/providers/remote/inference/bedrock/bedrock.py @@ -98,7 +98,7 @@ class BedrockInferenceAdapter( OpenAICompletionToLlamaStackMixin, ): def __init__(self, config: BedrockConfig) -> None: - ModelRegistryHelper.__init__(self, MODEL_ENTRIES) + ModelRegistryHelper.__init__(self, model_entries=MODEL_ENTRIES) self._config = config self._client = None diff --git a/llama_stack/providers/remote/inference/cerebras/cerebras.py b/llama_stack/providers/remote/inference/cerebras/cerebras.py index 6947dbc87..6662f004d 100644 --- a/llama_stack/providers/remote/inference/cerebras/cerebras.py +++ b/llama_stack/providers/remote/inference/cerebras/cerebras.py @@ -49,7 +49,6 @@ from llama_stack.providers.utils.inference.prompt_adapter import ( ) from .config import CerebrasImplConfig -from .models import MODEL_ENTRIES class CerebrasInferenceAdapter( @@ -58,10 +57,6 @@ class CerebrasInferenceAdapter( Inference, ): def __init__(self, config: CerebrasImplConfig) -> None: - ModelRegistryHelper.__init__( - self, - model_entries=MODEL_ENTRIES, - ) self.config = config # TODO: make this use provider data, etc. like other providers diff --git a/llama_stack/providers/remote/inference/cerebras/models.py b/llama_stack/providers/remote/inference/cerebras/models.py deleted file mode 100644 index 4de2e62c9..000000000 --- a/llama_stack/providers/remote/inference/cerebras/models.py +++ /dev/null @@ -1,28 +0,0 @@ -# Copyright (c) Meta Platforms, Inc. and affiliates. -# All rights reserved. -# -# This source code is licensed under the terms described in the LICENSE file in -# the root directory of this source tree. - -from llama_stack.models.llama.sku_types import CoreModelId -from llama_stack.providers.utils.inference.model_registry import ( - build_hf_repo_model_entry, -) - -SAFETY_MODELS_ENTRIES = [] - -# https://inference-docs.cerebras.ai/models -MODEL_ENTRIES = [ - build_hf_repo_model_entry( - "llama3.1-8b", - CoreModelId.llama3_1_8b_instruct.value, - ), - build_hf_repo_model_entry( - "llama-3.3-70b", - CoreModelId.llama3_3_70b_instruct.value, - ), - build_hf_repo_model_entry( - "llama-4-scout-17b-16e-instruct", - CoreModelId.llama4_scout_17b_16e_instruct.value, - ), -] + SAFETY_MODELS_ENTRIES diff --git a/llama_stack/providers/remote/inference/databricks/databricks.py b/llama_stack/providers/remote/inference/databricks/databricks.py index f2dc302e0..25fd9f3b7 100644 --- a/llama_stack/providers/remote/inference/databricks/databricks.py +++ b/llama_stack/providers/remote/inference/databricks/databricks.py @@ -23,6 +23,8 @@ from llama_stack.apis.inference import ( Inference, LogProbConfig, Message, + Model, + ModelType, OpenAICompletion, ResponseFormat, SamplingParams, @@ -32,11 +34,7 @@ from llama_stack.apis.inference import ( ToolDefinition, ToolPromptFormat, ) -from llama_stack.apis.models import Model, ModelType from llama_stack.log import get_logger -from llama_stack.providers.utils.inference.model_registry import ( - ProviderModelEntry, -) from llama_stack.providers.utils.inference.openai_mixin import OpenAIMixin from .config import DatabricksImplConfig @@ -44,29 +42,16 @@ from .config import DatabricksImplConfig logger = get_logger(name=__name__, category="inference::databricks") -# source: https://docs.databricks.com/aws/en/machine-learning/foundation-model-apis/supported-models -EMBEDDING_MODEL_ENTRIES = { - "databricks-gte-large-en": ProviderModelEntry( - provider_model_id="databricks-gte-large-en", - metadata={ - "embedding_dimension": 1024, - "context_length": 8192, - }, - ), - "databricks-bge-large-en": ProviderModelEntry( - provider_model_id="databricks-bge-large-en", - metadata={ - "embedding_dimension": 1024, - "context_length": 512, - }, - ), -} - - class DatabricksInferenceAdapter( OpenAIMixin, Inference, ): + # source: https://docs.databricks.com/aws/en/machine-learning/foundation-model-apis/supported-models + embedding_model_metadata = { + "databricks-gte-large-en": {"embedding_dimension": 1024, "context_length": 8192}, + "databricks-bge-large-en": {"embedding_dimension": 1024, "context_length": 512}, + } + def __init__(self, config: DatabricksImplConfig) -> None: self.config = config @@ -156,11 +141,11 @@ class DatabricksInferenceAdapter( if endpoint.task == "llm/v1/chat": model.model_type = ModelType.llm # this is redundant, but informative elif endpoint.task == "llm/v1/embeddings": - if endpoint.name not in EMBEDDING_MODEL_ENTRIES: + if endpoint.name not in self.embedding_model_metadata: logger.warning(f"No metadata information available for embedding model {endpoint.name}, skipping.") continue model.model_type = ModelType.embedding - model.metadata = EMBEDDING_MODEL_ENTRIES[endpoint.name].metadata + model.metadata = self.embedding_model_metadata[endpoint.name] else: logger.warning(f"Unknown model type, skipping: {endpoint}") continue @@ -169,13 +154,5 @@ class DatabricksInferenceAdapter( return list(self._model_cache.values()) - async def register_model(self, model: Model) -> Model: - if not await self.check_model_availability(model.provider_resource_id): - raise ValueError(f"Model {model.provider_resource_id} is not available in Databricks workspace.") - return model - - async def unregister_model(self, model_id: str) -> None: - pass - async def should_refresh_models(self) -> bool: return False diff --git a/llama_stack/providers/remote/inference/fireworks/fireworks.py b/llama_stack/providers/remote/inference/fireworks/fireworks.py index 2fcf1be2e..cf7e93974 100644 --- a/llama_stack/providers/remote/inference/fireworks/fireworks.py +++ b/llama_stack/providers/remote/inference/fireworks/fireworks.py @@ -54,15 +54,18 @@ from llama_stack.providers.utils.inference.prompt_adapter import ( ) from .config import FireworksImplConfig -from .models import MODEL_ENTRIES logger = get_logger(name=__name__, category="inference::fireworks") class FireworksInferenceAdapter(OpenAIMixin, ModelRegistryHelper, Inference, NeedsRequestProviderData): + embedding_model_metadata = { + "nomic-ai/nomic-embed-text-v1.5": {"embedding_dimension": 768, "context_length": 8192}, + } + def __init__(self, config: FireworksImplConfig) -> None: - ModelRegistryHelper.__init__(self, MODEL_ENTRIES, config.allowed_models) self.config = config + self.allowed_models = config.allowed_models async def initialize(self) -> None: pass diff --git a/llama_stack/providers/remote/inference/fireworks/models.py b/llama_stack/providers/remote/inference/fireworks/models.py deleted file mode 100644 index 30807a0d4..000000000 --- a/llama_stack/providers/remote/inference/fireworks/models.py +++ /dev/null @@ -1,70 +0,0 @@ -# Copyright (c) Meta Platforms, Inc. and affiliates. -# All rights reserved. -# -# This source code is licensed under the terms described in the LICENSE file in -# the root directory of this source tree. - -from llama_stack.apis.models import ModelType -from llama_stack.models.llama.sku_types import CoreModelId -from llama_stack.providers.utils.inference.model_registry import ( - ProviderModelEntry, - build_hf_repo_model_entry, -) - -SAFETY_MODELS_ENTRIES = [ - build_hf_repo_model_entry( - "accounts/fireworks/models/llama-guard-3-8b", - CoreModelId.llama_guard_3_8b.value, - ), - build_hf_repo_model_entry( - "accounts/fireworks/models/llama-guard-3-11b-vision", - CoreModelId.llama_guard_3_11b_vision.value, - ), -] - -MODEL_ENTRIES = [ - build_hf_repo_model_entry( - "accounts/fireworks/models/llama-v3p1-8b-instruct", - CoreModelId.llama3_1_8b_instruct.value, - ), - build_hf_repo_model_entry( - "accounts/fireworks/models/llama-v3p1-70b-instruct", - CoreModelId.llama3_1_70b_instruct.value, - ), - build_hf_repo_model_entry( - "accounts/fireworks/models/llama-v3p1-405b-instruct", - CoreModelId.llama3_1_405b_instruct.value, - ), - build_hf_repo_model_entry( - "accounts/fireworks/models/llama-v3p2-3b-instruct", - CoreModelId.llama3_2_3b_instruct.value, - ), - build_hf_repo_model_entry( - "accounts/fireworks/models/llama-v3p2-11b-vision-instruct", - CoreModelId.llama3_2_11b_vision_instruct.value, - ), - build_hf_repo_model_entry( - "accounts/fireworks/models/llama-v3p2-90b-vision-instruct", - CoreModelId.llama3_2_90b_vision_instruct.value, - ), - build_hf_repo_model_entry( - "accounts/fireworks/models/llama-v3p3-70b-instruct", - CoreModelId.llama3_3_70b_instruct.value, - ), - build_hf_repo_model_entry( - "accounts/fireworks/models/llama4-scout-instruct-basic", - CoreModelId.llama4_scout_17b_16e_instruct.value, - ), - build_hf_repo_model_entry( - "accounts/fireworks/models/llama4-maverick-instruct-basic", - CoreModelId.llama4_maverick_17b_128e_instruct.value, - ), - ProviderModelEntry( - provider_model_id="nomic-ai/nomic-embed-text-v1.5", - model_type=ModelType.embedding, - metadata={ - "embedding_dimension": 768, - "context_length": 8192, - }, - ), -] + SAFETY_MODELS_ENTRIES diff --git a/llama_stack/providers/remote/inference/gemini/gemini.py b/llama_stack/providers/remote/inference/gemini/gemini.py index 569227fdd..30ceedff0 100644 --- a/llama_stack/providers/remote/inference/gemini/gemini.py +++ b/llama_stack/providers/remote/inference/gemini/gemini.py @@ -8,14 +8,16 @@ from llama_stack.providers.utils.inference.litellm_openai_mixin import LiteLLMOp from llama_stack.providers.utils.inference.openai_mixin import OpenAIMixin from .config import GeminiConfig -from .models import MODEL_ENTRIES class GeminiInferenceAdapter(OpenAIMixin, LiteLLMOpenAIMixin): + embedding_model_metadata = { + "text-embedding-004": {"embedding_dimension": 768, "context_length": 2048}, + } + def __init__(self, config: GeminiConfig) -> None: LiteLLMOpenAIMixin.__init__( self, - MODEL_ENTRIES, litellm_provider_name="gemini", api_key_from_config=config.api_key, provider_data_api_key_field="gemini_api_key", diff --git a/llama_stack/providers/remote/inference/gemini/models.py b/llama_stack/providers/remote/inference/gemini/models.py deleted file mode 100644 index bd696b0ac..000000000 --- a/llama_stack/providers/remote/inference/gemini/models.py +++ /dev/null @@ -1,34 +0,0 @@ -# Copyright (c) Meta Platforms, Inc. and affiliates. -# All rights reserved. -# -# This source code is licensed under the terms described in the LICENSE file in -# the root directory of this source tree. - -from llama_stack.apis.models import ModelType -from llama_stack.providers.utils.inference.model_registry import ( - ProviderModelEntry, -) - -LLM_MODEL_IDS = [ - "gemini-1.5-flash", - "gemini-1.5-pro", - "gemini-2.0-flash", - "gemini-2.0-flash-lite", - "gemini-2.5-flash", - "gemini-2.5-flash-lite", - "gemini-2.5-pro", -] - -SAFETY_MODELS_ENTRIES = [] - -MODEL_ENTRIES = ( - [ProviderModelEntry(provider_model_id=m) for m in LLM_MODEL_IDS] - + [ - ProviderModelEntry( - provider_model_id="text-embedding-004", - model_type=ModelType.embedding, - metadata={"embedding_dimension": 768, "context_length": 2048}, - ), - ] - + SAFETY_MODELS_ENTRIES -) diff --git a/llama_stack/providers/remote/inference/groq/groq.py b/llama_stack/providers/remote/inference/groq/groq.py index 888953af0..e449f2005 100644 --- a/llama_stack/providers/remote/inference/groq/groq.py +++ b/llama_stack/providers/remote/inference/groq/groq.py @@ -9,8 +9,6 @@ from llama_stack.providers.remote.inference.groq.config import GroqConfig from llama_stack.providers.utils.inference.litellm_openai_mixin import LiteLLMOpenAIMixin from llama_stack.providers.utils.inference.openai_mixin import OpenAIMixin -from .models import MODEL_ENTRIES - class GroqInferenceAdapter(OpenAIMixin, LiteLLMOpenAIMixin): _config: GroqConfig @@ -18,7 +16,6 @@ class GroqInferenceAdapter(OpenAIMixin, LiteLLMOpenAIMixin): def __init__(self, config: GroqConfig): LiteLLMOpenAIMixin.__init__( self, - model_entries=MODEL_ENTRIES, litellm_provider_name="groq", api_key_from_config=config.api_key, provider_data_api_key_field="groq_api_key", diff --git a/llama_stack/providers/remote/inference/groq/models.py b/llama_stack/providers/remote/inference/groq/models.py deleted file mode 100644 index fac66db72..000000000 --- a/llama_stack/providers/remote/inference/groq/models.py +++ /dev/null @@ -1,48 +0,0 @@ -# Copyright (c) Meta Platforms, Inc. and affiliates. -# All rights reserved. -# -# This source code is licensed under the terms described in the LICENSE file in -# the root directory of this source tree. - -from llama_stack.models.llama.sku_list import CoreModelId -from llama_stack.providers.utils.inference.model_registry import ( - build_hf_repo_model_entry, - build_model_entry, -) - -SAFETY_MODELS_ENTRIES = [] - -MODEL_ENTRIES = [ - build_hf_repo_model_entry( - "llama3-8b-8192", - CoreModelId.llama3_1_8b_instruct.value, - ), - build_model_entry( - "llama-3.1-8b-instant", - CoreModelId.llama3_1_8b_instruct.value, - ), - build_hf_repo_model_entry( - "llama3-70b-8192", - CoreModelId.llama3_70b_instruct.value, - ), - build_hf_repo_model_entry( - "llama-3.3-70b-versatile", - CoreModelId.llama3_3_70b_instruct.value, - ), - # Groq only contains a preview version for llama-3.2-3b - # Preview models aren't recommended for production use, but we include this one - # to pass the test fixture - # TODO(aidand): Replace this with a stable model once Groq supports it - build_hf_repo_model_entry( - "llama-3.2-3b-preview", - CoreModelId.llama3_2_3b_instruct.value, - ), - build_hf_repo_model_entry( - "meta-llama/llama-4-scout-17b-16e-instruct", - CoreModelId.llama4_scout_17b_16e_instruct.value, - ), - build_hf_repo_model_entry( - "meta-llama/llama-4-maverick-17b-128e-instruct", - CoreModelId.llama4_maverick_17b_128e_instruct.value, - ), -] + SAFETY_MODELS_ENTRIES diff --git a/llama_stack/providers/remote/inference/llama_openai_compat/llama.py b/llama_stack/providers/remote/inference/llama_openai_compat/llama.py index f2069b5e5..489b12a68 100644 --- a/llama_stack/providers/remote/inference/llama_openai_compat/llama.py +++ b/llama_stack/providers/remote/inference/llama_openai_compat/llama.py @@ -8,8 +8,6 @@ from llama_stack.providers.remote.inference.llama_openai_compat.config import Ll from llama_stack.providers.utils.inference.litellm_openai_mixin import LiteLLMOpenAIMixin from llama_stack.providers.utils.inference.openai_mixin import OpenAIMixin -from .models import MODEL_ENTRIES - logger = get_logger(name=__name__, category="inference::llama_openai_compat") @@ -30,7 +28,6 @@ class LlamaCompatInferenceAdapter(OpenAIMixin, LiteLLMOpenAIMixin): def __init__(self, config: LlamaCompatConfig): LiteLLMOpenAIMixin.__init__( self, - model_entries=MODEL_ENTRIES, litellm_provider_name="meta_llama", api_key_from_config=config.api_key, provider_data_api_key_field="llama_api_key", diff --git a/llama_stack/providers/remote/inference/llama_openai_compat/models.py b/llama_stack/providers/remote/inference/llama_openai_compat/models.py deleted file mode 100644 index 6285e98e1..000000000 --- a/llama_stack/providers/remote/inference/llama_openai_compat/models.py +++ /dev/null @@ -1,25 +0,0 @@ -# Copyright (c) Meta Platforms, Inc. and affiliates. -# All rights reserved. -# -# This source code is licensed under the terms described in the LICENSE file in -# the root directory of this source tree. - -from llama_stack.models.llama.sku_types import CoreModelId -from llama_stack.providers.utils.inference.model_registry import ( - build_hf_repo_model_entry, -) - -MODEL_ENTRIES = [ - build_hf_repo_model_entry( - "Llama-3.3-70B-Instruct", - CoreModelId.llama3_3_70b_instruct.value, - ), - build_hf_repo_model_entry( - "Llama-4-Scout-17B-16E-Instruct-FP8", - CoreModelId.llama4_scout_17b_16e_instruct.value, - ), - build_hf_repo_model_entry( - "Llama-4-Maverick-17B-128E-Instruct-FP8", - CoreModelId.llama4_maverick_17b_128e_instruct.value, - ), -] diff --git a/llama_stack/providers/remote/inference/nvidia/models.py b/llama_stack/providers/remote/inference/nvidia/models.py deleted file mode 100644 index df07f46b6..000000000 --- a/llama_stack/providers/remote/inference/nvidia/models.py +++ /dev/null @@ -1,109 +0,0 @@ -# Copyright (c) Meta Platforms, Inc. and affiliates. -# All rights reserved. -# -# This source code is licensed under the terms described in the LICENSE file in -# the root directory of this source tree. - -from llama_stack.apis.models import ModelType -from llama_stack.models.llama.sku_types import CoreModelId -from llama_stack.providers.utils.inference.model_registry import ( - ProviderModelEntry, - build_hf_repo_model_entry, -) - -SAFETY_MODELS_ENTRIES = [] - -# https://docs.nvidia.com/nim/large-language-models/latest/supported-llm-agnostic-architectures.html -MODEL_ENTRIES = [ - build_hf_repo_model_entry( - "meta/llama3-8b-instruct", - CoreModelId.llama3_8b_instruct.value, - ), - build_hf_repo_model_entry( - "meta/llama3-70b-instruct", - CoreModelId.llama3_70b_instruct.value, - ), - build_hf_repo_model_entry( - "meta/llama-3.1-8b-instruct", - CoreModelId.llama3_1_8b_instruct.value, - ), - build_hf_repo_model_entry( - "meta/llama-3.1-70b-instruct", - CoreModelId.llama3_1_70b_instruct.value, - ), - build_hf_repo_model_entry( - "meta/llama-3.1-405b-instruct", - CoreModelId.llama3_1_405b_instruct.value, - ), - build_hf_repo_model_entry( - "meta/llama-3.2-1b-instruct", - CoreModelId.llama3_2_1b_instruct.value, - ), - build_hf_repo_model_entry( - "meta/llama-3.2-3b-instruct", - CoreModelId.llama3_2_3b_instruct.value, - ), - build_hf_repo_model_entry( - "meta/llama-3.2-11b-vision-instruct", - CoreModelId.llama3_2_11b_vision_instruct.value, - ), - build_hf_repo_model_entry( - "meta/llama-3.2-90b-vision-instruct", - CoreModelId.llama3_2_90b_vision_instruct.value, - ), - build_hf_repo_model_entry( - "meta/llama-3.3-70b-instruct", - CoreModelId.llama3_3_70b_instruct.value, - ), - ProviderModelEntry( - provider_model_id="nvidia/vila", - model_type=ModelType.llm, - ), - # NeMo Retriever Text Embedding models - - # - # https://docs.nvidia.com/nim/nemo-retriever/text-embedding/latest/support-matrix.html - # - # +-----------------------------------+--------+-----------+-----------+------------+ - # | Model ID | Max | Publisher | Embedding | Dynamic | - # | | Tokens | | Dimension | Embeddings | - # +-----------------------------------+--------+-----------+-----------+------------+ - # | nvidia/llama-3.2-nv-embedqa-1b-v2 | 8192 | NVIDIA | 2048 | Yes | - # | nvidia/nv-embedqa-e5-v5 | 512 | NVIDIA | 1024 | No | - # | nvidia/nv-embedqa-mistral-7b-v2 | 512 | NVIDIA | 4096 | No | - # | snowflake/arctic-embed-l | 512 | Snowflake | 1024 | No | - # +-----------------------------------+--------+-----------+-----------+------------+ - ProviderModelEntry( - provider_model_id="nvidia/llama-3.2-nv-embedqa-1b-v2", - model_type=ModelType.embedding, - metadata={ - "embedding_dimension": 2048, - "context_length": 8192, - }, - ), - ProviderModelEntry( - provider_model_id="nvidia/nv-embedqa-e5-v5", - model_type=ModelType.embedding, - metadata={ - "embedding_dimension": 1024, - "context_length": 512, - }, - ), - ProviderModelEntry( - provider_model_id="nvidia/nv-embedqa-mistral-7b-v2", - model_type=ModelType.embedding, - metadata={ - "embedding_dimension": 4096, - "context_length": 512, - }, - ), - ProviderModelEntry( - provider_model_id="snowflake/arctic-embed-l", - model_type=ModelType.embedding, - metadata={ - "embedding_dimension": 1024, - "context_length": 512, - }, - ), - # TODO(mf): how do we handle Nemotron models? - # "Llama3.1-Nemotron-51B-Instruct" -> "meta/llama-3.1-nemotron-51b-instruct", -] + SAFETY_MODELS_ENTRIES diff --git a/llama_stack/providers/remote/inference/nvidia/nvidia.py b/llama_stack/providers/remote/inference/nvidia/nvidia.py index a5475bc92..92094a0f3 100644 --- a/llama_stack/providers/remote/inference/nvidia/nvidia.py +++ b/llama_stack/providers/remote/inference/nvidia/nvidia.py @@ -37,9 +37,6 @@ from llama_stack.apis.inference import ( ) from llama_stack.log import get_logger from llama_stack.models.llama.datatypes import ToolDefinition, ToolPromptFormat -from llama_stack.providers.utils.inference.model_registry import ( - ModelRegistryHelper, -) from llama_stack.providers.utils.inference.openai_compat import ( convert_openai_chat_completion_choice, convert_openai_chat_completion_stream, @@ -48,7 +45,6 @@ from llama_stack.providers.utils.inference.openai_mixin import OpenAIMixin from llama_stack.providers.utils.inference.prompt_adapter import content_has_media from . import NVIDIAConfig -from .models import MODEL_ENTRIES from .openai_utils import ( convert_chat_completion_request, convert_completion_request, @@ -60,7 +56,7 @@ from .utils import _is_nvidia_hosted logger = get_logger(name=__name__, category="inference::nvidia") -class NVIDIAInferenceAdapter(OpenAIMixin, Inference, ModelRegistryHelper): +class NVIDIAInferenceAdapter(OpenAIMixin, Inference): """ NVIDIA Inference Adapter for Llama Stack. @@ -74,10 +70,15 @@ class NVIDIAInferenceAdapter(OpenAIMixin, Inference, ModelRegistryHelper): - ModelRegistryHelper.check_model_availability() just returns False and shows a warning """ - def __init__(self, config: NVIDIAConfig) -> None: - # TODO(mf): filter by available models - ModelRegistryHelper.__init__(self, model_entries=MODEL_ENTRIES) + # source: https://docs.nvidia.com/nim/nemo-retriever/text-embedding/latest/support-matrix.html + embedding_model_metadata = { + "nvidia/llama-3.2-nv-embedqa-1b-v2": {"embedding_dimension": 2048, "context_length": 8192}, + "nvidia/nv-embedqa-e5-v5": {"embedding_dimension": 512, "context_length": 1024}, + "nvidia/nv-embedqa-mistral-7b-v2": {"embedding_dimension": 512, "context_length": 4096}, + "snowflake/arctic-embed-l": {"embedding_dimension": 512, "context_length": 1024}, + } + def __init__(self, config: NVIDIAConfig) -> None: logger.info(f"Initializing NVIDIAInferenceAdapter({config.url})...") if _is_nvidia_hosted(config): diff --git a/llama_stack/providers/remote/inference/ollama/models.py b/llama_stack/providers/remote/inference/ollama/models.py deleted file mode 100644 index 7c0a19a1a..000000000 --- a/llama_stack/providers/remote/inference/ollama/models.py +++ /dev/null @@ -1,106 +0,0 @@ -# Copyright (c) Meta Platforms, Inc. and affiliates. -# All rights reserved. -# -# This source code is licensed under the terms described in the LICENSE file in -# the root directory of this source tree. - -from llama_stack.apis.models import ModelType -from llama_stack.models.llama.sku_types import CoreModelId -from llama_stack.providers.utils.inference.model_registry import ( - ProviderModelEntry, - build_hf_repo_model_entry, - build_model_entry, -) - -SAFETY_MODELS_ENTRIES = [ - # The Llama Guard models don't have their full fp16 versions - # so we are going to alias their default version to the canonical SKU - build_hf_repo_model_entry( - "llama-guard3:8b", - CoreModelId.llama_guard_3_8b.value, - ), - build_hf_repo_model_entry( - "llama-guard3:1b", - CoreModelId.llama_guard_3_1b.value, - ), -] - -MODEL_ENTRIES = [ - build_hf_repo_model_entry( - "llama3.1:8b-instruct-fp16", - CoreModelId.llama3_1_8b_instruct.value, - ), - build_model_entry( - "llama3.1:8b", - CoreModelId.llama3_1_8b_instruct.value, - ), - build_hf_repo_model_entry( - "llama3.1:70b-instruct-fp16", - CoreModelId.llama3_1_70b_instruct.value, - ), - build_model_entry( - "llama3.1:70b", - CoreModelId.llama3_1_70b_instruct.value, - ), - build_hf_repo_model_entry( - "llama3.1:405b-instruct-fp16", - CoreModelId.llama3_1_405b_instruct.value, - ), - build_model_entry( - "llama3.1:405b", - CoreModelId.llama3_1_405b_instruct.value, - ), - build_hf_repo_model_entry( - "llama3.2:1b-instruct-fp16", - CoreModelId.llama3_2_1b_instruct.value, - ), - build_model_entry( - "llama3.2:1b", - CoreModelId.llama3_2_1b_instruct.value, - ), - build_hf_repo_model_entry( - "llama3.2:3b-instruct-fp16", - CoreModelId.llama3_2_3b_instruct.value, - ), - build_model_entry( - "llama3.2:3b", - CoreModelId.llama3_2_3b_instruct.value, - ), - build_hf_repo_model_entry( - "llama3.2-vision:11b-instruct-fp16", - CoreModelId.llama3_2_11b_vision_instruct.value, - ), - build_model_entry( - "llama3.2-vision:latest", - CoreModelId.llama3_2_11b_vision_instruct.value, - ), - build_hf_repo_model_entry( - "llama3.2-vision:90b-instruct-fp16", - CoreModelId.llama3_2_90b_vision_instruct.value, - ), - build_model_entry( - "llama3.2-vision:90b", - CoreModelId.llama3_2_90b_vision_instruct.value, - ), - build_hf_repo_model_entry( - "llama3.3:70b", - CoreModelId.llama3_3_70b_instruct.value, - ), - ProviderModelEntry( - provider_model_id="all-minilm:l6-v2", - aliases=["all-minilm"], - model_type=ModelType.embedding, - metadata={ - "embedding_dimension": 384, - "context_length": 512, - }, - ), - ProviderModelEntry( - provider_model_id="nomic-embed-text", - model_type=ModelType.embedding, - metadata={ - "embedding_dimension": 768, - "context_length": 8192, - }, - ), -] + SAFETY_MODELS_ENTRIES diff --git a/llama_stack/providers/remote/inference/ollama/ollama.py b/llama_stack/providers/remote/inference/ollama/ollama.py index 67a22cbe3..81a5fb9ad 100644 --- a/llama_stack/providers/remote/inference/ollama/ollama.py +++ b/llama_stack/providers/remote/inference/ollama/ollama.py @@ -45,8 +45,9 @@ from llama_stack.apis.inference import ( ToolDefinition, ToolPromptFormat, ) -from llama_stack.apis.models import Model, ModelType +from llama_stack.apis.models import Model from llama_stack.log import get_logger +from llama_stack.models.llama.sku_types import CoreModelId from llama_stack.providers.datatypes import ( HealthResponse, HealthStatus, @@ -55,6 +56,7 @@ from llama_stack.providers.datatypes import ( from llama_stack.providers.remote.inference.ollama.config import OllamaImplConfig from llama_stack.providers.utils.inference.model_registry import ( ModelRegistryHelper, + build_hf_repo_model_entry, ) from llama_stack.providers.utils.inference.openai_compat import ( OpenAICompatCompletionChoice, @@ -77,8 +79,6 @@ from llama_stack.providers.utils.inference.prompt_adapter import ( request_has_media, ) -from .models import MODEL_ENTRIES - logger = get_logger(name=__name__, category="inference::ollama") @@ -90,8 +90,44 @@ class OllamaInferenceAdapter( # automatically set by the resolver when instantiating the provider __provider_id__: str + embedding_model_metadata = { + "all-minilm:l6-v2": { + "embedding_dimension": 384, + "context_length": 512, + }, + "nomic-embed-text:latest": { + "embedding_dimension": 768, + "context_length": 8192, + }, + "nomic-embed-text:v1.5": { + "embedding_dimension": 768, + "context_length": 8192, + }, + "nomic-embed-text:137m-v1.5-fp16": { + "embedding_dimension": 768, + "context_length": 8192, + }, + } + def __init__(self, config: OllamaImplConfig) -> None: - self.register_helper = ModelRegistryHelper(MODEL_ENTRIES) + # TODO: remove ModelRegistryHelper.__init__ when completion and + # chat_completion are. this exists to satisfy the input / + # output processing for llama models. specifically, + # tool_calling is handled by raw template processing, + # instead of using the /api/chat endpoint w/ tools=... + ModelRegistryHelper.__init__( + self, + model_entries=[ + build_hf_repo_model_entry( + "llama3.2:3b-instruct-fp16", + CoreModelId.llama3_2_3b_instruct.value, + ), + build_hf_repo_model_entry( + "llama-guard3:1b", + CoreModelId.llama_guard_3_1b.value, + ), + ], + ) self.config = config self._clients: dict[asyncio.AbstractEventLoop, AsyncOllamaClient] = {} @@ -120,59 +156,6 @@ class OllamaInferenceAdapter( async def should_refresh_models(self) -> bool: return self.config.refresh_models - async def list_models(self) -> list[Model] | None: - provider_id = self.__provider_id__ - response = await self.ollama_client.list() - - # always add the two embedding models which can be pulled on demand - models = [ - Model( - identifier="all-minilm:l6-v2", - provider_resource_id="all-minilm:l6-v2", - provider_id=provider_id, - metadata={ - "embedding_dimension": 384, - "context_length": 512, - }, - model_type=ModelType.embedding, - ), - # add all-minilm alias - Model( - identifier="all-minilm", - provider_resource_id="all-minilm:l6-v2", - provider_id=provider_id, - metadata={ - "embedding_dimension": 384, - "context_length": 512, - }, - model_type=ModelType.embedding, - ), - Model( - identifier="nomic-embed-text", - provider_resource_id="nomic-embed-text:latest", - provider_id=provider_id, - metadata={ - "embedding_dimension": 768, - "context_length": 8192, - }, - model_type=ModelType.embedding, - ), - ] - for m in response.models: - # kill embedding models since we don't know dimensions for them - if "bert" in m.details.family: - continue - models.append( - Model( - identifier=m.model, - provider_resource_id=m.model, - provider_id=provider_id, - metadata={}, - model_type=ModelType.llm, - ) - ) - return models - async def health(self) -> HealthResponse: """ Performs a health check by verifying connectivity to the Ollama server. @@ -301,7 +284,7 @@ class OllamaInferenceAdapter( input_dict: dict[str, Any] = {} media_present = request_has_media(request) - llama_model = self.register_helper.get_llama_model(request.model) + llama_model = self.get_llama_model(request.model) if isinstance(request, ChatCompletionRequest): if media_present or not llama_model: contents = [await convert_message_to_openai_dict_for_ollama(m) for m in request.messages] @@ -409,37 +392,16 @@ class OllamaInferenceAdapter( return EmbeddingsResponse(embeddings=embeddings) async def register_model(self, model: Model) -> Model: - try: - model = await self.register_helper.register_model(model) - except ValueError: - pass # Ignore statically unknown model, will check live listing + if await self.check_model_availability(model.provider_model_id): + return model + elif await self.check_model_availability(f"{model.provider_model_id}:latest"): + model.provider_resource_id = f"{model.provider_model_id}:latest" + logger.warning( + f"Imprecise provider resource id was used but 'latest' is available in Ollama - using '{model.provider_model_id}'" + ) + return model - if model.model_type == ModelType.embedding: - response = await self.ollama_client.list() - if model.provider_resource_id not in [m.model for m in response.models]: - await self.ollama_client.pull(model.provider_resource_id) - - # we use list() here instead of ps() - - # - ps() only lists running models, not available models - # - models not currently running are run by the ollama server as needed - response = await self.ollama_client.list() - available_models = [m.model for m in response.models] - - provider_resource_id = model.provider_resource_id - assert provider_resource_id is not None # mypy - if provider_resource_id not in available_models: - available_models_latest = [m.model.split(":latest")[0] for m in response.models] - if provider_resource_id in available_models_latest: - logger.warning( - f"Imprecise provider resource id was used but 'latest' is available in Ollama - using '{model.provider_resource_id}:latest'" - ) - return model - raise UnsupportedModelError(provider_resource_id, available_models) - - # mutating this should be considered an anti-pattern - model.provider_resource_id = provider_resource_id - - return model + raise UnsupportedModelError(model.provider_model_id, list(self._model_cache.keys())) async def openai_chat_completion( self, diff --git a/llama_stack/providers/remote/inference/openai/models.py b/llama_stack/providers/remote/inference/openai/models.py deleted file mode 100644 index 28d0c4b41..000000000 --- a/llama_stack/providers/remote/inference/openai/models.py +++ /dev/null @@ -1,60 +0,0 @@ -# Copyright (c) Meta Platforms, Inc. and affiliates. -# All rights reserved. -# -# This source code is licensed under the terms described in the LICENSE file in -# the root directory of this source tree. - -from dataclasses import dataclass - -from llama_stack.apis.models import ModelType -from llama_stack.providers.utils.inference.model_registry import ( - ProviderModelEntry, -) - -LLM_MODEL_IDS = [ - "gpt-3.5-turbo-0125", - "gpt-3.5-turbo", - "gpt-3.5-turbo-instruct", - "gpt-4", - "gpt-4-turbo", - "gpt-4o", - "gpt-4o-2024-08-06", - "gpt-4o-mini", - "gpt-4o-audio-preview", - "chatgpt-4o-latest", - "o1", - "o1-mini", - "o3-mini", - "o4-mini", -] - - -@dataclass -class EmbeddingModelInfo: - """Structured representation of embedding model information.""" - - embedding_dimension: int - context_length: int - - -EMBEDDING_MODEL_IDS: dict[str, EmbeddingModelInfo] = { - "text-embedding-3-small": EmbeddingModelInfo(1536, 8192), - "text-embedding-3-large": EmbeddingModelInfo(3072, 8192), -} -SAFETY_MODELS_ENTRIES = [] - -MODEL_ENTRIES = ( - [ProviderModelEntry(provider_model_id=m) for m in LLM_MODEL_IDS] - + [ - ProviderModelEntry( - provider_model_id=model_id, - model_type=ModelType.embedding, - metadata={ - "embedding_dimension": model_info.embedding_dimension, - "context_length": model_info.context_length, - }, - ) - for model_id, model_info in EMBEDDING_MODEL_IDS.items() - ] - + SAFETY_MODELS_ENTRIES -) diff --git a/llama_stack/providers/remote/inference/openai/openai.py b/llama_stack/providers/remote/inference/openai/openai.py index 0f73c9321..18530f20b 100644 --- a/llama_stack/providers/remote/inference/openai/openai.py +++ b/llama_stack/providers/remote/inference/openai/openai.py @@ -9,7 +9,6 @@ from llama_stack.providers.utils.inference.litellm_openai_mixin import LiteLLMOp from llama_stack.providers.utils.inference.openai_mixin import OpenAIMixin from .config import OpenAIConfig -from .models import MODEL_ENTRIES logger = get_logger(name=__name__, category="inference::openai") @@ -40,10 +39,14 @@ class OpenAIInferenceAdapter(OpenAIMixin, LiteLLMOpenAIMixin): - ModelRegistryHelper.check_model_availability() (inherited by LiteLLMOpenAIMixin) just returns False and shows a warning """ + embedding_model_metadata = { + "text-embedding-3-small": {"embedding_dimension": 1536, "context_length": 8192}, + "text-embedding-3-large": {"embedding_dimension": 3072, "context_length": 8192}, + } + def __init__(self, config: OpenAIConfig) -> None: LiteLLMOpenAIMixin.__init__( self, - MODEL_ENTRIES, litellm_provider_name="openai", api_key_from_config=config.api_key, provider_data_api_key_field="openai_api_key", diff --git a/llama_stack/providers/remote/inference/passthrough/passthrough.py b/llama_stack/providers/remote/inference/passthrough/passthrough.py index 2f1cd40f2..a2bdf0369 100644 --- a/llama_stack/providers/remote/inference/passthrough/passthrough.py +++ b/llama_stack/providers/remote/inference/passthrough/passthrough.py @@ -43,7 +43,7 @@ from .config import PassthroughImplConfig class PassthroughInferenceAdapter(Inference): def __init__(self, config: PassthroughImplConfig) -> None: - ModelRegistryHelper.__init__(self, []) + ModelRegistryHelper.__init__(self) self.config = config async def initialize(self) -> None: diff --git a/llama_stack/providers/remote/inference/sambanova/models.py b/llama_stack/providers/remote/inference/sambanova/models.py deleted file mode 100644 index db781eb86..000000000 --- a/llama_stack/providers/remote/inference/sambanova/models.py +++ /dev/null @@ -1,28 +0,0 @@ -# Copyright (c) Meta Platforms, Inc. and affiliates. -# All rights reserved. -# -# This source code is licensed under the terms described in the LICENSE file in -# the root directory of this source tree. - -from llama_stack.models.llama.sku_types import CoreModelId -from llama_stack.providers.utils.inference.model_registry import ( - build_hf_repo_model_entry, -) - -SAFETY_MODELS_ENTRIES = [] - - -MODEL_ENTRIES = [ - build_hf_repo_model_entry( - "Meta-Llama-3.1-8B-Instruct", - CoreModelId.llama3_1_8b_instruct.value, - ), - build_hf_repo_model_entry( - "Meta-Llama-3.3-70B-Instruct", - CoreModelId.llama3_3_70b_instruct.value, - ), - build_hf_repo_model_entry( - "Llama-4-Maverick-17B-128E-Instruct", - CoreModelId.llama4_maverick_17b_128e_instruct.value, - ), -] + SAFETY_MODELS_ENTRIES diff --git a/llama_stack/providers/remote/inference/sambanova/sambanova.py b/llama_stack/providers/remote/inference/sambanova/sambanova.py index ee3b0f648..6121e81f7 100644 --- a/llama_stack/providers/remote/inference/sambanova/sambanova.py +++ b/llama_stack/providers/remote/inference/sambanova/sambanova.py @@ -9,7 +9,6 @@ from llama_stack.providers.utils.inference.litellm_openai_mixin import LiteLLMOp from llama_stack.providers.utils.inference.openai_mixin import OpenAIMixin from .config import SambaNovaImplConfig -from .models import MODEL_ENTRIES class SambaNovaInferenceAdapter(OpenAIMixin, LiteLLMOpenAIMixin): @@ -29,7 +28,6 @@ class SambaNovaInferenceAdapter(OpenAIMixin, LiteLLMOpenAIMixin): self.environment_available_models = [] LiteLLMOpenAIMixin.__init__( self, - model_entries=MODEL_ENTRIES, litellm_provider_name="sambanova", api_key_from_config=self.config.api_key.get_secret_value() if self.config.api_key else None, provider_data_api_key_field="sambanova_api_key", diff --git a/llama_stack/providers/remote/inference/together/models.py b/llama_stack/providers/remote/inference/together/models.py deleted file mode 100644 index 2aba614cb..000000000 --- a/llama_stack/providers/remote/inference/together/models.py +++ /dev/null @@ -1,103 +0,0 @@ -# Copyright (c) Meta Platforms, Inc. and affiliates. -# All rights reserved. -# -# This source code is licensed under the terms described in the LICENSE file in -# the root directory of this source tree. - -from llama_stack.models.llama.sku_types import CoreModelId -from llama_stack.providers.utils.inference.model_registry import ( - ProviderModelEntry, - build_hf_repo_model_entry, -) - -SAFETY_MODELS_ENTRIES = [ - build_hf_repo_model_entry( - "meta-llama/Llama-Guard-3-8B", - CoreModelId.llama_guard_3_8b.value, - ), - build_hf_repo_model_entry( - "meta-llama/Llama-Guard-3-11B-Vision-Turbo", - CoreModelId.llama_guard_3_11b_vision.value, - ), -] - -# source: https://docs.together.ai/docs/serverless-models#embedding-models -EMBEDDING_MODEL_ENTRIES = { - "togethercomputer/m2-bert-80M-32k-retrieval": ProviderModelEntry( - provider_model_id="togethercomputer/m2-bert-80M-32k-retrieval", - metadata={ - "embedding_dimension": 768, - "context_length": 32768, - }, - ), - "BAAI/bge-large-en-v1.5": ProviderModelEntry( - provider_model_id="BAAI/bge-large-en-v1.5", - metadata={ - "embedding_dimension": 1024, - "context_length": 512, - }, - ), - "BAAI/bge-base-en-v1.5": ProviderModelEntry( - provider_model_id="BAAI/bge-base-en-v1.5", - metadata={ - "embedding_dimension": 768, - "context_length": 512, - }, - ), - "Alibaba-NLP/gte-modernbert-base": ProviderModelEntry( - provider_model_id="Alibaba-NLP/gte-modernbert-base", - metadata={ - "embedding_dimension": 768, - "context_length": 8192, - }, - ), - "intfloat/multilingual-e5-large-instruct": ProviderModelEntry( - provider_model_id="intfloat/multilingual-e5-large-instruct", - metadata={ - "embedding_dimension": 1024, - "context_length": 512, - }, - ), -} -MODEL_ENTRIES = ( - [ - build_hf_repo_model_entry( - "meta-llama/Meta-Llama-3.1-8B-Instruct-Turbo", - CoreModelId.llama3_1_8b_instruct.value, - ), - build_hf_repo_model_entry( - "meta-llama/Meta-Llama-3.1-70B-Instruct-Turbo", - CoreModelId.llama3_1_70b_instruct.value, - ), - build_hf_repo_model_entry( - "meta-llama/Meta-Llama-3.1-405B-Instruct-Turbo", - CoreModelId.llama3_1_405b_instruct.value, - ), - build_hf_repo_model_entry( - "meta-llama/Llama-3.2-3B-Instruct-Turbo", - CoreModelId.llama3_2_3b_instruct.value, - ), - build_hf_repo_model_entry( - "meta-llama/Llama-3.2-11B-Vision-Instruct-Turbo", - CoreModelId.llama3_2_11b_vision_instruct.value, - ), - build_hf_repo_model_entry( - "meta-llama/Llama-3.2-90B-Vision-Instruct-Turbo", - CoreModelId.llama3_2_90b_vision_instruct.value, - ), - build_hf_repo_model_entry( - "meta-llama/Llama-3.3-70B-Instruct-Turbo", - CoreModelId.llama3_3_70b_instruct.value, - ), - build_hf_repo_model_entry( - "meta-llama/Llama-4-Scout-17B-16E-Instruct", - CoreModelId.llama4_scout_17b_16e_instruct.value, - ), - build_hf_repo_model_entry( - "meta-llama/Llama-4-Maverick-17B-128E-Instruct-FP8", - CoreModelId.llama4_maverick_17b_128e_instruct.value, - ), - ] - + SAFETY_MODELS_ENTRIES - + list(EMBEDDING_MODEL_ENTRIES.values()) -) diff --git a/llama_stack/providers/remote/inference/together/together.py b/llama_stack/providers/remote/inference/together/together.py index d45bd489f..653f84610 100644 --- a/llama_stack/providers/remote/inference/together/together.py +++ b/llama_stack/providers/remote/inference/together/together.py @@ -56,15 +56,22 @@ from llama_stack.providers.utils.inference.prompt_adapter import ( ) from .config import TogetherImplConfig -from .models import EMBEDDING_MODEL_ENTRIES, MODEL_ENTRIES logger = get_logger(name=__name__, category="inference::together") class TogetherInferenceAdapter(OpenAIMixin, ModelRegistryHelper, Inference, NeedsRequestProviderData): + embedding_model_metadata = { + "togethercomputer/m2-bert-80M-32k-retrieval": {"embedding_dimension": 768, "context_length": 32768}, + "BAAI/bge-large-en-v1.5": {"embedding_dimension": 1024, "context_length": 512}, + "BAAI/bge-base-en-v1.5": {"embedding_dimension": 768, "context_length": 512}, + "Alibaba-NLP/gte-modernbert-base": {"embedding_dimension": 768, "context_length": 8192}, + "intfloat/multilingual-e5-large-instruct": {"embedding_dimension": 1024, "context_length": 512}, + } + def __init__(self, config: TogetherImplConfig) -> None: - ModelRegistryHelper.__init__(self, MODEL_ENTRIES, config.allowed_models) self.config = config + self.allowed_models = config.allowed_models self._model_cache: dict[str, Model] = {} def get_api_key(self): @@ -264,15 +271,16 @@ class TogetherInferenceAdapter(OpenAIMixin, ModelRegistryHelper, Inference, Need # Together's /v1/models is not compatible with OpenAI's /v1/models. Together support ticket #13355 -> will not fix, use Together's own client for m in await self._get_client().models.list(): if m.type == "embedding": - if m.id not in EMBEDDING_MODEL_ENTRIES: + if m.id not in self.embedding_model_metadata: logger.warning(f"Unknown embedding dimension for model {m.id}, skipping.") continue + metadata = self.embedding_model_metadata[m.id] self._model_cache[m.id] = Model( provider_id=self.__provider_id__, - provider_resource_id=EMBEDDING_MODEL_ENTRIES[m.id].provider_model_id, + provider_resource_id=m.id, identifier=m.id, model_type=ModelType.embedding, - metadata=EMBEDDING_MODEL_ENTRIES[m.id].metadata, + metadata=metadata, ) else: self._model_cache[m.id] = Model( diff --git a/llama_stack/providers/remote/inference/vertexai/models.py b/llama_stack/providers/remote/inference/vertexai/models.py deleted file mode 100644 index e72db533d..000000000 --- a/llama_stack/providers/remote/inference/vertexai/models.py +++ /dev/null @@ -1,20 +0,0 @@ -# Copyright (c) Meta Platforms, Inc. and affiliates. -# All rights reserved. -# -# This source code is licensed under the terms described in the LICENSE file in -# the root directory of this source tree. - -from llama_stack.providers.utils.inference.model_registry import ( - ProviderModelEntry, -) - -# Vertex AI model IDs with vertex_ai/ prefix as required by litellm -LLM_MODEL_IDS = [ - "vertex_ai/gemini-2.0-flash", - "vertex_ai/gemini-2.5-flash", - "vertex_ai/gemini-2.5-pro", -] - -SAFETY_MODELS_ENTRIES = list[ProviderModelEntry]() - -MODEL_ENTRIES = [ProviderModelEntry(provider_model_id=m) for m in LLM_MODEL_IDS] + SAFETY_MODELS_ENTRIES diff --git a/llama_stack/providers/remote/inference/vertexai/vertexai.py b/llama_stack/providers/remote/inference/vertexai/vertexai.py index 8996543e7..770d21a2a 100644 --- a/llama_stack/providers/remote/inference/vertexai/vertexai.py +++ b/llama_stack/providers/remote/inference/vertexai/vertexai.py @@ -16,14 +16,12 @@ from llama_stack.providers.utils.inference.litellm_openai_mixin import ( from llama_stack.providers.utils.inference.openai_mixin import OpenAIMixin from .config import VertexAIConfig -from .models import MODEL_ENTRIES class VertexAIInferenceAdapter(OpenAIMixin, LiteLLMOpenAIMixin): def __init__(self, config: VertexAIConfig) -> None: LiteLLMOpenAIMixin.__init__( self, - MODEL_ENTRIES, litellm_provider_name="vertex_ai", api_key_from_config=None, # Vertex AI uses ADC, not API keys provider_data_api_key_field="vertex_project", # Use project for validation diff --git a/llama_stack/providers/remote/inference/vllm/vllm.py b/llama_stack/providers/remote/inference/vllm/vllm.py index 15f807846..8fbb4b815 100644 --- a/llama_stack/providers/remote/inference/vllm/vllm.py +++ b/llama_stack/providers/remote/inference/vllm/vllm.py @@ -292,7 +292,7 @@ class VLLMInferenceAdapter(OpenAIMixin, LiteLLMOpenAIMixin, Inference, ModelsPro def __init__(self, config: VLLMInferenceAdapterConfig) -> None: LiteLLMOpenAIMixin.__init__( self, - build_hf_repo_model_entries(), + model_entries=build_hf_repo_model_entries(), litellm_provider_name="vllm", api_key_from_config=config.api_token, provider_data_api_key_field="vllm_api_token", diff --git a/llama_stack/providers/remote/inference/watsonx/watsonx.py b/llama_stack/providers/remote/inference/watsonx/watsonx.py index ab5ca76db..cb8b45565 100644 --- a/llama_stack/providers/remote/inference/watsonx/watsonx.py +++ b/llama_stack/providers/remote/inference/watsonx/watsonx.py @@ -76,7 +76,7 @@ logger = get_logger(name=__name__, category="inference::watsonx") class WatsonXInferenceAdapter(Inference, ModelRegistryHelper): def __init__(self, config: WatsonXConfig) -> None: - ModelRegistryHelper.__init__(self, MODEL_ENTRIES) + ModelRegistryHelper.__init__(self, model_entries=MODEL_ENTRIES) logger.info(f"Initializing watsonx InferenceAdapter({config.url})...") self._config = config diff --git a/llama_stack/providers/utils/inference/litellm_openai_mixin.py b/llama_stack/providers/utils/inference/litellm_openai_mixin.py index 9bd43e4c9..b1e38f323 100644 --- a/llama_stack/providers/utils/inference/litellm_openai_mixin.py +++ b/llama_stack/providers/utils/inference/litellm_openai_mixin.py @@ -40,7 +40,7 @@ from llama_stack.apis.inference import ( ) from llama_stack.core.request_headers import NeedsRequestProviderData from llama_stack.log import get_logger -from llama_stack.providers.utils.inference.model_registry import ModelRegistryHelper +from llama_stack.providers.utils.inference.model_registry import ModelRegistryHelper, ProviderModelEntry from llama_stack.providers.utils.inference.openai_compat import ( b64_encode_openai_embeddings_response, convert_message_to_openai_dict_new, @@ -67,10 +67,10 @@ class LiteLLMOpenAIMixin( # when calling litellm. def __init__( self, - model_entries, litellm_provider_name: str, api_key_from_config: str | None, provider_data_api_key_field: str, + model_entries: list[ProviderModelEntry] | None = None, openai_compat_api_base: str | None = None, download_images: bool = False, json_schema_strict: bool = True, @@ -86,7 +86,7 @@ class LiteLLMOpenAIMixin( :param download_images: Whether to download images and convert to base64 for message conversion. :param json_schema_strict: Whether to use strict mode for JSON schema validation. """ - ModelRegistryHelper.__init__(self, model_entries) + ModelRegistryHelper.__init__(self, model_entries=model_entries) self.litellm_provider_name = litellm_provider_name self.api_key_from_config = api_key_from_config diff --git a/llama_stack/providers/utils/inference/model_registry.py b/llama_stack/providers/utils/inference/model_registry.py index b6b06c0b6..ff15b2d43 100644 --- a/llama_stack/providers/utils/inference/model_registry.py +++ b/llama_stack/providers/utils/inference/model_registry.py @@ -11,7 +11,6 @@ from pydantic import BaseModel, Field from llama_stack.apis.common.errors import UnsupportedModelError from llama_stack.apis.models import ModelType from llama_stack.log import get_logger -from llama_stack.models.llama.sku_list import all_registered_models from llama_stack.providers.datatypes import Model, ModelsProtocolPrivate from llama_stack.providers.utils.inference import ( ALL_HUGGINGFACE_REPOS_TO_MODEL_DESCRIPTOR, @@ -37,13 +36,6 @@ class ProviderModelEntry(BaseModel): metadata: dict[str, Any] = Field(default_factory=dict) -def get_huggingface_repo(model_descriptor: str) -> str | None: - for model in all_registered_models(): - if model.descriptor() == model_descriptor: - return model.huggingface_repo - return None - - def build_hf_repo_model_entry( provider_model_id: str, model_descriptor: str, @@ -63,25 +55,20 @@ def build_hf_repo_model_entry( ) -def build_model_entry(provider_model_id: str, model_descriptor: str) -> ProviderModelEntry: - return ProviderModelEntry( - provider_model_id=provider_model_id, - aliases=[], - llama_model=model_descriptor, - model_type=ModelType.llm, - ) - - class ModelRegistryHelper(ModelsProtocolPrivate): __provider_id__: str - def __init__(self, model_entries: list[ProviderModelEntry], allowed_models: list[str] | None = None): - self.model_entries = model_entries + def __init__( + self, + model_entries: list[ProviderModelEntry] | None = None, + allowed_models: list[str] | None = None, + ): self.allowed_models = allowed_models self.alias_to_provider_id_map = {} self.provider_id_to_llama_model_map = {} - for entry in model_entries: + self.model_entries = model_entries or [] + for entry in self.model_entries: for alias in entry.aliases: self.alias_to_provider_id_map[alias] = entry.provider_model_id diff --git a/llama_stack/providers/utils/inference/openai_mixin.py b/llama_stack/providers/utils/inference/openai_mixin.py index 2fe343f63..84211dc96 100644 --- a/llama_stack/providers/utils/inference/openai_mixin.py +++ b/llama_stack/providers/utils/inference/openai_mixin.py @@ -24,12 +24,13 @@ from llama_stack.apis.inference import ( ) from llama_stack.apis.models import ModelType from llama_stack.log import get_logger +from llama_stack.providers.utils.inference.model_registry import ModelRegistryHelper from llama_stack.providers.utils.inference.openai_compat import prepare_openai_completion_params logger = get_logger(name=__name__, category="providers::utils") -class OpenAIMixin(ABC): +class OpenAIMixin(ModelRegistryHelper, ABC): """ Mixin class that provides OpenAI-specific functionality for inference providers. This class handles direct OpenAI API calls using the AsyncOpenAI client. @@ -50,10 +51,18 @@ class OpenAIMixin(ABC): # This is useful for providers that do not return a unique id in the response. overwrite_completion_id: bool = False + # Embedding model metadata for this provider + # Can be set by subclasses or instances to provide embedding models + # Format: {"model_id": {"embedding_dimension": 1536, "context_length": 8192}} + embedding_model_metadata: dict[str, dict[str, int]] = {} + # Cache of available models keyed by model ID # This is set in list_models() and used in check_model_availability() _model_cache: dict[str, Model] = {} + # List of allowed models for this provider, if empty all models allowed + allowed_models: list[str] = [] + @abstractmethod def get_api_key(self) -> str: """ @@ -302,22 +311,36 @@ class OpenAIMixin(ABC): async def list_models(self) -> list[Model] | None: """ - List available models from the provider's /v1/models endpoint. + List available models from the provider's /v1/models endpoint augmented with static embedding model metadata. Also, caches the models in self._model_cache for use in check_model_availability(). :return: A list of Model instances representing available models. """ - self._model_cache = { - m.id: Model( - # __provider_id__ is dynamically added by instantiate_provider in resolver.py - provider_id=self.__provider_id__, # type: ignore[attr-defined] - provider_resource_id=m.id, - identifier=m.id, - model_type=ModelType.llm, - ) - async for m in self.client.models.list() - } + self._model_cache = {} + + async for m in self.client.models.list(): + if self.allowed_models and m.id not in self.allowed_models: + logger.info(f"Skipping model {m.id} as it is not in the allowed models list") + continue + if metadata := self.embedding_model_metadata.get(m.id): + # This is an embedding model - augment with metadata + model = Model( + provider_id=self.__provider_id__, # type: ignore[attr-defined] + provider_resource_id=m.id, + identifier=m.id, + model_type=ModelType.embedding, + metadata=metadata, + ) + else: + # This is an LLM + model = Model( + provider_id=self.__provider_id__, # type: ignore[attr-defined] + provider_resource_id=m.id, + identifier=m.id, + model_type=ModelType.llm, + ) + self._model_cache[m.id] = model return list(self._model_cache.values()) diff --git a/tests/integration/recordings/responses/models-bd032f995f2a-3255f444.json b/tests/integration/recordings/responses/models-bd032f995f2a-3255f444.json new file mode 100644 index 000000000..0909cfcac --- /dev/null +++ b/tests/integration/recordings/responses/models-bd032f995f2a-3255f444.json @@ -0,0 +1,96 @@ +{ + "request": { + "method": "POST", + "url": "http://0.0.0.0:11434/v1/v1/models", + "headers": {}, + "body": {}, + "endpoint": "/v1/models", + "model": "" + }, + "response": { + "body": [ + { + "__type__": "openai.types.model.Model", + "__data__": { + "id": "qwen3:8b", + "created": 1758707188, + "object": "model", + "owned_by": "library" + } + }, + { + "__type__": "openai.types.model.Model", + "__data__": { + "id": "nomic-embed-text:137m-v1.5-fp16", + "created": 1758640855, + "object": "model", + "owned_by": "library" + } + }, + { + "__type__": "openai.types.model.Model", + "__data__": { + "id": "nomic-embed-text:latest", + "created": 1756727155, + "object": "model", + "owned_by": "library" + } + }, + { + "__type__": "openai.types.model.Model", + "__data__": { + "id": "llama3.2-vision:11b", + "created": 1756722893, + "object": "model", + "owned_by": "library" + } + }, + { + "__type__": "openai.types.model.Model", + "__data__": { + "id": "llama-guard3:1b", + "created": 1756671473, + "object": "model", + "owned_by": "library" + } + }, + { + "__type__": "openai.types.model.Model", + "__data__": { + "id": "all-minilm:l6-v2", + "created": 1756655274, + "object": "model", + "owned_by": "library" + } + }, + { + "__type__": "openai.types.model.Model", + "__data__": { + "id": "all-minilm:latest", + "created": 1747317111, + "object": "model", + "owned_by": "library" + } + }, + { + "__type__": "openai.types.model.Model", + "__data__": { + "id": "llama3.2:3b-instruct-fp16", + "created": 1744974677, + "object": "model", + "owned_by": "library" + } + }, + { + "__type__": "openai.types.model.Model", + "__data__": { + "id": "llama3.2:3b", + "created": 1743536220, + "object": "model", + "owned_by": "library" + } + } + ], + "is_streaming": false + } +} diff --git a/tests/unit/providers/inference/test_litellm_openai_mixin.py b/tests/unit/providers/inference/test_litellm_openai_mixin.py index bbc437edf..dc17e6abf 100644 --- a/tests/unit/providers/inference/test_litellm_openai_mixin.py +++ b/tests/unit/providers/inference/test_litellm_openai_mixin.py @@ -26,7 +26,6 @@ class TestProviderDataValidator(BaseModel): class TestLiteLLMAdapter(LiteLLMOpenAIMixin): def __init__(self, config: TestConfig): super().__init__( - model_entries=[], litellm_provider_name="test", api_key_from_config=config.api_key, provider_data_api_key_field="test_api_key", diff --git a/tests/unit/providers/nvidia/test_eval.py b/tests/unit/providers/nvidia/test_eval.py index 2bdcbbeba..55dfd7bee 100644 --- a/tests/unit/providers/nvidia/test_eval.py +++ b/tests/unit/providers/nvidia/test_eval.py @@ -150,7 +150,7 @@ class TestNVIDIAEvalImpl(unittest.TestCase): self._assert_request_body( { "config": f"nvidia/{MOCK_BENCHMARK_ID}", - "target": {"type": "model", "model": "meta/llama-3.1-8b-instruct"}, + "target": {"type": "model", "model": "Llama3.1-8B-Instruct"}, } ) diff --git a/tests/unit/providers/utils/inference/test_openai_mixin.py b/tests/unit/providers/utils/inference/test_openai_mixin.py index 93f82da19..d62292542 100644 --- a/tests/unit/providers/utils/inference/test_openai_mixin.py +++ b/tests/unit/providers/utils/inference/test_openai_mixin.py @@ -13,7 +13,6 @@ from llama_stack.apis.models import ModelType from llama_stack.providers.utils.inference.openai_mixin import OpenAIMixin -# Test implementation of OpenAIMixin for testing purposes class OpenAIMixinImpl(OpenAIMixin): def __init__(self): self.__provider_id__ = "test-provider" @@ -25,12 +24,35 @@ class OpenAIMixinImpl(OpenAIMixin): raise NotImplementedError("This method should be mocked in tests") +class OpenAIMixinWithEmbeddingsImpl(OpenAIMixin): + """Test implementation with embedding model metadata""" + + embedding_model_metadata = { + "text-embedding-3-small": {"embedding_dimension": 1536, "context_length": 8192}, + "text-embedding-ada-002": {"embedding_dimension": 1536, "context_length": 8192}, + } + + __provider_id__ = "test-provider" + + def get_api_key(self) -> str: + raise NotImplementedError("This method should be mocked in tests") + + def get_base_url(self) -> str: + raise NotImplementedError("This method should be mocked in tests") + + @pytest.fixture def mixin(): """Create a test instance of OpenAIMixin""" return OpenAIMixinImpl() +@pytest.fixture +def mixin_with_embeddings(): + """Create a test instance of OpenAIMixin with embedding model metadata""" + return OpenAIMixinWithEmbeddingsImpl() + + @pytest.fixture def mock_models(): """Create multiple mock OpenAI model objects""" @@ -181,3 +203,89 @@ class TestOpenAIMixinCacheBehavior: assert "some-mock-model-id" in mixin._model_cache assert "another-mock-model-id" in mixin._model_cache assert "final-mock-model-id" in mixin._model_cache + + +class TestOpenAIMixinEmbeddingModelMetadata: + """Test cases for embedding_model_metadata attribute functionality""" + + async def test_embedding_model_identified_and_augmented(self, mixin_with_embeddings, mock_client_context): + """Test that models in embedding_model_metadata are correctly identified as embeddings with metadata""" + # Create mock models: 1 embedding model and 1 LLM, while there are 2 known embedding models + mock_embedding_model = MagicMock(id="text-embedding-3-small") + mock_llm_model = MagicMock(id="gpt-4") + mock_models = [mock_embedding_model, mock_llm_model] + + mock_client = MagicMock() + + async def mock_models_list(): + for model in mock_models: + yield model + + mock_client.models.list.return_value = mock_models_list() + + with mock_client_context(mixin_with_embeddings, mock_client): + result = await mixin_with_embeddings.list_models() + + assert result is not None + assert len(result) == 2 + + # Find the models in the result + embedding_model = next(m for m in result if m.identifier == "text-embedding-3-small") + llm_model = next(m for m in result if m.identifier == "gpt-4") + + # Check embedding model + assert embedding_model.model_type == ModelType.embedding + assert embedding_model.metadata == {"embedding_dimension": 1536, "context_length": 8192} + assert embedding_model.provider_id == "test-provider" + assert embedding_model.provider_resource_id == "text-embedding-3-small" + + # Check LLM model + assert llm_model.model_type == ModelType.llm + assert llm_model.metadata == {} # No metadata for LLMs + assert llm_model.provider_id == "test-provider" + assert llm_model.provider_resource_id == "gpt-4" + + +class TestOpenAIMixinAllowedModels: + """Test cases for allowed_models filtering functionality""" + + async def test_list_models_with_allowed_models_filter(self, mixin, mock_client_with_models, mock_client_context): + """Test that list_models filters models based on allowed_models set""" + mixin.allowed_models = {"some-mock-model-id", "another-mock-model-id"} + + with mock_client_context(mixin, mock_client_with_models): + result = await mixin.list_models() + + assert result is not None + assert len(result) == 2 + + model_ids = [model.identifier for model in result] + assert "some-mock-model-id" in model_ids + assert "another-mock-model-id" in model_ids + assert "final-mock-model-id" not in model_ids + + async def test_list_models_with_empty_allowed_models(self, mixin, mock_client_with_models, mock_client_context): + """Test that empty allowed_models set allows all models""" + assert len(mixin.allowed_models) == 0 + + with mock_client_context(mixin, mock_client_with_models): + result = await mixin.list_models() + + assert result is not None + assert len(result) == 3 # All models should be included + + model_ids = [model.identifier for model in result] + assert "some-mock-model-id" in model_ids + assert "another-mock-model-id" in model_ids + assert "final-mock-model-id" in model_ids + + async def test_check_model_availability_with_allowed_models( + self, mixin, mock_client_with_models, mock_client_context + ): + """Test that check_model_availability respects allowed_models""" + mixin.allowed_models = {"final-mock-model-id"} + + with mock_client_context(mixin, mock_client_with_models): + assert await mixin.check_model_availability("final-mock-model-id") + assert not await mixin.check_model_availability("some-mock-model-id") + assert not await mixin.check_model_availability("another-mock-model-id") diff --git a/tests/unit/providers/utils/test_model_registry.py b/tests/unit/providers/utils/test_model_registry.py index db1630000..04e75aa82 100644 --- a/tests/unit/providers/utils/test_model_registry.py +++ b/tests/unit/providers/utils/test_model_registry.py @@ -84,14 +84,14 @@ def unknown_model() -> Model: @pytest.fixture def helper(known_provider_model: ProviderModelEntry, known_provider_model2: ProviderModelEntry) -> ModelRegistryHelper: - return ModelRegistryHelper([known_provider_model, known_provider_model2]) + return ModelRegistryHelper(model_entries=[known_provider_model, known_provider_model2]) class MockModelRegistryHelperWithDynamicModels(ModelRegistryHelper): """Test helper that simulates a provider with dynamically available models.""" def __init__(self, model_entries: list[ProviderModelEntry], available_models: list[str]): - super().__init__(model_entries) + super().__init__(model_entries=model_entries) self._available_models = available_models async def check_model_availability(self, model: str) -> bool: From 28d83faf8af5d1eedaae1f6d75ab5a63519d0774 Mon Sep 17 00:00:00 2001 From: Alexey Rybak <50731695+reluctantfuturist@users.noreply.github.com> Date: Thu, 25 Sep 2025 15:41:12 -0700 Subject: [PATCH 147/150] fix: docs deployment URL (#3556) # What does this PR do? Fixes Llama Stack docs deployment URL ## Test Plan ``` npm run gen-api-docs all npm run build ``` successfully builds the documentation --- docs/docusaurus.config.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/docusaurus.config.ts b/docs/docusaurus.config.ts index f4420df87..937aa4ddf 100644 --- a/docs/docusaurus.config.ts +++ b/docs/docusaurus.config.ts @@ -9,8 +9,8 @@ import type * as OpenApiPlugin from "docusaurus-plugin-openapi-docs"; const config: Config = { title: 'Llama Stack', tagline: 'The open-source framework for building generative AI applications', - url: 'https://reluctantfuturist.github.io', - baseUrl: '/llama-stack/', + url: 'https://llamastack.github.io', + baseUrl: '/', onBrokenLinks: "warn", onBrokenMarkdownLinks: "warn", favicon: "img/favicon.ico", From 9c751b6789b70e39b535610d6d69a891ed9e1415 Mon Sep 17 00:00:00 2001 From: Doug Edgar Date: Fri, 26 Sep 2025 02:17:25 -0700 Subject: [PATCH 148/150] feat: use FIPS validated CSPRNG for telemetry (#3554) # What does this PR do? Switches from `random.getrandbits` to `secrets.randbits` in the telemetry module. Closes #3553 ## Test Plan Unit tests from scripts/unit-tests.sh were ran to verify the tests still pass. Signed-off-by: Doug Edgar --- llama_stack/providers/utils/telemetry/tracing.py | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/llama_stack/providers/utils/telemetry/tracing.py b/llama_stack/providers/utils/telemetry/tracing.py index 9969b1055..62cceb13e 100644 --- a/llama_stack/providers/utils/telemetry/tracing.py +++ b/llama_stack/providers/utils/telemetry/tracing.py @@ -8,7 +8,7 @@ import asyncio import contextvars import logging # allow-direct-logging import queue -import random +import secrets import sys import threading import time @@ -76,16 +76,16 @@ def span_id_to_str(span_id: int) -> str: def generate_span_id() -> str: - span_id = random.getrandbits(64) + span_id = secrets.randbits(64) while span_id == INVALID_SPAN_ID: - span_id = random.getrandbits(64) + span_id = secrets.randbits(64) return span_id_to_str(span_id) def generate_trace_id() -> str: - trace_id = random.getrandbits(128) + trace_id = secrets.randbits(128) while trace_id == INVALID_TRACE_ID: - trace_id = random.getrandbits(128) + trace_id = secrets.randbits(128) return trace_id_to_str(trace_id) From 65e01b56842ef5c31b4d1f9a15508cce07521300 Mon Sep 17 00:00:00 2001 From: Matthew Farrellee Date: Fri, 26 Sep 2025 10:05:52 -0400 Subject: [PATCH 149/150] feat: together now supports base64 embedding encoding (#3559) # What does this PR do? use together's new base64 support ## Test Plan recordings for: ./scripts/integration-tests.sh --stack-config server:ci-tests --suite base --setup together --subdirs inference --pattern openai --- .../remote/inference/together/together.py | 9 +- .../inference/test_openai_embeddings.py | 1 - .../recordings/responses/1d54570bbe4b.json | 2353 +++++++++++++ .../recordings/responses/225b4d2263a7.json | 802 +++++ .../recordings/responses/2c55f483cea8.json | 59 + .../recordings/responses/33b71fb85bfb.json | 730 ++++ .../recordings/responses/3d89a56a76b1.json | 46 + .../recordings/responses/41ace09e5dba.json | 59 + .../recordings/responses/52b4e16b7289.json | 181 + .../recordings/responses/53365c6ae29c.json | 59 + .../recordings/responses/546dc9533c84.json | 801 +++++ .../recordings/responses/5c0552be2793.json | 3127 +++++++++++++++++ .../recordings/responses/6841bb14fa8d.json | 61 + .../recordings/responses/68e59155a09f.json | 802 +++++ .../recordings/responses/69464dfd3a06.json | 59 + .../recordings/responses/7550dd0d24bc.json | 166 + .../recordings/responses/8e5b53b9d493.json | 801 +++++ .../recordings/responses/a0ec01643fa2.json | 59 + .../recordings/responses/ae82d694f34c.json | 802 +++++ .../recordings/responses/b734171a0872.json | 801 +++++ .../recordings/responses/c8a59b661fd5.json | 46 + .../recordings/responses/d2e057a81717.json | 61 + .../recordings/responses/d5971b8fdb94.json | 801 +++++ .../recordings/responses/dcbe6260d0a1.json | 2352 +++++++++++++ .../recordings/responses/e8b427b3d631.json | 802 +++++ .../recordings/responses/ef4d211b38bf.json | 59 + .../recordings/responses/f4c5ae637cd1.json | 59 + 27 files changed, 15951 insertions(+), 7 deletions(-) create mode 100644 tests/integration/recordings/responses/1d54570bbe4b.json create mode 100644 tests/integration/recordings/responses/225b4d2263a7.json create mode 100644 tests/integration/recordings/responses/2c55f483cea8.json create mode 100644 tests/integration/recordings/responses/33b71fb85bfb.json create mode 100644 tests/integration/recordings/responses/3d89a56a76b1.json create mode 100644 tests/integration/recordings/responses/41ace09e5dba.json create mode 100644 tests/integration/recordings/responses/52b4e16b7289.json create mode 100644 tests/integration/recordings/responses/53365c6ae29c.json create mode 100644 tests/integration/recordings/responses/546dc9533c84.json create mode 100644 tests/integration/recordings/responses/5c0552be2793.json create mode 100644 tests/integration/recordings/responses/6841bb14fa8d.json create mode 100644 tests/integration/recordings/responses/68e59155a09f.json create mode 100644 tests/integration/recordings/responses/69464dfd3a06.json create mode 100644 tests/integration/recordings/responses/7550dd0d24bc.json create mode 100644 tests/integration/recordings/responses/8e5b53b9d493.json create mode 100644 tests/integration/recordings/responses/a0ec01643fa2.json create mode 100644 tests/integration/recordings/responses/ae82d694f34c.json create mode 100644 tests/integration/recordings/responses/b734171a0872.json create mode 100644 tests/integration/recordings/responses/c8a59b661fd5.json create mode 100644 tests/integration/recordings/responses/d2e057a81717.json create mode 100644 tests/integration/recordings/responses/d5971b8fdb94.json create mode 100644 tests/integration/recordings/responses/dcbe6260d0a1.json create mode 100644 tests/integration/recordings/responses/e8b427b3d631.json create mode 100644 tests/integration/recordings/responses/ef4d211b38bf.json create mode 100644 tests/integration/recordings/responses/f4c5ae637cd1.json diff --git a/llama_stack/providers/remote/inference/together/together.py b/llama_stack/providers/remote/inference/together/together.py index 653f84610..37973d635 100644 --- a/llama_stack/providers/remote/inference/together/together.py +++ b/llama_stack/providers/remote/inference/together/together.py @@ -6,7 +6,7 @@ from collections.abc import AsyncGenerator -from openai import NOT_GIVEN, AsyncOpenAI +from openai import AsyncOpenAI from together import AsyncTogether from together.constants import BASE_URL @@ -311,10 +311,9 @@ class TogetherInferenceAdapter(OpenAIMixin, ModelRegistryHelper, Inference, Need the standard OpenAI embeddings endpoint. The endpoint - - - does not return usage information + - not all models return usage information - does not support user param, returns 400 Unrecognized request arguments supplied: user - does not support dimensions param, returns 400 Unrecognized request arguments supplied: dimensions - - does not support encoding_format param, always returns floats, never base64 """ # Together support ticket #13332 -> will not fix if user is not None: @@ -322,13 +321,11 @@ class TogetherInferenceAdapter(OpenAIMixin, ModelRegistryHelper, Inference, Need # Together support ticket #13333 -> escalated if dimensions is not None: raise ValueError("Together's embeddings endpoint does not support dimensions param.") - # Together support ticket #13331 -> will not fix, compute client side - if encoding_format not in (None, NOT_GIVEN, "float"): - raise ValueError("Together's embeddings endpoint only supports encoding_format='float'.") response = await self.client.embeddings.create( model=await self._get_provider_model_id(model), input=input, + encoding_format=encoding_format, ) response.model = model # return the user the same model id they provided, avoid exposing the provider model id diff --git a/tests/integration/inference/test_openai_embeddings.py b/tests/integration/inference/test_openai_embeddings.py index 0598919a1..92064b651 100644 --- a/tests/integration/inference/test_openai_embeddings.py +++ b/tests/integration/inference/test_openai_embeddings.py @@ -41,7 +41,6 @@ def skip_if_model_doesnt_support_user_param(client, model_id): def skip_if_model_doesnt_support_encoding_format_base64(client, model_id): provider = provider_from_model(client, model_id) if provider.provider_type in ( - "remote::together", # param silently ignored, always returns floats "remote::databricks", # param silently ignored, always returns floats "remote::fireworks", # param silently ignored, always returns list of floats "remote::ollama", # param silently ignored, always returns list of floats diff --git a/tests/integration/recordings/responses/1d54570bbe4b.json b/tests/integration/recordings/responses/1d54570bbe4b.json new file mode 100644 index 000000000..8fc686895 --- /dev/null +++ b/tests/integration/recordings/responses/1d54570bbe4b.json @@ -0,0 +1,2353 @@ +{ + "request": { + "method": "POST", + "url": "https://api.together.xyz/v1/v1/embeddings", + "headers": {}, + "body": { + "model": "togethercomputer/m2-bert-80M-32k-retrieval", + "input": [ + "Hello, world!", + "How are you today?", + "This is a test." + ], + "encoding_format": "float" + }, + "endpoint": "/v1/embeddings", + "model": "togethercomputer/m2-bert-80M-32k-retrieval" + }, + "response": { + "body": { + "__type__": "openai.types.create_embedding_response.CreateEmbeddingResponse", + "__data__": { + "data": [ + { + "embedding": [ + -0.017041557, + -0.07436493, + 0.02897635, + -0.032216743, + 0.0056444216, + -0.029015187, + 0.06512343, + -0.040310342, + 0.05263593, + 0.0068842396, + 0.019191971, + -0.0064884443, + -0.01664521, + 0.014244285, + 0.036390014, + -0.040292, + 0.031780273, + 0.0039553884, + -0.055303488, + -0.028992416, + -0.02059435, + 0.05677091, + -0.043668333, + -0.014273451, + 0.15328151, + -0.023603301, + -0.049825363, + 0.007869072, + -0.010882995, + -0.033912696, + 0.053697765, + -0.00093928695, + 0.0017799847, + 0.038871024, + -0.069678165, + -0.067093275, + 0.025772842, + -0.057590123, + -0.015825877, + 0.020131286, + 0.020742312, + 0.003915491, + -0.018451879, + 0.020440312, + -0.023613403, + -0.039568678, + -0.013152008, + -0.01871725, + 0.021348018, + -0.019964654, + 0.038607903, + 0.018397795, + -0.0063561443, + -0.018936336, + -0.060981557, + -0.02152846, + 0.027057847, + 0.0014626224, + -0.018241309, + -0.07473041, + -0.02377323, + -0.033910733, + 0.02569418, + -0.024951216, + -0.0076659806, + -0.015425462, + 0.006604636, + 0.09833969, + -0.005054596, + 0.008841989, + -0.01836461, + -0.018554095, + 0.011605144, + -0.016599955, + -0.062196333, + -0.0037542647, + -0.025220644, + -0.027834827, + -0.020460974, + -0.050503097, + 0.032119684, + -0.023387104, + 0.050067227, + -0.05834235, + 0.023189448, + -0.021862485, + 0.023831544, + -0.016663097, + -0.041609522, + 0.025361128, + 0.002924296, + 0.01852158, + 0.08960255, + -0.003265466, + -0.058762494, + -0.06428431, + -0.014671485, + -0.046800107, + 0.02691456, + -0.0059303525, + -0.015431455, + 0.022179665, + 0.014044907, + 0.012218545, + 0.0053836405, + -0.025096457, + 0.009438382, + 0.032498095, + 0.06879721, + 0.056900814, + 0.019497631, + -0.122159146, + -0.106994465, + -0.017456975, + 0.047223866, + 0.06569824, + 0.04780035, + 0.018039258, + -0.0011028647, + -0.05067006, + 0.0106863845, + 0.027489506, + -0.014593985, + -0.039851535, + -0.09175489, + 0.037555773, + -0.060439512, + 0.008525801, + 0.0071557434, + -0.057973035, + -0.054225244, + 0.051505033, + -0.0008626373, + 0.069083415, + 0.064380065, + 0.09843996, + 0.0062191207, + -0.041505292, + -0.05381256, + -0.0073601264, + -0.03288613, + 0.011711341, + -0.09244605, + 0.0069717136, + -0.05722877, + 0.041075893, + 0.06521969, + -0.0018537377, + 0.016272636, + 0.008761483, + -0.029342752, + 0.020412564, + -0.07015791, + 0.033616304, + 0.039998446, + 0.01602917, + 0.044467725, + -0.08176377, + -0.036885373, + 0.03468746, + 0.0024068495, + 0.00056306267, + 0.02546511, + -0.053339135, + -0.027220095, + -0.021510394, + 0.054806393, + -0.005447777, + -0.05690438, + -0.028497366, + 0.01873974, + -0.035461064, + -0.00019089226, + -0.04914238, + 0.030303763, + 0.013396073, + 0.015789565, + -0.07714792, + -0.062155712, + -0.00677417, + 0.02850476, + 0.031491462, + 0.014566345, + 0.012163924, + 0.11814501, + -0.0043511004, + -0.017920421, + 0.004205825, + -0.0015928322, + -0.012145554, + 0.01663168, + -0.071173735, + 0.0029570858, + 0.12899451, + 0.004157568, + 0.010501232, + 0.07710632, + 0.062119417, + 0.021002673, + -0.023212241, + -0.04327007, + -0.0567023, + 0.04590105, + 0.0019161925, + 0.02637205, + 0.029331107, + -0.029769177, + -0.050466795, + -0.08057371, + 0.007419741, + -0.008777471, + 0.02217743, + 0.013535721, + 0.03426775, + 0.04592361, + 0.009423588, + -0.023030678, + -0.024462381, + 0.054334357, + 0.06710402, + 0.077300854, + 0.0300022, + -0.0035417816, + -0.0046773576, + -0.0927158, + -0.0218652, + -0.043468982, + -0.035734102, + -0.038873542, + -0.0412869, + -0.016015923, + 0.0038303286, + 0.08523618, + -0.05200533, + -0.014904317, + -0.016793448, + 0.04478206, + -0.017161047, + 0.02638292, + 0.007849463, + -0.040533304, + -0.017599737, + 0.047704253, + 0.034988616, + -0.013908102, + 0.044121094, + 0.040395457, + -0.010402818, + 0.0063570403, + -0.014962749, + 0.025776524, + 0.023681043, + 0.006042675, + 0.017647373, + 0.016301101, + -0.07793374, + -0.004771094, + 0.012728924, + -0.00047885205, + -0.051591527, + 0.03612118, + -0.02209703, + 0.052075963, + -0.021613466, + -0.026258182, + 0.008102769, + -0.04963262, + 0.00062747014, + -0.012579783, + 0.076374784, + -0.047350414, + -0.007680664, + 0.062471915, + -0.0061351187, + -0.043617643, + 0.023878522, + -0.09653609, + 0.018392054, + -0.039719462, + 0.065271765, + 0.034548305, + 0.004219043, + -0.003628092, + 0.0047836183, + 0.0132732885, + -0.028140727, + -0.015683327, + -0.052812085, + -0.019410037, + 0.06812139, + -0.041178964, + 0.014646207, + -0.0037439142, + 0.0003088275, + -0.04985693, + 0.0223661, + 0.008887433, + 0.0049061268, + 0.042707395, + -0.021471359, + -0.06471383, + 0.0022036259, + 0.030178884, + -0.002764245, + -0.0063233464, + -0.04146522, + -0.008236624, + 0.0037351896, + -0.027550086, + -0.0137326885, + 0.0055276263, + 0.0016785853, + 0.050191414, + 0.02629574, + -0.009129228, + 0.06351977, + -0.037435655, + 0.0467174, + -0.012987377, + -0.007550927, + -0.004503205, + 0.010520655, + 0.064984836, + 0.009879768, + 0.055787366, + -0.042653065, + 0.024189176, + 0.0378726, + -0.032453574, + 0.043519154, + 0.020133087, + -0.055212636, + -0.016188117, + 0.03764466, + -0.022142444, + 0.11164031, + 0.019020407, + -0.008950892, + 0.0517199, + 0.0014494535, + 0.041113462, + -0.0912906, + -0.04723132, + 0.008548748, + 0.028231544, + 0.023689618, + -0.039103802, + -0.034011997, + -0.04731894, + 0.03309799, + -0.044572156, + -0.116778485, + -0.028786778, + 0.05798776, + 0.05287191, + -0.0039562676, + -0.08213019, + -0.01224603, + -0.012757768, + 0.035721667, + 0.012440343, + 0.0053813523, + -0.072770126, + 0.0066190604, + 0.038976185, + -0.037760906, + -0.0031381482, + -0.052277293, + -0.016870236, + -0.053451907, + -0.05629483, + -0.034493946, + -0.0048654405, + 0.022051724, + 0.028501945, + 0.025858566, + -0.023936177, + -0.098391004, + -0.030646492, + -0.049461726, + -0.00086931954, + 0.03593346, + 0.015843417, + -0.03276966, + 0.008957432, + -0.022735167, + -0.012159252, + 0.07607085, + -0.059834506, + 0.004478244, + 0.03439635, + 0.03683821, + 0.062883355, + 0.054430448, + -0.029807799, + 0.0032295138, + 0.08891875, + -0.026941199, + -0.00618463, + -0.022683868, + -0.024138795, + -0.036633875, + 0.02097464, + -0.003001584, + 0.020455033, + 0.043717608, + 0.06566654, + -0.029039463, + -0.0066977167, + -0.04504434, + 0.022257777, + 0.054422457, + 0.029796708, + 0.009008146, + 0.028205348, + 0.06255052, + -0.004475601, + 0.059329458, + -0.038065027, + -0.027933009, + -0.07060949, + 0.013978787, + -0.051300917, + 0.02945564, + -0.008552103, + -0.009436655, + 0.039747514, + -0.016741823, + 0.04740887, + 0.03521937, + -0.012574282, + -0.089222826, + -0.043515395, + -0.04158566, + 0.0016020355, + 0.02684753, + -0.019394692, + -0.02156877, + 0.06316388, + 0.01663444, + 0.015482924, + 0.047349654, + -0.028341234, + 0.013805591, + -0.010708488, + -0.07627738, + 0.08611209, + 0.0089956885, + 0.034438204, + 0.016312746, + -0.03412846, + 0.0770598, + -0.06790466, + 0.036359854, + 0.08038976, + 0.023465984, + -0.019832904, + -0.0011524013, + -0.03804293, + 0.04106918, + -0.028220456, + 0.032340813, + -0.030669356, + -0.004353358, + -0.019439798, + 0.0020563425, + 0.03015629, + -0.06430176, + 0.0034439075, + -0.045720384, + -0.06526568, + -0.0004192516, + -0.016580455, + -0.012596616, + 0.039126, + -0.04699455, + -0.008973794, + 0.015056125, + 0.018929023, + -0.07840811, + -0.014792519, + -0.0044317124, + 0.019588342, + 0.035912346, + -0.035739247, + 0.058755044, + -0.01856197, + 0.021155646, + -0.073580906, + -0.04310776, + -0.023147091, + -0.010232029, + 0.06352039, + 0.039570276, + 0.020424508, + 0.051613245, + 0.013395984, + -0.003908009, + -0.04643392, + 0.019592889, + -0.008484923, + 0.0031434586, + -0.046069775, + -0.01765311, + -0.041277196, + -0.070297986, + 0.012561737, + -0.003500738, + -0.01729488, + -0.0033254062, + 0.053035453, + -0.054218896, + -0.029708259, + -0.0047281524, + 0.019236762, + -0.12249525, + 0.03018237, + -0.028753102, + -0.031858314, + 0.0811298, + -0.005711499, + -0.057587985, + 0.014153141, + 0.0006705577, + -0.024263157, + 0.016729265, + -0.03195949, + -0.007259763, + -0.0035231581, + -0.03890975, + 0.011460382, + -0.06591321, + -0.023756726, + -0.023958001, + 0.030074941, + -0.0040949634, + -0.048368257, + -0.029692868, + 0.027246583, + -0.024747347, + 0.014442731, + -0.00832639, + -0.0002390868, + -0.013635633, + 0.0035843733, + 0.02354072, + -0.012829061, + -0.0060750768, + -0.044952527, + -0.05725624, + 0.031746052, + -0.024419094, + 0.032444403, + -0.029308707, + 0.034302235, + -0.022495607, + 0.015296428, + -0.0057196384, + -7.8588724e-05, + 0.060303975, + 0.06299601, + 0.028222265, + -0.0071411408, + 0.015196491, + 0.02031155, + 0.039635558, + 0.079736926, + 0.008736669, + -0.023079613, + -0.04490686, + -0.021764707, + -0.015199573, + 0.036019534, + -0.0046079857, + 0.04429082, + -0.04291344, + -0.05991891, + -0.006501417, + 0.010603077, + 0.03435066, + -0.065568395, + -0.04424192, + 0.035055783, + 0.019717937, + 0.032764338, + 0.021240309, + -0.01646063, + 0.007835414, + 0.06857148, + -0.013750999, + 0.028333688, + -0.078255735, + -0.047899257, + -0.0006370693, + 0.012606231, + 0.012178417, + -0.013057751, + -0.008095854, + -0.013466724, + 0.019036459, + -0.025450038, + 0.021131655, + -0.02505666, + 0.012961284, + 0.0004236046, + -0.023920864, + -0.055114083, + 0.082351916, + 0.028973032, + 0.025259241, + 0.098259576, + -0.007385416, + 0.003546012, + -0.05316339, + -0.04186183, + 0.043638214, + -0.069299474, + -0.013284585, + -0.010019175, + 0.012883975, + 0.014200739, + -0.013508286, + 0.0086570075, + -0.020393575, + 0.10617594, + 0.028786503, + -0.018674662, + 0.026763268, + -0.0062548965, + -0.07215284, + 0.055464335, + 0.0029595464, + -0.009364344, + -0.096402094, + 0.02823341, + -0.022853011, + 0.04750492, + 0.008378555, + 0.016491622, + 0.01860681, + 0.048116222, + 0.106049344, + -0.028929656, + -0.008896546, + 0.033615295, + -0.0070807124, + -0.05684197, + -0.061439563, + 0.0060220268, + 0.046171866, + -0.01574131, + -0.07562956, + 0.0024098414, + 0.0006304895, + -0.07831614, + 0.060869616, + 0.00076000375, + -0.008209363, + -0.04139266, + -0.085268535, + -0.028194478, + -0.024567788, + -0.04218179, + 0.023546752, + 0.036236234, + 0.017199656, + -0.03315456, + -0.023814544, + 0.038755447, + -0.023165299, + -0.049283065, + -0.006907019, + 0.040826146, + 0.017533792, + -0.036849793, + -0.015506943, + -0.010768763, + -0.08758806, + -0.0295733, + 0.055843282, + -0.012555046, + 0.0076235603, + 0.008802991, + 0.026661193, + -0.023899797, + 0.043548774, + -0.034339137, + -0.027354732, + -0.07583677, + 0.020500224, + 0.036802996, + 0.031019075, + 0.04605757, + -0.004433706, + 0.0108612785, + 0.050121468, + -0.07816735, + -0.014776514, + -0.04565195, + -0.0036854912, + 0.0075577567, + -0.017044865, + 0.030597543, + -0.013623054, + -0.0648466, + -0.0318741, + -0.059455115, + -0.024783187, + -0.0088010235, + 0.11127796, + 0.03429834, + -0.010424589, + -0.06355135, + 0.034265812, + 0.02680333, + -0.007930513, + 0.030092249, + 0.008321974, + 0.03125566, + -0.06832331, + -0.0076806936, + 0.034010306, + -0.087202646, + -0.047684345, + 0.06384632, + -0.026591811, + -0.0016003181, + 0.05721666, + -0.0024700803, + -0.029714238, + 0.07761957, + -0.04561395, + -0.053199258, + 0.030417573, + -0.01958724, + 0.0012449475, + -0.04003076, + 0.08825553, + -0.023196172, + -0.08629044, + -0.049815316, + 0.027229005, + 0.0021765123, + 0.03438692, + -0.09314263, + -0.019655729, + 0.018762926, + 0.025670087, + -0.017116003, + 0.031716976, + -0.05509443, + 0.032953184, + -0.02264915, + 0.04861606, + -0.050201602, + 0.033154316, + 0.009971947, + -0.037610047, + 0.016600395, + -0.031037569, + -0.015495428, + 0.026365642, + -0.043527953, + 0.055781424, + 0.06780075, + -0.015966192, + 0.03201043, + 0.028026119 + ], + "index": 0, + "object": "embedding" + }, + { + "embedding": [ + -0.050693978, + -0.010858309, + 0.020310253, + -0.01049692, + 0.029866666, + -0.025998075, + 0.07918496, + -0.042496245, + -0.028718667, + -0.027305981, + -0.02330032, + -0.021886542, + -0.027306426, + 0.061016064, + 0.012688038, + 0.022281228, + -0.054594085, + 0.07765493, + 0.05386447, + 0.03140333, + -9.44268e-06, + -0.0011356915, + 0.022630688, + -0.014110621, + 0.030000638, + 0.007599051, + -0.06352133, + 0.053137243, + -0.056568034, + 0.057547573, + 0.0030512416, + 0.03837667, + 0.04789846, + 0.038161233, + -0.02627195, + -0.050061185, + 0.10019976, + 0.038518198, + 0.010254856, + 0.10148112, + 0.04869421, + -0.0073997034, + 0.05293147, + -0.034767445, + 0.07249512, + 0.05695461, + -0.03786103, + 0.007449489, + 0.020537589, + 0.000312089, + 0.016584814, + 0.001918721, + 0.05273067, + 0.027494889, + 0.0637688, + -0.06113676, + 0.041710924, + 0.039151315, + 0.045457218, + -0.042557742, + -0.03437774, + -0.03965357, + 0.035107236, + -0.030944545, + 0.018480912, + 0.016318278, + 0.010664849, + 0.06706701, + 0.028976813, + 0.04934793, + 0.01920518, + -0.022590633, + 0.05794299, + -0.014218797, + -0.10727855, + -0.04222983, + 0.014688315, + -0.009868972, + -0.030892346, + 0.024784064, + -0.01335315, + -0.030918332, + -0.022723109, + 0.018553259, + -0.030180262, + -0.0072358795, + 0.04466348, + 0.0028644707, + -0.08218491, + -0.035578046, + 0.034649692, + 0.014995248, + -0.034041993, + -0.01754551, + 0.012509432, + -0.12817404, + 0.022282014, + 0.038324747, + -0.007946491, + -0.10563139, + -0.0018780051, + -0.010040646, + 0.051342048, + -0.031782173, + 0.026881691, + -0.0070015015, + 0.1403214, + -0.0383665, + 0.13297008, + 0.01473871, + 0.0035459534, + -0.05397022, + 0.0027416502, + -0.008002018, + -0.05214072, + 0.046578355, + -0.06554441, + -0.01918899, + -0.044716686, + 0.016660467, + 0.0074168034, + 0.043397274, + 0.041952852, + -0.020719659, + 0.044949867, + 0.08868983, + -0.06033043, + -0.06299611, + -0.0299354, + -0.06335069, + -0.041603137, + 0.063161835, + 0.0053624725, + 0.04566859, + 0.01997067, + -0.08615492, + -0.00461124, + 0.039520558, + 0.040905517, + -0.035469536, + -0.04317211, + 0.011673073, + -0.06018417, + 0.0028443343, + -0.09747001, + -0.087689236, + 0.0004175659, + 0.07349427, + -0.002189792, + -0.023225918, + 0.031347603, + 0.003863699, + 0.03039125, + 0.0026322505, + -0.0044767857, + 0.037814893, + 0.013607858, + -0.04524581, + 0.006180776, + -0.025796989, + -0.0018575953, + 0.056745563, + -0.056899827, + -0.13912162, + 0.01923313, + -0.0072119716, + 0.03653831, + -0.03553157, + 0.008960138, + 0.01913016, + 0.041605312, + -0.030891325, + -0.050350275, + 0.017834349, + -0.06821085, + 0.024607243, + 0.016700145, + 0.06613456, + 0.048102804, + 0.06076021, + 0.006365906, + 0.009644411, + 0.044110093, + 0.04351857, + 0.06734216, + -0.0017035177, + -0.00439251, + -0.06284958, + -0.012278929, + -0.12074305, + -0.010177493, + -0.04965999, + 0.023366336, + -0.04580006, + 0.019479955, + -0.006699217, + 0.03502374, + 0.1611132, + -0.026563711, + 0.0025155211, + 0.018676694, + 0.0009814353, + -0.036826, + 0.017627593, + 0.07587332, + 0.006969805, + -0.051941425, + -0.06698752, + -0.006748652, + 0.026837183, + -0.0744657, + 0.011689156, + -0.01411786, + -0.031564586, + -0.07331578, + 0.001811603, + -0.017448701, + -0.0654881, + 0.00889219, + 0.056011263, + 0.054930564, + 0.027538713, + 0.010776839, + -0.009119489, + -0.034182906, + -0.07947322, + 0.010956856, + 0.0067299716, + -0.038189813, + -0.0017738482, + 0.0026462704, + -0.0539034, + -0.0066219224, + 0.00018278696, + 0.06491363, + 0.050116353, + 0.03692079, + 0.08176937, + 0.049276054, + -0.038431957, + 0.0041264175, + 0.0016263039, + 0.04835715, + 0.05372281, + -0.039015856, + -0.0035196007, + 0.022530695, + 0.055513002, + 0.030869612, + -0.008039368, + -0.013746457, + -0.045808554, + 0.021556988, + 0.0014481185, + 0.03700321, + 0.03712917, + 0.10185659, + -0.08633657, + 0.03425641, + 0.045996998, + -0.051326204, + -0.02598336, + 0.037188865, + 0.047904, + -0.016023936, + 0.051980697, + -0.036479976, + 0.10651916, + -0.008438165, + 0.04487357, + -0.0035620069, + -0.018047113, + 0.06171551, + 0.014961666, + -0.012419838, + -0.04932983, + -0.03162733, + 0.04412971, + 0.010965971, + 0.0099312, + -0.06457594, + -0.0020091454, + -0.012179282, + 0.011060499, + 0.013348316, + 0.0040744096, + -0.053495333, + -0.055626135, + -0.024634268, + 0.041642897, + -0.020521278, + 0.0077626, + -0.02442528, + 0.02345328, + -0.07039642, + 0.011572023, + -0.03946985, + -0.017554415, + -0.018510753, + -0.02628016, + 0.003842782, + -0.013968606, + 0.009930984, + -0.0019439043, + -0.001055162, + -0.024441715, + 0.002748, + 0.03797272, + -0.01796759, + 0.016857954, + -0.054101113, + 0.029492574, + 0.009648833, + 0.06267544, + 0.025378056, + 0.008614674, + 0.03406931, + 0.04041812, + 0.050837472, + 0.016481942, + -0.010224863, + -0.020784473, + -0.039759353, + 0.04798226, + 0.026257176, + -0.111021474, + 0.0015075838, + 0.07929549, + 0.029072981, + 0.03136461, + -0.09024568, + 0.03706794, + 0.00069653604, + 0.028990004, + 0.00158074, + -0.058231257, + -0.012032319, + -0.11285045, + 0.03993099, + 0.022554532, + 0.038430568, + -0.036563788, + -0.036297306, + 0.07201281, + 0.05026459, + -0.03646699, + -0.06714899, + -0.036391288, + 0.07507739, + 0.039017055, + 0.056063708, + -0.061854262, + 0.0077921483, + 0.026512198, + 0.0035518222, + -0.021420741, + -0.000929089, + 0.0051694694, + -0.054385625, + 0.015488236, + 0.0018151755, + 0.023275228, + -0.051910095, + 0.046563655, + -0.027084865, + -0.019521073, + 0.07038185, + -0.005629437, + 0.0104171075, + -0.025500813, + 0.012515233, + -0.018450025, + 0.0064471816, + -0.0822687, + 0.0514733, + -0.0007634487, + 0.041627247, + -0.016323347, + -0.0053568603, + 0.085863255, + 0.033773705, + -0.0048070354, + -0.0004412159, + -0.023257103, + 0.05561736, + 0.05207766, + 0.019670658, + 0.037812483, + -0.013077478, + -0.014929977, + 0.04772904, + 0.033561055, + -0.05835228, + 0.09368593, + -0.013790776, + 0.024843333, + 0.052117642, + 0.016168434, + -0.03309694, + -0.0332709, + 0.037880875, + -0.029704971, + 0.0103478255, + 0.0621371, + -0.00020507257, + 0.012393343, + -0.011916155, + 0.08173812, + -0.039204735, + -0.024686804, + 0.024316456, + 0.031949792, + 0.012687219, + 0.017169757, + -0.0016561806, + 0.017296743, + -0.005550947, + -0.04265122, + -0.0684987, + 0.06895011, + 0.016198147, + 0.12301288, + -0.027970051, + 0.07270332, + -0.0781321, + -0.023150189, + 0.019209703, + 0.050384432, + 0.063102365, + -0.1052462, + 0.013622426, + 0.024222417, + 0.07932484, + -0.044099297, + 0.05000115, + 0.01611413, + -0.066668235, + 0.03482801, + -0.03827191, + -0.016675064, + -0.008992525, + 0.01809865, + -0.0016681388, + 0.008033063, + -0.018875819, + 0.0005663335, + 0.044920616, + 0.076877005, + 0.06927666, + -0.05225116, + -0.032670625, + 0.067736275, + -0.027458396, + 0.04716389, + -0.02720322, + 0.013453853, + -0.038000166, + 0.04254829, + 0.02056911, + 0.07206648, + -0.032540064, + -0.0067454036, + -0.07023072, + 0.034042906, + -0.007585006, + -0.0068458025, + -0.019583486, + -0.079872504, + -0.04205456, + -0.09317277, + 0.008631627, + 0.029064497, + 0.055591475, + 0.049023792, + 0.017245598, + -0.027409904, + -0.008231064, + 0.05183169, + 0.088575125, + -0.00014200807, + -0.028889684, + 0.0103782285, + 0.031932928, + -0.0010171203, + 0.00889097, + 0.03915642, + -0.014465671, + 0.025092429, + -0.051718716, + -0.005562561, + 0.009389093, + -0.012151888, + 0.035728022, + -0.07083709, + 0.048586708, + -0.020331206, + 0.03032039, + -0.022218483, + -0.01604572, + -0.019281179, + -0.047274433, + 0.08225039, + -0.009769263, + -0.022123044, + -0.025783258, + 0.015255551, + 0.03588135, + 0.04413771, + -0.014886365, + -0.015528786, + -0.027134163, + -0.03344223, + -0.03906999, + -0.030708836, + 0.027987922, + -0.02679848, + -0.025790287, + 0.034544602, + -0.0015380334, + -0.011152637, + -0.033290375, + -0.06581815, + 0.06209049, + -0.012149317, + -0.06770575, + -0.029887203, + -0.021404674, + -0.048510525, + 0.020026335, + 0.021071516, + 0.01682142, + -0.12870917, + -0.012587804, + -0.04055468, + 0.047302578, + -0.037762202, + -0.046112824, + 0.010776369, + -0.014212859, + 0.02349173, + 0.09041585, + 1.565367e-05, + 0.07245511, + -0.033793304, + 0.035921212, + -0.02783346, + 0.0806998, + -0.010611987, + 0.041489985, + -0.017004602, + 0.024825959, + 0.0017323868, + 0.06234449, + 0.04331931, + 0.008339923, + 0.043990854, + 0.0060589914, + -0.022705998, + -0.020941943, + -0.00049144955, + 0.08638997, + 0.012002845, + 0.090267256, + 0.028547058, + -0.006239364, + 0.06821692, + 0.045356773, + 0.0515711, + -0.0023774423, + -0.0055029676, + -0.039530966, + -0.06231984, + 0.07199615, + -0.0736272, + 0.06531544, + 0.015005152, + 0.018980997, + 0.0010049999, + -0.01213177, + 0.05067269, + -0.026431412, + -0.039080206, + 0.051915344, + -0.018134514, + 0.008343715, + -0.038160358, + -0.033324458, + 0.0029796292, + -0.09010633, + -0.007604104, + -0.08881641, + -0.04259058, + -0.09903379, + -0.012423294, + 0.019745879, + -0.02834356, + 0.020667437, + -0.025804685, + 0.052014343, + 0.016800258, + -0.014739471, + -0.043742716, + 0.049421653, + 0.021032294, + -0.061259594, + -0.050550286, + 0.04592372, + 0.050988674, + 0.0491073, + -0.00096262776, + 0.08990844, + 0.037509143, + 0.028742973, + -0.118190385, + 0.010533227, + -0.03514427, + -0.08367883, + -0.013493585, + 0.02654289, + 0.014374991, + -0.039481364, + 0.1674116, + 0.07490431, + 0.058380052, + 0.027852368, + -0.061896965, + -0.022872766, + 0.047993485, + -0.065123655, + -0.07428092, + -0.041723747, + 0.080762535, + 0.010601916, + -0.035257086, + -0.047732975, + 6.712973e-05, + 0.05134923, + 0.050521225, + 0.025271116, + -0.0072390456, + 0.04151577, + 0.02572708, + -0.057142563, + -0.028259942, + 0.018771905, + -0.033247933, + -0.06304049, + 0.03697809, + -0.037529476, + 0.03391705, + 0.023996636, + -0.063727565, + -0.049316347, + -0.021822812, + -0.051387135, + 0.016310921, + 0.0016229213, + 0.006816926, + -0.028204253, + 0.027451735, + 0.024213102, + 0.07196294, + 0.00041893774, + -0.0096297115, + 0.049549352, + -0.06110793, + 0.0061441287, + -0.050353367, + -0.015283087, + -0.01888433, + -0.05886002, + 0.012889236, + 0.02860981, + 0.04765169, + -0.035136737, + 0.0049838605, + -0.064163454, + 0.051824152, + -0.01143845, + 0.007576831, + -0.018313015, + 0.012159296, + 0.034033798, + 0.020029843, + 0.019590652, + -0.010082555, + -0.022751726, + -0.0355381, + -0.038172133, + 0.12067669, + -0.075687334, + 0.01861976, + -0.031330068, + 0.026860299, + 0.006408792, + -0.0145417405, + 0.015177668, + -0.03025762, + 0.07643991, + 0.016266705, + -0.013141844, + -0.07231639, + 0.055646416, + -0.021509636, + -0.025625022, + -0.047063146, + -0.070508875, + -0.08632433, + -0.011631201, + -0.019939274, + -0.06350421, + -0.019870907, + 0.03216671, + 0.058062643, + 0.055208843, + -0.07156028, + 0.007989774, + 0.049972944, + 0.037406262, + -0.06293042, + -0.027840614, + -0.041593563, + -0.054527696, + 0.021761741, + 0.017650325, + -0.055453133, + -0.024841229, + 0.029395606, + -0.058559354, + 0.010116847, + -0.029088652, + 0.022447364, + 0.0079206675, + -0.015874255, + -0.0039944267, + -0.08912434, + -0.04124756, + 0.021253418, + -0.027858313, + -0.06234424, + -0.028922025, + -0.006749017, + -0.00204751, + 0.020167105, + -0.008826207, + -0.008012587, + -0.02876077, + 0.04325802, + -0.006442264, + 0.03814887, + -0.03429738, + 0.0058901254, + 0.02109685, + 0.01542989, + -0.06856703, + 0.037813462, + -0.007801844, + 0.038300894, + 0.03818303, + -0.06064273, + -0.03106093, + 0.017438883, + 0.0030734143, + 0.0013211939, + 0.017740646, + -0.030678462, + 0.02107452, + 0.061798688 + ], + "index": 1, + "object": "embedding" + }, + { + "embedding": [ + -0.02779177, + -0.007752902, + 0.00666607, + 0.007333073, + 0.027681155, + -0.04680753, + 0.034528963, + -0.050833542, + -0.055877283, + -0.075369135, + 0.018063514, + -0.0045533236, + -0.011292311, + 0.032624524, + -0.013017948, + -0.048883513, + -0.013815144, + 0.022201993, + -0.0025201102, + 0.03166489, + 0.06015168, + -0.0018540767, + 0.043800958, + 0.014623904, + 0.038353812, + -0.021314984, + 0.010522611, + -0.024581844, + 0.031366486, + 0.012493078, + -0.0007007419, + 0.009890471, + 0.05789071, + -0.05520709, + -0.02783322, + 0.018479174, + 0.0009625551, + -0.024165243, + 0.01635198, + 0.04199145, + 0.053655755, + -0.04307552, + 0.025551995, + -0.018680023, + 0.020759536, + 0.059369273, + -0.006988708, + -0.026320163, + -0.0025934891, + 0.026870603, + -0.009730706, + 0.018218627, + 0.005037782, + -0.0132323345, + -0.039169345, + -0.033258922, + -0.002247369, + 0.09466787, + 0.0056981854, + -0.022665996, + 0.06024469, + -0.016116608, + -0.003789675, + -0.025225416, + 0.019347968, + 0.024802739, + -0.049069185, + -0.012823434, + 0.000846098, + 0.018634543, + -0.060731795, + -0.03504043, + 0.085316636, + 0.013361458, + -0.012425992, + 0.0057458133, + -0.014212679, + 0.042268865, + -0.029114101, + -0.0011103856, + -0.044912685, + -0.028397746, + 0.021935457, + -0.027663197, + -0.11580737, + -0.055029213, + 0.05578334, + 0.0071452004, + -0.014473731, + -0.06328084, + 0.0140667, + -0.024593478, + 0.0046616863, + -0.007522579, + 0.025511945, + -0.07863747, + -0.0085762385, + 0.05148283, + -0.039227873, + -0.0816022, + -0.018585978, + -0.03510035, + 0.02342686, + -0.0042144833, + 0.029105023, + 0.00817719, + 0.10530593, + 0.056663927, + 0.051986016, + 0.0027708863, + -0.027644029, + -0.026126249, + 0.04316672, + 0.008625363, + -0.026928555, + 0.09236891, + -0.10665132, + 0.0022109712, + -0.04672772, + -0.0010714191, + 0.017687786, + 0.025763303, + 0.02738723, + -0.019653322, + -0.06636015, + 0.038601268, + -0.026597418, + -0.032743942, + -0.007986222, + -0.0077568023, + -0.021615017, + 0.014973637, + 0.036659174, + -0.002434029, + 0.056992944, + -0.0802926, + -0.034491055, + 0.057339218, + -0.031598423, + 0.01815245, + -0.05142944, + 0.09277832, + -0.023692241, + -0.02133611, + -0.024636442, + -0.06723946, + 0.026400885, + 0.08087762, + 0.0036785558, + 0.02101903, + -0.029615631, + -0.038861174, + 0.04874963, + 0.02979751, + 0.0060734656, + 0.05423366, + -0.030063542, + -0.004280309, + 0.05995971, + -0.042565927, + 0.0030267043, + 0.1041919, + 0.03300429, + -0.0050015924, + -0.01911076, + -0.026665272, + 0.016458593, + -0.050006777, + 0.05080731, + -0.065816425, + 0.026471464, + -0.027813306, + -0.036025744, + 0.03723687, + 0.018098509, + -0.044298846, + 0.024373472, + -0.016016398, + 0.03582579, + -0.026484434, + -0.0038789911, + 0.10619606, + 0.0022864433, + -0.014563999, + 0.004348137, + -0.013476688, + -0.0331399, + -0.07461764, + 0.032642554, + -0.014079754, + -0.007546746, + -0.04735429, + 0.028523289, + -0.025188936, + 0.0059138797, + 0.023881987, + 0.05757653, + 0.0380678, + 0.0012175398, + -0.02047756, + 0.0718534, + -0.04708265, + 0.023029216, + -0.027009143, + 0.087099396, + 0.0017206921, + 0.025318645, + -0.03911548, + -0.038268212, + 0.04721421, + -0.09048235, + 0.0018269889, + 0.03689738, + -0.0500337, + -0.0806958, + 0.015961647, + -0.0117793055, + -0.043277707, + 0.011102296, + 0.024736766, + 0.07859274, + -0.0010727937, + 0.014366967, + -0.07669862, + -0.007824215, + -0.07287751, + -0.016301835, + -0.003434503, + 0.019447176, + -0.051193517, + 0.08773244, + 0.006728499, + 0.052058756, + -0.039105475, + 0.052423023, + 0.015097122, + 0.009336027, + 0.022993218, + 0.031443782, + -0.0622707, + 0.03517323, + -0.033169843, + 0.097570434, + 0.010101814, + -0.062746756, + -0.032313753, + 0.039362427, + 0.12776423, + 0.019260308, + -0.050483607, + 0.036213342, + 0.0028129816, + 0.058977667, + -0.024792053, + -0.005835713, + 0.016384302, + 0.013303189, + -0.04755607, + -0.012990615, + 0.032058302, + -0.015489647, + -0.04008588, + 0.011562045, + 0.013523483, + -0.008329744, + 0.067591324, + -0.09078176, + 0.050933324, + -0.0001931563, + -0.01570064, + 0.0077628815, + -0.021175632, + 0.08191918, + 0.0042020655, + -0.057577576, + -0.024850775, + -0.016462047, + -0.01608794, + -0.0095810965, + 0.03440579, + -0.016924929, + -0.051613178, + -0.038862303, + -0.002591376, + -0.01687491, + -0.038348936, + -0.016345026, + -0.03499395, + -0.023711955, + -0.038983267, + 0.02909387, + 0.052785136, + -0.03956735, + 0.048813544, + -0.07408873, + -0.047479205, + -0.037384547, + 3.6122277e-05, + -0.00323103, + 0.014085068, + 0.02166948, + -0.025022797, + 0.00548469, + -0.00043267754, + 0.013587588, + -0.075237095, + -0.046044935, + 0.0037340645, + 0.015775705, + 0.0044056266, + -0.033436574, + 0.07790523, + 0.017369641, + 0.03162654, + 0.06311004, + 0.00030665845, + 0.02039911, + 0.030216057, + -0.0022921541, + -0.02669933, + -0.04271925, + -0.021516768, + -0.04860288, + 0.0037491426, + 0.044397604, + 0.013711982, + -0.0019044406, + 0.041717444, + 0.07527258, + 0.004396075, + -0.05697599, + 0.062371805, + 0.0122556435, + 0.018541628, + 0.013916607, + -0.001407872, + -0.074479096, + -0.0074305376, + 0.06843066, + -0.027167812, + 0.0020887114, + -0.03339334, + -0.069467865, + 0.027772086, + -0.029680463, + 0.0023603945, + -0.034341622, + -0.007946808, + 0.014316168, + 0.040272575, + -0.029381637, + -0.012669895, + -0.040007718, + -0.007849514, + 0.0037267352, + 0.025559353, + 0.01908747, + 0.010199893, + 0.02811712, + -0.015757034, + 0.023825217, + -0.050415065, + -0.028737074, + 0.03919414, + -0.0024481888, + -0.022511285, + 0.027958939, + 0.046735343, + 0.077127144, + 0.022440491, + 0.035965107, + -0.01409118, + 0.022490244, + -0.007463417, + 0.05943725, + 0.0740578, + -0.020744171, + -0.019496184, + -0.052855786, + -0.00028804876, + -0.05126455, + 0.015544, + 0.053731557, + -0.014565541, + 0.04822947, + -0.024476951, + 0.036131904, + -0.008535516, + 0.029941507, + 0.027597597, + 0.05004942, + -0.0634054, + -0.00058592664, + 0.075618185, + -0.06424452, + 0.0551141, + 0.07195737, + 0.0059559983, + -0.06548788, + 0.021463854, + 0.013003529, + -0.012621075, + 0.022944402, + 0.08323847, + 0.07705397, + 0.012239931, + -0.042122364, + 0.037349377, + -0.0023981212, + -0.018399907, + 0.047214046, + 0.0003528697, + 0.013069748, + 0.009889366, + -0.015569374, + 0.097634934, + -0.051274985, + -0.0035838345, + -0.081493884, + -0.034804776, + -0.068767905, + 0.06497728, + -0.04292809, + 0.009441323, + -0.050664015, + -0.026311554, + 0.043648314, + 0.05953572, + 0.02149848, + -0.070732236, + 0.032498803, + -0.01525829, + 0.025482485, + -0.07821578, + -0.0031100207, + 0.013336255, + 0.012977619, + 0.10831072, + -0.012108079, + 0.05215784, + -0.0014752754, + 0.04672664, + -0.006357827, + 0.03887902, + 0.0110858865, + 0.03910481, + 0.044483896, + 0.027306804, + 0.0304683, + -0.035071675, + 0.049174044, + -0.005893214, + -0.03226845, + 0.012989943, + -0.024567459, + 0.012174184, + -0.029126454, + 0.027247919, + 0.080386184, + 0.03994174, + -0.06301434, + -0.07710563, + -0.02356785, + -0.015658041, + -0.040340938, + 0.02344931, + -0.005036427, + -0.03987439, + 0.052536115, + -0.042034335, + -0.052926026, + 0.024309393, + -0.011847247, + -0.011882506, + -0.07358051, + -0.012023142, + 0.019672018, + 0.09082111, + 0.073102705, + -0.04581442, + -0.042871106, + -0.0347567, + 0.051297594, + 0.028319057, + -0.019270716, + -0.022108674, + 0.034829013, + -0.05005505, + -0.07417835, + 0.045196395, + 0.0032714135, + -0.07566778, + 0.048085734, + -0.005009543, + -0.0011667939, + -0.040728357, + -0.020352578, + -0.0021036982, + -0.037561715, + 0.018334854, + -0.048219055, + -0.005598004, + 0.052623373, + -0.046602413, + 0.00022030994, + 0.059313178, + 0.09316803, + 0.035902113, + -0.03455553, + -0.06944326, + 0.014147145, + -0.060626503, + -0.036259595, + -0.020195402, + 0.043234885, + -0.007683996, + 0.043373056, + 0.022036567, + 0.0020106016, + -0.035812076, + 0.063685834, + -0.03424115, + 0.06406924, + -0.0073639182, + -0.015726037, + -0.036662076, + -0.011314391, + -0.061053474, + -0.02398348, + -0.05477042, + -0.02349147, + -0.06840239, + -0.04402523, + 0.022536961, + 0.025341304, + -0.09786782, + 0.0008502628, + -0.054442905, + -0.023104902, + -0.0454393, + 0.05547487, + 0.02941837, + 0.042048343, + -0.06071158, + -0.011033424, + 0.0029785563, + 0.01214972, + 0.014557061, + 0.016386319, + -0.043748617, + -0.021092765, + -0.004604394, + 0.075954765, + 0.027810903, + -0.019764582, + -0.015932038, + 0.013924321, + -0.014167113, + -0.04632259, + -0.028052354, + 0.021453502, + -0.02792163, + 0.07461302, + 0.10187651, + 0.010440466, + 0.08697039, + 0.05600476, + -0.055770714, + -0.062498394, + -0.058112442, + -0.044180583, + -0.05975845, + 0.056162726, + -0.010600922, + 0.077493295, + -0.025435269, + 0.0923372, + 0.043819454, + -0.016430752, + -0.0015095237, + -0.0341286, + -0.002565857, + 0.005184101, + -0.071053594, + -0.010112436, + -0.045120917, + -0.0348495, + -0.006502529, + 0.03641696, + -0.027302794, + -0.02890681, + -0.033199534, + -0.07256904, + -0.03758855, + 0.070195265, + -0.0038111259, + 0.011434567, + -0.044890616, + 0.023136368, + 0.09412049, + 0.0091492105, + -0.0066012493, + -0.019036641, + 0.059483536, + -0.018774608, + -0.052236408, + -0.026530499, + -0.040146265, + 0.0271693, + 0.01088683, + 0.117901385, + -0.011070082, + 0.023090107, + -0.11041944, + -0.0023761739, + 0.052857988, + -0.027439566, + -0.009057878, + -0.0021141092, + -0.031223183, + -0.032892667, + 0.10651295, + 0.018553382, + -0.018379116, + 0.014873018, + -0.040512417, + -0.09556882, + -0.03374361, + -0.07808277, + 0.05681848, + -0.046243265, + -0.07731494, + -0.032985333, + -0.02485327, + 0.017732931, + -0.020051923, + 0.019893952, + 0.06432696, + 0.08048177, + 0.0135258045, + 0.024358852, + 0.009759977, + -0.04197342, + 0.032504115, + 0.056780778, + -0.015715199, + -0.044023775, + 0.078800865, + 0.018545117, + 0.016267061, + 0.021082798, + -0.051552717, + 3.997702e-05, + -0.03628584, + -0.021589098, + 0.008213196, + 0.0047702063, + -0.023508605, + -0.044364233, + 0.067961864, + 0.041272104, + -0.014481658, + -0.010015822, + 0.0012155318, + -0.0011898371, + -0.08544548, + -0.015493928, + -0.0961194, + -0.03561227, + -0.047253173, + -0.08211245, + 0.018751975, + 0.018324235, + 0.014308755, + 0.0015786501, + 0.038473077, + -0.038047757, + 0.0052879406, + -0.017839737, + 0.05342696, + -0.0057547847, + 0.013748893, + 0.019040905, + -0.008233868, + -0.02624656, + 0.023323942, + 0.015264979, + 0.01448448, + -0.008367796, + 0.01959026, + -0.063270934, + 0.017139366, + 0.045523375, + -0.026564969, + 0.017915701, + -0.006382077, + 0.023788478, + 0.04140121, + 0.026335489, + -0.010871567, + 0.04780582, + -0.04176159, + 0.07836516, + -0.0018306614, + 0.025779009, + -0.009535478, + -0.10667496, + -0.01856794, + -0.025107326, + -0.035873048, + -0.05994878, + 0.0076866797, + -0.0008296443, + 0.018000983, + 0.039555117, + -0.051457543, + -0.014178609, + 0.03977316, + -0.04112076, + -0.0056524235, + -0.03817852, + -0.009010357, + -0.049929984, + 0.02815696, + 0.07178824, + -0.0891005, + 0.029434266, + -0.024762046, + -0.039339434, + 0.02766893, + -0.06167313, + 0.040054474, + 0.040781498, + -0.012865714, + 0.022845585, + -0.061530273, + 0.0055303588, + 0.0707426, + -0.039974045, + -0.021843985, + 0.03287734, + 0.0024584641, + 0.008380913, + 0.027124694, + -0.00067393284, + 0.024518743, + -0.04561021, + 0.0014067562, + -0.0015057714, + -0.0045690965, + -0.05774384, + 0.030880308, + 0.0383094, + -0.035241883, + -0.041534826, + 0.00013213791, + -0.05538147, + 0.07076548, + 0.028332852, + -0.020840552, + 0.0026513778, + -0.040424034, + 0.02619544, + -0.053306147, + 0.02648879, + 0.013661143, + 0.012982066, + 0.07114231 + ], + "index": 2, + "object": "embedding" + } + ], + "model": "togethercomputer/m2-bert-80M-32k-retrieval", + "object": "list", + "usage": null + } + }, + "is_streaming": false + } +} diff --git a/tests/integration/recordings/responses/225b4d2263a7.json b/tests/integration/recordings/responses/225b4d2263a7.json new file mode 100644 index 000000000..66124cabd --- /dev/null +++ b/tests/integration/recordings/responses/225b4d2263a7.json @@ -0,0 +1,802 @@ +{ + "request": { + "method": "POST", + "url": "https://api.together.xyz/v1/v1/embeddings", + "headers": {}, + "body": { + "model": "togethercomputer/m2-bert-80M-32k-retrieval", + "input": [ + "What is the capital of France?" + ] + }, + "endpoint": "/v1/embeddings", + "model": "togethercomputer/m2-bert-80M-32k-retrieval" + }, + "response": { + "body": { + "__type__": "openai.types.create_embedding_response.CreateEmbeddingResponse", + "__data__": { + "data": [ + { + "embedding": [ + -0.01970832422375679, + 0.06973592191934586, + 0.06339020282030106, + -0.0476469062268734, + 0.02473558485507965, + 0.036016080528497696, + -0.030854633077979088, + -0.05661148950457573, + -0.03762897476553917, + -0.022825224325060844, + 0.07212689518928528, + -0.03594600036740303, + 0.028144309297204018, + -0.0572437047958374, + -0.01636800728738308, + 0.05597497895359993, + -0.0615837387740612, + -0.0772617980837822, + 0.07462957501411438, + -0.014081664383411407, + -0.046484049409627914, + 0.007972045801579952, + 0.05659373477101326, + 0.005015407223254442, + -0.021550362929701805, + 0.007466076873242855, + -0.01818244718015194, + 0.012974875047802925, + 0.12098025530576706, + 0.004642108455300331, + -0.03853101655840874, + -0.038064178079366684, + -0.00252514542080462, + -0.007285259198397398, + 0.0010585911804810166, + 0.0906301811337471, + 0.041732583194971085, + 0.0012193279108032584, + -0.022201454266905785, + 0.04487229138612747, + 0.05817768722772598, + 0.03595009818673134, + 0.003200811566784978, + -0.059940092265605927, + -0.03945835679769516, + -0.05063691735267639, + -0.0010590233141556382, + -0.013847910799086094, + -0.010883520357310772, + 0.05425434187054634, + 0.048579007387161255, + 0.05931898206472397, + 0.03469032421708107, + 0.040213894098997116, + 0.017600275576114655, + 0.030363716185092926, + 0.006166841834783554, + -0.031214607879519463, + -0.09986788034439087, + -0.08849328756332397, + -0.04174111783504486, + -0.06822851300239563, + 0.037840817123651505, + -0.011262879706919193, + 0.02725878357887268, + -0.03785941004753113, + 0.02948189154267311, + 0.052330728620290756, + -0.006199777591973543, + 0.015686513856053352, + 0.02012643963098526, + 0.03715239465236664, + 0.015146151185035706, + 0.0118742436170578, + 0.01236711349338293, + 0.08493024855852127, + 0.006574893835932016, + 0.012279890477657318, + 0.0497514046728611, + -0.03023892641067505, + 0.024616962298750877, + -0.002334396820515394, + -0.06940878927707672, + -0.09034860879182816, + -0.030876951292157173, + -0.05628745257854462, + 0.15566386282444, + 0.04915332421660423, + -0.05976790562272072, + -0.0651850774884224, + -0.01671917550265789, + 0.005158144049346447, + 0.03231115639209747, + -0.12673619389533997, + 0.01491079106926918, + -0.10013868659734726, + 0.0593881830573082, + 0.04409949108958244, + 0.02496299520134926, + -0.09309431165456772, + 0.016884522512555122, + 0.08458107709884644, + 0.001436055637896061, + -0.023505622521042824, + -0.1091550886631012, + 0.009409628808498383, + -0.06841670721769333, + 0.006294394377619028, + 0.011773636564612389, + -0.006649228744208813, + -0.025980884209275246, + 0.028650643303990364, + -0.004796619061380625, + -0.15275581181049347, + 0.07362587004899979, + 0.023234043270349503, + -0.07766558974981308, + 0.11400321125984192, + -0.0761248916387558, + 0.10137518495321274, + 0.04917748644948006, + -0.05897725000977516, + 0.028588805347681046, + -0.016921594738960266, + 0.020847199484705925, + 0.02583436481654644, + 0.0100707383826375, + -0.10680415481328964, + -0.039595309644937515, + -0.02198234759271145, + 0.04287746921181679, + 0.0770343467593193, + 0.12591315805912018, + 0.05319112911820412, + 0.06336589902639389, + -0.004751566331833601, + -0.027462828904390335, + 0.025833114981651306, + 0.031229868531227112, + 0.03495239466428757, + -0.03417152911424637, + 0.01695503294467926, + 0.008892396464943886, + -0.022700343281030655, + -0.010422530584037304, + -0.011403913609683514, + 0.06934408098459244, + -0.018299903720617294, + 0.05521678924560547, + 0.0448828861117363, + -0.035779181867837906, + 0.1004837155342102, + -0.052232082933187485, + -0.1069478765130043, + 0.010958191938698292, + -0.037957314401865005, + 0.012439441867172718, + -0.016643444076180458, + -0.003614538349211216, + 0.02663247659802437, + 0.011455153115093708, + -0.06175852194428444, + 0.024681027978658676, + 0.02250850759446621, + 0.05536889657378197, + 0.06054207682609558, + -0.0278964564204216, + -0.014830108731985092, + 0.0026953965425491333, + 0.01350411120802164, + 0.12171561270952225, + -0.08564072847366333, + -0.034310709685087204, + 0.08295650035142899, + 0.00242776982486248, + 0.04291205108165741, + 0.07752981036901474, + 0.059791646897792816, + -0.17697358131408691, + -0.05253177508711815, + -0.056304335594177246, + -0.08669780939817429, + 0.08720479905605316, + 0.09867717325687408, + 0.042815010994672775, + 0.056739237159490585, + -0.08280040323734283, + 0.022493114694952965, + -0.02084849216043949, + -0.02938813529908657, + -0.0007219210965558887, + 0.06848610937595367, + -0.04856500029563904, + -0.17225198447704315, + 0.05346125736832619, + 0.012011714279651642, + 0.0025602886453270912, + 0.0857025608420372, + 0.02747567743062973, + -0.049506328999996185, + 0.07006517052650452, + 0.04238149896264076, + -0.15906751155853271, + 0.03605888783931732, + 0.10328453034162521, + -0.07136455923318863, + 0.036719564348459244, + 0.08598599582910538, + 0.0641678124666214, + 0.016239356249570847, + -0.026155924424529076, + 0.05666787922382355, + 0.016006596386432648, + 0.011990846134722233, + -0.14744064211845398, + -0.026924695819616318, + 0.07851225882768631, + -0.015755966305732727, + -0.01938048005104065, + 0.01009741984307766, + 0.037861280143260956, + -0.018061142414808273, + -0.01375116128474474, + 0.06686730682849884, + -0.011987685225903988, + -0.09704967588186264, + 0.06962467730045319, + -0.041706811636686325, + -0.0633535385131836, + 0.040516119450330734, + 0.07941865921020508, + -0.05590837448835373, + 0.012286134995520115, + -0.0320778526365757, + 0.024782376363873482, + 0.023459354415535927, + 0.05950900912284851, + -0.06305302679538727, + -0.03517928719520569, + -0.0714961439371109, + -0.002884534653276205, + -0.040440525859594345, + 0.014511113986372948, + 0.0064672185108065605, + 0.04428369551897049, + -0.057187750935554504, + -0.020834827795624733, + 0.04081743583083153, + 0.014744394458830357, + -0.0902390256524086, + -0.020159481093287468, + 0.02022283524274826, + -0.023768901824951172, + 0.09302803874015808, + 0.0001490376889705658, + -0.03495747223496437, + 0.055485714226961136, + 0.08195064216852188, + -0.00781647115945816, + -0.041974276304244995, + -0.024822648614645004, + -0.03270355984568596, + 0.07572082430124283, + 0.07882461696863174, + -0.1703532338142395, + 0.007348283194005489, + 0.017360031604766846, + -0.04545089602470398, + 0.00336546846665442, + -0.03401961550116539, + -0.010519049130380154, + 0.0031063177157193422, + -0.05100075155496597, + -0.0038971842732280493, + 0.04990682750940323, + -0.005734169390052557, + -0.008000397123396397, + 0.011249272152781487, + 0.08259451389312744, + -0.009997809305787086, + -0.03317711129784584, + 0.08035999536514282, + -0.030665725469589233, + -0.013539387844502926, + 0.06129683554172516, + 0.005680982489138842, + -0.030879436060786247, + -0.015947014093399048, + -0.04250485822558403, + 0.036226458847522736, + 0.0077215759083628654, + -0.01335059106349945, + -0.017429955303668976, + 0.02677704021334648, + 0.05891023576259613, + -0.033094074577093124, + -0.009611436165869236, + 0.029392564669251442, + -0.019255351275205612, + 0.0028371994849294424, + -0.06841883808374405, + 0.09074953198432922, + -0.007491895463317633, + -0.05885957553982735, + -0.054593320935964584, + 0.03154400363564491, + -0.018664345145225525, + 0.0014028018340468407, + -0.007962699048221111, + -0.0073072719387710094, + 0.07813835889101028, + -0.009949258528649807, + -0.042123954743146896, + 0.0330609530210495, + -0.09078606963157654, + -0.0661826878786087, + -0.008728893473744392, + 0.0261079091578722, + 0.020198725163936615, + -0.001164281158708036, + 0.030456693843007088, + 0.013369766063988209, + 0.0473308339715004, + -0.1095656007528305, + -0.0035175648517906666, + 0.0019665348809212446, + 0.038703836500644684, + 0.004033247474581003, + -0.07139096409082413, + -0.025092288851737976, + 0.026497622951865196, + 0.010865016840398312, + -0.007291565183550119, + -0.008395146578550339, + 0.09979000687599182, + 0.014964831992983818, + 0.006895039696246386, + -0.05342651531100273, + 0.028149953112006187, + 0.02636386640369892, + -0.07864879816770554, + 0.07730228453874588, + -0.015716969966888428, + 0.09981396049261093, + 0.10495205223560333, + 0.1379401981830597, + 0.039402298629283905, + -0.06488822400569916, + 0.06241980195045471, + 0.01095480564981699, + -0.038665588945150375, + 0.13688994944095612, + -0.020979976281523705, + 0.006442971993237734, + -0.04762554541230202, + -0.050086282193660736, + -0.01811848394572735, + 0.03287108987569809, + -0.023971999064087868, + 0.07773148268461227, + -0.034932006150484085, + 0.07602691650390625, + -0.017853112891316414, + -0.005400413181632757, + -0.053703248500823975, + 0.06815090030431747, + -0.02043701708316803, + 0.04952498897910118, + 0.05423223227262497, + -0.01902719773352146, + -0.03968493640422821, + -0.06244910880923271, + -0.02818591706454754, + -0.0901985615491867, + 0.0008713805582374334, + 0.0062495567835867405, + -0.025452183559536934, + -0.031959064304828644, + 0.12171333283185959, + -0.06405504792928696, + -0.020061912015080452, + 0.0356234535574913, + -0.007606834638863802, + 0.005293095018714666, + 0.036428119987249374, + 0.06186530366539955, + -0.0005228556110523641, + 0.047188978642225266, + -0.05147498473525047, + -0.026932740584015846, + 0.03888168931007385, + -0.09699693322181702, + 0.023630235344171524, + 0.005371326580643654, + 0.015998994931578636, + 0.0003666430420707911, + 0.04907926544547081, + 0.008110874332487583, + 0.047511179000139236, + -0.06465531885623932, + -0.0073038008995354176, + -0.04283558949828148, + 0.04818195849657059, + 0.047115594148635864, + 0.005004839971661568, + 0.01839282736182213, + -0.11655856668949127, + -0.048311498016119, + -0.11851174384355545, + 0.027857793495059013, + -0.017113903537392616, + 0.09556174278259277, + 0.03273570165038109, + -0.07939599454402924, + -0.008300776593387127, + 0.012330071069300175, + -0.03996765613555908, + 0.06578177213668823, + -0.12040718644857407, + 0.017966903746128082, + 0.009441595524549484, + 0.019408095628023148, + 0.0386037640273571, + 0.020615454763174057, + 0.07171255350112915, + -0.02859123796224594, + 0.05328092724084854, + 0.02087463065981865, + -0.04982484132051468, + -0.03510921075940132, + 0.025723610073328018, + -0.021969307214021683, + -0.038896411657333374, + -0.0030326545238494873, + -0.011459474451839924, + -0.05368846282362938, + -0.01735803298652172, + -0.10430730879306793, + -0.0481608547270298, + 0.07020232826471329, + 0.09553399682044983, + -0.05687297135591507, + 0.09741470217704773, + 0.023591971024870872, + 0.08581022173166275, + -0.048408862203359604, + 0.013134839944541454, + 0.05038471519947052, + 0.04907285422086716, + 0.006127485539764166, + 0.03915533423423767, + -0.05594480037689209, + -0.08703725785017014, + -0.08769574016332626, + 0.010736892931163311, + 0.06320276111364365, + -0.007989616133272648, + 0.08732284605503082, + -0.02034064009785652, + 0.015313192270696163, + 0.03629201650619507, + 0.034474775195121765, + 0.06430205702781677, + 0.0020889199804514647, + -0.05312385782599449, + 0.01831977441906929, + -0.012571982108056545, + 0.020523348823189735, + 0.02271760255098343, + 0.0199508648365736, + 0.0419381819665432, + -0.01719197817146778, + 0.03996086120605469, + -0.05291396379470825, + 0.05518871545791626, + -0.04077994078397751, + -0.018808426335453987, + -0.00802540685981512, + -0.016489434987306595, + -0.05184184014797211, + 0.007551070302724838, + -0.03549691662192345, + 0.049017034471035004, + -0.061343707144260406, + 0.08948376029729843, + -0.010120436549186707, + -0.06860023736953735, + -0.003899200586602092, + -0.10330148786306381, + -0.08999688923358917, + 0.030074885115027428, + -0.039791032671928406, + 0.11411391198635101, + -0.03553398698568344, + 0.03152026981115341, + 0.011465642601251602, + 0.059032928198575974, + -0.0031185627449303865, + 0.03391928970813751, + 0.013379181735217571, + 0.016364645212888718, + 0.06576719135046005, + 0.09512922912836075, + 0.14299455285072327, + -0.009059438481926918, + -0.06343400478363037, + 0.041009820997714996, + 0.08385325968265533, + -0.11938642710447311, + 0.056769926100969315, + 0.012045303359627724, + -0.11157312244176865, + -0.017104897648096085, + -0.0487101674079895, + 0.1471950113773346, + 0.010011108592152596, + 0.13776572048664093, + -0.004685565363615751, + -0.012601284310221672, + 0.08867102116346359, + -0.08892746269702911, + -0.09875845909118652, + -0.06571769714355469, + 0.07505372911691666, + 0.011863797903060913, + 0.05538568273186684, + 0.01753435842692852, + -0.07213204354047775, + -0.05682818964123726, + 0.00998744834214449, + 0.02545950934290886, + 0.01886233128607273, + -0.039678677916526794, + 0.05204062908887863, + -0.06929492950439453, + -0.001108978409320116, + -0.02570975571870804, + -0.001650663441978395, + -0.01176548097282648, + 0.045692771673202515, + 0.056068118661642075, + 0.0661809891462326, + -0.02520962432026863, + -0.10593820363283157, + -0.10804887861013412, + -0.020683452486991882, + -0.005477438680827618, + 0.024770764634013176, + 0.07821083813905716, + 0.012553723528981209, + 0.007506367284804583, + 2.3520085960626602e-05, + -0.029135674238204956, + -0.076198510825634, + 0.08536317944526672, + -0.01657869853079319, + 0.04385578632354736, + -0.0772562026977539, + 0.005188582465052605, + 0.049979791045188904, + -0.06056411564350128, + -0.08391109853982925, + -0.06077081710100174, + -0.008781449869275093, + -0.011842862702906132, + -0.07997778803110123, + -0.01606394723057747, + 0.04154130443930626, + -0.05641850084066391, + -0.006831947714090347, + 0.06409531831741333, + 0.028369562700390816, + 0.052074600011110306, + 0.0348689928650856, + -0.0008872381877154112, + 0.006672622170299292, + 0.04850737750530243, + 0.005414317362010479, + -0.048521313816308975, + -0.026075325906276703, + 0.07934144884347916, + 0.005803801119327545, + -0.028049731627106667, + -0.03317294642329216, + -0.10424027591943741, + -0.05862601473927498, + -0.054002031683921814, + -0.03496117889881134, + -0.005786501336842775, + 0.01869465596973896, + -0.0716874748468399, + 0.03654158487915993, + 0.03871994838118553, + -0.0014013899490237236, + 0.00667097931727767, + 0.005493564996868372, + -0.0037677220534533262, + 0.028866715729236603, + 0.008601633831858635, + -0.011309036985039711, + 0.006561725400388241, + 0.003093352075666189, + -0.05333438143134117, + 0.11794350296258926, + 0.05515727028250694, + -0.045878659933805466, + -0.007742924615740776, + 0.05761441960930824, + 0.04962746798992157, + -0.05010354891419411, + -0.029717203229665756, + -0.030527284368872643, + 0.03150942549109459, + -0.02865293063223362, + 0.05704553425312042, + -0.04078275337815285, + 0.0030061027500778437, + -0.03728826716542244, + -0.0038562272675335407, + 0.046621695160865784, + -0.0399412102997303, + -0.06038284674286842, + -0.01777978055179119, + -0.05188119783997536, + 0.02835647016763687, + -0.029642196372151375, + -0.016305141150951385, + -0.031576007604599, + 0.017664453014731407, + -0.041909970343112946, + -0.012923586182296276, + -0.021099943667650223, + -0.017399169504642487, + 0.056286755949258804, + -0.05219496041536331, + -0.11236775666475296, + 0.00020210817456245422, + 0.034043293446302414, + 0.037877317517995834, + 0.07059024274349213, + 0.01576846092939377, + 0.00600209878757596, + 0.03498513251543045, + -0.07349121570587158, + 0.010249773971736431, + 0.0006832143990322948, + 0.007001726888120174, + -0.007545476779341698, + -0.0071549611166119576, + 0.013768760487437248, + -0.07035242766141891, + 0.0011084708385169506, + 0.04469631239771843, + 0.03711879998445511, + 0.09525424242019653, + 0.088236004114151, + -0.010062330402433872, + 0.04878973588347435, + 0.018639028072357178, + -0.07545189559459686, + 0.012827134691178799, + 0.011818451806902885, + -0.00043396090040914714, + 0.023057980462908745, + 0.018296075984835625, + 0.05173768103122711, + 0.04826314374804497, + -0.06903506070375443, + -0.013263779692351818, + 0.046295709908008575, + 0.0382310189306736, + 0.006243202835321426, + 0.03561382368206978, + 0.05397462099790573, + 0.011734798550605774, + 0.04356921464204788, + -0.12166430056095123, + -0.06433001905679703, + 0.023853130638599396, + -0.0015384622383862734, + -0.12167169153690338, + 0.014306800439953804, + 0.0328274741768837, + 0.043768156319856644, + -0.005291013978421688, + -0.08029299229383469, + -0.051037609577178955, + -0.01827603206038475, + 0.06053758040070534, + -0.059887759387493134, + -0.032715871930122375, + 0.05102593079209328, + -0.08917390555143356, + -0.03805398568511009, + 0.00810143630951643, + 0.021369729191064835, + -6.789527833461761e-05, + -0.04995651915669441, + 0.015594455413520336, + 0.0017202553572133183, + -0.036478441208601, + -0.023708082735538483, + -0.10896393656730652, + -0.006573833059519529, + -0.05991625040769577, + -0.0019618964288383722, + 0.11073953658342361, + -0.01818089187145233, + -0.03572739660739899, + 0.09510193765163422, + 0.023465821519494057, + -0.02191684953868389, + 0.08381339907646179, + 0.09135788679122925, + 0.027638541534543037, + -0.0589328408241272, + -0.06251821666955948, + 0.016308434307575226, + 0.0911746472120285, + -0.0646301731467247, + -0.09164340794086456, + 0.032364875078201294, + -0.06892918050289154, + -0.020094409584999084, + -0.040389593690633774, + 0.020000949501991272, + 0.08940748870372772, + 0.041878264397382736, + -0.011807584203779697, + 0.021119650453329086, + 0.04327758401632309, + 0.008469630964100361, + 0.032335314899683, + -0.02453739382326603, + -0.04345237836241722, + -0.04026284068822861, + -0.047669146209955215, + 0.03758959099650383, + 0.011994728818535805, + 0.01332483347505331, + -0.044041428714990616, + -0.0013196832733228803, + -0.060047995299100876, + 0.011327322572469711, + 0.08492118865251541, + 0.028005098924040794, + -0.009107382968068123, + 0.05239562690258026, + 0.03746683895587921, + 0.04791608080267906, + -0.013966036029160023, + -0.005161612294614315, + -0.11603696644306183, + 0.038569845259189606, + 0.005635268986225128, + -0.07037810236215591, + 0.030191345140337944, + -0.01739041693508625, + 0.07960490137338638, + -0.018345264717936516, + 0.006483801174908876, + 0.1404862403869629, + -0.02148035168647766, + -0.05914505571126938, + -0.010929574258625507, + -0.03669396787881851, + 0.04541589319705963, + 0.03889324888586998 + ], + "index": 0, + "object": "embedding" + } + ], + "model": "togethercomputer/m2-bert-80M-32k-retrieval", + "object": "list", + "usage": null + } + }, + "is_streaming": false + } +} diff --git a/tests/integration/recordings/responses/2c55f483cea8.json b/tests/integration/recordings/responses/2c55f483cea8.json new file mode 100644 index 000000000..938f3e203 --- /dev/null +++ b/tests/integration/recordings/responses/2c55f483cea8.json @@ -0,0 +1,59 @@ +{ + "request": { + "method": "POST", + "url": "https://api.together.xyz/v1/v1/chat/completions", + "headers": {}, + "body": { + "model": "meta-llama/Llama-3.3-70B-Instruct-Turbo-Free", + "messages": [ + { + "role": "user", + "content": "Quick test" + } + ], + "max_tokens": 5 + }, + "endpoint": "/v1/chat/completions", + "model": "meta-llama/Llama-3.3-70B-Instruct-Turbo-Free" + }, + "response": { + "body": { + "__type__": "openai.types.chat.chat_completion.ChatCompletion", + "__data__": { + "id": "oCfwhT4-4Yz4kd-984c28c09bb58fab", + "choices": [ + { + "finish_reason": "length", + "index": 0, + "logprobs": null, + "message": { + "content": "Quick test, indeed.", + "refusal": null, + "role": "assistant", + "annotations": null, + "audio": null, + "function_call": null, + "tool_calls": [] + }, + "seed": 7090417062976472000 + } + ], + "created": 1758820480, + "model": "meta-llama/Llama-3.3-70B-Instruct-Turbo-Free", + "object": "chat.completion", + "service_tier": null, + "system_fingerprint": null, + "usage": { + "completion_tokens": 5, + "prompt_tokens": 37, + "total_tokens": 42, + "completion_tokens_details": null, + "prompt_tokens_details": null, + "cached_tokens": 0 + }, + "prompt": [] + } + }, + "is_streaming": false + } +} diff --git a/tests/integration/recordings/responses/33b71fb85bfb.json b/tests/integration/recordings/responses/33b71fb85bfb.json new file mode 100644 index 000000000..763388a6d --- /dev/null +++ b/tests/integration/recordings/responses/33b71fb85bfb.json @@ -0,0 +1,730 @@ +{ + "request": { + "method": "POST", + "url": "https://api.together.xyz/v1/v1/chat/completions", + "headers": {}, + "body": { + "model": "meta-llama/Llama-3.3-70B-Instruct-Turbo-Free", + "messages": [ + { + "role": "user", + "content": "What's the weather in Tokyo?" + } + ], + "response_format": { + "type": "text" + }, + "stream": true + }, + "endpoint": "/v1/chat/completions", + "model": "meta-llama/Llama-3.3-70B-Instruct-Turbo-Free" + }, + "response": { + "body": [ + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "oCfxg3w-4Yz4kd-984c2d684c778f6d", + "choices": [ + { + "delta": { + "content": "{\"", + "function_call": null, + "refusal": null, + "role": "assistant", + "tool_calls": null, + "token_id": 5018 + }, + "finish_reason": null, + "index": 0, + "logprobs": null, + "text": "{\"", + "seed": null + } + ], + "created": 1758820670, + "model": "meta-llama/Llama-3.3-70B-Instruct-Turbo-Free", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": null, + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "oCfxg3w-4Yz4kd-984c2d684c778f6d", + "choices": [ + { + "delta": { + "content": "type", + "function_call": null, + "refusal": null, + "role": "assistant", + "tool_calls": null, + "token_id": 1337 + }, + "finish_reason": null, + "index": 0, + "logprobs": null, + "text": "type", + "seed": null + } + ], + "created": 1758820670, + "model": "meta-llama/Llama-3.3-70B-Instruct-Turbo-Free", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": null, + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "oCfxg3w-4Yz4kd-984c2d684c778f6d", + "choices": [ + { + "delta": { + "content": "\":", + "function_call": null, + "refusal": null, + "role": "assistant", + "tool_calls": null, + "token_id": 794 + }, + "finish_reason": null, + "index": 0, + "logprobs": null, + "text": "\":", + "seed": null + } + ], + "created": 1758820670, + "model": "meta-llama/Llama-3.3-70B-Instruct-Turbo-Free", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": null, + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "oCfxg3w-4Yz4kd-984c2d684c778f6d", + "choices": [ + { + "delta": { + "content": " \"", + "function_call": null, + "refusal": null, + "role": "assistant", + "tool_calls": null, + "token_id": 330 + }, + "finish_reason": null, + "index": 0, + "logprobs": null, + "text": " \"", + "seed": null + } + ], + "created": 1758820670, + "model": "meta-llama/Llama-3.3-70B-Instruct-Turbo-Free", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": null, + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "oCfxg3w-4Yz4kd-984c2d684c778f6d", + "choices": [ + { + "delta": { + "content": "function", + "function_call": null, + "refusal": null, + "role": "assistant", + "tool_calls": null, + "token_id": 1723 + }, + "finish_reason": null, + "index": 0, + "logprobs": null, + "text": "function", + "seed": null + } + ], + "created": 1758820670, + "model": "meta-llama/Llama-3.3-70B-Instruct-Turbo-Free", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": null, + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "oCfxg3w-4Yz4kd-984c2d684c778f6d", + "choices": [ + { + "delta": { + "content": "\",", + "function_call": null, + "refusal": null, + "role": "assistant", + "tool_calls": null, + "token_id": 498 + }, + "finish_reason": null, + "index": 0, + "logprobs": null, + "text": "\",", + "seed": null + } + ], + "created": 1758820670, + "model": "meta-llama/Llama-3.3-70B-Instruct-Turbo-Free", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": null, + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "oCfxg3w-4Yz4kd-984c2d684c778f6d", + "choices": [ + { + "delta": { + "content": " \"", + "function_call": null, + "refusal": null, + "role": "assistant", + "tool_calls": null, + "token_id": 330 + }, + "finish_reason": null, + "index": 0, + "logprobs": null, + "text": " \"", + "seed": null + } + ], + "created": 1758820670, + "model": "meta-llama/Llama-3.3-70B-Instruct-Turbo-Free", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": null, + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "oCfxg3w-4Yz4kd-984c2d684c778f6d", + "choices": [ + { + "delta": { + "content": "name", + "function_call": null, + "refusal": null, + "role": "assistant", + "tool_calls": null, + "token_id": 609 + }, + "finish_reason": null, + "index": 0, + "logprobs": null, + "text": "name", + "seed": null + } + ], + "created": 1758820670, + "model": "meta-llama/Llama-3.3-70B-Instruct-Turbo-Free", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": null, + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "oCfxg3w-4Yz4kd-984c2d684c778f6d", + "choices": [ + { + "delta": { + "content": "\":", + "function_call": null, + "refusal": null, + "role": "assistant", + "tool_calls": null, + "token_id": 794 + }, + "finish_reason": null, + "index": 0, + "logprobs": null, + "text": "\":", + "seed": null + } + ], + "created": 1758820670, + "model": "meta-llama/Llama-3.3-70B-Instruct-Turbo-Free", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": null, + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "oCfxg3w-4Yz4kd-984c2d684c778f6d", + "choices": [ + { + "delta": { + "content": " \"", + "function_call": null, + "refusal": null, + "role": "assistant", + "tool_calls": null, + "token_id": 330 + }, + "finish_reason": null, + "index": 0, + "logprobs": null, + "text": " \"", + "seed": null + } + ], + "created": 1758820670, + "model": "meta-llama/Llama-3.3-70B-Instruct-Turbo-Free", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": null, + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "oCfxg3w-4Yz4kd-984c2d684c778f6d", + "choices": [ + { + "delta": { + "content": "get", + "function_call": null, + "refusal": null, + "role": "assistant", + "tool_calls": null, + "token_id": 456 + }, + "finish_reason": null, + "index": 0, + "logprobs": null, + "text": "get", + "seed": null + } + ], + "created": 1758820670, + "model": "meta-llama/Llama-3.3-70B-Instruct-Turbo-Free", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": null, + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "oCfxg3w-4Yz4kd-984c2d684c778f6d", + "choices": [ + { + "delta": { + "content": "_weather", + "function_call": null, + "refusal": null, + "role": "assistant", + "tool_calls": null, + "token_id": 70464 + }, + "finish_reason": null, + "index": 0, + "logprobs": null, + "text": "_weather", + "seed": null + } + ], + "created": 1758820670, + "model": "meta-llama/Llama-3.3-70B-Instruct-Turbo-Free", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": null, + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "oCfxg3w-4Yz4kd-984c2d684c778f6d", + "choices": [ + { + "delta": { + "content": "\",", + "function_call": null, + "refusal": null, + "role": "assistant", + "tool_calls": null, + "token_id": 498 + }, + "finish_reason": null, + "index": 0, + "logprobs": null, + "text": "\",", + "seed": null + } + ], + "created": 1758820670, + "model": "meta-llama/Llama-3.3-70B-Instruct-Turbo-Free", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": null, + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "oCfxg3w-4Yz4kd-984c2d684c778f6d", + "choices": [ + { + "delta": { + "content": " \"", + "function_call": null, + "refusal": null, + "role": "assistant", + "tool_calls": null, + "token_id": 330 + }, + "finish_reason": null, + "index": 0, + "logprobs": null, + "text": " \"", + "seed": null + } + ], + "created": 1758820670, + "model": "meta-llama/Llama-3.3-70B-Instruct-Turbo-Free", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": null, + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "oCfxg3w-4Yz4kd-984c2d684c778f6d", + "choices": [ + { + "delta": { + "content": "parameters", + "function_call": null, + "refusal": null, + "role": "assistant", + "tool_calls": null, + "token_id": 14105 + }, + "finish_reason": null, + "index": 0, + "logprobs": null, + "text": "parameters", + "seed": null + } + ], + "created": 1758820670, + "model": "meta-llama/Llama-3.3-70B-Instruct-Turbo-Free", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": null, + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "oCfxg3w-4Yz4kd-984c2d684c778f6d", + "choices": [ + { + "delta": { + "content": "\":", + "function_call": null, + "refusal": null, + "role": "assistant", + "tool_calls": null, + "token_id": 794 + }, + "finish_reason": null, + "index": 0, + "logprobs": null, + "text": "\":", + "seed": null + } + ], + "created": 1758820670, + "model": "meta-llama/Llama-3.3-70B-Instruct-Turbo-Free", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": null, + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "oCfxg3w-4Yz4kd-984c2d684c778f6d", + "choices": [ + { + "delta": { + "content": " {\"", + "function_call": null, + "refusal": null, + "role": "assistant", + "tool_calls": null, + "token_id": 5324 + }, + "finish_reason": null, + "index": 0, + "logprobs": null, + "text": " {\"", + "seed": null + } + ], + "created": 1758820670, + "model": "meta-llama/Llama-3.3-70B-Instruct-Turbo-Free", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": null, + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "oCfxg3w-4Yz4kd-984c2d684c778f6d", + "choices": [ + { + "delta": { + "content": "city", + "function_call": null, + "refusal": null, + "role": "assistant", + "tool_calls": null, + "token_id": 9103 + }, + "finish_reason": null, + "index": 0, + "logprobs": null, + "text": "city", + "seed": null + } + ], + "created": 1758820670, + "model": "meta-llama/Llama-3.3-70B-Instruct-Turbo-Free", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": null, + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "oCfxg3w-4Yz4kd-984c2d684c778f6d", + "choices": [ + { + "delta": { + "content": "\":", + "function_call": null, + "refusal": null, + "role": "assistant", + "tool_calls": null, + "token_id": 794 + }, + "finish_reason": null, + "index": 0, + "logprobs": null, + "text": "\":", + "seed": null + } + ], + "created": 1758820670, + "model": "meta-llama/Llama-3.3-70B-Instruct-Turbo-Free", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": null, + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "oCfxg3w-4Yz4kd-984c2d684c778f6d", + "choices": [ + { + "delta": { + "content": " \"", + "function_call": null, + "refusal": null, + "role": "assistant", + "tool_calls": null, + "token_id": 330 + }, + "finish_reason": null, + "index": 0, + "logprobs": null, + "text": " \"", + "seed": null + } + ], + "created": 1758820670, + "model": "meta-llama/Llama-3.3-70B-Instruct-Turbo-Free", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": null, + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "oCfxg3w-4Yz4kd-984c2d684c778f6d", + "choices": [ + { + "delta": { + "content": "Tok", + "function_call": null, + "refusal": null, + "role": "assistant", + "tool_calls": null, + "token_id": 53954 + }, + "finish_reason": null, + "index": 0, + "logprobs": null, + "text": "Tok", + "seed": null + } + ], + "created": 1758820670, + "model": "meta-llama/Llama-3.3-70B-Instruct-Turbo-Free", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": null, + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "oCfxg3w-4Yz4kd-984c2d684c778f6d", + "choices": [ + { + "delta": { + "content": "yo", + "function_call": null, + "refusal": null, + "role": "assistant", + "tool_calls": null, + "token_id": 16417 + }, + "finish_reason": null, + "index": 0, + "logprobs": null, + "text": "yo", + "seed": null + } + ], + "created": 1758820670, + "model": "meta-llama/Llama-3.3-70B-Instruct-Turbo-Free", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": null, + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "oCfxg3w-4Yz4kd-984c2d684c778f6d", + "choices": [ + { + "delta": { + "content": "\"}}", + "function_call": null, + "refusal": null, + "role": "assistant", + "tool_calls": null, + "token_id": 32075 + }, + "finish_reason": null, + "index": 0, + "logprobs": null, + "text": "\"}}", + "seed": null + } + ], + "created": 1758820670, + "model": "meta-llama/Llama-3.3-70B-Instruct-Turbo-Free", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": null, + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "oCfxg3w-4Yz4kd-984c2d684c778f6d", + "choices": [ + { + "delta": { + "content": "", + "function_call": null, + "refusal": null, + "role": "assistant", + "tool_calls": null, + "token_id": 128009 + }, + "finish_reason": "stop", + "index": 0, + "logprobs": null, + "text": "", + "seed": 4111464499205743000 + } + ], + "created": 1758820670, + "model": "meta-llama/Llama-3.3-70B-Instruct-Turbo-Free", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": null, + "usage": { + "completion_tokens": 24, + "prompt_tokens": 42, + "total_tokens": 66, + "completion_tokens_details": null, + "prompt_tokens_details": null, + "cached_tokens": 0 + } + } + } + ], + "is_streaming": true + } +} diff --git a/tests/integration/recordings/responses/3d89a56a76b1.json b/tests/integration/recordings/responses/3d89a56a76b1.json new file mode 100644 index 000000000..ba6a107af --- /dev/null +++ b/tests/integration/recordings/responses/3d89a56a76b1.json @@ -0,0 +1,46 @@ +{ + "request": { + "method": "POST", + "url": "https://api.together.xyz/v1/v1/embeddings", + "headers": {}, + "body": { + "model": "togethercomputer/m2-bert-80M-32k-retrieval", + "input": [ + "First text for base64", + "Second text for base64", + "Third text for base64" + ], + "encoding_format": "base64" + }, + "endpoint": "/v1/embeddings", + "model": "togethercomputer/m2-bert-80M-32k-retrieval" + }, + "response": { + "body": { + "__type__": "openai.types.create_embedding_response.CreateEmbeddingResponse", + "__data__": { + "data": [ + { + "embedding": "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", + "index": 0, + "object": "embedding" + }, + { + "embedding": "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", + "index": 1, + "object": "embedding" + }, + { + "embedding": "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", + "index": 2, + "object": "embedding" + } + ], + "model": "togethercomputer/m2-bert-80M-32k-retrieval", + "object": "list", + "usage": null + } + }, + "is_streaming": false + } +} diff --git a/tests/integration/recordings/responses/41ace09e5dba.json b/tests/integration/recordings/responses/41ace09e5dba.json new file mode 100644 index 000000000..d1831b521 --- /dev/null +++ b/tests/integration/recordings/responses/41ace09e5dba.json @@ -0,0 +1,59 @@ +{ + "request": { + "method": "POST", + "url": "https://api.together.xyz/v1/v1/chat/completions", + "headers": {}, + "body": { + "model": "meta-llama/Llama-3.3-70B-Instruct-Turbo-Free", + "messages": [ + { + "role": "user", + "content": "Test trace openai 2" + } + ], + "stream": false + }, + "endpoint": "/v1/chat/completions", + "model": "meta-llama/Llama-3.3-70B-Instruct-Turbo-Free" + }, + "response": { + "body": { + "__type__": "openai.types.chat.chat_completion.ChatCompletion", + "__data__": { + "id": "oCfxBri-4Yz4kd-984c2b177fb74ce3", + "choices": [ + { + "finish_reason": "stop", + "index": 0, + "logprobs": null, + "message": { + "content": "This conversation has just begun. What would you like to talk about? I can summarize our conversation at the end, if you like.", + "refusal": null, + "role": "assistant", + "annotations": null, + "audio": null, + "function_call": null, + "tool_calls": [] + }, + "seed": 7149743687991911000 + } + ], + "created": 1758820576, + "model": "meta-llama/Llama-3.3-70B-Instruct-Turbo-Free", + "object": "chat.completion", + "service_tier": null, + "system_fingerprint": null, + "usage": { + "completion_tokens": 28, + "prompt_tokens": 41, + "total_tokens": 69, + "completion_tokens_details": null, + "prompt_tokens_details": null, + "cached_tokens": 0 + }, + "prompt": [] + } + }, + "is_streaming": false + } +} diff --git a/tests/integration/recordings/responses/52b4e16b7289.json b/tests/integration/recordings/responses/52b4e16b7289.json new file mode 100644 index 000000000..ff868952f --- /dev/null +++ b/tests/integration/recordings/responses/52b4e16b7289.json @@ -0,0 +1,181 @@ +{ + "request": { + "method": "POST", + "url": "https://api.together.xyz/v1/v1/chat/completions", + "headers": {}, + "body": { + "model": "meta-llama/Llama-3.3-70B-Instruct-Turbo-Free", + "messages": [ + { + "role": "user", + "content": "What's the weather in Tokyo? YOU MUST USE THE get_weather function to get the weather." + } + ], + "response_format": { + "type": "text" + }, + "stream": true, + "tools": [ + { + "type": "function", + "function": { + "type": "function", + "name": "get_weather", + "description": "Get the weather in a given city", + "parameters": { + "type": "object", + "properties": { + "city": { + "type": "string", + "description": "The city to get the weather for" + } + } + }, + "strict": null + } + } + ] + }, + "endpoint": "/v1/chat/completions", + "model": "meta-llama/Llama-3.3-70B-Instruct-Turbo-Free" + }, + "response": { + "body": [ + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "oCfzfVP-4Yz4kd-984c36e368b59059", + "choices": [ + { + "delta": { + "content": null, + "function_call": null, + "refusal": null, + "role": "assistant", + "tool_calls": null + }, + "finish_reason": null, + "index": 0, + "logprobs": null + } + ], + "created": 1758821066, + "model": "meta-llama/Llama-3.3-70B-Instruct-Turbo-Free", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": null, + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "oCfzfVP-4Yz4kd-984c36e368b59059", + "choices": [ + { + "delta": { + "content": null, + "function_call": null, + "refusal": null, + "role": null, + "tool_calls": [ + { + "index": 0, + "id": "call_025hjpfgbv2kf9adhboe6hd4", + "function": { + "arguments": "", + "name": "get_weather" + }, + "type": "function" + } + ] + }, + "finish_reason": null, + "index": 0, + "logprobs": null + } + ], + "created": 1758821066, + "model": "meta-llama/Llama-3.3-70B-Instruct-Turbo-Free", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": null, + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "oCfzfVP-4Yz4kd-984c36e368b59059", + "choices": [ + { + "delta": { + "content": null, + "function_call": null, + "refusal": null, + "role": null, + "tool_calls": [ + { + "index": 0, + "id": null, + "function": { + "arguments": "{\"city\":\"Tokyo\"}", + "name": null + }, + "type": null + } + ] + }, + "finish_reason": null, + "index": 0, + "logprobs": null + } + ], + "created": 1758821066, + "model": "meta-llama/Llama-3.3-70B-Instruct-Turbo-Free", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": null, + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "oCfzfVP-4Yz4kd-984c36e368b59059", + "choices": [ + { + "delta": { + "content": "", + "function_call": null, + "refusal": null, + "role": "assistant", + "tool_calls": null, + "token_id": 128009 + }, + "finish_reason": "tool_calls", + "index": 0, + "logprobs": null, + "text": "", + "seed": 3184440617167083500 + } + ], + "created": 1758821059, + "model": "meta-llama/Llama-3.3-70B-Instruct-Turbo-Free", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": null, + "usage": { + "completion_tokens": 24, + "prompt_tokens": 201, + "total_tokens": 225, + "completion_tokens_details": null, + "prompt_tokens_details": null, + "cached_tokens": 0 + } + } + } + ], + "is_streaming": true + } +} diff --git a/tests/integration/recordings/responses/53365c6ae29c.json b/tests/integration/recordings/responses/53365c6ae29c.json new file mode 100644 index 000000000..7895ae60d --- /dev/null +++ b/tests/integration/recordings/responses/53365c6ae29c.json @@ -0,0 +1,59 @@ +{ + "request": { + "method": "POST", + "url": "https://api.together.xyz/v1/v1/chat/completions", + "headers": {}, + "body": { + "model": "meta-llama/Llama-3.3-70B-Instruct-Turbo-Free", + "messages": [ + { + "role": "user", + "content": "Test OpenAI telemetry creation" + } + ], + "stream": false + }, + "endpoint": "/v1/chat/completions", + "model": "meta-llama/Llama-3.3-70B-Instruct-Turbo-Free" + }, + "response": { + "body": { + "__type__": "openai.types.chat.chat_completion.ChatCompletion", + "__data__": { + "id": "oCfxQwj-4Yz4kd-984c2bd8ba58901d", + "choices": [ + { + "finish_reason": "stop", + "index": 0, + "logprobs": null, + "message": { + "content": "To test OpenAI telemetry creation, let's break down the process into steps that can help ensure telemetry data is correctly created and utilized. Telemetry in the context of AI, such as OpenAI, typically refers to the automated process of collecting, transmitting, and analyzing data from remote sources, in this case, user interactions with AI models. Here\u2019s how you might approach testing telemetry creation:\n\n### 1. **Define Telemetry Requirements**\n- **Identify Data Points:** Determine what data points are crucial for your analysis. This could include user input, model responses, interaction timestamps, user IDs, etc.\n- **Purpose of Telemetry:** Understand why you are collecting this data. Is it for model improvement, user experience enhancement, or security monitoring?\n\n### 2. **Implement Data Collection**\n- **API Integration:** If you're using OpenAI's API, ensure you have the necessary permissions and access to collect the required data. OpenAI provides APIs for interacting with their models, and you can collect telemetry data through these interactions.\n- **Logging Mechanisms:** Implement logging mechanisms in your application to capture relevant data. This could involve server-side logging for API calls or client-side logging for user interactions.\n\n### 3. **Data Transmission**\n- **Secure Data Transfer:** Ensure that the data collected is transmitted securely to your analytics or storage system. HTTPS is a standard for secure data transmission over the internet.\n- **Data Format:** Decide on a data format for transmission. JSON is commonly used due to its readability and ease of parsing.\n\n### 4. **Data Analysis**\n- **Analytics Tools:** Utilize appropriate analytics tools or platforms to process and analyze the collected data. This could range from simple statistical analysis to complex machine learning models.\n- **Visualization:** Use data visualization techniques to represent the insights gained from the telemetry data. This helps in understanding trends, patterns, and areas for improvement.\n\n### 5. **Testing the Telemetry System**\n- **Mock Data:** Test your telemetry system with mock data to ensure it can collect, transmit, and analyze data correctly without affecting real users.\n- **Real-World Testing:** Once the system seems to work with mock data, gradually introduce it to real-world scenarios, starting with a small user base to identify and fix any issues that arise.\n- **Feedback Loop:** Implement a feedback loop to continuously monitor the telemetry system's performance and the insights it provides, making adjustments as necessary.\n\n### Example of Testing with Mock Data\nIf you're testing an OpenAI model's interaction telemetry, you might simulate user queries and model responses, then verify that this data is correctly logged, transmitted, and analyzed. For instance, in Python, you might use a mock library to simulate API calls and then assert that the expected data is collected and processed.\n\n```python\nimport unittest\nfrom unittest.mock import Mock\nimport json\n\nclass TestTelemetry(unittest.TestCase):\n\n def test_telemetry_data_collection(self):\n # Mock user interaction\n user_input = \"Hello, how are you?\"\n model_response = \"I'm doing well, thanks.\"\n\n # Mock the API call\n api_call_mock = Mock(return_value=model_response)\n\n # Simulate the interaction\n response = api_call_mock(user_input)\n\n # Verify telemetry data is collected correctly\n expected_data = {\n 'user_input': user_input,\n 'model_response': model_response,\n # Other relevant data points\n }\n\n # Assuming `collect_telemetry_data` is your function to collect telemetry\n collected_data = collect_telemetry_data(user_input, response)\n\n self.assertEqual(collected_data, expected_data)\n\nif __name__ == '__main__':\n unittest.main()\n```\n\nThis example simplifies the process and focuses on the concept. Actual implementation details may vary based on your specific requirements, the technologies you're using, and the OpenAI APIs or models you're interacting with.", + "refusal": null, + "role": "assistant", + "annotations": null, + "audio": null, + "function_call": null, + "tool_calls": [] + }, + "seed": 3434953141173799400 + } + ], + "created": 1758820620, + "model": "meta-llama/Llama-3.3-70B-Instruct-Turbo-Free", + "object": "chat.completion", + "service_tier": null, + "system_fingerprint": null, + "usage": { + "completion_tokens": 791, + "prompt_tokens": 40, + "total_tokens": 831, + "completion_tokens_details": null, + "prompt_tokens_details": null, + "cached_tokens": 0 + }, + "prompt": [] + } + }, + "is_streaming": false + } +} diff --git a/tests/integration/recordings/responses/546dc9533c84.json b/tests/integration/recordings/responses/546dc9533c84.json new file mode 100644 index 000000000..720839e84 --- /dev/null +++ b/tests/integration/recordings/responses/546dc9533c84.json @@ -0,0 +1,801 @@ +{ + "request": { + "method": "POST", + "url": "https://api.together.xyz/v1/v1/embeddings", + "headers": {}, + "body": { + "model": "togethercomputer/m2-bert-80M-32k-retrieval", + "input": "This is the first text", + "encoding_format": "float" + }, + "endpoint": "/v1/embeddings", + "model": "togethercomputer/m2-bert-80M-32k-retrieval" + }, + "response": { + "body": { + "__type__": "openai.types.create_embedding_response.CreateEmbeddingResponse", + "__data__": { + "data": [ + { + "embedding": [ + -0.039021637, + 0.022414008, + 0.060316082, + 0.010932758, + 0.018470073, + -0.038455445, + 0.013484707, + -0.038724504, + -0.025575833, + -0.07131675, + 0.03463345, + -0.025232196, + 0.020823235, + 0.03832292, + -0.006293115, + -0.088807434, + 0.0063370736, + -0.002888027, + 0.02621656, + 0.055453233, + 0.102450415, + 0.03387425, + -0.005548249, + 0.06926162, + 0.036552645, + -0.027929714, + 0.05147974, + -0.084861636, + -0.05467612, + 0.0061274734, + 0.01355064, + -0.027067322, + 0.099598646, + -0.05280082, + -0.03848137, + -0.0138273295, + 0.00055626774, + -0.062084854, + -0.026424624, + -0.004740091, + 0.06750933, + -0.05090067, + 0.06227124, + -0.01807564, + 0.0048294156, + 0.013328212, + 0.004276883, + -0.034934912, + -0.036818415, + 0.0185289, + 0.0048565175, + 0.016870664, + -0.040981345, + -0.035420854, + -0.091292314, + -0.08983982, + -0.048739515, + 0.12078825, + 0.04027495, + 0.088196404, + 0.082896, + -0.08266004, + -0.00082181377, + -0.050194185, + 0.024180485, + -0.027468672, + -0.08769602, + 0.047489725, + -0.03834715, + 0.07631481, + -0.06501303, + -0.03695376, + 0.067694835, + 0.027814003, + -0.051688053, + -0.032236356, + 0.039202936, + 0.03445711, + 0.009532945, + -0.034482885, + -0.08042295, + 0.008322418, + 0.05848545, + -0.064453684, + -0.17329726, + -0.047616575, + 0.045936666, + 0.023837132, + -0.015925486, + -0.0857517, + -0.0001586331, + -0.044116773, + -0.029393503, + 0.009738323, + 0.03763726, + -0.11253048, + 0.019114532, + 0.07549436, + -0.1030746, + -0.038988255, + 0.011407976, + -0.037570667, + 0.05159809, + 0.007962588, + 0.01113923, + 0.003076782, + 0.15470116, + 0.0043370854, + 0.030429134, + -0.027383734, + -0.030138142, + -0.079299994, + 0.12148583, + 0.034556936, + -0.0064313645, + 0.048751578, + -0.05864567, + 0.026685659, + -0.09871483, + -0.046130598, + 0.019625148, + -0.072314, + 0.03352563, + 0.01364348, + -0.085728094, + 0.06642468, + -0.094013095, + -0.037293892, + 0.0076811705, + 0.0052874135, + 0.018115167, + -0.055315576, + -0.052764144, + -0.034311842, + 0.015955461, + -0.07966574, + -0.028749859, + 0.03149985, + -0.047564246, + 0.008608991, + -0.021272784, + 0.030198015, + -0.0107804965, + 0.017173572, + -0.011607755, + -0.050619457, + 0.030204969, + 0.10163846, + -0.0056075957, + 0.06950345, + 0.04063133, + -0.03608383, + 0.023170248, + -0.014745303, + -0.014478895, + 0.10499135, + -0.038678814, + -0.0075368164, + 0.08199838, + -0.09530577, + 0.020091686, + 0.10653022, + 0.08388272, + -0.0045513124, + -0.04053859, + -0.0025074913, + 0.017358577, + -0.03037232, + 0.04310344, + -0.04824635, + 0.055064622, + -0.019335788, + -0.0674805, + 0.024816237, + 0.019295547, + 0.0007229409, + 0.04357454, + 0.021688526, + 0.08630486, + -0.011211191, + -0.039039955, + 0.17257652, + -0.007145191, + 0.006575071, + -0.0139306225, + -0.014735097, + -0.044341516, + -0.11539079, + 0.033123154, + -0.011538915, + -0.024190484, + -0.018813878, + 0.03229297, + -0.04379363, + 0.03185381, + -0.035783295, + 0.06494934, + 0.05133508, + 0.00010083616, + 0.007334995, + 0.06611978, + -0.062722, + 0.045553267, + -0.011721417, + 0.020822436, + -0.04873414, + 0.03926427, + 0.007051802, + -0.05594363, + 0.03565722, + -0.12122127, + 0.027855415, + -0.016186016, + -0.041470908, + -0.08864265, + -0.0036498592, + 0.010997135, + -0.012785444, + -0.06519897, + 0.027590077, + 0.067321666, + -0.05896251, + 0.008983399, + -0.095143765, + 0.011621533, + -0.06121848, + 0.050336383, + 0.0019902636, + 0.053377967, + -0.045287643, + 0.09474427, + -0.053598337, + 0.08048404, + -0.08297755, + 0.08607313, + 0.004596277, + 0.0204861, + 0.0132703995, + 0.0492952, + 0.003006371, + 0.024936337, + -0.021873668, + 0.11727927, + -0.043151148, + -0.0846394, + -0.048050277, + 0.0012273242, + 0.16534594, + 0.07620599, + 0.0144042745, + 0.09004986, + 0.06599925, + 0.050307803, + -0.014542778, + -0.06923349, + 0.08603958, + -0.003079753, + -0.08008583, + -0.04276064, + 0.07779741, + -0.04970902, + 0.024014566, + 0.026120175, + -0.007566401, + -0.06362058, + 0.0075124875, + -0.025173014, + 0.06797637, + 0.064056545, + -0.12027379, + -0.030917957, + 0.009303285, + 0.1108725, + 0.048372857, + -0.025575588, + -0.0063446634, + 0.011040862, + -0.03459656, + -0.0144168, + 0.048665646, + -0.009920939, + -0.0061537125, + -0.10304914, + 0.014452626, + 0.016036827, + 0.012599703, + 0.016684191, + -0.039659906, + 0.010836161, + -0.029463075, + 0.0011919601, + 0.06632273, + -0.05316992, + 0.039452244, + -0.021640282, + -0.05948179, + -0.015061293, + -0.015513855, + 0.04358236, + -0.0029279767, + 0.0860453, + -0.012484551, + -0.013506936, + 0.016622225, + 0.03162366, + -0.09996153, + -0.05663382, + -0.015155038, + 0.00578972, + 0.025347538, + -0.06958232, + 0.10877864, + -0.036945637, + 0.03478135, + 0.13662694, + -0.020611005, + 0.07592442, + 0.0036063113, + -0.09048903, + 0.016554832, + -0.04288513, + -0.027900286, + -0.07563455, + 0.030791664, + -0.033230122, + 0.018658046, + -0.043807156, + 0.029736735, + 0.10202865, + 0.009116146, + -0.09378922, + 0.099590845, + 0.0642359, + 0.0589953, + 0.05296719, + -0.07642986, + -0.11738337, + -0.05376279, + 0.09199399, + -0.0627918, + 0.03704901, + -0.037008967, + -0.05638905, + 0.009441371, + 0.04416073, + -0.03527975, + -0.03531018, + 0.07021692, + 0.05659684, + 0.099865966, + 0.076215744, + 0.043112382, + 0.007842607, + -0.039226923, + 0.006264895, + -0.03105526, + 0.060152344, + 0.040446483, + 0.10218391, + -0.07178106, + 0.015407178, + -0.06229486, + 0.0043686125, + 0.09733845, + -0.09527866, + 0.041407365, + 0.06550996, + 0.08803008, + 0.09149921, + 0.04229226, + 0.052133556, + 0.047242433, + 0.014378367, + 0.03682277, + 0.06764445, + 0.066040926, + 0.021740213, + 0.04180941, + -0.00519632, + -0.0111550195, + 0.017352529, + -0.00943155, + 0.11390086, + 0.05582122, + 0.035394136, + 0.0024461604, + 0.04081662, + -0.0007266066, + 0.06292638, + 0.0052844593, + 0.05790997, + -0.09407522, + -0.05039574, + 0.07852171, + -0.08000922, + 0.13302545, + 0.10419625, + 0.039512042, + -0.09167407, + 0.010040825, + 0.013924355, + 0.027515184, + 0.079743214, + 0.09399837, + 0.0151610905, + 0.004694856, + -0.0536953, + 0.06531984, + 0.027906924, + -0.0012715638, + 0.09168681, + -0.00026439782, + -0.0041136686, + 0.033571295, + -0.01907176, + 0.11883433, + -0.0065728375, + -0.0062215794, + -0.1049895, + -0.03321981, + -0.026450735, + 0.072518945, + -0.11240429, + -0.022515744, + -0.048495665, + -0.037087325, + 0.00032197312, + 0.051534563, + 0.046150282, + -0.08213623, + 0.09886837, + 0.041117694, + 0.05323094, + -0.05427183, + -0.022201112, + -0.024121372, + 0.012735752, + 0.1397762, + -0.007587272, + 0.05582085, + 0.06499377, + -0.018458825, + -0.021883465, + 0.032667745, + 0.02018645, + 0.040008776, + 0.07482824, + -0.024819402, + 0.045242358, + -0.06036402, + 0.025522556, + -0.025958247, + 0.018367121, + 0.029390294, + -0.031080022, + -0.010285386, + -0.007700369, + 0.045184247, + 0.044544965, + 0.029447366, + 0.014604208, + -0.09001254, + -0.09150779, + 0.048845917, + -0.005016622, + -0.030419605, + -0.021073101, + -0.028362123, + 0.04180255, + 0.011223455, + 0.026317155, + 0.07052029, + 0.04195792, + -0.010761702, + -0.054835323, + 0.047067013, + 0.04737349, + 0.09244638, + 0.096748084, + -0.03332587, + -0.009952178, + -0.0030183739, + 0.07009167, + 0.05392541, + 0.024944762, + 0.0061005787, + 0.028459419, + -0.05767917, + -0.051464006, + 0.08488547, + -0.016385203, + -0.04579279, + -0.084523976, + -0.032011546, + -0.007594041, + -0.06051386, + -0.046265714, + -0.027389096, + -0.044890895, + -0.0022862924, + -0.1268961, + -0.037864592, + 0.024412185, + -0.07392371, + -0.014362709, + 0.07425692, + 0.022583768, + 0.011156761, + -0.057216533, + -0.039548866, + -0.018076254, + -0.05556914, + -0.057198036, + -0.03188685, + 0.090208404, + 0.10571588, + 0.01070536, + 0.08128956, + 0.017667988, + -0.10340015, + 0.07804198, + -0.019781966, + 0.06535109, + -0.07777538, + -0.025819557, + -0.08128869, + -0.034394037, + 0.019422948, + -0.039221227, + -0.08033355, + -0.02329798, + -0.0962552, + -0.016624983, + 0.038193095, + -0.06870783, + -0.033954047, + -0.0025311739, + -0.114151455, + -0.00511124, + -0.06920173, + 0.044555113, + 0.10051683, + 0.04055453, + -0.06167893, + -0.01584111, + 0.0030792183, + 4.6655536e-05, + -0.026384909, + -0.012856535, + -0.06174471, + 0.0024448705, + -0.022707395, + 0.066114195, + -0.010608763, + -0.01576041, + -0.0010933182, + 0.03396316, + 0.008329627, + -0.060327142, + -0.05505636, + -0.028406821, + -0.025708841, + 0.016102789, + 0.03405433, + 0.007868113, + 0.13327968, + 0.072789304, + -0.08000951, + -0.050192088, + -0.05803803, + -0.050078847, + -0.01996999, + 0.043255676, + -0.04441973, + 0.08783117, + 0.002935635, + 0.040976398, + -0.01976899, + 0.018852778, + -0.03215457, + -0.04958742, + 0.015443288, + 0.010633601, + -0.074571095, + 0.053966194, + -0.01581196, + -0.04183213, + -0.04719714, + 0.033312585, + 0.011825424, + -0.029853545, + -0.050666492, + -0.08864941, + -0.022672195, + 0.0724055, + 0.0037794008, + 0.055587664, + -0.13644798, + 0.022921626, + 0.1152114, + 0.07047247, + 0.030930748, + -0.0052061337, + 0.044788003, + -0.08634308, + -0.10505402, + -0.025340958, + -0.08207144, + 0.059532717, + -0.0062416205, + 0.1022889, + 0.010608143, + 0.041661825, + -0.097806565, + 0.0038305484, + 0.05404457, + 0.032105837, + 0.06415997, + -0.049071103, + -0.03720757, + -0.023321476, + 0.12579422, + 0.043440778, + -0.011532883, + -0.05620173, + 0.005197981, + -0.12449035, + 0.008241525, + -0.10594952, + 0.102292866, + -0.0699, + -0.11592147, + 0.06966665, + -0.027437769, + -0.014774349, + 0.018875254, + -0.017957961, + 0.091627896, + 0.04989476, + 0.0798358, + 0.04239699, + -0.007844917, + -0.06630319, + 0.052326147, + 0.02648383, + 0.044119354, + -0.06851671, + 0.15443392, + -0.020682698, + -0.03766801, + 0.0155308945, + -0.063717306, + 0.0006521008, + -0.05569479, + -0.043325484, + -0.014842672, + -0.025855135, + 0.017403143, + -0.011325402, + 0.054577086, + 0.02011184, + -0.09925977, + -0.0069759586, + -0.03428202, + 0.0034359726, + -0.15824135, + 0.000930797, + -0.113140985, + -0.044972613, + -0.02884488, + -0.06731342, + 0.04106218, + 0.028871017, + -0.011909599, + 0.03274342, + 0.018106263, + -0.020201381, + 0.1281747, + 0.020703837, + 0.024401633, + 0.042717557, + 0.014739593, + 0.07050051, + 0.038078446, + -0.022462513, + -0.004700358, + -0.014908828, + 0.037429586, + 0.021075286, + -0.047952563, + -0.010115325, + 0.011719644, + 0.052587837, + -0.026325963, + 0.06416419, + 0.04302814, + -0.032076415, + 0.03226265, + 0.047885012, + -0.08571586, + 0.13789223, + -0.039638847, + 0.08949073, + 0.0019859069, + 0.054476757, + -0.04336167, + -0.12529649, + 0.013598417, + -0.046129137, + 0.0031463325, + -0.10019061, + 0.02212261, + -0.024540763, + -0.020073807, + -0.015366339, + -0.04205672, + -0.004573892, + 0.04018059, + -0.06835582, + 0.0762453, + -0.07784769, + -0.03393797, + -0.084803775, + 0.028064115, + 0.06559264, + -0.10455632, + 0.039434727, + -0.038992915, + -0.09218861, + 0.013562555, + -0.06523423, + 0.10188195, + 0.05163541, + 0.02234651, + 0.01926983, + 0.0017454309, + 0.030410308, + 0.025801515, + -0.0333776, + 0.0030322578, + 0.055338234, + -0.017410548, + 0.07205084, + 0.04127999, + 0.0026357244, + 0.00054674776, + -0.018812224, + 0.051227525, + 2.2485852e-05, + -0.04581609, + -0.106634825, + 0.018237107, + 0.048612136, + -0.018699843, + -0.035245672, + -0.0367398, + -0.09525288, + 0.05530859, + 0.023024498, + -0.05791263, + -0.011325011, + -0.055147734, + 0.02724777, + -0.10974393, + 0.015870394, + 0.053438365, + 0.032307543, + 0.055390432 + ], + "index": 0, + "object": "embedding" + } + ], + "model": "togethercomputer/m2-bert-80M-32k-retrieval", + "object": "list", + "usage": null + } + }, + "is_streaming": false + } +} diff --git a/tests/integration/recordings/responses/5c0552be2793.json b/tests/integration/recordings/responses/5c0552be2793.json new file mode 100644 index 000000000..6372e930c --- /dev/null +++ b/tests/integration/recordings/responses/5c0552be2793.json @@ -0,0 +1,3127 @@ +{ + "request": { + "method": "POST", + "url": "https://api.together.xyz/v1/v1/embeddings", + "headers": {}, + "body": { + "model": "togethercomputer/m2-bert-80M-32k-retrieval", + "input": [ + "Python is a high-level programming language that emphasizes code readability and allows programmers to express concepts in fewer lines of code than would be possible in languages such as C++ or Java.", + "Machine learning is a subset of artificial intelligence that enables systems to automatically learn and improve from experience without being explicitly programmed, using statistical techniques to give computer systems the ability to progressively improve performance on a specific task.", + "Data structures are fundamental to computer science because they provide organized ways to store and access data efficiently, enable faster processing of data through optimized algorithms, and form the building blocks for more complex software systems.", + "Neural networks are inspired by biological neural networks found in animal brains, using interconnected nodes called artificial neurons to process information through weighted connections that can be trained to recognize patterns and solve complex problems through iterative learning." + ] + }, + "endpoint": "/v1/embeddings", + "model": "togethercomputer/m2-bert-80M-32k-retrieval" + }, + "response": { + "body": { + "__type__": "openai.types.create_embedding_response.CreateEmbeddingResponse", + "__data__": { + "data": [ + { + "embedding": [ + -0.03554640710353851, + -0.007096407935023308, + 0.03447485715150833, + -0.017988182604312897, + 0.04746536165475845, + 0.002823449671268463, + 0.018451310694217682, + -0.055378228425979614, + -0.04928762838244438, + -0.020526282489299774, + 0.01511127594858408, + -0.029369531199336052, + 0.029876960441470146, + 0.038107991218566895, + 0.037690650671720505, + -0.03575237840414047, + 0.030052166432142258, + 0.010156095959246159, + 0.023729082196950912, + 0.022262724116444588, + 0.05377553030848503, + 0.015983840450644493, + 0.012193809263408184, + 0.0363505519926548, + 0.03717820346355438, + -0.0132398447021842, + 0.005464593414217234, + -0.04128178581595421, + 0.009104952216148376, + 0.02491668239235878, + -0.0015784600982442498, + -0.03032855875790119, + 0.05317708104848862, + -0.035418543964624405, + -0.0403718501329422, + -0.031031614169478416, + 0.0066244155168533325, + -0.020375743508338928, + 0.016089564189314842, + 0.04707200825214386, + 0.045463643968105316, + -0.03221960738301277, + 0.012529425323009491, + -0.04036363214254379, + 0.002571037970483303, + 0.029752220958471298, + -0.009468672797083855, + 0.003708574688062072, + -0.03314213454723358, + -0.01323634572327137, + -0.012179017998278141, + 0.02393718995153904, + -0.008176485076546669, + 0.004878294188529253, + -0.0633009523153305, + -0.009240301325917244, + -0.0204729363322258, + 0.08824464678764343, + 0.0551028810441494, + -0.025194218382239342, + 0.015531675890088081, + -0.0328342467546463, + 0.020082000643014908, + -0.02244427241384983, + 0.025918079540133476, + 0.007830075919628143, + -0.03271260857582092, + 0.004204218741506338, + -0.00690473522990942, + 0.057740241289138794, + -0.0583774633705616, + -0.05268712714314461, + 0.04913575202226639, + 0.011438315734267235, + -0.05547183007001877, + 0.018471337854862213, + 0.022338125854730606, + 0.036328114569187164, + 0.011987737379968166, + 0.016123993322253227, + -0.023944057524204254, + -0.010756840929389, + 0.0054707913659513, + -0.03772115334868431, + -0.10223563015460968, + -0.030133256688714027, + 0.06909658759832382, + 0.03793053328990936, + -0.028042854741215706, + -0.05860919505357742, + 0.027706949040293694, + -0.013812185265123844, + -0.011283869855105877, + -0.0025857349392026663, + -0.004806371871381998, + -0.0966075137257576, + 0.03193771466612816, + 0.0727173238992691, + -0.038796763867139816, + -0.06174341216683388, + -0.0032117462251335382, + -0.06063411384820938, + 0.0606837123632431, + 0.02011265978217125, + 0.011877722106873989, + -0.004632994998246431, + 0.157028466463089, + -0.010776677168905735, + 0.04906792193651199, + 0.017969049513339996, + -0.023766208440065384, + -0.035593319684267044, + 0.06603281944990158, + 0.004095954354852438, + -0.003013259032741189, + 0.09234334528446198, + -0.06996338069438934, + -0.0012650408316403627, + -0.051047634333372116, + -0.023429956287145615, + 0.0506940558552742, + -0.000989840948022902, + 0.005756124388426542, + -0.01844569854438305, + -0.05294405296444893, + 0.10093262046575546, + -0.05163591727614403, + -0.046391189098358154, + 0.03682076185941696, + -0.013953039422631264, + -0.00829730648547411, + 0.016348037868738174, + 0.029590878635644913, + -0.010724885389208794, + 0.03132936730980873, + -0.09037119150161743, + -0.02446158416569233, + 0.01799129694700241, + -0.004724904894828796, + -0.0179754626005888, + -0.017058907076716423, + 0.06549952179193497, + -0.03879868611693382, + 0.03201507031917572, + -0.05263605713844299, + -0.07560855150222778, + 0.023038333281874657, + 0.08131105452775955, + -0.007891630753874779, + 0.010212005116045475, + -0.022032614797353745, + -0.037194348871707916, + 0.04312831163406372, + -0.021400118246674538, + -0.0055341594852507114, + 0.0505189374089241, + -0.015061940997838974, + 0.008572549559175968, + 0.06600383669137955, + -0.06507135927677155, + 0.025505272671580315, + 0.1239512488245964, + 0.0029331184923648834, + -0.05543820187449455, + -0.0464475080370903, + -0.014905349351465702, + 0.0553421825170517, + -0.060036033391952515, + 0.027302566915750504, + -0.05769211798906326, + 0.020448798313736916, + -0.02193785086274147, + -0.024715296924114227, + 0.05368613824248314, + -0.054843612015247345, + -0.0493527352809906, + -0.0036408405285328627, + 0.01888098567724228, + 0.07817717641592026, + 0.012165231630206108, + -0.013434512540698051, + 0.1234184205532074, + 0.02105126529932022, + 0.027825387194752693, + 0.04109129309654236, + -0.01481082197278738, + -0.037877876311540604, + -0.08924141526222229, + 0.014156855642795563, + -0.04031049832701683, + 0.0012453959789127111, + -0.05089078098535538, + 0.0157526396214962, + -0.013785487040877342, + 0.012570018880069256, + 0.03820948675274849, + 0.056189246475696564, + 0.0570443794131279, + -0.00707648042589426, + -0.010196640156209469, + 0.03861375153064728, + -0.06775396317243576, + 8.025951683521271e-05, + -0.01706021837890148, + 0.034831322729587555, + -0.03055954910814762, + 0.005970990285277367, + -0.04690682888031006, + -0.0664185956120491, + 0.06603065133094788, + -0.10048158466815948, + -0.010846846736967564, + 0.04063577204942703, + -0.04530816897749901, + -0.06576434522867203, + 0.024065490812063217, + 0.00985124334692955, + -0.04521741345524788, + -0.024303117766976357, + 0.007082080468535423, + 0.05948451906442642, + -0.0013600765960291028, + 0.06832627952098846, + -0.0816824734210968, + 0.03162050619721413, + -0.07064618170261383, + -0.005621605087071657, + 0.031182067468762398, + 0.028993628919124603, + -0.06745805591344833, + 0.1008504182100296, + -0.019304536283016205, + 0.05470830202102661, + -0.04224247857928276, + 0.03821016848087311, + 0.0177629292011261, + 0.0029355017468333244, + 0.0210754182189703, + 0.036286503076553345, + -0.008670195005834103, + 0.014225011691451073, + -0.03810659795999527, + 0.09428758174180984, + 0.001167136593721807, + -0.04306814447045326, + -0.05250782147049904, + 0.01725144125521183, + 0.1009177640080452, + 0.056033939123153687, + -0.04590430483222008, + 0.03750710189342499, + 0.00973665714263916, + 0.031874917447566986, + -0.028557363897562027, + -0.0427425242960453, + 0.017966706305742264, + 0.06426543742418289, + -0.07949667423963547, + 0.012790117412805557, + 0.07740969210863113, + -0.03154323995113373, + -0.000931435904931277, + 0.028952905908226967, + -0.0016979111824184656, + -0.027679821476340294, + 0.01712878607213497, + -0.0625903308391571, + 0.056609392166137695, + 0.02206997759640217, + -0.04671192169189453, + -0.02998626045882702, + -0.017524294555187225, + 0.11413019150495529, + 0.03503143787384033, + -0.04886762425303459, + -0.01309217605739832, + 0.017934465780854225, + -0.008569798432290554, + -0.011151830665767193, + 0.043749406933784485, + -0.04999162629246712, + -0.02375105582177639, + -0.06315535306930542, + -0.01858431100845337, + 0.010522568598389626, + -0.022048017010092735, + 0.006009046919643879, + -0.05854521319270134, + -0.048333462327718735, + -0.002478170907124877, + -0.015333693474531174, + 0.05189032107591629, + -0.018828751519322395, + 0.032818086445331573, + -0.06960243731737137, + -0.059407517313957214, + -0.01066416222602129, + -0.04799465835094452, + 0.03485500440001488, + -0.006828434765338898, + 0.03854886069893837, + -0.001209061942063272, + 0.01583092473447323, + -0.003763538785278797, + 0.005827051587402821, + -0.06429404765367508, + -0.026753002777695656, + -0.007608311716467142, + 0.023611638695001602, + -0.015527237206697464, + -0.0816955491900444, + 0.07749387621879578, + 0.020281655713915825, + 0.04358011856675148, + 0.06164932623505592, + 0.012244789861142635, + 0.009536119177937508, + -0.01715359278023243, + -0.049351681023836136, + -0.010262561030685902, + -0.040689606219530106, + 0.0015704972902312875, + -0.029288627207279205, + 0.033916302025318146, + 0.022839462384581566, + -0.023955155164003372, + -0.0018260570941492915, + 0.04853229969739914, + 0.029086245223879814, + 0.02011525072157383, + -0.087351955473423, + 0.029166242107748985, + 0.04226355254650116, + 0.013103838078677654, + 0.028118737041950226, + -0.03275945037603378, + -0.06070456653833389, + -0.03526311740279198, + 0.03457321971654892, + 0.000781301234383136, + 0.06521835923194885, + -0.03403833135962486, + -0.05867011100053787, + 0.029102222993969917, + 0.02450171299278736, + -0.012786544859409332, + -0.06446541845798492, + -0.0051344106905162334, + 0.03445170447230339, + 0.06778490543365479, + -0.02216685190796852, + 0.0016194046474993229, + -0.01634589582681656, + -0.0011322996579110622, + -0.01887090690433979, + -0.02892678789794445, + 0.014416128396987915, + 0.0009288133005611598, + 0.00677884416654706, + -0.04446335509419441, + 0.016548747196793556, + -0.03842639550566673, + -0.03163810446858406, + 0.06702737510204315, + -0.03608359023928642, + -0.00025231484323740005, + 0.04340079426765442, + 0.05607728287577629, + 0.031793396919965744, + 0.08414526283740997, + 0.008220396935939789, + -0.01985529251396656, + -0.013045559637248516, + -0.0149798933416605, + 0.06220037117600441, + 0.033296458423137665, + 0.00500292656943202, + 0.004333977587521076, + -0.04320530593395233, + 0.007642753422260284, + -0.03890792280435562, + 0.0051839109510183334, + 0.05762368068099022, + 0.02640019729733467, + 0.011530695483088493, + 0.02300417236983776, + -0.019416140392422676, + -0.007894888520240784, + 0.02734089083969593, + 0.000815258186776191, + 0.053942739963531494, + -0.0436263382434845, + -0.034643787890672684, + 0.07824137806892395, + -0.06709934771060944, + 0.06901289522647858, + 0.08676657825708389, + 0.01688706874847412, + -0.05954931303858757, + 0.004134624730795622, + 0.023650459945201874, + 0.0001446884125471115, + 0.037243153899908066, + 0.05318034440279007, + 0.0700862929224968, + 0.0385315977036953, + -0.00830205250531435, + 0.022020962089300156, + -0.00824003480374813, + 0.025458309799432755, + 0.04254689812660217, + 0.0009686902048997581, + -0.014871773310005665, + 0.051201775670051575, + 0.01027221791446209, + 0.08684585988521576, + -0.02971283532679081, + -0.011146444827318192, + -0.07543549686670303, + -0.020205246284604073, + -0.06203436478972435, + 0.07105137407779694, + -0.06884029507637024, + -0.033693719655275345, + -0.0417039655148983, + -0.031183280050754547, + 0.0323086753487587, + 0.07099177688360214, + 0.0004308670468162745, + -0.0946657806634903, + 0.05404246225953102, + -0.011720084585249424, + 0.045603178441524506, + -0.05754629895091057, + -0.011325608938932419, + 0.010355609469115734, + 0.022307073697447777, + 0.09751570969820023, + -0.03173089772462845, + 0.05594935640692711, + 0.010774122551083565, + 0.025656910613179207, + -0.02179778181016445, + 0.05516326427459717, + -0.035248346626758575, + 0.034484293311834335, + 0.07085457444190979, + 0.028202733024954796, + 0.056037697941064835, + -0.057751286774873734, + 0.018484141677618027, + -0.0036834031343460083, + 0.01223890669643879, + -0.0009950973326340318, + -0.01307816430926323, + 0.03376156836748123, + -0.02969367243349552, + 0.059113480150699615, + 0.04872358962893486, + 0.05968193709850311, + -0.028744438663125038, + -0.05794977769255638, + -0.08101271092891693, + 0.007644148543477058, + -0.03083055466413498, + -0.027795907109975815, + -0.010444259271025658, + -0.02906023897230625, + 0.04509296268224716, + -0.05705117806792259, + -0.04451403394341469, + 0.06550070643424988, + -0.0078123449347913265, + -0.0183242317289114, + -0.040778711438179016, + 0.005235273856669664, + 0.002707386389374733, + 0.06487920135259628, + 0.0973295047879219, + -0.02223711460828781, + -0.05871149152517319, + 0.01749638468027115, + 0.05020421743392944, + 0.027955958619713783, + 0.016088897362351418, + 0.014080396853387356, + 0.0064940787851810455, + -0.017334003001451492, + -0.049333494156599045, + 0.04429780691862106, + -0.005173363257199526, + -0.04948711767792702, + -0.001269756117835641, + -0.003951952792704105, + 0.04227662831544876, + -0.020763786509633064, + -0.050812024623155594, + -0.05954231321811676, + -0.06424717605113983, + -0.01500832848250866, + -0.06810985505580902, + -0.011319112963974476, + -0.00735191535204649, + -0.04203500226140022, + -0.02823590487241745, + 0.06403610110282898, + 0.033493559807538986, + -0.004137557931244373, + -0.04067056253552437, + -0.030258391052484512, + -0.008252452127635479, + -0.056280579417943954, + -0.0440947599709034, + -0.007525031920522451, + 0.04915264993906021, + 0.04837511479854584, + -0.019422918558120728, + 0.031448233872652054, + 0.00733947055414319, + -0.03402920439839363, + 0.05732659995555878, + -0.025952192023396492, + 0.06528374552726746, + -0.024781251326203346, + -0.027520032599568367, + -0.041780468076467514, + -0.05471392720937729, + -0.05062618851661682, + -0.0121277691796422, + -0.05728118494153023, + -0.037124015390872955, + -0.10094387084245682, + 0.0008856018539518118, + 0.016356606036424637, + -0.009727592580020428, + -0.07148565351963043, + 0.013242436572909355, + -0.05578983202576637, + 0.04417295753955841, + -0.05025770515203476, + 0.0524807907640934, + 0.058065030723810196, + 0.04594448581337929, + -0.08914202451705933, + -0.005309537518769503, + -0.0051671178080141544, + 0.020991137251257896, + -0.009967241436243057, + 0.028821321204304695, + -0.038495149463415146, + -0.011333068832755089, + -0.00032505951821804047, + 0.06773139536380768, + 0.01539461500942707, + 0.0052316030487418175, + 0.025828253477811813, + 0.004387897439301014, + 0.0009168533142656088, + -0.05614563450217247, + -0.036197442561388016, + -0.0038549299351871014, + 0.05081174895167351, + 0.02860085852444172, + 0.036911290138959885, + 0.020038267597556114, + 0.0900401696562767, + 0.04283471405506134, + -0.026248479261994362, + -0.014528274536132812, + -0.08037876337766647, + -0.015186730772256851, + -0.046942830085754395, + 0.09666776657104492, + -0.032152704894542694, + 0.1042107418179512, + -0.0037883748300373554, + 0.03532910719513893, + 0.024518869817256927, + -0.006518403068184853, + 3.624148666858673e-05, + -0.05473252385854721, + 0.0038580731488764286, + 0.01619664579629898, + -0.0592433400452137, + -0.028054092079401016, + -0.039563704282045364, + -0.07826728373765945, + 0.007303891237825155, + -0.0016252738423645496, + 0.010634698905050755, + -0.05892583727836609, + -0.1028798520565033, + -0.1025250256061554, + -0.0489053837954998, + 0.0761580839753151, + 0.0003246227279305458, + 0.01764671318233013, + -0.04567689448595047, + 0.0017265045316889882, + 0.1074521392583847, + 0.009256143122911453, + -0.0086295735090971, + 0.025150688365101814, + 0.029408499598503113, + -0.05374184250831604, + -0.08697893470525742, + -0.004331841133534908, + -0.012978748418390751, + 0.01129025686532259, + 0.01291558239609003, + 0.12539006769657135, + 0.0067464374005794525, + 0.04762988165020943, + -0.09101837873458862, + 0.0024143336340785027, + 0.06800898164510727, + -0.0031652532052248716, + -0.03735361620783806, + -0.0008640715386718512, + -0.02979232184588909, + -0.037972591817379, + 0.10696317255496979, + 0.024048063904047012, + 0.006043695844709873, + -0.014625146985054016, + -0.01327919028699398, + -0.07279280573129654, + 0.011475003324449062, + -0.07008174806833267, + 0.03393857553601265, + -0.06376609206199646, + -0.05901316553354263, + 0.03415929153561592, + -0.00576013745740056, + -0.051618244498968124, + -0.00013159774243831635, + -0.003026098944246769, + 0.09039998799562454, + 0.021720316261053085, + 0.034962330013513565, + 0.05111391842365265, + -0.013111330568790436, + -0.07111985236406326, + 0.043959252536296844, + 0.05692610144615173, + 0.012901142239570618, + -0.03638460487127304, + 0.10743413865566254, + -0.0021282576490193605, + -0.04420499876141548, + 0.01582242362201214, + -0.07095066457986832, + -0.011896103620529175, + -0.0898396298289299, + 0.000857154605910182, + 0.02479904145002365, + -0.04015585407614708, + -0.04043566435575485, + -0.0472237765789032, + 0.031227534636855125, + 0.021124064922332764, + -0.0604877769947052, + 0.003218618221580982, + -0.0231316015124321, + 0.017888469621539116, + -0.08809228986501694, + -0.0036133499816060066, + -0.06864125281572342, + -0.04682687297463417, + -0.018113508820533752, + -0.07460294663906097, + 0.031445179134607315, + 0.05917775630950928, + -0.010313867591321468, + 0.001913213636726141, + 0.021329523995518684, + -0.04515153169631958, + 0.044391997158527374, + 0.024442709982395172, + 0.052626948803663254, + 0.0038299085572361946, + 0.015321130864322186, + 0.03426644206047058, + -0.013600368052721024, + -0.056420888751745224, + -0.013546468690037727, + -0.013812181539833546, + 0.025691255927085876, + -0.036974724382162094, + 0.01779022067785263, + -0.06874419748783112, + 0.047782573848962784, + 0.03878454491496086, + -0.007244600914418697, + 0.02038305252790451, + -0.002618989907205105, + 0.005330730229616165, + 0.029592636972665787, + 0.01506439782679081, + -0.006280140485614538, + 0.0839882493019104, + -0.03317708894610405, + 0.0694027841091156, + 0.016044368967413902, + 0.031813107430934906, + -0.03898882120847702, + -0.09924381971359253, + -0.0018308327998965979, + -0.04994996264576912, + -0.027328994125127792, + -0.0730605348944664, + -0.02931971475481987, + 0.0021876508835703135, + 0.03022065758705139, + 0.035129692405462265, + -0.07134779542684555, + -0.014315178617835045, + 0.031005024909973145, + -0.017868271097540855, + -0.013462456874549389, + -0.033486656844615936, + -0.023653019219636917, + -0.04801288992166519, + 0.009975641034543514, + 0.01450454443693161, + -0.08886445313692093, + 0.05838429182767868, + -0.017613688483834267, + -0.0365159772336483, + -0.004224137403070927, + -0.04649507254362106, + 0.010790612548589706, + 0.03452901542186737, + -0.017780426889657974, + 0.0020221667364239693, + -0.03713726997375488, + -0.009614478796720505, + 0.060829438269138336, + -0.04794372618198395, + -0.0035630834754556417, + 0.015318566001951694, + 0.04921897500753403, + 0.036809924989938736, + 0.017779115587472916, + -0.0066700163297355175, + 0.012913006357848644, + -0.017593827098608017, + 0.04107185825705528, + -0.0011484860442578793, + -0.02227785997092724, + -0.07282926142215729, + -0.005404220428317785, + 0.019945429638028145, + -0.03512192144989967, + -0.048513222485780716, + -0.02390464022755623, + -0.04964315518736839, + 0.055427663028240204, + 0.042578473687171936, + -0.05552581697702408, + -0.019406726583838463, + -0.04732907563447952, + -0.01687067560851574, + -0.02169208787381649, + 0.021561047062277794, + 0.0004930216236971319, + 0.04019555076956749, + 0.038148827850818634 + ], + "index": 0, + "object": "embedding" + }, + { + "embedding": [ + -0.019107868894934654, + 0.05969410762190819, + -0.02641526237130165, + -0.00969020463526249, + -0.03747580572962761, + 0.02357102558016777, + 0.09215934574604034, + -0.02301914431154728, + -0.004839807283133268, + 0.009354430250823498, + 0.0667242631316185, + -0.054705146700143814, + 0.0034877739381045103, + -0.09294716268777847, + 0.039650965481996536, + -3.956817090511322e-05, + -0.01878221705555916, + 0.03802841901779175, + 0.04464232549071312, + 0.036792606115341187, + 0.05557376518845558, + 0.01654529571533203, + -0.05781911313533783, + 0.0298917219042778, + 0.05767952278256416, + -0.07013184577226639, + -0.023283272981643677, + -0.02829700894653797, + -0.07846219837665558, + 0.055097613483667374, + -0.031084541231393814, + 0.0370931401848793, + -0.0262261051684618, + -0.003207992995157838, + -0.0501214824616909, + -0.00466768117621541, + -0.028331540524959564, + 0.010863426141440868, + -0.030716603621840477, + 0.02695249393582344, + -0.009500059299170971, + 0.0312824584543705, + -0.016594339162111282, + -0.016109604388475418, + 0.030723711475729942, + 0.009460280649363995, + 0.03169010952115059, + 0.0428958386182785, + 0.06801591068506241, + 0.04352327063679695, + 0.06424146890640259, + 0.02542412094771862, + -0.02557544596493244, + -0.07389100641012192, + 0.024695497006177902, + -0.037883155047893524, + -0.06273537129163742, + -0.033280596137046814, + 0.0942988246679306, + -0.021529264748096466, + 0.005481111817061901, + -0.05713951960206032, + -0.03173011913895607, + 0.08359173685312271, + 0.002509322250261903, + -0.010705582797527313, + -0.02813081070780754, + 0.03218778595328331, + -0.031135477125644684, + 0.054803911596536636, + -0.03086942248046398, + 0.027762817218899727, + 0.050554174929857254, + -0.011865640059113503, + -0.034509144723415375, + -0.0822167620062828, + 0.03028966300189495, + 0.0012372484197840095, + 0.022374756634235382, + 0.005579935386776924, + 0.03646182641386986, + -0.02391068823635578, + -0.022860227152705193, + 0.06766748428344727, + 0.06965604424476624, + -0.055303674191236496, + 0.0024586475919932127, + 0.036844659596681595, + 0.02541314996778965, + 0.01812933385372162, + -0.03368941694498062, + 0.09144852310419083, + 0.09115881472826004, + -0.06697574257850647, + -0.017377778887748718, + -0.010126631706953049, + 0.027187934145331383, + -0.014947411604225636, + 0.05628008395433426, + 0.06307908147573471, + 0.03403352200984955, + 0.0030784416012465954, + 0.06869656592607498, + -0.009399832226336002, + 0.041315484791994095, + -0.010467988438904285, + -0.0483647845685482, + 0.017219247296452522, + -0.03896819427609444, + 0.021415650844573975, + 0.09061326831579208, + -0.005861051380634308, + -0.038267653435468674, + 0.046615395694971085, + 0.04201333597302437, + -0.01590883545577526, + -0.003025552723556757, + 0.021644582971930504, + -0.10279767960309982, + 0.0063465856947004795, + 0.03894897550344467, + -0.018092051148414612, + -0.035921160131692886, + -0.014537656679749489, + 0.009809433482587337, + -0.03156856819987297, + 0.018243683502078056, + -0.07279945909976959, + -0.08304895460605621, + 0.020131003111600876, + -0.003034191206097603, + 0.17061756551265717, + -0.03022359497845173, + -0.06010538339614868, + 0.0001771855168044567, + -0.06383176147937775, + -0.1212034747004509, + 0.030682992190122604, + 0.04772643372416496, + 0.02061346545815468, + 0.044820792973041534, + 0.06503155082464218, + -0.014484420418739319, + -0.07592359185218811, + 0.003911200445145369, + -0.046980120241642, + 0.062438253313302994, + -0.011392018757760525, + 0.007086616475135088, + -0.003980552311986685, + -0.09060041606426239, + 0.021531838923692703, + -0.05317315086722374, + -0.0063044060952961445, + 0.014186644926667213, + 0.05544703081250191, + 0.04073552042245865, + -0.08768859505653381, + -0.1433810442686081, + 0.062245022505521774, + -0.06447340548038483, + 0.07243824005126953, + -0.04838711395859718, + -0.10524970293045044, + -0.09465774893760681, + 0.04338963329792023, + -0.028572693467140198, + 0.08500376343727112, + -0.03209125995635986, + 0.05384884029626846, + 0.05702401325106621, + -0.06152752414345741, + 0.058184098452329636, + 0.09705542773008347, + 0.10502056032419205, + 0.03784438967704773, + 0.030813420191407204, + 0.03487790375947952, + 0.03566966578364372, + 0.12169647216796875, + -0.08527814596891403, + 0.024039991199970245, + 0.049659278243780136, + 0.011523749679327011, + -0.02314302697777748, + 0.002479518298059702, + 0.018091682344675064, + -0.03763652220368385, + 0.04773708060383797, + 0.02359866350889206, + -0.046382155269384384, + -0.07191500067710876, + -0.0137832872569561, + -0.061333637684583664, + 0.0044320980086922646, + 0.011473669670522213, + -0.0004515079490374774, + 0.004205567296594381, + 0.10532690584659576, + 0.04663138464093208, + -0.004316071979701519, + -0.02644043229520321, + 0.04246068373322487, + 0.05435512587428093, + 0.021789541468024254, + 0.03728332743048668, + 0.03247801586985588, + 0.006477495189756155, + -0.03336288779973984, + -0.052549008280038834, + 0.03782998025417328, + 0.0539570115506649, + -0.011990574188530445, + -0.012592736631631851, + -0.028249235823750496, + -0.08427534252405167, + -0.14187216758728027, + -0.015555874444544315, + 0.02031802572309971, + -0.004645025357604027, + 0.07693739980459213, + -0.0019037178717553616, + 0.05387450009584427, + 0.06875354051589966, + -0.0260264053940773, + -0.012445708736777306, + -0.09106626361608505, + -0.05967855826020241, + 0.04270946979522705, + 0.030767718330025673, + 0.004102952778339386, + -0.07895159721374512, + -0.005092627834528685, + -0.05254456400871277, + -0.027765337377786636, + -0.019031543284654617, + 0.015856865793466568, + -0.009976810775697231, + 0.06166425347328186, + -0.09034319221973419, + -0.029368003830313683, + 0.003111080499365926, + 0.013041235506534576, + -0.029530683532357216, + -0.0060139428824186325, + 0.037104107439517975, + 0.048742953687906265, + 0.012147465720772743, + -0.06627201288938522, + -0.14233113825321198, + 0.06595543771982193, + 0.09540640562772751, + -0.027140118181705475, + -0.05786439776420593, + -0.03835649788379669, + 0.04362019523978233, + -0.05224176123738289, + -0.040575262159109116, + 0.026075158268213272, + 0.0486895777285099, + 0.02869992144405842, + -0.02865298092365265, + 0.027256378903985023, + -0.04727815091609955, + -0.01788470149040222, + 0.0029314374551177025, + -0.039456482976675034, + 0.006910055875778198, + 0.019828999415040016, + 0.03293032571673393, + 0.04420895874500275, + 0.04037678241729736, + -0.004165329039096832, + 0.04362497851252556, + 0.01705991104245186, + -0.09046860039234161, + -0.007405324373394251, + 0.02170439064502716, + -0.000971913046669215, + -0.03682924434542656, + -0.0055264937691390514, + 0.00488848052918911, + -0.05618760362267494, + -0.0007306243060156703, + 0.034489840269088745, + 0.036111295223236084, + -0.027665967121720314, + 0.0036469593178480864, + -0.10788348317146301, + 0.032339032739400864, + 0.004036004189401865, + -0.0304102823138237, + 0.10898232460021973, + 0.003966630902141333, + -0.02487463504076004, + 0.011165143921971321, + 0.022842761129140854, + 0.1355801373720169, + -0.00575806712731719, + -0.03804865851998329, + 0.012298420071601868, + 0.135411337018013, + 0.013281743973493576, + -0.010842448100447655, + -0.05865247920155525, + -0.07216284424066544, + 0.00909117516130209, + -0.08173802495002747, + -0.002813630737364292, + 0.025598060339689255, + 0.07495344430208206, + -0.04790157452225685, + 0.012442308478057384, + 0.07229872792959213, + -0.03790329024195671, + 0.06151506304740906, + -0.021866757422685623, + 0.0631132572889328, + 0.025492189452052116, + -0.06090550869703293, + 0.052262693643569946, + 0.03031247854232788, + 0.04965190961956978, + -0.0513898991048336, + -0.02395702712237835, + -0.06624690443277359, + 0.03414173796772957, + -0.002529361518099904, + 0.06878060102462769, + 0.014153602533042431, + -0.06909331679344177, + 0.048220910131931305, + 0.042710382491350174, + 0.04152809828519821, + 0.09201670438051224, + 0.10529816895723343, + -0.009647340513765812, + 0.04514491558074951, + 0.06182157248258591, + 0.038261137902736664, + 0.012247578240931034, + -0.016902048140764236, + -0.054074861109256744, + -0.0027346459683030844, + -0.035286322236061096, + -0.000671595218591392, + -0.020851444453001022, + -0.05912028253078461, + 0.03581051528453827, + -0.04337315261363983, + -0.01956385374069214, + 0.004237719811499119, + -0.06927124410867691, + 0.020569758489727974, + -0.0006926784990355372, + 0.0004869419790338725, + -0.014945785515010357, + 0.06363927572965622, + 0.018962930887937546, + 0.04128069058060646, + 0.08596605062484741, + 0.00627359701320529, + -0.030244803056120872, + 0.029033750295639038, + 0.040679361671209335, + 0.03888079896569252, + -0.01623433455824852, + 0.12628987431526184, + -0.061587922275066376, + 0.11117321997880936, + 0.028206661343574524, + -0.09006542712450027, + -0.17459966242313385, + 0.05753336846828461, + -0.0777580514550209, + -0.055061567574739456, + -0.047371719032526016, + 0.00888530071824789, + -0.04794039577245712, + 0.044454410672187805, + -0.07609839737415314, + -0.050501272082328796, + 0.052621595561504364, + -0.02454296313226223, + -0.06877875328063965, + 0.0022716957610100508, + -0.020329033955931664, + 0.08024442195892334, + -0.023272959515452385, + -0.05816803500056267, + -0.04624331742525101, + 0.08294914662837982, + 0.01656801626086235, + -0.02112448960542679, + -0.09380540996789932, + 0.06970463693141937, + 0.014710181392729282, + 0.04234965890645981, + 0.0002107415348291397, + 0.025668375194072723, + 0.04749423265457153, + -0.03174463286995888, + -0.10041133314371109, + 0.04286760836839676, + 0.059495434165000916, + -0.0024170400574803352, + -0.1331634521484375, + -0.019143972545862198, + -0.045793578028678894, + 0.013072194531559944, + -0.06513761729001999, + -0.0021775441709905863, + 0.07740801572799683, + 0.0128395427018404, + 0.034201547503471375, + 0.002501504961401224, + -0.06347143650054932, + -0.0827707052230835, + -0.058420464396476746, + 0.011762617155909538, + -0.10761692374944687, + 0.06448917835950851, + -0.04513268172740936, + -0.017448261380195618, + 0.03361862152814865, + -0.010465940460562706, + 0.12419401854276657, + 0.01241596695035696, + -0.0641559585928917, + -0.05590023845434189, + 0.0018879227573052049, + 0.1075424998998642, + -0.0632002204656601, + 0.0012930401135236025, + 0.038224510848522186, + -0.023312170058488846, + -0.00465640053153038, + -0.04008292406797409, + -0.03062780573964119, + -0.02024693787097931, + -0.028171975165605545, + 0.03836512938141823, + 0.038529135286808014, + 0.05846807733178139, + 0.022991705685853958, + -0.0016795138362795115, + -0.04207833856344223, + -0.032820925116539, + -0.03261202201247215, + -0.030419277027249336, + 0.03492671623826027, + -0.0626068264245987, + 0.015011549927294254, + -0.07747045904397964, + 0.009282127022743225, + 0.05342179909348488, + 0.004121758043766022, + 0.015549017116427422, + 0.009798477403819561, + 0.09516540914773941, + -0.10548490285873413, + -0.09371929615736008, + -0.07756969332695007, + -0.05806498974561691, + 0.06880338490009308, + -0.026806222274899483, + -0.004507019650191069, + 0.04031221196055412, + 0.07586846500635147, + 0.0010414771968498826, + -0.032703712582588196, + 0.011433696374297142, + 0.029833726584911346, + -0.0257119033485651, + -0.03366890177130699, + 0.03963543847203255, + -0.03344348073005676, + 0.03677061200141907, + 0.0016234205104410648, + 0.036410167813301086, + 0.0027553834952414036, + 0.05725175887346268, + 0.0871000587940216, + 0.017660632729530334, + -0.1307959258556366, + -0.030803510919213295, + -0.06702478975057602, + -0.03890928626060486, + 0.005833339877426624, + 0.046123526990413666, + 0.024221643805503845, + 0.10369864851236343, + -0.04899594187736511, + 0.03488156199455261, + -0.010654409416019917, + -0.029799839481711388, + -0.0498703233897686, + 0.04467075690627098, + -0.00047155001084320247, + 0.03461684286594391, + 0.05542340874671936, + -0.01189647987484932, + 0.05968725308775902, + -0.03660564124584198, + -0.0037804662715643644, + 0.04793388023972511, + -0.07941094785928726, + 0.03307073190808296, + -0.023683249950408936, + 0.0025685373693704605, + -0.04098949581384659, + 0.03376660868525505, + 0.005951263476163149, + 0.07380400598049164, + -0.023361800238490105, + -0.0009826641762629151, + 0.0021398146636784077, + 0.0314042903482914, + -0.02987937442958355, + -0.08601617813110352, + 0.0914551243185997, + 0.0272340327501297, + 0.00570692541077733, + 0.03476465120911598, + -0.025536982342600822, + 0.05501542240381241, + -0.09498315304517746, + -0.017913876101374626, + -0.009813526645302773, + 0.07722225040197372, + -0.10824139416217804, + -0.08675307780504227, + 0.05775047093629837, + 0.10283687710762024, + 0.10858594626188278, + 0.004729479551315308, + -0.03893456608057022, + 0.12252123653888702, + -0.05336784943938255, + 0.007989426143467426, + 0.02518993616104126, + 0.021054377779364586, + -0.01120569184422493, + 0.008962331339716911, + 0.15070155262947083, + -0.041931431740522385, + 0.020063523203134537, + 0.07124665379524231, + -0.015184132382273674, + -0.009105974808335304, + -0.010330158285796642, + 0.002910048933699727, + 0.08601880818605423, + 0.0687614306807518, + -0.007822689600288868, + -0.016773391515016556, + -0.03154626861214638, + -0.07681484520435333, + -0.005057695787400007, + 0.017769012600183487, + 0.025736026465892792, + -0.002089190063998103, + -0.0345032699406147, + 0.06573650240898132, + 0.009012715891003609, + 0.0017626332119107246, + 0.0250503271818161, + 0.016202164813876152, + 0.04089904576539993, + -0.0011557838879525661, + -0.022899556905031204, + 0.020666014403104782, + 0.04018319025635719, + 0.029078686609864235, + -0.007621978875249624, + -0.016741041094064713, + 0.030248675495386124, + 0.02992335520684719, + 0.024699456989765167, + 0.017959201708436012, + 0.02364400401711464, + -0.034220755100250244, + -0.044312484562397, + 0.05544113367795944, + 0.04405776038765907, + -0.06289990246295929, + 0.018241044133901596, + 0.008325253613293171, + -0.029943838715553284, + 0.050102684646844864, + -0.023013044148683548, + 0.055493418127298355, + -0.06803395599126816, + -0.09021510928869247, + 0.08165101706981659, + 0.05944748967885971, + 0.021631119772791862, + -0.10993658006191254, + -0.0366002656519413, + 0.03235526755452156, + 0.019820883870124817, + 0.0018356747459620237, + -0.03975026309490204, + 0.024339156225323677, + 0.04263564944267273, + -0.061034977436065674, + -0.014553683809936047, + 0.0012570091057568789, + -0.024188965559005737, + 0.05914260074496269, + -0.007840420119464397, + -0.06857188791036606, + 0.09867143630981445, + -0.08754199743270874, + -0.0781262144446373, + -0.015508989803493023, + -0.010083363391458988, + 0.07288424670696259, + 0.09142982959747314, + -0.03969590365886688, + -0.05447239801287651, + 0.059492725878953934, + 0.07319212704896927, + -0.01694398559629917, + -0.03204117342829704, + 0.040536362677812576, + -0.008453471586108208, + -0.10774454474449158, + -0.020000411197543144, + -0.03818512707948685, + -0.0015745327109470963, + -0.03628892824053764, + 0.04461211711168289, + -0.05635157227516174, + 0.003746225731447339, + 0.041590671986341476, + 0.12744614481925964, + 0.006540853530168533, + -0.051108427345752716, + 0.015473317354917526, + -0.03978969156742096, + -0.03567656874656677, + 0.04545801877975464, + 0.05113706737756729, + 0.06606247276067734, + -0.039817459881305695, + 0.05209381505846977, + 0.050641030073165894, + 0.009054858237504959, + 0.001490931841544807, + 0.03269848972558975, + 0.037380777299404144, + -0.1146283894777298, + -0.04820196330547333, + 0.003163886023685336, + -0.02449909970164299, + 0.01799364760518074, + 0.016373910009860992, + -0.041310638189315796, + 0.04804148152470589, + -0.015126112848520279, + 0.08803117275238037, + -0.03349269926548004, + -0.005476118065416813, + 0.049157604575157166, + -0.06031497195363045, + 0.011520297266542912, + -0.029003849253058434, + 0.03276553004980087, + 0.05113251507282257, + -0.05430557206273079, + 0.08796515315771103, + 0.031849559396505356, + 0.029127072542905807, + -0.04036870226264, + -0.035829927772283554, + 0.01921452023088932, + -0.05420341342687607, + -0.04428316280245781, + 0.03898577764630318, + -0.0254821740090847, + 0.04274837672710419, + -0.004430112428963184, + 0.021844282746315002, + -0.0277419276535511, + -0.006554972380399704, + 0.02749747969210148, + -0.0060079158283770084, + -0.0759068951010704, + 0.051791753619909286, + -0.05145301669836044, + -0.029623968526721, + -0.12719927728176117, + 0.16616640985012054, + 0.01761988364160061, + -0.062106575816869736, + -0.0028107725083827972, + -0.011166619136929512, + -0.043970100581645966, + -0.05232355743646622, + 0.09471729397773743, + -0.018105845898389816, + -0.031164875254034996, + -0.07069668173789978, + -0.027401957660913467, + 0.03022896498441696, + 0.023299144580960274, + -0.10004950314760208, + 0.05298234894871712, + -0.0990290567278862, + -0.03169042989611626, + 0.06493762880563736, + -0.0012039461871609092, + -0.022033141925930977, + 0.037844426929950714, + -0.09252651780843735, + -0.027259940281510353, + -0.028783030807971954, + -0.15443633496761322, + -0.011268218979239464, + 0.11249776184558868, + -0.04436073452234268, + 0.015984032303094864, + 0.021389255300164223, + -0.01712341420352459, + -0.043895382434129715, + -0.07284197956323624, + 0.0319129079580307, + 0.12249504029750824, + -0.06822671741247177, + -0.031229401007294655, + -0.04616959020495415, + -0.04777440428733826, + 0.01624317653477192, + 0.07043299823999405, + -0.029858168214559555, + -0.050169117748737335, + 0.08853098750114441, + 0.03621404245495796, + -0.07093819230794907, + -0.034914661198854446, + -0.025673825293779373, + -0.02026950754225254, + 0.06507165729999542, + 0.0763045996427536, + 0.02203441597521305, + 0.033576007932424545, + 0.03952609375119209, + 0.02557799592614174, + 0.005753787234425545, + 0.01158105581998825, + 0.04434368386864662, + -0.0012732513714581728, + -0.04557472839951515, + 0.042615748941898346, + -0.013398909009993076, + -0.027536101639270782, + 0.02765466831624508, + 0.03956178203225136, + -0.06656771153211594, + 0.046436857432127, + 0.03554150462150574, + -0.003146965755149722, + 0.001389424316585064, + -0.09146097302436829, + 0.005561611149460077, + 0.016635337844491005, + -0.06795576959848404 + ], + "index": 1, + "object": "embedding" + }, + { + "embedding": [ + -0.061557523906230927, + 0.02080259658396244, + 0.055228427052497864, + 0.0020441869273781776, + 0.0025449786335229874, + -0.04805852845311165, + 0.0265218336135149, + -0.05998262017965317, + -0.0295464675873518, + -0.07836110144853592, + 0.020754694938659668, + -0.018101077526807785, + 0.012781891040503979, + 0.03845624998211861, + -3.4533441066741943e-06, + -0.0718374028801918, + -0.010329673998057842, + 0.019257087260484695, + 0.02170238457620144, + 0.031523268669843674, + 0.09562760591506958, + 0.020851192995905876, + -0.00297796493396163, + 0.09478145837783813, + 0.043912265449762344, + -0.027752766385674477, + 0.03518194332718849, + -0.0646074116230011, + -0.02263837493956089, + 0.017166532576084137, + 0.021467985585331917, + -0.01767192967236042, + 0.09736727923154831, + -0.03964245319366455, + -0.03365505114197731, + -0.006702782586216927, + 0.005792389158159494, + -0.03890980780124664, + -0.0011443658731877804, + 0.014723812229931355, + 0.05521225556731224, + -0.027238909155130386, + 0.058320362120866776, + -0.02367200143635273, + 0.0065787918865680695, + 0.0056058382615447044, + -0.010819255374372005, + -0.039377011358737946, + -0.012212555855512619, + 0.013808563351631165, + 0.0007871052366681397, + -0.002378924982622266, + -0.015141905285418034, + -0.031390365213155746, + -0.06274549663066864, + -0.05993959307670593, + -0.026836197823286057, + 0.10041190683841705, + 0.05616408586502075, + 0.023109061643481255, + 0.05199896916747093, + -0.06549163162708282, + 0.028634920716285706, + -0.044805821031332016, + 0.010857407003641129, + -0.0038166530430316925, + -0.08109555393457413, + 0.044161852449178696, + -0.020472757518291473, + 0.0758325383067131, + -0.06934519112110138, + -0.04711494222283363, + 0.058023568242788315, + 0.016695929691195488, + -0.056938156485557556, + -0.01581818424165249, + 0.01544687058776617, + 0.027362950146198273, + 0.006386633031070232, + -0.029433026909828186, + -0.05808013677597046, + 0.004807379096746445, + 0.04571516439318657, + -0.048068832606077194, + -0.1409703493118286, + -0.04430615156888962, + 0.07560203224420547, + 0.02842158079147339, + -0.021456964313983917, + -0.07939398288726807, + 0.004749900195747614, + -0.03420829400420189, + -0.016520069912075996, + 0.017604999244213104, + 0.026151373982429504, + -0.13602207601070404, + 0.01756151206791401, + 0.06743232160806656, + -0.0788491889834404, + -0.0732865259051323, + -0.00963820144534111, + -0.030407778918743134, + 0.054906539618968964, + 0.014350044541060925, + 0.018225759267807007, + -0.0002081543207168579, + 0.1769949197769165, + 0.024131931364536285, + 0.06296230852603912, + -0.029111331328749657, + -0.03202029690146446, + -0.04699435457587242, + 0.09393177926540375, + 0.010633355006575584, + 0.0035634299274533987, + 0.06478850543498993, + -0.0749504417181015, + 0.010190804488956928, + -0.07949966937303543, + -0.030986765399575233, + -0.007734260056167841, + -0.047853633761405945, + 0.006169784814119339, + -0.0033485540188848972, + -0.06453626602888107, + 0.08211663365364075, + -0.08734812587499619, + -0.026940234005451202, + 0.00634808698669076, + -0.024274475872516632, + 0.008418355137109756, + -0.04505014792084694, + -0.027207395061850548, + -0.0036513102240860462, + 0.029595818370580673, + -0.0897647961974144, + -0.04516728222370148, + 0.04067203402519226, + -0.03197766840457916, + 0.0231638140976429, + -0.02368600107729435, + 0.04237283393740654, + -0.03507782146334648, + 0.01177262794226408, + -0.024702254682779312, + -0.08386675268411636, + 0.026940980926156044, + 0.0779075101017952, + -0.025266939774155617, + 0.04615459218621254, + 0.01339583657681942, + -0.02941860631108284, + 0.02515445463359356, + -0.0320737361907959, + 0.0010209080064669251, + 0.09977539628744125, + -0.018261563032865524, + -0.00983362179249525, + 0.09386462718248367, + -0.06959392130374908, + -0.0006084776832722127, + 0.11735045164823532, + 0.05741734430193901, + -0.0237805787473917, + -0.04109995812177658, + 0.0009611320565454662, + 0.006311706267297268, + -0.041298117488622665, + 0.04715995863080025, + -0.056103333830833435, + 0.02898971363902092, + -0.027803028002381325, + -0.07407600432634354, + 0.004661418031901121, + 0.01099067647010088, + -0.006461405660957098, + 0.022562436759471893, + 0.029299777001142502, + 0.04790095239877701, + -0.01662955991923809, + -0.01823064684867859, + 0.14664961397647858, + 0.003053737571462989, + 0.018857616931200027, + 0.002498770598322153, + -0.012757600285112858, + -0.061637911945581436, + -0.11198734492063522, + 0.014784800820052624, + -0.016342399641871452, + -0.014666472561657429, + -0.021422233432531357, + 0.03471158444881439, + -0.03667265549302101, + 0.03310947120189667, + -0.029424097388982773, + 0.09364338219165802, + 0.08107949048280716, + 0.0010562833631411195, + -0.0027208428364247084, + 0.0709361657500267, + -0.07117032259702682, + 0.041216250509023666, + -0.0035790237598121166, + 0.021134505048394203, + -0.023005999624729156, + 0.03180701658129692, + -0.015317085199058056, + -0.07503004372119904, + 0.03297184780240059, + -0.1122499480843544, + 0.026771968230605125, + -0.003317444585263729, + -0.03583106771111488, + -0.10052846372127533, + -0.01670895703136921, + 0.006044056732207537, + -0.0353948138654232, + -0.06496644020080566, + 0.04254237934947014, + 0.06662790477275848, + -0.02872725948691368, + 0.03233612701296806, + -0.08098772168159485, + -0.002917562611401081, + -0.059007685631513596, + 0.01551723014563322, + -0.0036865416914224625, + 0.03948555141687393, + -0.029730895534157753, + 0.08848481625318527, + -0.04417796432971954, + 0.08919074386358261, + -0.05832821503281593, + 0.07851067185401917, + 0.009961046278476715, + 0.030549589544534683, + 0.04732692986726761, + 0.04392458498477936, + -0.02009996771812439, + 0.031521156430244446, + -0.03206602483987808, + 0.11469870060682297, + -0.024758143350481987, + -0.08026223629713058, + -0.035604171454906464, + 0.018993748351931572, + 0.14987272024154663, + 0.060040105134248734, + -0.017032846808433533, + 0.06244199350476265, + 0.03899195417761803, + 0.06938868761062622, + -0.012093457393348217, + -0.07042790949344635, + 0.0835808590054512, + 0.01002182811498642, + -0.07154907286167145, + -0.03159642964601517, + 0.05388499051332474, + -0.029367676004767418, + 0.031295858323574066, + 0.0238728616386652, + 0.004915574099868536, + -0.04333344101905823, + 0.0211846511811018, + -0.05012655630707741, + 0.07294707745313644, + 0.03529274836182594, + -0.07038716226816177, + -0.028013255447149277, + 0.02531358227133751, + 0.11515265703201294, + 0.04194512963294983, + -0.051548201590776443, + -0.03893586993217468, + -0.007670999970287085, + -0.015665851533412933, + -0.012601067312061787, + 0.05932888388633728, + -0.026280006393790245, + 0.020621582865715027, + -0.08311574906110764, + 0.024060217663645744, + 0.004734879359602928, + -0.013305076397955418, + 0.011913719587028027, + -0.028520511463284492, + 0.011541048064827919, + -0.01646098680794239, + 0.0027226305101066828, + 0.043097518384456635, + -0.03690396621823311, + 0.023397205397486687, + -0.041729021817445755, + -0.04418623819947243, + -0.026759829372167587, + -0.003737540217116475, + 0.028038935735821724, + -0.0103102782741189, + 0.04782361909747124, + -0.04321561008691788, + -0.01046162098646164, + 0.01591915264725685, + 0.037790361791849136, + -0.09842560440301895, + -0.05866103619337082, + 0.012297896668314934, + 0.009950865991413593, + 0.007484015077352524, + -0.05998437479138374, + 0.10837540030479431, + -0.016087345778942108, + 0.03411209210753441, + 0.11232127249240875, + -0.0387527234852314, + 0.04367959126830101, + 0.004913573618978262, + -0.07560715824365616, + 0.005539371632039547, + -0.04728255420923233, + -0.019808584824204445, + -0.07848677784204483, + 0.019333817064762115, + -0.012286359444260597, + -0.0008059663814492524, + -0.03699260950088501, + 0.02564675360918045, + 0.08281515538692474, + 0.01159362681210041, + -0.07901489734649658, + 0.08633352816104889, + 0.0484158881008625, + 0.024328358471393585, + 0.048739202320575714, + -0.023705506697297096, + -0.11965138465166092, + -0.04248884320259094, + 0.10684081166982651, + -0.05587674304842949, + 0.04601799324154854, + -0.03752054646611214, + -0.06610417366027832, + 0.020532017573714256, + 0.05577194318175316, + -0.0351848304271698, + -0.03966183215379715, + 0.039472825825214386, + 0.04662502929568291, + 0.0920429602265358, + 0.05710485950112343, + 0.0015081677120178938, + -0.001661293557845056, + -0.03866681084036827, + 0.008358764462172985, + -0.010966735891997814, + 0.051610253751277924, + 0.012763690203428268, + 0.08436810970306396, + -0.04448515549302101, + 0.004049496725201607, + -0.05853516608476639, + -0.010701366700232029, + 0.0802207812666893, + -0.06702207773923874, + 0.02797039784491062, + 0.05719626322388649, + 0.06924539804458618, + 0.07604339718818665, + 0.04466324672102928, + 0.05305468291044235, + 0.03920542448759079, + 0.02115277200937271, + 0.017460286617279053, + 0.09175240248441696, + 0.03976890444755554, + 0.006327434908598661, + 0.017122600227594376, + -0.020584115758538246, + -0.0022071937564760447, + -0.01142031978815794, + 0.002747416030615568, + 0.0869361013174057, + 0.04037103429436684, + 0.05526987835764885, + 0.0037959632463753223, + 0.046756330877542496, + 0.003939548507332802, + 0.05206673592329025, + 0.005674003157764673, + 0.040892262011766434, + -0.06547341495752335, + -0.03260507062077522, + 0.08396773040294647, + -0.07550634443759918, + 0.12760308384895325, + 0.0880792960524559, + 0.01173308864235878, + -0.09041643887758255, + 0.029585275799036026, + 0.001130781602114439, + 0.0007187369046732783, + 0.04810946434736252, + 0.08175022155046463, + 0.023635948076844215, + -0.0007396190194413066, + -0.044851914048194885, + 0.043525196611881256, + 0.03885793313384056, + -0.0062509928829967976, + 0.06491073966026306, + -0.006760436575859785, + 4.718080163002014e-06, + 0.034302957355976105, + -0.01173165999352932, + 0.12747405469417572, + -0.014666312374174595, + -0.009264315478503704, + -0.10077650845050812, + -0.012223553843796253, + -0.030275540426373482, + 0.08462796360254288, + -0.06931953877210617, + -0.008290097117424011, + -0.061825480312108994, + -0.03543975204229355, + 0.0064462944865226746, + 0.06175720691680908, + 0.041911300271749496, + -0.08280936628580093, + 0.07825805991888046, + 0.0022807137575000525, + 0.05598978325724602, + -0.05291788652539253, + -0.017720498144626617, + -0.0037429446820169687, + -0.00740834092721343, + 0.13099193572998047, + -0.016362376511096954, + 0.04761392995715141, + 0.06243278086185455, + -0.012130548246204853, + -0.014929243363440037, + 0.049694936722517014, + 0.020226312801241875, + 0.03466084972023964, + 0.05942593142390251, + -0.02239811234176159, + 0.05331430584192276, + -0.040120869874954224, + 0.039348915219306946, + -0.013168253935873508, + -0.012476191855967045, + 0.02109885774552822, + -0.01602952741086483, + 0.0010936758480966091, + -0.021984923630952835, + 0.04495074227452278, + 0.04218602553009987, + 0.013104777783155441, + -0.0009330061147920787, + -0.06865502148866653, + -0.07468852400779724, + 0.03262045979499817, + 0.003583319019526243, + -0.024782249704003334, + -0.006680495571345091, + -0.002014060504734516, + 0.04689604789018631, + -0.0004360750026535243, + 0.004111730493605137, + 0.05334358289837837, + 0.021736275404691696, + -0.020955385640263557, + -0.04790278151631355, + 0.040953442454338074, + 0.04858502745628357, + 0.11163617670536041, + 0.11007434129714966, + -0.03981231153011322, + -0.011445174925029278, + -0.005122769623994827, + 0.0803154706954956, + 0.06338779628276825, + 0.0139765040948987, + 0.004219823516905308, + 0.03783654049038887, + -0.04720406234264374, + -0.061881937086582184, + 0.08398488909006119, + -0.03193046152591705, + -0.06009882315993309, + -0.04475605860352516, + -0.03480907157063484, + -0.006613061297684908, + -0.05507068336009979, + -0.05623098835349083, + -0.012239466421306133, + -0.039281658828258514, + 0.013645431958138943, + -0.0984303280711174, + -0.021213950589299202, + 0.03370966762304306, + -0.05870208889245987, + -0.018790647387504578, + 0.09075725823640823, + 0.01939035952091217, + 0.016227634623646736, + -0.05809008702635765, + -0.05329965427517891, + -0.012274257838726044, + -0.07503010332584381, + -0.0560571625828743, + -0.025919314473867416, + 0.07525516301393509, + 0.07574900984764099, + 0.020306071266531944, + 0.05117601528763771, + 0.009903589263558388, + -0.10001925379037857, + 0.07389220595359802, + -0.0358579158782959, + 0.07475733011960983, + -0.050454191863536835, + -0.011644942685961723, + -0.07511253654956818, + -0.02085184119641781, + 0.007209982722997665, + -0.03442830592393875, + -0.07751305401325226, + -0.011530717834830284, + -0.10854385048151016, + -0.026548288762569427, + 0.022584158927202225, + -0.05808578059077263, + -0.06184999272227287, + -0.006361300125718117, + -0.08633283525705338, + -0.007299655117094517, + -0.054048508405685425, + 0.04977639019489288, + 0.0800187811255455, + 0.043838679790496826, + -0.058855533599853516, + 0.0008643732871860266, + -0.011604574508965015, + -0.0005179251893423498, + -0.007619425188750029, + 0.011775720864534378, + -0.04379800707101822, + -0.014153039082884789, + -0.024185743182897568, + 0.06792017072439194, + -0.0032818906474858522, + 0.004900431260466576, + 0.007497119717299938, + 0.01870359480381012, + 0.008026315830647945, + -0.05082084611058235, + -0.0362345427274704, + -0.013726629316806793, + -0.021465320140123367, + 0.04130924493074417, + 0.05518465116620064, + 0.008306142874062061, + 0.12373553216457367, + 0.07854555547237396, + -0.0875948816537857, + -0.050983600318431854, + -0.055993761867284775, + -0.041282135993242264, + -0.02437025122344494, + 0.05205613374710083, + -0.0502597913146019, + 0.08499561995267868, + -0.005645051132887602, + 0.07367569953203201, + -0.015836002305150032, + 0.0162825807929039, + -0.002377419965341687, + -0.0469253808259964, + 0.006652745883911848, + 0.026379568502306938, + -0.08686188608407974, + 0.0301973819732666, + -0.0031743175350129604, + -0.04157540947198868, + -0.0422104112803936, + 0.02118316851556301, + 0.010832742787897587, + -0.029460832476615906, + -0.051823828369379044, + -0.09889776259660721, + -0.02205701172351837, + 0.07898921519517899, + 0.006344629917293787, + 0.04122161120176315, + -0.13566647469997406, + 0.026102155447006226, + 0.10255654901266098, + 0.04816935583949089, + 0.019704462960362434, + -0.0037931432016193867, + 0.04952011629939079, + -0.0624857060611248, + -0.10203205049037933, + -0.04100814461708069, + -0.04298250377178192, + 0.052039649337530136, + -0.009493480436503887, + 0.10994862765073776, + 0.01494740042835474, + 0.04819463938474655, + -0.07886224240064621, + 0.012770792469382286, + 0.05823500081896782, + -0.010228138417005539, + 0.043389249593019485, + -0.04455692693591118, + -0.026159441098570824, + -0.014504816383123398, + 0.1315975934267044, + 0.015806524083018303, + 0.00017872080206871033, + -0.039979465305805206, + -0.01070393156260252, + -0.11038648337125778, + 0.004028037656098604, + -0.09508360177278519, + 0.09150142222642899, + -0.07623880356550217, + -0.09600035846233368, + 0.031263478100299835, + -0.03871247172355652, + -0.00802614912390709, + 0.025084661319851875, + 0.00300199375487864, + 0.08458340167999268, + 0.07256080955266953, + 0.05981824919581413, + 0.033045221120119095, + 0.013377734459936619, + -0.08104311674833298, + 0.025950508192181587, + 0.035431571304798126, + 0.03974687680602074, + -0.08084629476070404, + 0.1328800916671753, + -0.006378353573381901, + -0.03064691461622715, + 0.014535668306052685, + -0.0682513415813446, + 0.001491258735768497, + -0.041070789098739624, + -0.039945997297763824, + 0.00709237577393651, + -0.01808503270149231, + 0.013203002512454987, + -0.011125064454972744, + 0.0527070127427578, + 0.02085830084979534, + -0.07813666015863419, + -0.009450078010559082, + -0.02172713354229927, + -0.01300408598035574, + -0.11026838421821594, + 0.007873781956732273, + -0.1196158304810524, + -0.033466920256614685, + -0.0457322932779789, + -0.06961105763912201, + 0.03899574652314186, + 0.03212570771574974, + 0.0012680359650403261, + 0.016437234356999397, + 0.02134554646909237, + -0.0263697300106287, + 0.12652339041233063, + 0.005523796658962965, + 0.03978269174695015, + 0.015642153099179268, + 0.012732453644275665, + 0.04305964708328247, + 0.03454715758562088, + -0.03824087977409363, + 0.004328976385295391, + 0.0003912262327503413, + 0.027716636657714844, + 0.02396395057439804, + -0.02847343124449253, + -0.016948312520980835, + 0.023767292499542236, + 0.04629465192556381, + -0.03143468126654625, + 0.037742406129837036, + 0.021194443106651306, + -0.03788991644978523, + 0.024483749642968178, + 0.05208025127649307, + -0.031938306987285614, + 0.12170270085334778, + -0.05562039092183113, + 0.08853810280561447, + -0.022249754518270493, + 0.03863701969385147, + -0.02860582433640957, + -0.13264809548854828, + -0.008532378822565079, + -0.0406331866979599, + 0.015312130562961102, + -0.07805967330932617, + 0.006238729692995548, + -0.025534609332680702, + -0.0070103248581290245, + 0.010838434100151062, + -0.03673049807548523, + -0.001783689484000206, + 0.04765395075082779, + -0.04501599073410034, + 0.04099445417523384, + -0.06562845408916473, + -0.023723235353827477, + -0.09627480059862137, + 0.022906223312020302, + 0.05437895655632019, + -0.09688648581504822, + 0.022415542975068092, + -0.02507556416094303, + -0.07629584521055222, + 0.01678617112338543, + -0.04702872037887573, + 0.09093689173460007, + 0.05460728704929352, + 0.013151026330888271, + -0.0032807972747832537, + -0.01958034187555313, + 0.012639516033232212, + 0.03352852165699005, + -0.048807695508003235, + 0.012123597785830498, + 0.021912487223744392, + 0.003014186630025506, + 0.06145930290222168, + 0.06476475298404694, + -0.007475043181329966, + -0.0009288859437219799, + -0.014005833305418491, + 0.059760816395282745, + 0.022914253175258636, + -0.05352196469902992, + -0.07883243262767792, + 0.029276518151164055, + 0.04270949587225914, + -0.03137461096048355, + -0.047380246222019196, + -0.01453434769064188, + -0.07227451354265213, + 0.07678356766700745, + 0.03607282042503357, + -0.04686196520924568, + -0.04268438369035721, + -0.04856279492378235, + 0.022016890347003937, + -0.09514237195253372, + 0.012326696887612343, + 0.043724242597818375, + 0.03722542151808739, + 0.0664031058549881 + ], + "index": 2, + "object": "embedding" + }, + { + "embedding": [ + -0.04192072153091431, + 0.06739765405654907, + -0.0881117507815361, + -0.025434914976358414, + -0.0007976124179549515, + 0.04544219747185707, + 0.023919273167848587, + -0.01714596152305603, + 0.015248444862663746, + -0.041811686009168625, + 0.02325117215514183, + 0.0897035300731659, + 0.012673909775912762, + -0.02059660106897354, + -0.09084810316562653, + -0.015460507944226265, + -0.014105337671935558, + -0.03226720169186592, + -0.02632078155875206, + -0.026455795392394066, + 0.06212672218680382, + 0.023486662656068802, + -0.032582152634859085, + 0.03263164684176445, + -0.02057139202952385, + -0.03550923988223076, + -0.041698552668094635, + -0.048175204545259476, + 0.030519232153892517, + -0.06563308835029602, + 0.05298648402094841, + 0.06691961735486984, + -0.025483068078756332, + 0.0004842057533096522, + -0.007826434448361397, + -0.041435252875089645, + -0.033761776983737946, + 0.045098789036273956, + 0.055017270147800446, + -0.007720989640802145, + -0.10931381583213806, + -0.017970597371459007, + 0.02401716262102127, + -0.006750625558197498, + 0.07090383768081665, + 0.03815016523003578, + -0.006283546797931194, + 0.06242258474230766, + -0.04689883813261986, + 0.006446192041039467, + 0.009382223710417747, + -0.002529083052650094, + -0.00011536478996276855, + -0.0009448041091673076, + -0.030059032142162323, + 0.020660191774368286, + -0.035045746713876724, + 0.012610760517418385, + -0.05114401504397392, + 0.014291507191956043, + -0.01914171688258648, + 0.05595478042960167, + 0.20842894911766052, + 0.04091084748506546, + -0.03339199349284172, + -0.018736684694886208, + -0.04324203357100487, + -0.036510296165943146, + -0.040959205478429794, + -0.055596861988306046, + 0.02378627099096775, + -0.032412514090538025, + 0.03718755021691322, + -0.08895562589168549, + -0.01896924339234829, + 0.0032698852010071278, + -0.023522846400737762, + -0.055508214980363846, + -0.07383961975574493, + 0.014368696138262749, + 0.07959893345832825, + -0.05999409779906273, + 0.10828885436058044, + -0.03971143439412117, + -0.07375017553567886, + -0.03630795702338219, + 0.010715680196881294, + -0.015512369573116302, + -0.03692962974309921, + -0.004445709753781557, + -0.05646027997136116, + 0.022770145907998085, + -0.04066101089119911, + -0.05405808985233307, + 0.06765549629926682, + -0.03342653810977936, + -0.03099502995610237, + -0.03577205538749695, + -0.0030446508899331093, + -0.05078830197453499, + 0.012246816419064999, + -0.05787038058042526, + 0.007146736141294241, + -0.026879100129008293, + 0.0076272012665867805, + 0.0034725889563560486, + 0.019866233691573143, + 0.020599715411663055, + -0.06616891175508499, + 0.025196276605129242, + 0.029114533215761185, + 0.028070561587810516, + -0.01041315495967865, + -0.04222819581627846, + -0.03837141394615173, + -0.10533731430768967, + 0.08254411071538925, + 0.06173647567629814, + -0.11052531003952026, + -0.04129445552825928, + -0.04036591574549675, + 0.04321273788809776, + -0.0712730810046196, + 0.03612561896443367, + -0.02249547466635704, + -0.0016524487873539329, + -0.02399303950369358, + -0.08907151967287064, + 0.06133141741156578, + 0.03303912654519081, + -0.09489106386899948, + 0.09016741812229156, + 0.09704682230949402, + -0.08501327037811279, + -0.012326125986874104, + 0.04504644498229027, + -0.08439379185438156, + -0.032368432730436325, + -0.04417438805103302, + 0.007467896677553654, + -0.004590330179780722, + 0.1162756010890007, + 0.08780170977115631, + -0.008521395735442638, + -0.08520947396755219, + -0.03324158862233162, + -0.08053623884916306, + -0.02580426260828972, + 0.009348656982183456, + -0.005565320607274771, + -0.05610598251223564, + 0.0053667169995605946, + 0.0604676678776741, + 0.015942415222525597, + 0.06819010525941849, + 0.00535653717815876, + 0.0032398959156125784, + 0.08639410883188248, + -0.05580917373299599, + 0.018780594691634178, + -0.10725097358226776, + -0.031721290200948715, + -0.03166975826025009, + 0.051686953753232956, + -0.009960589930415154, + -0.13245539367198944, + -0.03390725329518318, + -0.018940147012472153, + -0.010620973072946072, + -0.031618066132068634, + 0.10258477181196213, + 0.0575074702501297, + -0.08389502018690109, + -0.050234779715538025, + 0.05363093689084053, + -0.07966934144496918, + -0.08889421075582504, + -0.006416057702153921, + -0.046130795031785965, + -0.11978791654109955, + 0.06862123310565948, + 0.056407179683446884, + 0.10906971991062164, + -0.0732492133975029, + 0.061636362224817276, + 0.05034111812710762, + 0.005161208100616932, + 0.024723555892705917, + 0.06685354560613632, + -0.017589008435606956, + 0.016249872744083405, + -0.05354464799165726, + -0.026373241096735, + -0.03794475272297859, + -0.006571537349373102, + 0.016455011442303658, + -0.0014304956421256065, + -0.058218106627464294, + -0.02876633033156395, + -0.016927488148212433, + 0.03287644311785698, + -0.00986045878380537, + 0.07751085609197617, + -0.015117493458092213, + -0.07916144281625748, + -0.012945973314344883, + 0.014852992258965969, + -0.10090044885873795, + 0.012214593589305878, + -0.050443362444639206, + 0.01461424957960844, + 0.009883047081530094, + 0.12654365599155426, + -0.07614471763372421, + 0.06052093580365181, + 0.09604322165250778, + -0.04305556043982506, + 0.11088798195123672, + 0.04705927148461342, + 0.04541826620697975, + 0.06163223087787628, + 0.05465885251760483, + 0.020997850224375725, + 0.01798207499086857, + 0.05652041733264923, + -0.013834050856530666, + 0.033924687653779984, + 0.024586454033851624, + -0.05322431027889252, + 0.04796868562698364, + 0.054416313767433167, + -0.05820561572909355, + -0.10481776297092438, + -0.0012059047585353255, + -0.05775771662592888, + 0.015114232897758484, + 0.031262386590242386, + 0.046472638845443726, + -0.028820939362049103, + -0.07707612961530685, + 0.0767933651804924, + 0.04212813079357147, + -0.02484605461359024, + 0.0163679588586092, + 0.02715056948363781, + -0.012361422181129456, + 0.004774135537445545, + -0.0345633439719677, + 0.0659593939781189, + 0.043033987283706665, + 0.07924427837133408, + -0.09330577403306961, + 0.009446347132325172, + 0.027626752853393555, + -0.008455729112029076, + -0.05381564050912857, + 0.05704919248819351, + 0.015030927956104279, + 0.025730088353157043, + -0.061554379761219025, + 0.056641459465026855, + -0.08030448108911514, + -0.018357248976826668, + 0.03305193409323692, + 0.10640862584114075, + -0.029918858781456947, + -0.033137835562229156, + -0.016921421512961388, + -0.009188657626509666, + -0.05802897363901138, + 0.07496775686740875, + -0.02708374708890915, + -0.023373110219836235, + -0.09614459425210953, + 0.05877238139510155, + -0.07747799903154373, + 0.10141705721616745, + 0.01967947743833065, + 0.0006563410861417651, + 0.011791248805820942, + -0.051714569330215454, + 0.0038117433432489634, + -0.05501708760857582, + 0.020864512771368027, + -0.03387419134378433, + -0.025123801082372665, + 0.03419404476881027, + 0.029600413516163826, + 0.024026183411478996, + 0.022544505074620247, + 0.08429984003305435, + -0.0551738366484642, + -0.0019121072255074978, + 0.017035113647580147, + 0.02882862463593483, + 0.04329182952642441, + -0.09148864448070526, + 0.028495145961642265, + 0.09566251933574677, + 0.06630894541740417, + 0.060001175850629807, + -0.07207918912172318, + 0.033028967678546906, + 0.008056395687162876, + -0.09427481144666672, + -0.06539085507392883, + 0.03939146548509598, + 0.009978732094168663, + 0.07262187451124191, + -0.08413073420524597, + 0.009582656435668468, + -0.039572618901729584, + 0.0654282495379448, + 0.09099354594945908, + 0.004624121356755495, + -0.00033582188189029694, + 0.02869660034775734, + 0.03825712576508522, + 0.01706891506910324, + 0.03238494321703911, + 0.011455582454800606, + -0.04514618590474129, + 0.06231397017836571, + 0.060716379433870316, + 0.09052547067403793, + -0.03407086059451103, + 0.03790238872170448, + 0.024124549701809883, + -0.06114032864570618, + 0.005452956072986126, + -0.007423525210469961, + 0.021313291043043137, + 0.013685769401490688, + 0.09123224765062332, + 0.043988462537527084, + 0.07540571689605713, + -0.011822633445262909, + 0.0366826169192791, + -0.08224806934595108, + -0.04881419986486435, + -0.07339194416999817, + 0.05221825838088989, + 0.03408384695649147, + -0.034514058381319046, + 0.004922253545373678, + 0.020705869421362877, + 0.05300689488649368, + 0.08092878758907318, + -0.0404917448759079, + 0.07416367530822754, + 0.06513980776071548, + -0.015393083915114403, + -0.07563870400190353, + 0.039245620369911194, + 0.041882723569869995, + -0.06333176791667938, + 0.017233457416296005, + -0.01609630510210991, + -0.07249383628368378, + 0.0030244700610637665, + 0.017735213041305542, + 0.02417902834713459, + -0.06096765771508217, + -0.01070717815309763, + 0.03960004448890686, + -0.10560576617717743, + 0.0589430034160614, + 0.07232145220041275, + -0.01776004768908024, + -0.012078851461410522, + -0.07409466058015823, + 0.05335940420627594, + 0.04555449262261391, + 0.05223322659730911, + 0.06394025683403015, + 0.14549089968204498, + 0.044257864356040955, + -0.05797089263796806, + -0.05118202790617943, + -0.008567857556045055, + -0.04519716277718544, + -0.01706848107278347, + 0.015538716688752174, + 0.04001522436738014, + -0.052074022591114044, + -0.03165757283568382, + 0.0666811391711235, + 0.04557286575436592, + 0.06350211054086685, + 0.0762525424361229, + 0.052452653646469116, + 0.0187546294182539, + -0.12399020791053772, + 0.050230611115694046, + 0.03244497627019882, + 0.010298308916389942, + 0.055637210607528687, + 0.025556130334734917, + 0.005960727110505104, + 0.0534348264336586, + -0.04258132725954056, + -0.05930972471833229, + -0.028094790875911713, + 0.019873907789587975, + 0.013205224648118019, + -0.06667505949735641, + -0.06467190384864807, + 0.08182628452777863, + 0.00033584609627723694, + -0.036400213837623596, + -0.016670942306518555, + 0.030610745772719383, + 0.05134936049580574, + -0.04891344904899597, + 0.009583552367985249, + 0.0338241271674633, + 0.0388835072517395, + -0.027264021337032318, + 0.02071349136531353, + 0.001176536432467401, + -0.04819236695766449, + 0.01430914830416441, + -0.031850505620241165, + -0.011204300448298454, + -0.030985558405518532, + -0.0431794673204422, + 0.0004312256060075015, + 0.06011468544602394, + -0.004422799684107304, + -0.06024283915758133, + 0.047397926449775696, + -0.0681692436337471, + 0.09940182417631149, + 0.056953065097332, + 0.0604858361184597, + -0.06183835491538048, + 0.09198040515184402, + -0.050269078463315964, + -0.005923697259277105, + -0.026983562856912613, + -0.007257952354848385, + 0.052908774465322495, + 0.031330373138189316, + -0.03674863651394844, + -0.03832351788878441, + 0.012378538958728313, + 0.02309458516538143, + 0.026386970654129982, + 0.04475753381848335, + -0.05562404543161392, + -0.056457389146089554, + -0.013215215876698494, + 0.04653751850128174, + 0.02619938924908638, + 0.08541132509708405, + 0.055598605424165726, + 0.0037850341759622097, + -0.14201460778713226, + 0.06318259984254837, + 0.03897802531719208, + 0.051111746579408646, + 0.019640441983938217, + 0.14644694328308105, + -0.07291465252637863, + -0.061945416033267975, + 0.02838815748691559, + -0.035905640572309494, + 0.0011565177701413631, + -0.09576383233070374, + 0.021247418597340584, + -0.07210452109575272, + 0.031098658218979836, + -0.054424989968538284, + 0.04758327826857567, + 0.0773940309882164, + -0.07216465473175049, + -0.05858452618122101, + -0.041504062712192535, + 0.018103161826729774, + -0.07168498635292053, + -0.02327563799917698, + 0.03616444021463394, + -0.06272757053375244, + 0.015157959423959255, + -0.05413122847676277, + -0.12320943921804428, + -0.0640324130654335, + -0.04640348255634308, + 0.011250918731093407, + -0.07948537915945053, + 0.007593377958983183, + 0.03566151484847069, + 0.013251551426947117, + 0.05462411046028137, + -0.028793226927518845, + 0.01981176808476448, + 0.05090990290045738, + 0.06517047435045242, + 0.01841190829873085, + -0.1290203332901001, + 0.0196949765086174, + 0.0073050870560109615, + 0.029632581397891045, + 0.047837406396865845, + -0.022116169333457947, + 0.04393791779875755, + 0.14046117663383484, + 0.04017089307308197, + -0.05090271681547165, + 0.06085523962974548, + 0.047485075891017914, + -0.06048053875565529, + -0.009504958055913448, + -0.0029562644194811583, + -0.019157810136675835, + -0.020955054089426994, + 0.10699652880430222, + 0.015047796070575714, + -0.03162265196442604, + -0.003773825941607356, + -0.006379327736794949, + -0.02259492129087448, + -0.039172567427158356, + -0.03541705384850502, + -0.02631019987165928, + 0.04135550186038017, + 0.023632211610674858, + -0.010892857797443867, + -0.0370229035615921, + 0.024737320840358734, + -0.03154825419187546, + 0.009463795460760593, + -0.052806172519922256, + -0.02705029956996441, + -0.03946391120553017, + 0.009689593687653542, + -0.04389646276831627, + 0.06582827866077423, + 0.0408187173306942, + 0.008897271007299423, + -0.06808342039585114, + -0.005568819120526314, + 0.02854752726852894, + -0.09684142470359802, + -0.0020819574128836393, + 0.0037411984521895647, + -0.03214259445667267, + 0.02043287828564644, + 0.025644805282354355, + -0.06106135994195938, + 0.054626986384391785, + -0.042766790837049484, + -0.030941486358642578, + 0.03161783143877983, + 0.023532601073384285, + 0.01513641607016325, + -0.04566654562950134, + -0.098955437541008, + 0.013866923749446869, + 0.042705196887254715, + -0.06457702070474625, + 0.0059195104986429214, + 0.030018063262104988, + 0.008317116647958755, + -0.036617908626794815, + -0.007984509691596031, + 0.0034960301127284765, + -0.0355348102748394, + 0.08715339004993439, + -0.05320737138390541, + 0.043556295335292816, + -0.009977439418435097, + -0.05462354049086571, + 0.018088415265083313, + -0.08066899329423904, + -0.031674113124608994, + 0.018222836777567863, + 0.047705285251140594, + -0.11215700209140778, + 0.009709063917398453, + -0.014690455980598927, + -0.00031382590532302856, + -0.010001042857766151, + -0.015778305009007454, + -0.008657842874526978, + -0.06569178402423859, + -0.04106181859970093, + -0.07239215821027756, + -0.0264374278485775, + -0.03945920243859291, + 0.007897313684225082, + -0.06793543696403503, + -0.02706964872777462, + 0.008016912266612053, + 0.03217436745762825, + 0.04435371235013008, + -0.09273311495780945, + -0.014239432290196419, + 0.04588089510798454, + -0.029641171917319298, + 0.04801453649997711, + 0.028102420270442963, + -0.041053496301174164, + 0.04099264740943909, + -0.020061006769537926, + -0.05948996543884277, + 0.028329623863101006, + 0.05356026813387871, + -0.1339828073978424, + 0.03183523193001747, + 0.04063316062092781, + -0.06726021319627762, + 0.07341201603412628, + -0.16125695407390594, + -0.040080536156892776, + 0.022957872599363327, + -0.0062933024019002914, + 0.03683321550488472, + 0.007304018829017878, + -0.02933444082736969, + -0.022679127752780914, + 0.005107872653752565, + -0.029977502301335335, + -0.004426880739629269, + -0.04625803977251053, + -0.01743447221815586, + -0.0464969277381897, + -0.10984612256288528, + 0.007491269614547491, + -0.04552454873919487, + -0.0013811876997351646, + 0.016381800174713135, + -0.07510838657617569, + 0.03706850856542587, + -0.06878402084112167, + 0.09896547347307205, + -0.03654446452856064, + 0.08149366080760956, + 0.04002750664949417, + 0.08065515756607056, + -0.027192696928977966, + -0.04022808372974396, + 0.020144201815128326, + -0.07413214445114136, + -0.010300585068762302, + 0.006279100198298693, + -0.05615796893835068, + -0.0019370535155758262, + -0.09266659617424011, + 0.025766920298337936, + -0.07226277887821198, + 0.009357654489576817, + -0.07671576738357544, + -0.037181612104177475, + 0.03418143093585968, + -0.027016883715987206, + 0.025881830602884293, + 0.011476525105535984, + 0.017548078671097755, + -0.0077001615427434444, + 0.05045963078737259, + -0.10106693208217621, + -0.10974548757076263, + 0.1600683331489563, + 0.023436646908521652, + 0.042146697640419006, + 0.10251763463020325, + -0.04332251474261284, + 0.11170297861099243, + -0.04360133409500122, + -0.024909527972340584, + 0.005018964875489473, + 0.018967404961586, + -0.011938455514609814, + 0.006434707436710596, + -0.004215696826577187, + 0.04706014692783356, + 0.04977819696068764, + 0.028114834800362587, + -0.05332447215914726, + -0.08680068701505661, + 0.004399196710437536, + 0.00041860525379888713, + 0.010579215362668037, + 0.028827155008912086, + -0.0016008787788450718, + -0.003770905314013362, + 0.02774237096309662, + -0.04213464632630348, + 0.05646880716085434, + 0.02067817561328411, + 0.039564091712236404, + 0.03295405954122543, + 0.07413716614246368, + 0.0012738772202283144, + -0.03566139563918114, + 0.015372633934020996, + -0.020117206498980522, + 0.08616413921117783, + -0.007662500254809856, + -0.09768418222665787, + -0.025586379691958427, + 0.10475053638219833, + 0.01832338608801365, + -0.051782261580228806, + 0.0010143631370738149, + 0.029876161366701126, + -0.03514533117413521, + -0.07534615695476532, + -0.03528827056288719, + -0.022103674709796906, + 0.07141080498695374, + -0.06718991696834564, + 0.022178590297698975, + 0.004428899846971035, + -0.07910066097974777, + 0.027018440887331963, + -0.02196909673511982, + -0.009854234755039215, + -0.12758766114711761, + 0.00032485928386449814, + 0.13802917301654816, + -0.05385074391961098, + -0.005936243571341038, + -0.017549416050314903, + -0.05493646860122681, + -0.047960348427295685, + -0.07576780766248703, + -0.011674131266772747, + 0.0004453658766578883, + 0.006700117606669664, + -0.08096279948949814, + 0.09600193798542023, + 0.12268830090761185, + -0.05676913261413574, + -0.03715287148952484, + -0.021753963083028793, + -0.019186746329069138, + -0.0403582789003849, + 0.014499095268547535, + 0.04421423748135567, + -0.08525583893060684, + -0.0741894319653511, + -0.02288356050848961, + 0.016668524593114853, + 0.07882894575595856, + 0.029720168560743332, + 0.025263387709856033, + 0.07420740276575089, + -0.034052371978759766, + 0.04624175280332565, + -0.10031282901763916, + 0.0167982317507267, + -0.023754164576530457, + -0.07777591794729233, + -0.02446010522544384, + 0.061058010905981064, + 0.05940721184015274, + 0.009616188704967499, + -0.010013721883296967, + 0.007791775744408369, + -0.020672190934419632, + -0.09781245142221451, + -0.04615814611315727, + 0.06525478512048721, + -0.0395856574177742, + -0.04023833945393562, + 0.07923253625631332 + ], + "index": 3, + "object": "embedding" + } + ], + "model": "togethercomputer/m2-bert-80M-32k-retrieval", + "object": "list", + "usage": null + } + }, + "is_streaming": false + } +} diff --git a/tests/integration/recordings/responses/6841bb14fa8d.json b/tests/integration/recordings/responses/6841bb14fa8d.json new file mode 100644 index 000000000..69b4522e9 --- /dev/null +++ b/tests/integration/recordings/responses/6841bb14fa8d.json @@ -0,0 +1,61 @@ +{ + "request": { + "method": "POST", + "url": "https://api.together.xyz/v1/v1/chat/completions", + "headers": {}, + "body": { + "model": "meta-llama/Llama-3.3-70B-Instruct-Turbo-Free", + "messages": [ + { + "role": "user", + "content": "Test trace openai with temperature 0" + } + ], + "max_tokens": 100, + "stream": false, + "temperature": 0.7 + }, + "endpoint": "/v1/chat/completions", + "model": "meta-llama/Llama-3.3-70B-Instruct-Turbo-Free" + }, + "response": { + "body": { + "__type__": "openai.types.chat.chat_completion.ChatCompletion", + "__data__": { + "id": "oCfxEyX-4Yz4kd-984c2b58fd3f4d13", + "choices": [ + { + "finish_reason": "length", + "index": 0, + "logprobs": null, + "message": { + "content": "When using a language model like OpenAI with a temperature of 0, the model is essentially forced to produce the most likely next word in a sequence, given the context. This means that the output will be very deterministic and less diverse, as the model is not allowed to explore less likely options.\n\nHere's an example of how this could work in practice:\n\n**Prompt:** Write a short story about a character who discovers a hidden world.\n\n**Temperature 0 Response:**\nIn a small village nestled", + "refusal": null, + "role": "assistant", + "annotations": null, + "audio": null, + "function_call": null, + "tool_calls": [] + }, + "seed": 9269366008132817000 + } + ], + "created": 1758820586, + "model": "meta-llama/Llama-3.3-70B-Instruct-Turbo-Free", + "object": "chat.completion", + "service_tier": null, + "system_fingerprint": null, + "usage": { + "completion_tokens": 100, + "prompt_tokens": 43, + "total_tokens": 143, + "completion_tokens_details": null, + "prompt_tokens_details": null, + "cached_tokens": 0 + }, + "prompt": [] + } + }, + "is_streaming": false + } +} diff --git a/tests/integration/recordings/responses/68e59155a09f.json b/tests/integration/recordings/responses/68e59155a09f.json new file mode 100644 index 000000000..89a294a9d --- /dev/null +++ b/tests/integration/recordings/responses/68e59155a09f.json @@ -0,0 +1,802 @@ +{ + "request": { + "method": "POST", + "url": "https://api.together.xyz/v1/v1/embeddings", + "headers": {}, + "body": { + "model": "togethercomputer/m2-bert-80M-32k-retrieval", + "input": [ + "How does machine learning improve over time?" + ] + }, + "endpoint": "/v1/embeddings", + "model": "togethercomputer/m2-bert-80M-32k-retrieval" + }, + "response": { + "body": { + "__type__": "openai.types.create_embedding_response.CreateEmbeddingResponse", + "__data__": { + "data": [ + { + "embedding": [ + -0.017091110348701477, + -0.04449904337525368, + 0.05639447644352913, + 0.02757648564875126, + -0.01052725501358509, + -0.023113058879971504, + 0.07145906239748001, + -0.02102668583393097, + -0.034163620322942734, + -0.04799016937613487, + 0.013283752836287022, + -0.018489355221390724, + -0.024232961237430573, + -0.039593327790498734, + -0.039129577577114105, + -0.06230281665921211, + -0.0054303002543747425, + 0.06882823258638382, + -0.013231862336397171, + 0.06959116458892822, + 0.003494634060189128, + 0.034262172877788544, + 0.03474000096321106, + 0.01021556369960308, + 0.062151506543159485, + -0.007965859957039356, + 0.016933385282754898, + -0.007620261516422033, + 0.03465918451547623, + -0.019624345004558563, + 0.026949048042297363, + 0.04594346135854721, + 0.030448030680418015, + -0.0062415460124611855, + 0.024632513523101807, + -0.009094628505408764, + 0.0068628196604549885, + 0.051083847880363464, + 0.025683417916297913, + 0.1110014095902443, + 0.048982519656419754, + 0.01494417805224657, + 0.02383127622306347, + -0.04119957238435745, + 0.04277747869491577, + -0.03204340860247612, + -0.012741178274154663, + -0.03751486539840698, + 0.056586142629384995, + 0.025235753506422043, + 0.01793726161122322, + 0.04099954292178154, + 0.07154829055070877, + 0.041061583906412125, + 0.06809084117412567, + -0.10853584855794907, + 0.08249932527542114, + 0.028061751276254654, + 0.0519598051905632, + -0.06860332190990448, + 0.004958455916494131, + -0.04448959231376648, + 0.09609439969062805, + -0.00619372446089983, + 0.007140932139009237, + 0.017792437225580215, + -0.01650928147137165, + 0.04542657360434532, + -0.006010851822793484, + 0.030694808810949326, + -0.0112632280215621, + -0.0159088633954525, + 0.029067715629935265, + 0.020537303760647774, + -0.036857571452856064, + -0.034286197274923325, + 0.010374762117862701, + 0.029303979128599167, + -0.026281535625457764, + -0.04053294658660889, + -0.007713824976235628, + 0.021145686507225037, + 0.0018956628628075123, + 0.009162032045423985, + -0.003967841621488333, + 0.005385218188166618, + 0.05180187523365021, + -0.01564045064151287, + 0.02468094415962696, + 4.1515566408634186e-05, + 0.015309401787817478, + 0.020134028047323227, + 0.02285873331129551, + -0.0030758781358599663, + 0.010366623289883137, + -0.12862254679203033, + 0.006405234336853027, + -0.00285987532697618, + -0.038957152515649796, + -0.0348617248237133, + -0.04436873272061348, + -0.024569036439061165, + -0.001334832631982863, + -0.01130272913724184, + 0.01797942817211151, + 0.047239724546670914, + 0.1354702264070511, + 0.05538365989923477, + 0.08639367669820786, + 0.011921187862753868, + -0.03216652572154999, + -0.05481015145778656, + 0.026179000735282898, + -0.08212552964687347, + -0.039176810532808304, + 0.0118326460942626, + -0.06838254630565643, + -0.02987653948366642, + -0.0341634601354599, + -0.0033300842624157667, + 0.04591712728142738, + 0.010237805545330048, + 0.033510755747556686, + -0.020220739766955376, + -0.008218149654567242, + 0.07410414516925812, + -0.07220402359962463, + 0.0043516866862773895, + 0.01174078043550253, + -0.004125840030610561, + -0.07815736532211304, + -0.030600078403949738, + -0.014574045315384865, + 0.009469592943787575, + 0.04217822849750519, + -0.05271849408745766, + 0.00037768480251543224, + 0.02528710477054119, + 0.04988700896501541, + 0.013128949329257011, + -0.009709068574011326, + 0.03833962604403496, + -0.004430458880960941, + -0.053310297429561615, + -0.05913899093866348, + -0.06092122197151184, + 0.03597554191946983, + 0.04806441441178322, + 0.014519140124320984, + 0.016532888635993004, + -0.02772163413465023, + 0.02643187716603279, + 0.054130520671606064, + 0.011015541851520538, + 0.010168751701712608, + 0.13184048235416412, + 0.017429586499929428, + -0.09562039375305176, + 0.004120356403291225, + 0.06979147344827652, + 0.01747124269604683, + 0.06685646623373032, + -0.02079174295067787, + -0.1065840870141983, + 0.003666015574708581, + -0.024378009140491486, + -0.018714547157287598, + -0.03100505657494068, + 0.023656615987420082, + 0.04414339363574982, + 0.008101040497422218, + -0.05081212520599365, + -0.028254367411136627, + -0.025158686563372612, + -0.01060985866934061, + -0.020752916112542152, + 0.05147681012749672, + 0.059838782995939255, + 0.015253720805048943, + -0.04351024329662323, + -0.02900739014148712, + 0.10752008110284805, + 0.015021839179098606, + 0.028819581493735313, + 0.04401375353336334, + 0.0011900285026058555, + -0.032843537628650665, + -0.04667872190475464, + 0.023874200880527496, + -0.026197509840130806, + 0.043272413313388824, + -0.04376351833343506, + -0.0036660165060311556, + 0.012742334045469761, + -0.02043633721768856, + 0.0056346505880355835, + 0.06811652332544327, + 0.0940936729311943, + 0.0005089789046905935, + -0.047517020255327225, + 0.03845725208520889, + -0.0416039377450943, + 0.011346561834216118, + 0.0327879935503006, + 0.018543416634202003, + 0.014663814567029476, + 0.03528588265180588, + -0.06245756149291992, + -0.060102980583906174, + 0.06862425059080124, + -0.04480714723467827, + 0.01673327572643757, + -0.013742557726800442, + 0.015649832785129547, + -0.05052841082215309, + 0.014181524515151978, + -0.011470867320895195, + -0.0913846418261528, + -0.01337501686066389, + 0.01687346026301384, + 0.011097698472440243, + 0.03340581804513931, + 0.07328605651855469, + -0.04521005228161812, + -0.014341622591018677, + -0.022116083651781082, + 0.019846217706799507, + -0.03134879842400551, + -0.025689005851745605, + -0.016337616369128227, + -0.009400046430528164, + 0.04813038557767868, + 0.09310487657785416, + -0.023314738646149635, + 0.0449095144867897, + 0.028920302167534828, + 0.03279547765851021, + 0.09780041873455048, + 0.042382802814245224, + -0.027986818924546242, + 0.018036792054772377, + 0.060797013342380524, + 0.029210783541202545, + 0.01824144832789898, + -0.0032405515667051077, + -0.061704110354185104, + 0.032816603779792786, + 0.07891224324703217, + 0.05889542028307915, + -0.0357075110077858, + 0.07179951667785645, + -0.009799567051231861, + 0.040095265954732895, + -0.010397388599812984, + -0.030199842527508736, + 0.0723610669374466, + 0.033793553709983826, + -0.050370991230010986, + -0.019451666623353958, + -0.059583477675914764, + -0.03205019608139992, + -0.008078041486442089, + 0.04325846955180168, + 0.005131071899086237, + -0.01694042980670929, + 0.12373893707990646, + -0.026953179389238358, + 0.08760038018226624, + -0.06059237942099571, + 0.036282479763031006, + 0.02045135386288166, + 0.03446183726191521, + 0.0672442838549614, + -0.03471960127353668, + -0.032043203711509705, + -0.01461110357195139, + -0.02886907011270523, + -0.00020732730627059937, + -0.03269560635089874, + 0.035647809505462646, + -0.019755830988287926, + -0.06200911104679108, + -0.02908874861896038, + 0.01128445751965046, + -0.022167179733514786, + 0.028986983001232147, + 0.03478562831878662, + -0.07198591530323029, + 0.021145109087228775, + 0.00676864106208086, + -0.009777943603694439, + -0.005817399825900793, + 0.012331933714449406, + 0.04287122189998627, + 0.007338544819504023, + -0.014030798338353634, + -0.02205159328877926, + -0.06498151272535324, + 0.0261244997382164, + -0.0016652516787871718, + -0.0012416461249813437, + -0.035079214721918106, + -0.04478784278035164, + 0.017631616443395615, + -0.03870261088013649, + -0.03700083866715431, + -0.03991252928972244, + 0.015349914319813251, + 0.027670124545693398, + -0.02155459113419056, + -0.061771076172590256, + 0.048039596527814865, + 0.020471401512622833, + 0.0814017578959465, + 0.012351211160421371, + -0.024866415187716484, + 0.03714727610349655, + 0.008872346952557564, + 0.04749113693833351, + -0.041523903608322144, + -0.05398213118314743, + 0.024968266487121582, + 0.0023721077013760805, + 0.03205203264951706, + 0.060478370636701584, + -0.057236168533563614, + 0.0046795508824288845, + 0.008967110887169838, + 0.05300765857100487, + 0.04545370489358902, + -0.041764918714761734, + 0.04538821801543236, + 0.017682619392871857, + 0.01751590333878994, + -0.041763801127672195, + -0.030938314273953438, + -0.02912597917020321, + -0.03287437558174133, + 0.05978328734636307, + -0.018110038712620735, + 0.10227105766534805, + -0.005680157337337732, + -0.03592002019286156, + 0.04470396786928177, + 0.058497779071331024, + -0.06304245442152023, + -0.05310345068573952, + 0.01905088871717453, + -0.0435650460422039, + 0.015648307278752327, + 0.010627292096614838, + 0.01209987048059702, + 0.02780025638639927, + -0.0659174993634224, + -0.02292121760547161, + -0.014478329569101334, + 0.027907969430088997, + 0.08582334965467453, + 0.05156566947698593, + 0.020003266632556915, + 0.00862419418990612, + 0.011991214007139206, + -0.057063665241003036, + 0.027426088228821754, + 0.010678093880414963, + -0.006323543842881918, + 0.026447616517543793, + -0.011029284447431564, + 0.005789259914308786, + -0.062225647270679474, + 0.002817378379404545, + 0.037070125341415405, + 0.05859753489494324, + -0.032734066247940063, + 0.0049278102815151215, + 0.005655582528561354, + 0.03440752252936363, + -0.04887422174215317, + 0.014217632822692394, + 0.03378811478614807, + 0.01143213827162981, + -0.0046334643848240376, + 0.008702044375240803, + -0.018078800290822983, + 0.02679763175547123, + 0.009265614673495293, + 0.006912717595696449, + 0.039455097168684006, + 0.08224938809871674, + -0.018994906917214394, + -0.011511171236634254, + 0.013095312751829624, + -0.01595144346356392, + 0.08322206139564514, + 0.0019320690771564841, + 0.09676595777273178, + 0.028369352221488953, + -0.006265261210501194, + -0.04760407656431198, + -0.07077552378177643, + 0.026524502784013748, + -0.045876167714595795, + -0.004767959006130695, + 0.09427748620510101, + 0.0010587290162220597, + 0.029367605224251747, + 0.04943876713514328, + -0.020956382155418396, + 0.011755046434700489, + -0.042785175144672394, + 0.05108770355582237, + -0.010644905269145966, + 0.051502931863069534, + 0.001376797561533749, + -0.02364213950932026, + 0.08517570048570633, + -0.05029089003801346, + 0.009807859547436237, + -0.015292741358280182, + -0.0477706678211689, + -0.03883887082338333, + 0.06258878856897354, + 0.029050428420305252, + 0.027633827179670334, + 0.01516599953174591, + -0.02382349781692028, + -0.04220383241772652, + 0.04617023095488548, + 0.03496578335762024, + -0.018243463709950447, + -0.0061411671340465546, + -0.005748555064201355, + 0.010852155275642872, + -0.010470863431692123, + -0.0401528999209404, + 0.011642354540526867, + -0.05758778378367424, + 0.04819398745894432, + 0.05960371717810631, + 0.0022469316609203815, + -0.001131345983594656, + 0.024024616926908493, + -0.025609636679291725, + 0.04534421116113663, + 0.020421037450432777, + 0.027833566069602966, + 0.0455608069896698, + 0.03330197185277939, + 0.09832030534744263, + -0.01626313105225563, + 0.01641569286584854, + 0.01554944645613432, + -0.013866779394447803, + -0.0638241097331047, + 0.047895193099975586, + 0.042961131781339645, + -0.03384869173169136, + -0.01620139367878437, + 0.08863108605146408, + 0.08185242116451263, + -0.05600340664386749, + -0.006179805379360914, + -0.046521030366420746, + 0.005049159750342369, + -0.03982756659388542, + 0.0018144379137083888, + -0.03435543552041054, + 0.01273403875529766, + 0.008960560895502567, + -0.04060171917080879, + 0.04573140665888786, + -0.018866222351789474, + -0.019972296431660652, + 0.0006385938613675535, + -0.040912169963121414, + 0.04912850633263588, + 0.021389227360486984, + 0.07629404962062836, + 0.07529498636722565, + -0.03599211201071739, + -0.07396151125431061, + -0.06263993680477142, + 0.035700149834156036, + 0.019643796607851982, + -0.014971467666327953, + -0.0449487641453743, + 0.05629347264766693, + 0.002529916586354375, + -0.028406130149960518, + 0.01962902769446373, + 0.021758396178483963, + -0.03318168967962265, + -0.022369498386979103, + -0.039087750017642975, + 0.04942493140697479, + -0.045022908598184586, + -0.0295136459171772, + -0.007183917332440615, + -0.05010795593261719, + 0.0014038635417819023, + -0.04356252774596214, + 0.04660043120384216, + 0.012791723944246769, + 0.01044919341802597, + -0.007226443849503994, + 0.009700221009552479, + 0.04041241481900215, + -0.013270650990307331, + -0.09328791499137878, + -0.04580668732523918, + -0.023542804643511772, + -0.04105115681886673, + 0.01962345279753208, + -0.0022925573866814375, + 0.016483748331665993, + -0.00046286170254461467, + 0.04518749564886093, + 0.03264132887125015, + 0.021030215546488762, + 0.000606459507253021, + 0.018279610201716423, + -0.051501113921403885, + -0.006836078595370054, + 0.0223738644272089, + -0.03288864716887474, + -0.013056786730885506, + 0.03506845235824585, + -0.06893748044967651, + 0.04185912758111954, + -0.059009850025177, + 0.025614604353904724, + -0.13203828036785126, + -0.0230705589056015, + 0.06457994133234024, + -0.03621802479028702, + -0.06727005541324615, + -0.007084821816533804, + 0.005194725468754768, + -0.04151730239391327, + -0.01337746437638998, + 0.007726626470685005, + 0.001198339625261724, + 0.0858355388045311, + -0.04361525923013687, + 0.029421508312225342, + 0.04561106860637665, + 0.04970911517739296, + 0.0021197511814534664, + 0.034886427223682404, + -0.0027102481108158827, + 0.026148471981287003, + -0.005215228535234928, + 0.03527367115020752, + 0.02213597670197487, + 0.006383026950061321, + 0.032270703464746475, + 0.01586599461734295, + -0.016247956082224846, + -0.016213105991482735, + -0.04151308164000511, + 0.061050400137901306, + 0.003419628133997321, + 0.04371068999171257, + -0.003939187154173851, + 0.008316335268318653, + 0.08146052062511444, + 0.02038543112576008, + 0.004892616532742977, + -0.017641207203269005, + -0.04877929389476776, + -0.014308643527328968, + -0.05225956812500954, + 0.01678878627717495, + -0.022617461159825325, + 0.10803868621587753, + 0.004787782672792673, + 0.005488952621817589, + 0.044927410781383514, + -0.0386410690844059, + 0.033641163259744644, + -0.012488718144595623, + 0.017685825005173683, + -0.019066687673330307, + -0.0044423723593354225, + -0.003003643127158284, + -0.046191710978746414, + 0.07452407479286194, + 0.039803750813007355, + -0.07293923199176788, + 0.009332723915576935, + 0.01869172789156437, + 0.006781427655369043, + -0.11368958652019501, + -0.009038697928190231, + 0.002026599831879139, + -0.0118027338758111, + -0.021069113165140152, + -0.012110181152820587, + -0.03503252565860748, + 0.04110250622034073, + 0.07244168221950531, + 0.010852963663637638, + 0.08984149992465973, + -0.027278605848550797, + -0.05750814825296402, + -0.06634411960840225, + -0.05021825432777405, + 0.016627361997961998, + 0.07608447223901749, + -0.006877075415104628, + 0.07241521030664444, + -0.08503241091966629, + -0.0015347690787166357, + -0.11855384707450867, + -0.02338363230228424, + 0.018290942534804344, + -0.06323908269405365, + -0.03858431428670883, + 0.0205442663282156, + 0.03796859830617905, + 0.020063228905200958, + 0.10658621788024902, + 0.035441286861896515, + 0.04583656042814255, + 0.04527920112013817, + -0.019515255466103554, + -0.10461927205324173, + 0.0038011830765753984, + -0.03096143901348114, + 0.03559565171599388, + -0.03741271421313286, + 0.013590610586106777, + 0.03363044559955597, + -0.028492426499724388, + -0.020304789766669273, + 0.0672440156340599, + -0.030570613220334053, + 0.05294065922498703, + 0.06384581327438354, + -0.004913600627332926, + -0.02157355658710003, + 0.026991942897439003, + -0.04970087110996246, + -0.01489020325243473, + 0.02735202945768833, + -0.0607466921210289, + -0.03535424917936325, + 0.02796528860926628, + 0.022950729355216026, + 0.04059499129652977, + 0.01365773193538189, + -0.0333610475063324, + 0.002045154571533203, + 0.05155564472079277, + -0.0031054376158863306, + 0.014623484574258327, + -0.06419086456298828, + -0.028253614902496338, + -0.02575419843196869, + 0.018699679523706436, + 0.05331188067793846, + -0.04458363726735115, + -0.04462023079395294, + -0.012874887324869633, + -0.009783362038433552, + -0.06447328627109528, + 0.027755791321396828, + -0.12949828803539276, + 0.013976480811834335, + -0.04830870404839516, + -0.07408348470926285, + -0.015234938822686672, + 0.03581376001238823, + -0.016954004764556885, + -0.010194940492510796, + 0.05199551209807396, + -0.04343723878264427, + -0.04505506902933121, + -0.026876715943217278, + -0.030063798651099205, + -0.0346873477101326, + 0.006097136996686459, + -0.031271882355213165, + -0.00029016193002462387, + -0.030612265691161156, + 0.05608702823519707, + 0.028940780088305473, + 0.0013379148440435529, + -0.0028184913098812103, + 0.021562576293945312, + -0.05187350884079933, + -0.04708464816212654, + -0.026602864265441895, + -0.025108829140663147, + -0.02762826532125473, + 0.04280998557806015, + -0.041647735983133316, + -0.009514877572655678, + 0.08883954584598541, + 0.01176463533192873, + 0.04458681866526604, + -0.06837990134954453, + 0.01112907100468874, + -0.061027880758047104, + -0.009307433851063251, + -0.027127249166369438, + -0.06876770406961441, + -0.108445905148983, + 0.02236987091600895, + -0.0412885956466198, + 0.009982330724596977, + 0.009275197982788086, + -0.019888408482074738, + 0.019699621945619583, + 0.008489453233778477, + -0.08368164300918579, + -0.06844163686037064, + 0.05367731302976608, + -0.030020998790860176, + 0.014990454539656639, + -0.054819319397211075, + -0.049916017800569534, + -0.023731136694550514, + -0.01989864930510521, + 0.0432029664516449, + -0.042317938059568405, + 0.009375320747494698, + 0.026804260909557343, + -0.018950626254081726, + -0.0015483262250199914, + 0.0028166286647319794, + 0.023358885198831558, + 0.0003610998101066798, + -0.02653382159769535, + -0.030427517369389534, + -0.0759892538189888, + -0.042637135833501816, + 0.014194052666425705, + -0.03227793797850609, + -0.024946041405200958, + -0.010455182753503323, + -0.03190105780959129, + 0.03781573101878166, + 0.03388536721467972, + 0.00973279494792223, + -0.01576327346265316, + -0.015895653516054153, + 0.04316965118050575, + 0.023514561355113983, + 0.03888101503252983, + 0.020031088963150978, + 0.08280724287033081, + -0.009437857195734978, + 0.06786453723907471, + -0.023869356140494347, + -0.002570996293798089, + 0.011280098930001259, + 0.03462803363800049, + -0.005325067788362503, + 0.032147448509931564, + -0.016798241063952446, + 0.04545372352004051, + -0.026565302163362503, + -0.0513574555516243, + 0.03857620060443878, + 0.023602399975061417, + -0.018047289922833443, + 0.06904193758964539 + ], + "index": 0, + "object": "embedding" + } + ], + "model": "togethercomputer/m2-bert-80M-32k-retrieval", + "object": "list", + "usage": null + } + }, + "is_streaming": false + } +} diff --git a/tests/integration/recordings/responses/69464dfd3a06.json b/tests/integration/recordings/responses/69464dfd3a06.json new file mode 100644 index 000000000..cd7461180 --- /dev/null +++ b/tests/integration/recordings/responses/69464dfd3a06.json @@ -0,0 +1,59 @@ +{ + "request": { + "method": "POST", + "url": "https://api.together.xyz/v1/v1/chat/completions", + "headers": {}, + "body": { + "model": "meta-llama/Llama-3.3-70B-Instruct-Turbo-Free", + "messages": [ + { + "role": "user", + "content": "Test trace openai 0" + } + ], + "stream": false + }, + "endpoint": "/v1/chat/completions", + "model": "meta-llama/Llama-3.3-70B-Instruct-Turbo-Free" + }, + "response": { + "body": { + "__type__": "openai.types.chat.chat_completion.ChatCompletion", + "__data__": { + "id": "oCfx5VY-4Yz4kd-984c2a91a8fd8f78", + "choices": [ + { + "finish_reason": "stop", + "index": 0, + "logprobs": null, + "message": { + "content": "This conversation has just begun. I'm happy to chat with you, but I don't have any prior context or information to work with. What would you like to talk about?", + "refusal": null, + "role": "assistant", + "annotations": null, + "audio": null, + "function_call": null, + "tool_calls": [] + }, + "seed": 5588230703258962000 + } + ], + "created": 1758820554, + "model": "meta-llama/Llama-3.3-70B-Instruct-Turbo-Free", + "object": "chat.completion", + "service_tier": null, + "system_fingerprint": null, + "usage": { + "completion_tokens": 37, + "prompt_tokens": 41, + "total_tokens": 78, + "completion_tokens_details": null, + "prompt_tokens_details": null, + "cached_tokens": 0 + }, + "prompt": [] + } + }, + "is_streaming": false + } +} diff --git a/tests/integration/recordings/responses/7550dd0d24bc.json b/tests/integration/recordings/responses/7550dd0d24bc.json new file mode 100644 index 000000000..c9ef94783 --- /dev/null +++ b/tests/integration/recordings/responses/7550dd0d24bc.json @@ -0,0 +1,166 @@ +{ + "request": { + "method": "POST", + "url": "https://api.together.xyz/v1/v1/chat/completions", + "headers": {}, + "body": { + "model": "meta-llama/Llama-3.3-70B-Instruct-Turbo-Free", + "messages": [ + { + "role": "user", + "content": "Message A: What is the capital of France?" + }, + { + "role": "assistant", + "content": "The capital of France is Paris." + }, + { + "role": "user", + "content": "Message B: What about Spain?" + }, + { + "role": "assistant", + "content": "The capital of Spain is Madrid." + }, + { + "role": "user", + "content": "Message C: And Italy?" + } + ], + "response_format": { + "type": "text" + }, + "stream": true + }, + "endpoint": "/v1/chat/completions", + "model": "meta-llama/Llama-3.3-70B-Instruct-Turbo-Free" + }, + "response": { + "body": [ + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "oCfv2aN-4Yz4kd-984c20cb7a8c8fa8", + "choices": [ + { + "delta": { + "content": "[", + "function_call": null, + "refusal": null, + "role": "assistant", + "tool_calls": null, + "token_id": 58 + }, + "finish_reason": null, + "index": 0, + "logprobs": null, + "text": "[", + "seed": null + } + ], + "created": 1758820154, + "model": "meta-llama/Llama-3.3-70B-Instruct-Turbo-Free", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": null, + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "oCfv2aN-4Yz4kd-984c20cb7a8c8fa8", + "choices": [ + { + "delta": { + "content": "1", + "function_call": null, + "refusal": null, + "role": "assistant", + "tool_calls": null, + "token_id": 16 + }, + "finish_reason": null, + "index": 0, + "logprobs": null, + "text": "1", + "seed": null + } + ], + "created": 1758820154, + "model": "meta-llama/Llama-3.3-70B-Instruct-Turbo-Free", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": null, + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "oCfv2aN-4Yz4kd-984c20cb7a8c8fa8", + "choices": [ + { + "delta": { + "content": "]", + "function_call": null, + "refusal": null, + "role": "assistant", + "tool_calls": null, + "token_id": 60 + }, + "finish_reason": null, + "index": 0, + "logprobs": null, + "text": "]", + "seed": null + } + ], + "created": 1758820154, + "model": "meta-llama/Llama-3.3-70B-Instruct-Turbo-Free", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": null, + "usage": null + } + }, + { + "__type__": "openai.types.chat.chat_completion_chunk.ChatCompletionChunk", + "__data__": { + "id": "oCfv2aN-4Yz4kd-984c20cb7a8c8fa8", + "choices": [ + { + "delta": { + "content": "", + "function_call": null, + "refusal": null, + "role": "assistant", + "tool_calls": null, + "token_id": 128009 + }, + "finish_reason": "stop", + "index": 0, + "logprobs": null, + "text": "", + "seed": 9314001608812126000 + } + ], + "created": 1758820154, + "model": "meta-llama/Llama-3.3-70B-Instruct-Turbo-Free", + "object": "chat.completion.chunk", + "service_tier": null, + "system_fingerprint": null, + "usage": { + "completion_tokens": 4, + "prompt_tokens": 92, + "total_tokens": 96, + "completion_tokens_details": null, + "prompt_tokens_details": null, + "cached_tokens": 0 + } + } + } + ], + "is_streaming": true + } +} diff --git a/tests/integration/recordings/responses/8e5b53b9d493.json b/tests/integration/recordings/responses/8e5b53b9d493.json new file mode 100644 index 000000000..1688aab2f --- /dev/null +++ b/tests/integration/recordings/responses/8e5b53b9d493.json @@ -0,0 +1,801 @@ +{ + "request": { + "method": "POST", + "url": "https://api.together.xyz/v1/v1/embeddings", + "headers": {}, + "body": { + "model": "togethercomputer/m2-bert-80M-32k-retrieval", + "input": "Test encoding format", + "encoding_format": "float" + }, + "endpoint": "/v1/embeddings", + "model": "togethercomputer/m2-bert-80M-32k-retrieval" + }, + "response": { + "body": { + "__type__": "openai.types.create_embedding_response.CreateEmbeddingResponse", + "__data__": { + "data": [ + { + "embedding": [ + -0.011256923, + 0.0037174695, + 0.047607094, + -0.03605117, + 0.022678856, + 0.0022196341, + 0.008172763, + -0.07876377, + -0.012652523, + -0.124776885, + -0.07201225, + 0.011470616, + 0.020233244, + -0.03953407, + 0.017867543, + -0.07615726, + 0.015161683, + 0.01493531, + 0.0021282644, + 0.02805457, + 0.0008320583, + 0.022922216, + 0.049158294, + -0.03197842, + 0.020910429, + 0.03798574, + 0.032469492, + 0.009267314, + 0.0883011, + 0.0032435523, + 0.013633923, + 0.0457091, + -0.022143621, + -0.0007423012, + -0.03613117, + 0.052107, + 0.02962152, + 0.045084383, + 0.044733327, + 0.11753868, + 0.05730107, + 0.026509244, + -0.056454167, + -0.017637681, + 0.030301955, + 0.04790331, + -0.025398305, + -0.019705286, + 0.11366949, + 0.05800383, + -0.0072742635, + 0.100181706, + 0.1609472, + 0.0053162435, + 0.01714287, + -0.023215268, + 0.042824704, + 0.04082185, + 0.030668061, + -0.06529372, + 0.008288249, + 0.0325246, + 0.009664108, + -0.031153189, + 0.044064675, + 0.10059426, + 0.036557477, + 0.009674479, + 0.016028037, + 0.02236809, + 0.056538712, + -0.12828006, + 0.016760435, + 0.015355689, + -0.00070172164, + -0.0076741586, + -0.02880062, + -0.011680436, + -0.036522433, + -0.030315956, + 0.023295958, + 0.031333964, + 0.042397793, + -0.063102156, + 0.0669075, + -0.07678097, + 0.0616129, + -0.0071245604, + -0.021313114, + 0.0040440215, + 0.04436404, + 0.05289292, + 0.05803014, + 0.032691576, + 0.037537806, + -0.09712317, + -0.0061692744, + 0.008186577, + -0.0151672475, + -0.05499382, + -0.11011894, + -0.017255861, + 0.061501417, + 0.03551128, + 0.056205165, + 0.07500363, + 0.023062926, + 0.10787879, + 0.063290246, + -0.021196125, + -0.005724647, + 0.019805718, + -0.0063712946, + -0.049270064, + -0.024442751, + 0.018587058, + -0.082689136, + -0.019034613, + 0.005483609, + 0.03418548, + -0.008317338, + 0.06888298, + -0.037655607, + -0.05362105, + -0.010807861, + 0.069666155, + -0.01777964, + -0.015136251, + -0.026567455, + -0.08084807, + -0.078372054, + 0.039493512, + 0.013156698, + 0.07340631, + 0.12035369, + -0.05765069, + 0.025966862, + -0.0045753582, + -0.030865112, + 0.039448086, + -0.037273232, + 0.047059145, + -0.029127738, + -0.024217308, + 0.02748501, + -0.048555836, + 0.017913114, + -0.055981673, + -0.005601368, + -0.04045025, + -0.017308103, + 0.06272273, + 0.012256746, + 0.01575095, + -0.026737463, + 0.04115108, + 0.07562276, + -0.01140116, + 0.022552952, + 0.0443809, + -0.030472409, + -0.021670958, + -0.037897367, + 0.017250286, + -0.033001736, + -0.048738975, + -0.06429833, + -0.015412785, + 0.0036735258, + 0.023700202, + 0.035861194, + -0.05393875, + 0.048050668, + 0.032297045, + 0.021352977, + -0.05701748, + 0.0008330949, + -0.006661303, + -0.0070953164, + -0.043984424, + 0.052504774, + 0.027689766, + 0.031661708, + -0.050054867, + -0.015419155, + -0.013700429, + -0.03579233, + -0.08926211, + -0.034341693, + -0.01738188, + -0.0065487004, + -0.051955026, + 0.0019674778, + 0.0015172043, + 0.024915336, + 0.010987228, + 0.061529815, + 0.09077649, + 0.04394813, + -0.07503514, + 0.043345768, + -0.028357483, + 0.06312762, + 0.025069924, + 0.028561853, + 0.043048594, + 0.017411513, + -0.025240859, + -0.0056393985, + 0.054039005, + 0.008721963, + -0.039967448, + 0.0012871448, + 0.0052062417, + 0.005563228, + 0.042596456, + -0.008794862, + -0.044669237, + 0.04184779, + 0.008726271, + 0.10136058, + 0.040724736, + 0.14168875, + -0.017516509, + -0.11203568, + 0.0010548063, + -0.058536656, + 0.01673066, + 0.007502946, + -0.035662595, + 0.034719367, + -0.0060368567, + 0.13295838, + 0.026423598, + 0.056147255, + 0.04473965, + 0.045232397, + 0.07171366, + 0.009358642, + -0.021109166, + 0.033915937, + 0.0380073, + -0.01451498, + -0.021589639, + 0.062518574, + -0.017531183, + -0.030811403, + 0.024500312, + 0.05383414, + -0.1335839, + 0.01834579, + -0.051048376, + 0.07460228, + 0.03231806, + 0.00962887, + 0.05156732, + 0.016169788, + 0.0062234807, + -0.09062714, + -0.08959952, + 0.025153147, + -0.030351512, + -0.04339584, + 0.007234872, + 0.014588551, + 0.022614833, + -0.08844599, + -0.009002514, + -0.114522785, + 0.08118862, + -0.03023919, + 0.007820294, + 0.043863248, + -0.043678157, + -0.036323708, + 0.006777855, + -0.019326974, + -0.0664114, + -0.019019991, + 0.073445216, + -0.039277073, + -0.0157583, + -0.01931436, + -0.027121417, + -0.028259363, + -0.107222356, + 0.11150329, + -0.012612926, + -0.025338905, + 0.029330198, + 0.011753977, + 0.009784897, + 0.042475123, + -0.004051051, + -0.014803267, + -0.04530689, + -0.01848677, + -0.050840423, + 0.01814009, + 0.0051442874, + -0.033988528, + 0.0033705293, + -0.05515113, + -0.023601055, + -0.06183089, + 0.012501645, + -0.08027637, + 0.022573682, + 0.079796925, + -0.00926268, + -0.02180816, + 0.0059841494, + -0.018863965, + -0.011257763, + 0.055679787, + -0.018714463, + -0.04081558, + -0.017017504, + 0.026006198, + -0.03687599, + -0.05399378, + 0.042955294, + 0.00079697353, + -0.0015601065, + 0.026138263, + -0.01198548, + 0.07594801, + -0.0049053924, + -0.001241132, + 0.022863775, + 0.025632044, + -0.023908222, + -0.02252925, + 0.042020634, + -0.060588334, + 0.05498828, + -0.03466166, + 0.003202133, + -0.015508297, + -0.021138275, + 0.007791096, + 0.052594397, + -0.08649948, + 0.038542755, + 0.011088168, + 0.049710445, + -0.015898548, + 0.013559725, + -0.0012927915, + -0.078937665, + -0.0470789, + 0.02421941, + 0.0050838543, + -0.051634457, + 0.014016644, + 0.059073824, + -0.01279741, + 0.006315097, + 0.028651753, + -0.023221422, + -0.049021006, + -0.08123552, + -0.027243393, + -0.026543872, + 0.040068373, + 0.01465917, + 0.01366034, + -0.07191417, + -0.007906117, + -0.06743931, + -0.040284913, + 0.046346053, + -0.015108051, + -0.067285545, + 0.020757562, + -0.03144588, + -0.02684228, + -0.030008601, + 0.0008360872, + -0.012667347, + -0.0782403, + 0.02436115, + -0.054881096, + -0.010856299, + -0.07653927, + -0.044655506, + -0.02075821, + 0.023765713, + 0.0083463555, + 0.026002545, + -0.003060633, + 0.060491852, + 0.032562606, + 0.029937308, + -0.022013078, + 0.07388013, + 0.017152807, + -0.07095613, + -0.03923808, + 0.0017680842, + 0.0038672008, + -0.053012144, + -0.016951663, + 0.027642388, + 0.016483316, + -0.015618807, + -0.11136081, + 0.006826955, + -0.010586094, + -0.05052998, + -0.04226535, + -0.031801827, + -0.020531418, + -0.06278464, + -0.062224947, + 0.0769673, + -0.0706861, + 0.026174366, + -0.041260213, + 0.058052614, + -0.046227556, + -0.05443509, + 0.007650712, + -0.061986744, + -0.00546975, + -0.042977307, + -0.0147894155, + 0.045748055, + -0.01602859, + 0.018538997, + 0.073324144, + -0.105757244, + -0.010215157, + 0.0069961487, + -0.010474333, + 0.007267861, + -0.043416463, + 0.04171331, + 0.012246647, + -0.024870023, + 0.0067938967, + 0.023995718, + 0.037606664, + -0.034879085, + 0.107255146, + 0.019311333, + 0.008084773, + 0.015113109, + 0.04807634, + -0.011898967, + 0.0028230203, + 0.004201883, + -0.019952193, + -0.083809994, + 0.025964422, + 0.010652608, + 0.021981532, + -0.029947964, + 0.10096241, + -0.0018155909, + -0.078443065, + 0.035357803, + 0.030101022, + 0.08652985, + -0.020698488, + 0.06619985, + 0.011043828, + 0.022531942, + 0.059432585, + -0.08669654, + 0.023926888, + 0.006353244, + -0.046637908, + -0.072916985, + -0.04355625, + -0.010734682, + -0.06298886, + 0.11202974, + -0.008399903, + 0.04045217, + -0.049840588, + -0.051897135, + 0.04921834, + 0.018730633, + 0.07189677, + -0.020521715, + 0.10433443, + -0.0035553537, + 0.015335822, + -0.03326729, + -0.05246277, + -0.038786076, + 0.04000599, + -0.028919725, + -0.017996594, + -0.007428113, + -0.003258321, + 0.0127034895, + -0.0062633064, + 0.0007574967, + -0.060385525, + -0.018971093, + 0.062526286, + -0.025764955, + 0.05286283, + 0.043842334, + 0.044092383, + -0.037126385, + -0.018775577, + 0.007996275, + -0.00028039515, + -0.06591952, + 0.039109394, + 0.022268493, + 0.033030964, + 0.010780152, + 0.051087722, + -0.07398754, + 0.02156791, + -0.03391487, + 0.01900175, + -0.03438655, + -0.050286565, + -0.029407075, + 0.013486627, + 0.006069821, + 0.03566702, + -0.046612754, + 0.030740444, + -0.0637836, + 0.020758858, + 0.013579259, + 0.015677635, + 0.07067559, + -0.03354964, + -0.09833861, + -0.045598283, + 0.046094477, + -0.018735003, + 0.0013117951, + 0.020225674, + -0.025771514, + -0.011772435, + 0.020403381, + 0.048393097, + -0.001137191, + -0.008214463, + -0.024194324, + 0.012559411, + 0.028170707, + -0.038262583, + -0.010594243, + 0.008866333, + 0.02652175, + 0.010765866, + 0.02152175, + 0.007194773, + -0.021046689, + -0.047594506, + -0.05342931, + 0.044459403, + -0.00075621146, + 0.021768885, + 0.061362576, + 0.03243972, + 0.023200674, + 0.012056035, + -0.010374278, + -0.06796502, + -0.0056832493, + 0.048799623, + -0.035878677, + -0.020508701, + 0.03527651, + 0.096402384, + -0.027735645, + 0.11728837, + 0.022490505, + -0.08394513, + -0.010033967, + 0.024851669, + -0.019062884, + 0.00039440763, + -0.10133529, + 0.011722217, + -0.04434193, + -0.030069547, + 0.030103652, + -0.017366616, + 0.046203658, + -0.04393208, + -0.05095759, + -0.04554081, + -0.029142734, + 0.01689045, + 0.008356038, + -0.035321265, + -0.02382173, + -0.0015672153, + 0.06304823, + -0.008137697, + -0.014463008, + 0.045292154, + -0.06497864, + 0.015265712, + 0.008239593, + -0.08195689, + 0.037012544, + 0.04680898, + 0.007484248, + 0.02335733, + -0.06787198, + -0.062197443, + -0.06841327, + -0.039720036, + -0.0105394935, + -0.057220835, + -0.039479975, + 0.029730098, + 0.0697698, + 0.0280752, + 0.0137115335, + -0.0045632124, + -0.01313052, + 0.07553262, + -0.04117193, + -0.14872926, + 0.028015105, + -0.047134113, + -0.016151398, + -0.081647106, + -0.02221662, + -0.036281105, + -0.023036504, + 0.0612415, + -0.018361837, + -0.0238258, + -0.0022532772, + 0.1537845, + 0.006872191, + -0.044352733, + -0.0026320857, + -0.08600976, + 0.005572628, + 0.053448226, + -0.015072955, + -0.029777542, + -0.019132927, + 0.053970527, + 0.005238485, + -0.02418231, + -0.12369688, + 0.0014781327, + 0.059662092, + -0.011181213, + 0.01400666, + 0.023866476, + -0.059490796, + -0.054530527, + -0.011234197, + 0.013823349, + -0.012150345, + -0.09948839, + 0.023659766, + 0.014326883, + -0.02229736, + -0.0024076505, + -0.10091382, + 0.08174192, + -0.024408998, + -0.023222951, + 0.011201234, + 0.013236311, + 0.04317295, + 0.051764306, + 0.07648576, + -0.00061111146, + -0.088623054, + -0.037177067, + 0.038964123, + -0.029959839, + 0.033466227, + -0.08635276, + 0.04128183, + -0.020397836, + 0.056285754, + -0.02570748, + 0.05911732, + 0.0061064134, + -0.01733281, + -0.0875996, + -0.0127257295, + -0.013593507, + -0.04925175, + 0.01888016, + -0.032455195, + -0.023753202, + 0.052025676, + 0.06000905, + 0.04137704, + 0.004952635, + -0.02542677, + 0.00017748028, + -0.041987997, + 0.04760188, + 0.068178274, + -0.060950078, + -0.05742421, + 0.054274186, + -0.048096504, + 0.034568857, + 0.0012921172, + 0.0705816, + -0.014679933, + -0.001761971, + -0.029119784, + 0.008006632, + 0.018063113, + -0.05880496, + -0.052486468, + 0.010976936, + 0.03688557, + 0.061141517, + -0.009467033, + -0.035062946, + -0.06794524, + -0.0609979, + 0.015924038, + -0.03805085, + 0.03977454, + -0.015656536, + 0.014254484, + -0.030620195, + -0.038830906, + -0.013730216, + -0.070247106, + -0.074514836, + 0.037831023, + 0.027780455, + 0.0073002693, + -0.050368425, + 0.040389538, + 0.035920046, + 0.025425838, + 0.006255748, + -0.017454483, + -0.02307413, + 0.05788845, + 0.018672187, + 0.033335716, + 0.01855402, + 0.07957198, + -0.0029801806, + -0.057038378, + 0.010123766, + 0.038190138, + 0.0333764, + 0.075057626, + 0.00592374, + 0.06380629, + -0.028154025, + 0.07188246, + -0.056649268, + -0.019166004, + 0.053392358, + 0.13961181, + -0.08459373, + 0.03255955 + ], + "index": 0, + "object": "embedding" + } + ], + "model": "togethercomputer/m2-bert-80M-32k-retrieval", + "object": "list", + "usage": null + } + }, + "is_streaming": false + } +} diff --git a/tests/integration/recordings/responses/a0ec01643fa2.json b/tests/integration/recordings/responses/a0ec01643fa2.json new file mode 100644 index 000000000..cba4a4fe2 --- /dev/null +++ b/tests/integration/recordings/responses/a0ec01643fa2.json @@ -0,0 +1,59 @@ +{ + "request": { + "method": "POST", + "url": "https://api.together.xyz/v1/v1/chat/completions", + "headers": {}, + "body": { + "model": "meta-llama/Llama-3.3-70B-Instruct-Turbo-Free", + "messages": [ + { + "role": "user", + "content": "Test trace openai 1" + } + ], + "stream": false + }, + "endpoint": "/v1/chat/completions", + "model": "meta-llama/Llama-3.3-70B-Instruct-Turbo-Free" + }, + "response": { + "body": { + "__type__": "openai.types.chat.chat_completion.ChatCompletion", + "__data__": { + "id": "oCfx8Zn-4Yz4kd-984c2ad25ac84cee", + "choices": [ + { + "finish_reason": "stop", + "index": 0, + "logprobs": null, + "message": { + "content": "This conversation has just begun. I'm happy to chat with you. Is there something I can help you with or would you like to test something with me?", + "refusal": null, + "role": "assistant", + "annotations": null, + "audio": null, + "function_call": null, + "tool_calls": [] + }, + "seed": 2693830755697369600 + } + ], + "created": 1758820564, + "model": "meta-llama/Llama-3.3-70B-Instruct-Turbo-Free", + "object": "chat.completion", + "service_tier": null, + "system_fingerprint": null, + "usage": { + "completion_tokens": 33, + "prompt_tokens": 41, + "total_tokens": 74, + "completion_tokens_details": null, + "prompt_tokens_details": null, + "cached_tokens": 0 + }, + "prompt": [] + } + }, + "is_streaming": false + } +} diff --git a/tests/integration/recordings/responses/ae82d694f34c.json b/tests/integration/recordings/responses/ae82d694f34c.json new file mode 100644 index 000000000..aa6bc34c5 --- /dev/null +++ b/tests/integration/recordings/responses/ae82d694f34c.json @@ -0,0 +1,802 @@ +{ + "request": { + "method": "POST", + "url": "https://api.together.xyz/v1/v1/embeddings", + "headers": {}, + "body": { + "model": "togethercomputer/m2-bert-80M-32k-retrieval", + "input": [ + "What makes Python different from C++ and Java?" + ] + }, + "endpoint": "/v1/embeddings", + "model": "togethercomputer/m2-bert-80M-32k-retrieval" + }, + "response": { + "body": { + "__type__": "openai.types.create_embedding_response.CreateEmbeddingResponse", + "__data__": { + "data": [ + { + "embedding": [ + 0.02517327293753624, + -0.05927547067403793, + -0.02752850204706192, + -0.03190239518880844, + 0.05084673687815666, + 0.007633775472640991, + 0.00997336208820343, + 0.016745490953326225, + -0.06594915688037872, + 0.024146223440766335, + 0.0005385297699831426, + -0.0006894826656207442, + -0.008592012338340282, + 0.008223236538469791, + 0.03929482772946358, + 0.043699394911527634, + -0.001660426496528089, + 0.025180906057357788, + -0.039375219494104385, + 0.0053853364661335945, + 0.034692440181970596, + 0.01133072841912508, + 0.04649277403950691, + -0.04183154180645943, + 0.024229303002357483, + 0.010672398842871189, + -0.012993639335036278, + 0.016633357852697372, + 0.09620392322540283, + -0.01894748955965042, + 0.00869813933968544, + 0.03333001211285591, + 0.011436302214860916, + -0.053283337503671646, + -0.029240107163786888, + -0.018422791734337807, + -0.011188727803528309, + -0.005999945569783449, + 0.033337924629449844, + 0.08805496990680695, + 0.007277320139110088, + 0.03119608946144581, + -0.005581452511250973, + 0.013757534325122833, + 0.013446818105876446, + 0.04478459060192108, + -0.0281585231423378, + 0.007232429925352335, + -0.02057827264070511, + -0.010735592804849148, + -0.041141167283058167, + -0.013414880260825157, + 0.008774801157414913, + -0.027892043814063072, + -0.02118038199841976, + 0.03535406291484833, + -0.005773103795945644, + 0.011915366165339947, + -0.013362586498260498, + -0.1074339896440506, + 0.010058971121907234, + 0.04685341939330101, + 0.02676686830818653, + -0.04209677129983902, + 0.008211489766836166, + 0.011635981500148773, + 0.03171093761920929, + 0.006887514144182205, + 0.0160739254206419, + -0.003477125195786357, + -0.028246482834219933, + -0.02985866740345955, + 0.012354123406112194, + -0.01321585662662983, + -0.0334138497710228, + 0.05904270336031914, + 0.01702887937426567, + 0.04508252069354057, + -0.02875608205795288, + 0.061527639627456665, + 0.02183707058429718, + -0.04652441293001175, + -0.023998353630304337, + -0.014925649389624596, + -0.03466776758432388, + -0.03714502230286598, + 0.00812164880335331, + 0.05643041431903839, + -0.03370414301753044, + 0.046314384788274765, + 0.042403917759656906, + 0.039711855351924896, + 0.04194587096571922, + -0.044892653822898865, + 0.014381085522472858, + -0.04303320497274399, + 0.02417507767677307, + 0.0024261465296149254, + 0.002907819813117385, + -0.04473122954368591, + -0.033169474452733994, + -0.012776823714375496, + 0.024204110726714134, + 0.030325455591082573, + -0.011538827791810036, + 0.01400262862443924, + 0.07599721848964691, + 0.007355066481977701, + 0.021303648129105568, + 0.030465370044112206, + -0.023435434326529503, + 0.03214404731988907, + 0.013625898398458958, + 0.0068402704782783985, + -0.018856564536690712, + 0.06660695374011993, + -0.017033617943525314, + 0.024832764640450478, + 0.027372173964977264, + -0.022973205894231796, + 0.0640808716416359, + 0.11020645499229431, + -0.010406771674752235, + -0.018275918439030647, + -0.022662967443466187, + 0.07155323028564453, + 0.017646832391619682, + -0.017067432403564453, + 0.025087783113121986, + 0.03291954845190048, + -0.05901481583714485, + 0.07096591591835022, + 0.1088729053735733, + 0.021950585767626762, + 0.044516440480947495, + -0.04362349957227707, + -0.025304825976490974, + 0.03380453214049339, + 0.013806285336613655, + 0.023288749158382416, + -0.032354686409235, + 0.05623454600572586, + -0.0331498384475708, + 0.008732054382562637, + -0.03133315593004227, + -0.08394992351531982, + 0.00966270174831152, + 0.018191881477832794, + -0.017256474122405052, + -0.014849426224827766, + -0.05408606678247452, + -0.054164595901966095, + 0.038517240434885025, + 0.04411592334508896, + 0.014354993589222431, + -0.015497663989663124, + 0.009233307093381882, + 0.04177677258849144, + 0.005623073782771826, + -0.017149949446320534, + -0.008299519307911396, + 0.07599443197250366, + -0.049110863357782364, + -0.040342554450035095, + -0.03237839415669441, + -0.03407994657754898, + 0.04117212072014809, + -0.06504429131746292, + -0.005143352318555117, + -0.02781560830771923, + 0.0030793561600148678, + -0.019363518804311752, + -0.024637293070554733, + 0.05453280359506607, + -0.07453737407922745, + -0.056514766067266464, + -0.03191586583852768, + 0.01347391027957201, + 0.04701421037316322, + 0.04784790799021721, + 0.04504203796386719, + 0.0416475273668766, + 0.027300169691443443, + -0.004853601101785898, + 0.07700737565755844, + 0.0058420440182089806, + -0.020056284964084625, + -0.029256943613290787, + -0.024188874289393425, + -0.044612374156713486, + 0.005700718145817518, + -0.042027492076158524, + 0.013135066255927086, + 0.015223084948956966, + -0.025109533220529556, + 0.09686876088380814, + -0.003817221149802208, + 0.04986831918358803, + -0.020277539268136024, + -0.016653837636113167, + 0.007358207833021879, + -0.010219651274383068, + -0.022081833332777023, + 0.009230331517755985, + 0.02870170958340168, + -0.0009385381708852947, + 0.011477699503302574, + -0.08156480640172958, + -0.023806657642126083, + 0.05778304859995842, + -0.0012239509960636497, + -0.050335925072431564, + 0.08446664363145828, + -0.07200253754854202, + -0.005410981830209494, + 0.04559531435370445, + -0.019777625799179077, + -0.005575160961598158, + 0.04143029823899269, + 0.0014152266085147858, + 0.0402572900056839, + 0.04996470734477043, + 0.05924665182828903, + -0.04288039356470108, + 0.029292447492480278, + -0.07367347925901413, + -0.04015783220529556, + 0.03934734687209129, + 0.006176967639476061, + -0.04073223099112511, + 0.02915194258093834, + 0.04113445803523064, + 0.023132748901844025, + 0.005755419842898846, + -0.000497312459629029, + -0.010455143637955189, + 0.02453756146132946, + 0.008060777559876442, + 0.006233473774045706, + -0.022512169554829597, + 0.0344528965651989, + -0.05065114423632622, + 0.03987080976366997, + 0.009848693385720253, + 0.02637004666030407, + -0.023348400369286537, + 0.040486037731170654, + 0.02671428583562374, + -0.004502414260059595, + -0.06244242191314697, + -0.00591331347823143, + -0.03456953167915344, + 0.03853173553943634, + -0.012725317850708961, + 0.0020869376603513956, + -0.0544876754283905, + 0.0465322844684124, + -0.03705056756734848, + 0.03402971103787422, + -0.012153149582445621, + -0.0025780058931559324, + -0.03231276571750641, + 0.014614064246416092, + 0.040733009576797485, + 0.02793523110449314, + 0.06121594458818436, + -0.10693642497062683, + -0.04121331125497818, + -0.049808602780103683, + 0.00931315403431654, + -0.0005079125403426588, + -0.03773258998990059, + 0.04029921442270279, + 0.006094376090914011, + -0.04541047289967537, + -0.00500077847391367, + 0.008933045901358128, + 0.0165691040456295, + 0.015843873843550682, + 0.0066689420491456985, + -0.042055536061525345, + -0.04772442579269409, + 0.04299677535891533, + -0.0885479673743248, + -0.03510256111621857, + -0.01526320818811655, + -0.002680840902030468, + 0.010199936106801033, + -0.05851084738969803, + 0.004623089451342821, + 0.023245980963110924, + 0.04002177715301514, + 0.006765763740986586, + 0.029415283352136612, + -0.08234964311122894, + -0.0530225895345211, + -0.027365796267986298, + -0.03294917941093445, + -0.027471251785755157, + 0.013792217709124088, + 0.02534564584493637, + 0.06191490963101387, + 0.017584433779120445, + 0.0334448516368866, + 0.0005386894918046892, + 0.0032774577848613262, + 0.01591615378856659, + -0.005250703077763319, + 0.04274865239858627, + -0.06351747363805771, + -0.07786543667316437, + 0.004636826459318399, + 0.07713916897773743, + 0.044997744262218475, + -0.032151103019714355, + 0.025335246697068214, + -0.020933767780661583, + -0.049735575914382935, + 0.03949493169784546, + -0.037822604179382324, + -0.021480482071638107, + -0.01508465874940157, + 0.010943945497274399, + 0.016628814861178398, + 0.09863129258155823, + -0.026716219261288643, + -0.005602245219051838, + 0.027888240292668343, + -0.01338939182460308, + -0.01564818061888218, + -0.017323773354291916, + -0.018854543566703796, + -0.04452570527791977, + -0.030418355017900467, + 0.020177267491817474, + 0.033515896648168564, + -0.04733597859740257, + 0.03742247074842453, + -0.04212302714586258, + 0.019949203357100487, + -0.024253876879811287, + 0.012272280640900135, + -0.0022997513879090548, + 0.03303530439734459, + -0.013598734512925148, + 0.035109736025333405, + -0.016654808074235916, + -0.035140249878168106, + -0.006442326586693525, + -0.024461794644594193, + -0.0680788904428482, + -0.036402251571416855, + -0.02342032641172409, + 0.040693119168281555, + -0.01149903703480959, + 0.025126351043581963, + -0.013343892991542816, + -0.045200083404779434, + -0.059597622603178024, + -0.02602051943540573, + 0.05655312165617943, + -0.05449136719107628, + -0.04953633248806, + -0.04299261420965195, + 0.0021499632857739925, + -0.058740951120853424, + 0.025703098624944687, + 0.026888279244303703, + 0.041148439049720764, + 0.09555676579475403, + -0.019787615165114403, + -0.03098965249955654, + 0.025334808975458145, + -0.03880137577652931, + 0.036906614899635315, + 0.0373193733394146, + -0.019397547468543053, + -0.03890744969248772, + -0.03533877432346344, + 0.01043013297021389, + -0.11240145564079285, + -0.001887193531729281, + 0.023699326440691948, + -0.012832568027079105, + -0.026331709697842598, + -0.03766907379031181, + 0.026428470388054848, + 0.008145553059875965, + -0.00892532430589199, + 0.01250272523611784, + 0.009742435067892075, + -0.0170003529638052, + 0.012004575692117214, + 0.03468174487352371, + -0.005657907575368881, + -0.03972026705741882, + 0.01663101464509964, + -0.023416968062520027, + -0.0009885226609185338, + -0.026063844561576843, + 0.0651560127735138, + 0.00011725723743438721, + -0.022703027352690697, + -0.005461778026074171, + 0.1116209477186203, + 0.03819834068417549, + 0.045459385961294174, + -0.00028157979249954224, + -0.048355814069509506, + 0.013377707451581955, + 0.02303946204483509, + -0.006767316721379757, + -0.019848201423883438, + 0.0033706456888467073, + 0.038057632744312286, + 0.11433175206184387, + -0.035053033381700516, + 0.03242923691868782, + -0.03408103808760643, + -0.053809478878974915, + -0.03179652616381645, + 0.06007275730371475, + -0.0076828645542263985, + -0.038644637912511826, + -0.02685503102838993, + -0.01804836094379425, + 0.06089795380830765, + 0.04324701055884361, + -0.07562246173620224, + -0.04398123547434807, + 0.010064228437840939, + -0.04334224760532379, + 0.014487305656075478, + -0.04711387678980827, + 0.024354685097932816, + 0.03232944384217262, + 0.04015462473034859, + 0.01371450163424015, + -0.04432954266667366, + 0.021805129945278168, + -0.052570246160030365, + 0.06789547950029373, + 0.012027716264128685, + 0.09023753553628922, + -0.08348759263753891, + 0.012259835377335548, + 0.025145262479782104, + 0.056849926710128784, + 0.021562620997428894, + -0.0038998445961624384, + 0.06174313649535179, + 0.03390361741185188, + -0.021384961903095245, + 0.0027765228878706694, + 0.021634142845869064, + 0.0617065355181694, + -0.038299500942230225, + 0.0033859144896268845, + 0.06074449047446251, + 0.02556876465678215, + -0.05028308182954788, + -0.026669925078749657, + -0.008310562931001186, + 0.0007795466226525605, + -0.051417842507362366, + -0.03003445826470852, + 0.023208893835544586, + -0.015607934445142746, + -0.004650155082345009, + -0.09222505241632462, + -0.07439403980970383, + -0.00030001159757375717, + -0.05885722488164902, + -0.03354410454630852, + -0.023885322734713554, + -0.023694748058915138, + -0.002964545274153352, + 0.033897001296281815, + 0.02342289499938488, + -0.008121664635837078, + -0.06673142313957214, + 0.035054516047239304, + 0.006485227961093187, + -0.011049957945942879, + -0.02849774807691574, + -0.003945561125874519, + -0.009321048855781555, + -0.04061659798026085, + -0.014878206886351109, + -0.026920367032289505, + 0.013240729458630085, + -0.00912179984152317, + 0.08025270700454712, + 0.011227552779018879, + 0.01162588782608509, + 0.03911953046917915, + -0.008459963835775852, + -0.011711232364177704, + -0.06549587845802307, + -0.003934463486075401, + 0.05689859390258789, + 0.005052486434578896, + -0.002148434054106474, + -0.031108779832720757, + 0.011704150587320328, + 0.018351705744862556, + 0.06075863167643547, + 0.03104316256940365, + -0.029100103303790092, + -0.06133035942912102, + -0.004201673902571201, + -0.03299975395202637, + -0.004409941844642162, + 0.02532418817281723, + 0.0012186126550659537, + -0.03342881426215172, + -0.011862652376294136, + -0.02509687840938568, + 0.011759525164961815, + 0.01686522550880909, + -0.028010768815875053, + -0.04315534606575966, + 0.01784290373325348, + 0.04763518646359444, + -0.03223493695259094, + -0.002270394703373313, + -0.02766132541000843, + -0.12045251578092575, + 0.010882371105253696, + 0.0055845039896667, + -0.0038317532744258642, + -0.032924551516771317, + 0.007581939455121756, + -0.04714681953191757, + 0.05493198707699776, + -0.10260175168514252, + 0.0184415802359581, + 0.009282311424612999, + 0.030968470498919487, + -0.016823798418045044, + -0.012262364849448204, + 0.026101063936948776, + 0.06509155035018921, + -0.038869716227054596, + -0.02793935500085354, + 0.020369278267025948, + 0.03919598087668419, + 0.017646079882979393, + 0.03126753866672516, + -0.007000391371548176, + -0.045992594212293625, + 0.00960536953061819, + 0.02549203298985958, + 0.014892284758388996, + -0.0028631072491407394, + 0.009483040310442448, + -0.0313774012029171, + -0.019784938544034958, + 0.0016485409578308463, + 0.0068555488251149654, + 0.030234023928642273, + 0.0529765859246254, + 0.015952007845044136, + 0.03150353580713272, + -0.00897759199142456, + 0.027130605652928352, + -0.029791418462991714, + 0.02543175406754017, + 0.031176520511507988, + -0.10031485557556152, + -0.005841521546244621, + -0.04214736074209213, + 0.11366035789251328, + 0.014739606529474258, + 0.03817747160792351, + -0.041414715349674225, + 0.00041041706572286785, + 0.059705231338739395, + -0.04762746021151543, + -0.000670370296575129, + -0.03526808321475983, + -0.01601385325193405, + 0.02779310569167137, + -0.04440660402178764, + -0.06342937052249908, + -0.009988636709749699, + -0.040076956152915955, + 0.025730127468705177, + -0.022812826558947563, + 0.006558165419846773, + -0.0163955707103014, + -0.049426544457674026, + -0.04815229773521423, + -0.04713110625743866, + 0.06885242462158203, + -0.009364955127239227, + -0.02605401538312435, + 0.049001749604940414, + -0.02085917256772518, + 0.017170386388897896, + -0.04500491917133331, + -0.05170299485325813, + 0.015235558152198792, + 0.015570051036775112, + 0.02370995655655861, + 0.023241516202688217, + -0.022776372730731964, + 0.024995196610689163, + -0.04913897067308426, + 0.02573673613369465, + 0.10389196127653122, + 0.013454177416861057, + 0.001859869109466672, + -0.025003504008054733, + -0.028296904638409615, + 0.01799187809228897, + 0.00047568834270350635, + -0.03678290545940399, + 0.03209736570715904, + 0.012836124747991562, + -0.05107932910323143, + 0.05102211609482765, + -0.027505643665790558, + -0.03218458220362663, + 0.01851729489862919, + 0.012394195422530174, + -0.021180691197514534, + -0.009217607788741589, + -0.017660317942500114, + 0.02939329855144024, + 0.0017022376414388418, + 0.05091192573308945, + -0.05493085831403732, + 0.010866599157452583, + -0.025341222062706947, + -0.025223098695278168, + 0.01900743879377842, + 0.03469342365860939, + 0.01142563670873642, + -0.008546913973987103, + 0.0062241884879767895, + -0.010737174190580845, + 0.010820822790265083, + 0.02365770936012268, + 0.027239330112934113, + -0.03450082615017891, + 0.0029956395737826824, + 0.011813182383775711, + 0.025415245443582535, + -0.0012042796006426215, + -0.014137083664536476, + 0.0014223991893231869, + 0.005054670386016369, + -0.034101780503988266, + 0.07151786983013153, + 0.07557526230812073, + -0.0033575203269720078, + -0.029922479763627052, + -0.043816667050123215, + 0.01773776486515999, + 0.05497784912586212, + -0.0015120196621865034, + -0.0025900728069245815, + 0.022179318591952324, + 0.03465230390429497, + 0.006229462567716837, + -0.03738939389586449, + 0.008196177892386913, + 0.010659514926373959, + -0.008288645185530186, + -0.028259970247745514, + -0.040584057569503784, + 0.021006176248192787, + 0.008154059760272503, + -0.033632151782512665, + 0.014476779848337173, + -0.008111199364066124, + -0.07059445232152939, + 0.0218367800116539, + -0.00847222376614809, + -0.026753349229693413, + 0.01831630803644657, + -0.01770036481320858, + -0.0354844406247139, + -0.024901393800973892, + -0.0360034741461277, + -0.011295972391963005, + 0.02604268305003643, + -0.06857088208198547, + 0.07337731868028641, + -0.06401073187589645, + 0.048566631972789764, + -0.012562915682792664, + 0.027890898287296295, + -0.026574552059173584, + -0.010268484242260456, + 0.00534316198900342, + 0.010180947370827198, + -0.0008329132688231766, + 0.08566134423017502, + -0.058507468551397324, + -0.011649815365672112, + 0.06626463681459427, + 0.023633329197764397, + 0.024257145822048187, + 0.006637289188802242, + -0.052131637930870056, + 0.008190560154616833, + -0.03723077103495598, + -0.03907524421811104, + -0.024975212290883064, + -0.04886558651924133, + 0.08183369785547256, + 0.036439407616853714, + 0.006964313797652721, + -0.04853811115026474, + -0.013049819506704807, + 0.020864145830273628, + -0.01652846857905388, + -0.11374097317457199, + 0.000909007852897048, + 0.02748906798660755, + 0.0004783617041539401, + -0.04259035363793373, + -0.01951170526444912, + -0.039266347885131836, + 0.0790289118885994, + -0.03614429011940956, + -0.009888287633657455, + -0.0014079920947551727, + -0.05354578420519829, + -0.05164365842938423, + 0.02401590719819069, + -0.004703827667981386, + -0.015352515503764153, + -0.09520741552114487, + -0.0011139996349811554, + 0.012082983739674091, + -0.11449477076530457, + -0.013903029263019562, + -0.0032681110315024853, + 0.06276882439851761, + -0.0160707738250494, + -0.025801463052630424, + 0.0024566405918449163, + 0.014286108314990997, + 0.008646920323371887, + -0.041887130588293076, + 0.0062835561111569405, + 0.002493197564035654, + -0.03657038137316704, + -0.029064077883958817, + 0.024899492040276527, + -0.023499423637986183, + -0.06424634903669357, + 0.03472882881760597, + -0.045173365622758865, + 0.06708387285470963, + 0.0032126533333212137, + -0.007638201583176851, + 0.010531589388847351, + -0.049638811498880386, + -0.042833518236875534, + 0.05096343532204628, + 0.00997287780046463, + -0.027017751708626747, + -0.00491376593708992, + -1.2727919965982437e-05 + ], + "index": 0, + "object": "embedding" + } + ], + "model": "togethercomputer/m2-bert-80M-32k-retrieval", + "object": "list", + "usage": null + } + }, + "is_streaming": false + } +} diff --git a/tests/integration/recordings/responses/b734171a0872.json b/tests/integration/recordings/responses/b734171a0872.json new file mode 100644 index 000000000..1b605b012 --- /dev/null +++ b/tests/integration/recordings/responses/b734171a0872.json @@ -0,0 +1,801 @@ +{ + "request": { + "method": "POST", + "url": "https://api.together.xyz/v1/v1/embeddings", + "headers": {}, + "body": { + "model": "togethercomputer/m2-bert-80M-32k-retrieval", + "input": "This is completely different content", + "encoding_format": "float" + }, + "endpoint": "/v1/embeddings", + "model": "togethercomputer/m2-bert-80M-32k-retrieval" + }, + "response": { + "body": { + "__type__": "openai.types.create_embedding_response.CreateEmbeddingResponse", + "__data__": { + "data": [ + { + "embedding": [ + 0.020581583, + 0.03996682, + 0.06342483, + -0.046694994, + -0.07684763, + -0.05265455, + -0.053058416, + -0.008007386, + -0.04512141, + 0.03718547, + -0.026790882, + 0.039592147, + 0.08868821, + -0.054975007, + 0.022950895, + -0.03249339, + 0.05376096, + 0.04878751, + 0.06144113, + 0.08925032, + -0.06345507, + -0.0008829904, + 0.07914291, + -0.028592229, + -0.048433058, + -0.0351529, + 0.028880889, + -0.08001268, + -0.04552556, + -0.080687605, + 0.1400234, + 0.14326853, + 0.02891313, + -0.05588759, + 0.007262874, + 0.026984219, + 0.09121335, + 0.050748702, + 0.017702162, + -0.035733465, + 0.1328057, + -0.08973662, + -0.050988093, + -0.009071953, + 0.00674055, + 0.0138731655, + -0.024637444, + -0.0019375099, + 0.019351467, + 0.041681487, + 0.09368255, + 0.0052818935, + 0.027539922, + -0.031472813, + 0.042352878, + 0.07326235, + 0.010973438, + 0.06776053, + 0.06473745, + 0.031266563, + 0.00057834754, + -0.002110916, + 0.16004054, + -0.0535361, + 0.04453045, + 0.050499436, + 0.03501775, + -0.003733677, + 0.020598825, + -0.079224035, + 0.07070447, + -0.060201976, + 0.006393084, + -0.003781692, + 0.070510566, + -0.047214407, + 0.06080987, + -0.0877733, + -0.08569845, + -0.018021964, + 0.06378409, + 0.027565937, + 0.038700324, + -0.1248613, + 0.00903349, + -0.08429076, + 0.016536232, + 0.025240825, + 0.00043874417, + -0.004602262, + 0.0457946, + -0.03598806, + 0.056914188, + 0.044693712, + 0.011178773, + -0.020428436, + 0.036093723, + 0.031189999, + 0.07220326, + -0.066868156, + -0.020061923, + -0.0563857, + -0.013928966, + -0.034524415, + 0.0041604545, + -0.047119446, + 0.033624567, + 0.06970587, + -0.033320673, + -0.0413748, + 0.01094969, + -0.0100499755, + 0.004480598, + 0.02067311, + -0.021157527, + 0.022485765, + 0.03633523, + 0.0049809627, + 0.02181411, + 0.049156368, + 0.06253565, + 0.059981186, + -0.031591866, + -0.049331754, + 0.033537455, + 0.021542493, + 0.009435254, + 0.025516914, + 0.025417773, + -0.07066102, + 0.011794456, + 0.06311989, + 0.011093616, + 0.08549021, + -0.04281618, + 0.011115061, + 0.07443118, + 0.021961706, + -0.02724888, + -0.00047235374, + 0.016601468, + 0.043411057, + 0.03835865, + 0.01029931, + 0.008437206, + -0.057274926, + -0.045377273, + -0.09733081, + -0.009755395, + 0.028172465, + 0.043972567, + 0.0968819, + 0.052496422, + 0.031553026, + -0.019291716, + 0.034150966, + 0.1310106, + 0.02864821, + -0.047452684, + 0.016342362, + -0.06591784, + -0.064888336, + -0.03380424, + -0.08384223, + 0.023302404, + -0.020427782, + 0.019540966, + 0.02240307, + 0.026848866, + -0.0018868797, + -0.031800512, + -0.073483676, + 0.08840526, + -0.02696041, + -0.042041607, + 0.030633071, + 0.020918656, + 0.06119309, + -0.048348967, + 0.036555305, + 0.033583682, + 0.019630525, + -0.03500669, + -0.020821452, + 0.012256841, + 0.06733756, + 0.036884613, + -0.080063485, + 0.019956889, + -0.01994667, + 0.0011630546, + -0.08307688, + -0.040326167, + -0.03293244, + -0.014897417, + 0.03977495, + 0.036790676, + 0.020645684, + 0.015943283, + -0.05961047, + 0.036905374, + 0.006005009, + 0.033375766, + -0.015491932, + -0.07008363, + -0.031575754, + -0.0065630106, + -0.013962699, + -0.012629252, + 0.046026245, + 0.007901817, + -0.117550366, + -0.06314231, + 0.05348636, + 0.10863247, + 0.053361807, + 0.055756297, + -0.026388792, + -0.011777907, + -0.07197253, + 0.010918023, + 0.020021347, + 0.14850953, + -0.043404948, + -0.04262303, + -0.04904758, + -0.014644666, + -0.0018742547, + -0.0054880613, + -0.015058903, + -0.03137978, + -0.09884002, + 0.048087206, + -0.00044948232, + -0.059237186, + 0.01681299, + 0.06357592, + 0.09665662, + -0.032431144, + -0.021346267, + -0.03630939, + 0.108024776, + 0.011421504, + 0.00090062595, + 0.09738569, + 0.07588425, + -0.038476508, + 0.008637763, + 0.03942589, + 0.03673421, + -0.008536316, + -0.035427485, + -0.0571462, + 0.077514425, + -0.014574157, + -0.06636753, + 0.0356625, + 0.00055575924, + -0.008948914, + 0.00082343427, + 0.0511982, + 0.03143358, + -0.03388075, + -0.013724427, + 0.0551338, + -0.007191376, + -0.05363105, + -0.07718383, + -0.008230843, + 0.10335533, + 0.013668598, + -0.08284561, + 0.05179483, + -0.08437943, + -0.017510848, + -0.05778264, + 0.044004828, + -0.02612715, + -0.0058190715, + 0.013293448, + -0.005663543, + 0.0037016177, + -0.020699238, + 0.00277368, + 0.041328322, + -0.052624915, + 0.020320976, + 0.0033441507, + -0.11465616, + -0.059619453, + -0.029252917, + 0.014145012, + -0.049234822, + 0.025969574, + 0.04118447, + 0.017938918, + -0.009885965, + 0.012801603, + -0.0007332413, + -0.0012993023, + -0.052635074, + 0.064850755, + 0.004576457, + -0.018446025, + -0.069130346, + 0.018532049, + 0.006330208, + 0.039377607, + 0.11237417, + 0.055357743, + -0.0038629018, + 0.048188694, + 0.052925084, + -0.011272187, + -0.012422014, + 0.005874242, + -0.0007749841, + -0.058404274, + -0.022589723, + 0.031956926, + 0.0470711, + 0.027993023, + -0.06112344, + -0.0119517995, + -0.09797626, + -0.073644884, + 0.07465703, + 0.09884925, + -0.035564825, + -0.040369682, + 0.014445328, + -0.052219898, + -0.027498178, + 0.036846854, + -0.09408649, + -0.00027856976, + 0.028489627, + 0.002446708, + -0.043065134, + -0.030562297, + 0.07565528, + -0.0256914, + -0.12143018, + 0.09360902, + 0.015026368, + 0.058814585, + -0.01885037, + 0.04901136, + 0.009521308, + -0.0067844316, + -0.06265128, + 0.029733902, + 0.019703392, + -0.029863501, + 0.033668272, + -0.015967827, + -0.024716265, + 0.07095029, + 0.07264489, + -0.021480447, + -0.040650267, + -0.11752601, + 0.019378915, + -0.042310815, + 0.05690114, + -0.01413233, + 0.058113046, + -0.073345415, + -0.059576523, + -0.09720947, + 0.012149926, + 0.057291746, + -0.03505685, + -0.038375836, + 0.0149342865, + -0.001562935, + -0.023513826, + 0.00014910847, + 0.022598296, + -0.071317434, + -0.06260575, + 4.0522777e-05, + -0.086758316, + -0.013101295, + -0.02990748, + -0.08461068, + 0.016139807, + 0.06101953, + -0.08451055, + -0.046145856, + -0.048467644, + 0.060105037, + 0.024200678, + 0.052542347, + 0.041119967, + -0.0068898834, + 0.09487794, + 0.012641435, + -0.13026047, + 0.06284531, + 0.018659385, + -0.07564698, + 0.006965884, + -0.036618453, + 0.118192144, + -0.04771263, + 0.023280941, + 0.054039616, + -0.114724584, + -0.0918062, + 0.038803104, + -0.09954885, + 0.008216844, + -0.030975524, + -0.030176945, + 0.0397766, + -0.0061745024, + 0.071971394, + -0.041089423, + 0.033857126, + 0.03961017, + -0.03826589, + 0.038435444, + -0.0860421, + 0.08869605, + -0.028628873, + -0.05565758, + 0.056920726, + 0.020458337, + 0.05994542, + 0.08241441, + 0.0400861, + -0.0045191804, + 0.0030094406, + -0.007466077, + -0.02953672, + -0.068642505, + 0.060889505, + -0.029501854, + -0.048823155, + 0.015409609, + 0.018862283, + -0.016425489, + -0.087497436, + 0.067643866, + -0.033761434, + -0.054749027, + -0.03657711, + 0.038102675, + -0.06197178, + 0.045409728, + -0.02127562, + 0.064449035, + -0.0056471447, + 0.067553245, + -0.07137091, + 0.017407946, + -0.09813906, + -0.046500444, + -0.058283363, + -0.018302118, + -0.025382183, + -0.04259567, + 0.022398086, + -0.09098867, + 0.043438766, + -0.07656342, + 0.0028111413, + 0.030880956, + -0.07750997, + 0.07084878, + 0.05344556, + 0.0052658613, + -0.025303314, + -0.04759683, + -0.017034022, + 0.02855913, + -0.04999449, + 0.01974624, + 0.07708244, + -0.011766297, + 0.057390995, + -0.04652422, + 0.023833811, + 0.05608237, + 0.05765577, + 0.05078112, + 0.046039928, + -0.055372067, + -0.044933185, + -0.08522771, + -0.09142792, + 0.012817157, + -0.026148932, + -0.07331254, + 0.11312438, + 0.055893615, + -0.013500698, + 0.008603385, + 0.00057156937, + -0.091709465, + 0.08057745, + -0.011340835, + -0.016915537, + 0.0011427286, + 0.09740327, + -0.029696029, + -0.047760956, + 0.015541391, + 0.0955123, + 0.021890407, + -0.02908531, + 0.030994056, + 0.03820344, + -0.062488347, + 0.015730608, + 0.021182666, + -0.043783836, + 0.02782434, + 0.11151618, + 0.052450567, + 0.00037089732, + 0.03351987, + -0.0054050605, + -0.033424556, + 0.10350312, + 0.065157756, + 0.03392563, + 0.010131469, + -0.053846426, + -0.0022781377, + 0.0014610494, + 0.005763698, + 0.0426489, + -0.08206464, + -0.07099776, + -0.04228286, + 0.07337842, + 0.047744617, + 0.04284143, + 0.06959166, + 0.013133698, + -0.030711556, + 0.009055728, + 0.06162162, + 0.017240932, + -0.039795205, + -0.10877084, + 0.024329182, + -0.0049141976, + -0.038892467, + -0.012901915, + -0.095080145, + 0.05290344, + 0.021141307, + 0.03017632, + -0.0044154925, + -0.10163907, + -0.08186605, + -0.023801327, + 0.035552323, + 0.039041802, + -0.032427292, + 0.07541, + 0.10233232, + 0.018622704, + -0.013646388, + -0.008619573, + 0.020216271, + -0.07897946, + 0.063637026, + -0.08652915, + -0.0100032855, + 0.046902858, + 0.076707095, + 0.02531022, + 0.05425257, + 0.015954422, + -0.033368777, + -0.025112148, + -0.01394599, + -0.04062625, + 0.056534503, + -0.04304168, + -0.060214523, + 0.016551849, + -0.006314451, + 0.060458317, + 0.027808908, + 0.040655438, + -0.031415448, + -0.120496035, + -0.04355332, + 0.002170874, + 0.013876282, + -0.011508199, + -0.046841078, + 0.076444104, + 0.08982719, + 0.0846208, + 0.029678846, + -0.086331986, + 0.14421903, + -0.0030989156, + 0.01598773, + 0.059804816, + -0.0464971, + -0.0058899643, + 0.02542227, + -0.020552263, + 0.10621325, + -0.023809364, + -0.13324538, + -0.075492345, + 0.06716611, + -0.040477127, + -0.046582364, + -0.07376809, + 0.024235222, + 0.070477486, + 0.11006968, + -0.04869493, + 0.078016356, + -0.07615679, + 0.08063025, + -0.016255612, + -0.051746953, + 0.08059405, + -0.0025989392, + -0.073428795, + -0.03987752, + 0.098251894, + -0.006217126, + -0.028130062, + -0.051326722, + -0.0470711, + -0.016759045, + -0.039230157, + -0.020525763, + 0.07148479, + -0.05419997, + -0.025775867, + 0.0070432695, + -0.006410803, + 0.027631486, + 0.037966132, + -0.025654731, + -0.023324372, + 0.026257442, + -0.034822363, + -0.010826962, + 0.020623349, + 0.0523646, + -0.022230538, + 0.028196862, + 0.023292363, + 0.12025986, + -0.022648653, + -0.061013527, + -0.040045265, + 0.022293845, + -0.016287014, + -0.08896512, + -0.021426601, + 0.05109808, + 0.038455352, + 0.055882193, + 0.10342665, + 0.06503611, + 0.07195616, + -0.013601524, + 0.028618002, + 0.03990776, + 0.03236452, + 0.07085622, + 0.0055737793, + 0.013130723, + -0.066394895, + 0.021342268, + 0.0026651763, + -0.012577644, + 0.049445108, + 0.049437333, + 0.0047207237, + -0.02006381, + 0.02022424, + 0.05142978, + 0.01725655, + 0.00037797724, + 0.039846063, + -0.11509461, + -0.013602717, + -0.066661686, + -0.020612884, + 0.012832718, + -0.091352694, + -0.09389515, + 0.07369748, + 0.056452867, + 0.10581744, + -0.06383743, + 0.036662158, + -0.07204409, + 0.012689036, + -0.025724197, + 0.040817674, + -0.06890574, + 0.0055584335, + 0.031956017, + 0.0014588524, + 0.098465145, + 0.0054196557, + 0.056656968, + 0.03322914, + -0.040962957, + -0.015689995, + -0.034545593, + -0.052660752, + -0.044768244, + -0.04419147, + -0.11039146, + 0.015522225, + 0.0052053384, + -0.08471112, + 0.025280464, + -0.03353502, + -0.018717872, + -0.020738749, + 0.0021664763, + -0.011238148, + 0.02322494, + 0.010894536, + -0.09676859, + 0.01013113, + 0.0035604087, + -0.0060942546, + -0.027839229, + -0.0037214137, + 0.053193003, + -0.070640355, + -0.07783396, + 0.005814805, + 0.0064411093, + -0.023913933, + 0.030543711, + -0.07979223, + -0.008982119, + 0.043360766, + -0.048063844, + 0.0017047173, + 0.06882568, + -0.03443207, + 0.015080402, + -0.049461022, + 0.045471057, + -0.031460688, + -0.0028212033, + 0.044725604, + 0.0026248703, + -0.0329393, + -0.034404054, + 0.024516258, + 0.002614168, + -0.047855787, + -0.03149, + 0.14646776, + -0.047660008, + 0.021453902 + ], + "index": 0, + "object": "embedding" + } + ], + "model": "togethercomputer/m2-bert-80M-32k-retrieval", + "object": "list", + "usage": null + } + }, + "is_streaming": false + } +} diff --git a/tests/integration/recordings/responses/c8a59b661fd5.json b/tests/integration/recordings/responses/c8a59b661fd5.json new file mode 100644 index 000000000..e6ec001a9 --- /dev/null +++ b/tests/integration/recordings/responses/c8a59b661fd5.json @@ -0,0 +1,46 @@ +{ + "request": { + "method": "POST", + "url": "https://api.together.xyz/v1/v1/completions", + "headers": {}, + "body": { + "model": "meta-llama/Llama-3.3-70B-Instruct-Turbo-Free", + "prompt": "Say completions", + "max_tokens": 20, + "extra_body": {} + }, + "endpoint": "/v1/completions", + "model": "meta-llama/Llama-3.3-70B-Instruct-Turbo-Free" + }, + "response": { + "body": { + "__type__": "openai.types.completion.Completion", + "__data__": { + "id": "oCfwct8-4Yz4kd-984c2861287d4cc3", + "choices": [ + { + "finish_reason": "length", + "index": 0, + "logprobs": null, + "text": " of the following sentences:\n* The _most_ important thing in life is...\n* The _least", + "seed": 12050749903881546000 + } + ], + "created": 1758820465, + "model": "meta-llama/Llama-3.3-70B-Instruct-Turbo-Free", + "object": "text.completion", + "system_fingerprint": null, + "usage": { + "completion_tokens": 20, + "prompt_tokens": 3, + "total_tokens": 23, + "completion_tokens_details": null, + "prompt_tokens_details": null, + "cached_tokens": 0 + }, + "prompt": [] + } + }, + "is_streaming": false + } +} diff --git a/tests/integration/recordings/responses/d2e057a81717.json b/tests/integration/recordings/responses/d2e057a81717.json new file mode 100644 index 000000000..99b46f6fc --- /dev/null +++ b/tests/integration/recordings/responses/d2e057a81717.json @@ -0,0 +1,61 @@ +{ + "request": { + "method": "POST", + "url": "https://api.together.xyz/v1/v1/chat/completions", + "headers": {}, + "body": { + "model": "meta-llama/Llama-3.3-70B-Instruct-Turbo-Free", + "messages": [ + { + "role": "user", + "content": "Test trace openai with temperature 1" + } + ], + "max_tokens": 100, + "stream": false, + "temperature": 0.7 + }, + "endpoint": "/v1/chat/completions", + "model": "meta-llama/Llama-3.3-70B-Instruct-Turbo-Free" + }, + "response": { + "body": { + "__type__": "openai.types.chat.chat_completion.ChatCompletion", + "__data__": { + "id": "oCfxJ43-4Yz4kd-984c2b99bc6a9045", + "choices": [ + { + "finish_reason": "length", + "index": 0, + "logprobs": null, + "message": { + "content": "I'll do my best to generate a response with a temperature of 1. \n\nIn the context of language models like myself, temperature is a parameter that controls the level of randomness or creativity in the generated text. A temperature of 1 is relatively high, which means the model will produce more diverse and potentially less coherent text.\n\nHere's a response with a temperature of 1:\n\n\"The stars shone brightly in the midnight sky, like diamonds scattered across the velvet expanse. The world was bath", + "refusal": null, + "role": "assistant", + "annotations": null, + "audio": null, + "function_call": null, + "tool_calls": [] + }, + "seed": 8314651915728863000 + } + ], + "created": 1758820596, + "model": "meta-llama/Llama-3.3-70B-Instruct-Turbo-Free", + "object": "chat.completion", + "service_tier": null, + "system_fingerprint": null, + "usage": { + "completion_tokens": 100, + "prompt_tokens": 43, + "total_tokens": 143, + "completion_tokens_details": null, + "prompt_tokens_details": null, + "cached_tokens": 0 + }, + "prompt": [] + } + }, + "is_streaming": false + } +} diff --git a/tests/integration/recordings/responses/d5971b8fdb94.json b/tests/integration/recordings/responses/d5971b8fdb94.json new file mode 100644 index 000000000..750537740 --- /dev/null +++ b/tests/integration/recordings/responses/d5971b8fdb94.json @@ -0,0 +1,801 @@ +{ + "request": { + "method": "POST", + "url": "https://api.together.xyz/v1/v1/embeddings", + "headers": {}, + "body": { + "model": "togethercomputer/m2-bert-80M-32k-retrieval", + "input": "Hello, world!", + "encoding_format": "float" + }, + "endpoint": "/v1/embeddings", + "model": "togethercomputer/m2-bert-80M-32k-retrieval" + }, + "response": { + "body": { + "__type__": "openai.types.create_embedding_response.CreateEmbeddingResponse", + "__data__": { + "data": [ + { + "embedding": [ + -0.017041557, + -0.07436493, + 0.02897635, + -0.032216743, + 0.0056444216, + -0.029015187, + 0.06512343, + -0.040310342, + 0.05263593, + 0.0068842396, + 0.019191971, + -0.0064884443, + -0.01664521, + 0.014244285, + 0.036390014, + -0.040292, + 0.031780273, + 0.0039553884, + -0.055303488, + -0.028992416, + -0.02059435, + 0.05677091, + -0.043668333, + -0.014273451, + 0.15328151, + -0.023603301, + -0.049825363, + 0.007869072, + -0.010882995, + -0.033912696, + 0.053697765, + -0.00093928695, + 0.0017799847, + 0.038871024, + -0.069678165, + -0.067093275, + 0.025772842, + -0.057590123, + -0.015825877, + 0.020131286, + 0.020742312, + 0.003915491, + -0.018451879, + 0.020440312, + -0.023613403, + -0.039568678, + -0.013152008, + -0.01871725, + 0.021348018, + -0.019964654, + 0.038607903, + 0.018397795, + -0.0063561443, + -0.018936336, + -0.060981557, + -0.02152846, + 0.027057847, + 0.0014626224, + -0.018241309, + -0.07473041, + -0.02377323, + -0.033910733, + 0.02569418, + -0.024951216, + -0.0076659806, + -0.015425462, + 0.006604636, + 0.09833969, + -0.005054596, + 0.008841989, + -0.01836461, + -0.018554095, + 0.011605144, + -0.016599955, + -0.062196333, + -0.0037542647, + -0.025220644, + -0.027834827, + -0.020460974, + -0.050503097, + 0.032119684, + -0.023387104, + 0.050067227, + -0.05834235, + 0.023189448, + -0.021862485, + 0.023831544, + -0.016663097, + -0.041609522, + 0.025361128, + 0.002924296, + 0.01852158, + 0.08960255, + -0.003265466, + -0.058762494, + -0.06428431, + -0.014671485, + -0.046800107, + 0.02691456, + -0.0059303525, + -0.015431455, + 0.022179665, + 0.014044907, + 0.012218545, + 0.0053836405, + -0.025096457, + 0.009438382, + 0.032498095, + 0.06879721, + 0.056900814, + 0.019497631, + -0.122159146, + -0.106994465, + -0.017456975, + 0.047223866, + 0.06569824, + 0.04780035, + 0.018039258, + -0.0011028647, + -0.05067006, + 0.0106863845, + 0.027489506, + -0.014593985, + -0.039851535, + -0.09175489, + 0.037555773, + -0.060439512, + 0.008525801, + 0.0071557434, + -0.057973035, + -0.054225244, + 0.051505033, + -0.0008626373, + 0.069083415, + 0.064380065, + 0.09843996, + 0.0062191207, + -0.041505292, + -0.05381256, + -0.0073601264, + -0.03288613, + 0.011711341, + -0.09244605, + 0.0069717136, + -0.05722877, + 0.041075893, + 0.06521969, + -0.0018537377, + 0.016272636, + 0.008761483, + -0.029342752, + 0.020412564, + -0.07015791, + 0.033616304, + 0.039998446, + 0.01602917, + 0.044467725, + -0.08176377, + -0.036885373, + 0.03468746, + 0.0024068495, + 0.00056306267, + 0.02546511, + -0.053339135, + -0.027220095, + -0.021510394, + 0.054806393, + -0.005447777, + -0.05690438, + -0.028497366, + 0.01873974, + -0.035461064, + -0.00019089226, + -0.04914238, + 0.030303763, + 0.013396073, + 0.015789565, + -0.07714792, + -0.062155712, + -0.00677417, + 0.02850476, + 0.031491462, + 0.014566345, + 0.012163924, + 0.11814501, + -0.0043511004, + -0.017920421, + 0.004205825, + -0.0015928322, + -0.012145554, + 0.01663168, + -0.071173735, + 0.0029570858, + 0.12899451, + 0.004157568, + 0.010501232, + 0.07710632, + 0.062119417, + 0.021002673, + -0.023212241, + -0.04327007, + -0.0567023, + 0.04590105, + 0.0019161925, + 0.02637205, + 0.029331107, + -0.029769177, + -0.050466795, + -0.08057371, + 0.007419741, + -0.008777471, + 0.02217743, + 0.013535721, + 0.03426775, + 0.04592361, + 0.009423588, + -0.023030678, + -0.024462381, + 0.054334357, + 0.06710402, + 0.077300854, + 0.0300022, + -0.0035417816, + -0.0046773576, + -0.0927158, + -0.0218652, + -0.043468982, + -0.035734102, + -0.038873542, + -0.0412869, + -0.016015923, + 0.0038303286, + 0.08523618, + -0.05200533, + -0.014904317, + -0.016793448, + 0.04478206, + -0.017161047, + 0.02638292, + 0.007849463, + -0.040533304, + -0.017599737, + 0.047704253, + 0.034988616, + -0.013908102, + 0.044121094, + 0.040395457, + -0.010402818, + 0.0063570403, + -0.014962749, + 0.025776524, + 0.023681043, + 0.006042675, + 0.017647373, + 0.016301101, + -0.07793374, + -0.004771094, + 0.012728924, + -0.00047885205, + -0.051591527, + 0.03612118, + -0.02209703, + 0.052075963, + -0.021613466, + -0.026258182, + 0.008102769, + -0.04963262, + 0.00062747014, + -0.012579783, + 0.076374784, + -0.047350414, + -0.007680664, + 0.062471915, + -0.0061351187, + -0.043617643, + 0.023878522, + -0.09653609, + 0.018392054, + -0.039719462, + 0.065271765, + 0.034548305, + 0.004219043, + -0.003628092, + 0.0047836183, + 0.0132732885, + -0.028140727, + -0.015683327, + -0.052812085, + -0.019410037, + 0.06812139, + -0.041178964, + 0.014646207, + -0.0037439142, + 0.0003088275, + -0.04985693, + 0.0223661, + 0.008887433, + 0.0049061268, + 0.042707395, + -0.021471359, + -0.06471383, + 0.0022036259, + 0.030178884, + -0.002764245, + -0.0063233464, + -0.04146522, + -0.008236624, + 0.0037351896, + -0.027550086, + -0.0137326885, + 0.0055276263, + 0.0016785853, + 0.050191414, + 0.02629574, + -0.009129228, + 0.06351977, + -0.037435655, + 0.0467174, + -0.012987377, + -0.007550927, + -0.004503205, + 0.010520655, + 0.064984836, + 0.009879768, + 0.055787366, + -0.042653065, + 0.024189176, + 0.0378726, + -0.032453574, + 0.043519154, + 0.020133087, + -0.055212636, + -0.016188117, + 0.03764466, + -0.022142444, + 0.11164031, + 0.019020407, + -0.008950892, + 0.0517199, + 0.0014494535, + 0.041113462, + -0.0912906, + -0.04723132, + 0.008548748, + 0.028231544, + 0.023689618, + -0.039103802, + -0.034011997, + -0.04731894, + 0.03309799, + -0.044572156, + -0.116778485, + -0.028786778, + 0.05798776, + 0.05287191, + -0.0039562676, + -0.08213019, + -0.01224603, + -0.012757768, + 0.035721667, + 0.012440343, + 0.0053813523, + -0.072770126, + 0.0066190604, + 0.038976185, + -0.037760906, + -0.0031381482, + -0.052277293, + -0.016870236, + -0.053451907, + -0.05629483, + -0.034493946, + -0.0048654405, + 0.022051724, + 0.028501945, + 0.025858566, + -0.023936177, + -0.098391004, + -0.030646492, + -0.049461726, + -0.00086931954, + 0.03593346, + 0.015843417, + -0.03276966, + 0.008957432, + -0.022735167, + -0.012159252, + 0.07607085, + -0.059834506, + 0.004478244, + 0.03439635, + 0.03683821, + 0.062883355, + 0.054430448, + -0.029807799, + 0.0032295138, + 0.08891875, + -0.026941199, + -0.00618463, + -0.022683868, + -0.024138795, + -0.036633875, + 0.02097464, + -0.003001584, + 0.020455033, + 0.043717608, + 0.06566654, + -0.029039463, + -0.0066977167, + -0.04504434, + 0.022257777, + 0.054422457, + 0.029796708, + 0.009008146, + 0.028205348, + 0.06255052, + -0.004475601, + 0.059329458, + -0.038065027, + -0.027933009, + -0.07060949, + 0.013978787, + -0.051300917, + 0.02945564, + -0.008552103, + -0.009436655, + 0.039747514, + -0.016741823, + 0.04740887, + 0.03521937, + -0.012574282, + -0.089222826, + -0.043515395, + -0.04158566, + 0.0016020355, + 0.02684753, + -0.019394692, + -0.02156877, + 0.06316388, + 0.01663444, + 0.015482924, + 0.047349654, + -0.028341234, + 0.013805591, + -0.010708488, + -0.07627738, + 0.08611209, + 0.0089956885, + 0.034438204, + 0.016312746, + -0.03412846, + 0.0770598, + -0.06790466, + 0.036359854, + 0.08038976, + 0.023465984, + -0.019832904, + -0.0011524013, + -0.03804293, + 0.04106918, + -0.028220456, + 0.032340813, + -0.030669356, + -0.004353358, + -0.019439798, + 0.0020563425, + 0.03015629, + -0.06430176, + 0.0034439075, + -0.045720384, + -0.06526568, + -0.0004192516, + -0.016580455, + -0.012596616, + 0.039126, + -0.04699455, + -0.008973794, + 0.015056125, + 0.018929023, + -0.07840811, + -0.014792519, + -0.0044317124, + 0.019588342, + 0.035912346, + -0.035739247, + 0.058755044, + -0.01856197, + 0.021155646, + -0.073580906, + -0.04310776, + -0.023147091, + -0.010232029, + 0.06352039, + 0.039570276, + 0.020424508, + 0.051613245, + 0.013395984, + -0.003908009, + -0.04643392, + 0.019592889, + -0.008484923, + 0.0031434586, + -0.046069775, + -0.01765311, + -0.041277196, + -0.070297986, + 0.012561737, + -0.003500738, + -0.01729488, + -0.0033254062, + 0.053035453, + -0.054218896, + -0.029708259, + -0.0047281524, + 0.019236762, + -0.12249525, + 0.03018237, + -0.028753102, + -0.031858314, + 0.0811298, + -0.005711499, + -0.057587985, + 0.014153141, + 0.0006705577, + -0.024263157, + 0.016729265, + -0.03195949, + -0.007259763, + -0.0035231581, + -0.03890975, + 0.011460382, + -0.06591321, + -0.023756726, + -0.023958001, + 0.030074941, + -0.0040949634, + -0.048368257, + -0.029692868, + 0.027246583, + -0.024747347, + 0.014442731, + -0.00832639, + -0.0002390868, + -0.013635633, + 0.0035843733, + 0.02354072, + -0.012829061, + -0.0060750768, + -0.044952527, + -0.05725624, + 0.031746052, + -0.024419094, + 0.032444403, + -0.029308707, + 0.034302235, + -0.022495607, + 0.015296428, + -0.0057196384, + -7.8588724e-05, + 0.060303975, + 0.06299601, + 0.028222265, + -0.0071411408, + 0.015196491, + 0.02031155, + 0.039635558, + 0.079736926, + 0.008736669, + -0.023079613, + -0.04490686, + -0.021764707, + -0.015199573, + 0.036019534, + -0.0046079857, + 0.04429082, + -0.04291344, + -0.05991891, + -0.006501417, + 0.010603077, + 0.03435066, + -0.065568395, + -0.04424192, + 0.035055783, + 0.019717937, + 0.032764338, + 0.021240309, + -0.01646063, + 0.007835414, + 0.06857148, + -0.013750999, + 0.028333688, + -0.078255735, + -0.047899257, + -0.0006370693, + 0.012606231, + 0.012178417, + -0.013057751, + -0.008095854, + -0.013466724, + 0.019036459, + -0.025450038, + 0.021131655, + -0.02505666, + 0.012961284, + 0.0004236046, + -0.023920864, + -0.055114083, + 0.082351916, + 0.028973032, + 0.025259241, + 0.098259576, + -0.007385416, + 0.003546012, + -0.05316339, + -0.04186183, + 0.043638214, + -0.069299474, + -0.013284585, + -0.010019175, + 0.012883975, + 0.014200739, + -0.013508286, + 0.0086570075, + -0.020393575, + 0.10617594, + 0.028786503, + -0.018674662, + 0.026763268, + -0.0062548965, + -0.07215284, + 0.055464335, + 0.0029595464, + -0.009364344, + -0.096402094, + 0.02823341, + -0.022853011, + 0.04750492, + 0.008378555, + 0.016491622, + 0.01860681, + 0.048116222, + 0.106049344, + -0.028929656, + -0.008896546, + 0.033615295, + -0.0070807124, + -0.05684197, + -0.061439563, + 0.0060220268, + 0.046171866, + -0.01574131, + -0.07562956, + 0.0024098414, + 0.0006304895, + -0.07831614, + 0.060869616, + 0.00076000375, + -0.008209363, + -0.04139266, + -0.085268535, + -0.028194478, + -0.024567788, + -0.04218179, + 0.023546752, + 0.036236234, + 0.017199656, + -0.03315456, + -0.023814544, + 0.038755447, + -0.023165299, + -0.049283065, + -0.006907019, + 0.040826146, + 0.017533792, + -0.036849793, + -0.015506943, + -0.010768763, + -0.08758806, + -0.0295733, + 0.055843282, + -0.012555046, + 0.0076235603, + 0.008802991, + 0.026661193, + -0.023899797, + 0.043548774, + -0.034339137, + -0.027354732, + -0.07583677, + 0.020500224, + 0.036802996, + 0.031019075, + 0.04605757, + -0.004433706, + 0.0108612785, + 0.050121468, + -0.07816735, + -0.014776514, + -0.04565195, + -0.0036854912, + 0.0075577567, + -0.017044865, + 0.030597543, + -0.013623054, + -0.0648466, + -0.0318741, + -0.059455115, + -0.024783187, + -0.0088010235, + 0.11127796, + 0.03429834, + -0.010424589, + -0.06355135, + 0.034265812, + 0.02680333, + -0.007930513, + 0.030092249, + 0.008321974, + 0.03125566, + -0.06832331, + -0.0076806936, + 0.034010306, + -0.087202646, + -0.047684345, + 0.06384632, + -0.026591811, + -0.0016003181, + 0.05721666, + -0.0024700803, + -0.029714238, + 0.07761957, + -0.04561395, + -0.053199258, + 0.030417573, + -0.01958724, + 0.0012449475, + -0.04003076, + 0.08825553, + -0.023196172, + -0.08629044, + -0.049815316, + 0.027229005, + 0.0021765123, + 0.03438692, + -0.09314263, + -0.019655729, + 0.018762926, + 0.025670087, + -0.017116003, + 0.031716976, + -0.05509443, + 0.032953184, + -0.02264915, + 0.04861606, + -0.050201602, + 0.033154316, + 0.009971947, + -0.037610047, + 0.016600395, + -0.031037569, + -0.015495428, + 0.026365642, + -0.043527953, + 0.055781424, + 0.06780075, + -0.015966192, + 0.03201043, + 0.028026119 + ], + "index": 0, + "object": "embedding" + } + ], + "model": "togethercomputer/m2-bert-80M-32k-retrieval", + "object": "list", + "usage": null + } + }, + "is_streaming": false + } +} diff --git a/tests/integration/recordings/responses/dcbe6260d0a1.json b/tests/integration/recordings/responses/dcbe6260d0a1.json new file mode 100644 index 000000000..643e3c453 --- /dev/null +++ b/tests/integration/recordings/responses/dcbe6260d0a1.json @@ -0,0 +1,2352 @@ +{ + "request": { + "method": "POST", + "url": "https://api.together.xyz/v1/v1/embeddings", + "headers": {}, + "body": { + "model": "togethercomputer/m2-bert-80M-32k-retrieval", + "input": [ + "First text for base64", + "Second text for base64", + "Third text for base64" + ] + }, + "endpoint": "/v1/embeddings", + "model": "togethercomputer/m2-bert-80M-32k-retrieval" + }, + "response": { + "body": { + "__type__": "openai.types.create_embedding_response.CreateEmbeddingResponse", + "__data__": { + "data": [ + { + "embedding": [ + -0.021243946626782417, + 0.034794747829437256, + 0.03294198960065842, + -0.028090357780456543, + 0.037979260087013245, + 0.0007518212078139186, + 0.03092937171459198, + -0.0757070928812027, + -0.0089311758056283, + -0.12937317788600922, + -0.03478684276342392, + -0.014693479984998703, + 0.02030082419514656, + -0.03696034476161003, + 0.02939474768936634, + -0.06821902841329575, + -0.009677799418568611, + 0.0005795712932012975, + 0.029995545744895935, + 0.04274674877524376, + -0.0015028107445687056, + -0.008859499357640743, + 0.0410819835960865, + -3.760308027267456e-05, + 0.013448919169604778, + 0.012646213173866272, + 0.010533844120800495, + -0.026266224682331085, + 0.05517255887389183, + 0.0012272180756554008, + -0.026349006220698357, + 0.033021584153175354, + 0.020924728363752365, + -0.003130909986793995, + -0.07338618487119675, + 0.05300657078623772, + 0.017535021528601646, + 0.012835361994802952, + 0.04423525929450989, + 0.1066272035241127, + 0.06260895729064941, + 0.04890596866607666, + -0.04477392137050629, + -0.01750274747610092, + 0.0343162938952446, + 0.10029055178165436, + -0.014948023483157158, + -0.024369262158870697, + 0.06106048822402954, + 0.07602144777774811, + 0.0004884329973720014, + 0.07446408271789551, + 0.11743774265050888, + 0.030932847410440445, + 0.004931860603392124, + -0.08820780366659164, + -0.01851862110197544, + 0.0921822264790535, + 0.04888436570763588, + -0.031682271510362625, + 0.0264931358397007, + 0.0018110721139237285, + -0.026995966210961342, + -0.05950840562582016, + 0.011343052610754967, + 0.07904137670993805, + -0.024950025603175163, + 0.024129478260874748, + 0.033503979444503784, + 0.01735381782054901, + 0.035805437713861465, + -0.1212705671787262, + 0.05092538893222809, + 0.020419137552380562, + 0.006083586718887091, + 0.020212028175592422, + -0.043722283095121384, + 0.02742619998753071, + -0.03652483597397804, + -0.0008565334137529135, + -0.05390670895576477, + 0.028156332671642303, + 0.02802872471511364, + -0.06313633173704147, + -0.027465177699923515, + -0.10524909198284149, + 0.08934938907623291, + 0.013776582665741444, + -0.01413104496896267, + -0.0374874472618103, + 0.05462100729346275, + 0.05183432623744011, + -0.0104093411937356, + 0.02317146211862564, + 0.012575537897646427, + -0.09260094910860062, + -0.05728054791688919, + 0.06886608153581619, + -0.04862228035926819, + -0.06568558514118195, + -0.07427217066287994, + -0.04599063843488693, + 0.0796656534075737, + 0.02040169946849346, + 0.03134843334555626, + 0.06542150676250458, + 0.0446057952940464, + 0.08117026835680008, + 0.06494253128767014, + 0.00807634275406599, + -0.02132454514503479, + 0.015039658173918724, + -0.0053248037584125996, + -0.05536780133843422, + -0.011107254773378372, + 0.06042608618736267, + -0.11041712760925293, + -0.0007388441590592265, + -0.01076942216604948, + 0.023536212742328644, + -0.024439888074994087, + 0.057694707065820694, + -0.0005566216423176229, + -0.022222088649868965, + -0.02083885855972767, + 0.057657815515995026, + -0.03296849876642227, + -0.0348387286067009, + -0.04256873577833176, + -0.030177747830748558, + -0.07543575018644333, + 0.024438725784420967, + 0.0275866761803627, + 0.02123904414474964, + 0.09619438648223877, + -0.10413849353790283, + 0.0076338155195117, + 0.03055821731686592, + -0.06505735963582993, + 0.055635593831539154, + -0.049195848405361176, + 0.07235309481620789, + -0.04930593818426132, + -0.022135699167847633, + 0.0028531793504953384, + -0.04230312630534172, + -0.0005465968861244619, + 0.008261390030384064, + -0.04080177843570709, + 0.006186335813254118, + -0.023405974730849266, + 0.019431626424193382, + 0.01728222891688347, + 0.0259513258934021, + -0.031367070972919464, + 0.012502037920057774, + 0.040825821459293365, + 0.05001406744122505, + 0.04015844687819481, + 0.010462706908583641, + -0.024905573576688766, + 0.07979825884103775, + 0.008362107910215855, + 0.032846204936504364, + 0.027283407747745514, + -0.027066078037023544, + -0.05478755757212639, + -0.02779112197458744, + 0.018969617784023285, + 0.0016592427855357528, + 0.03605928644537926, + -0.03889048844575882, + 0.002129088621586561, + 0.03605295717716217, + 0.053488731384277344, + -0.07981417328119278, + 0.0013098784256726503, + 0.007055372465401888, + 0.035932816565036774, + -0.021957283839583397, + 0.04175853356719017, + 0.024311570450663567, + 0.022088928148150444, + -0.03077773191034794, + -0.023651933297514915, + -0.029449904337525368, + -0.06242407485842705, + -0.09673216938972473, + -0.022156711667776108, + -0.002594852587208152, + -0.03681497275829315, + -0.028873350471258163, + 0.039285652339458466, + -0.013717029243707657, + 0.03909775987267494, + -0.01578403450548649, + 0.07472826540470123, + 0.07584545761346817, + 0.047826215624809265, + -0.01626771129667759, + 0.0754612535238266, + -0.027092115953564644, + 0.04353151470422745, + -0.00043609036947600543, + 0.04202340543270111, + 0.04058298468589783, + 0.04573487490415573, + 0.006294480990618467, + -0.020078429952263832, + 0.05308700352907181, + -0.07461412996053696, + -0.02280886098742485, + 0.006082446780055761, + -0.010309150442481041, + -0.0648636445403099, + 0.03642423823475838, + -0.04575612396001816, + -0.03454422205686569, + 0.03753354027867317, + 0.01559093315154314, + 0.14071153104305267, + 0.03761900216341019, + 0.09063170105218887, + -0.05966372787952423, + -0.0881241112947464, + -0.03742286562919617, + -0.08929157257080078, + -0.004663981031626463, + -0.021736236289143562, + -0.04781720042228699, + 0.07504318654537201, + 0.006156024057418108, + 0.09562328457832336, + 0.01149415597319603, + 0.03671488165855408, + 0.05823316052556038, + -0.004843208473175764, + 0.03940499946475029, + 0.005145011004060507, + -0.0387989841401577, + 0.02801636792719364, + -0.01898770034313202, + -0.01319114863872528, + -0.04162587970495224, + -0.009340304881334305, + -0.028531309217214584, + -0.013548480346798897, + 0.0749879702925682, + 0.029029767960309982, + -0.13125675916671753, + 0.028858788311481476, + 0.016637325286865234, + 0.07098004221916199, + 0.014350894838571548, + 0.025028040632605553, + 0.08852114528417587, + 0.01179411169141531, + 0.003958633169531822, + -0.07466915249824524, + -0.051881562918424606, + 0.016343487426638603, + -0.015593438409268856, + -0.018738843500614166, + 0.023900233209133148, + -0.029499951750040054, + 0.029405502602458, + -0.10045821219682693, + 0.0407489538192749, + -0.08355997502803802, + 0.02037896029651165, + -0.02060963399708271, + -0.006867741234600544, + 0.041690364480018616, + -0.02105969935655594, + -0.031096510589122772, + 0.022436559200286865, + -0.008763480000197887, + -0.060320526361465454, + -0.033940769731998444, + 0.06043842062354088, + -0.046624381095170975, + -0.020693134516477585, + -0.015724539756774902, + 0.0017427188577130437, + -0.04013955593109131, + -0.09141470491886139, + 0.048646699637174606, + -0.011399643495678902, + -0.011805842630565166, + 0.0028939840849488974, + 0.04591585695743561, + 0.03140917420387268, + 0.02115165814757347, + 0.01129426434636116, + -0.04453091695904732, + -0.034225091338157654, + -0.043412696570158005, + -0.0507376603782177, + -0.045656848698854446, + 0.03541470691561699, + 0.0004332195676397532, + -0.015982968732714653, + -0.049344033002853394, + -0.016870534047484398, + -0.02533125877380371, + -0.052366580814123154, + -0.05742982402443886, + 0.014312811195850372, + 0.02991114743053913, + 0.007198266219347715, + -0.056468795984983444, + 0.05485447496175766, + -0.04732056334614754, + 0.0015276444610208273, + 0.08423584699630737, + -0.05577176809310913, + -0.03241731971502304, + 0.005962055176496506, + 0.0438140444457531, + 0.015707187354564667, + -0.07703499495983124, + 0.006147976033389568, + -0.01812780275940895, + -0.0010729017667472363, + 0.0232272669672966, + 0.005022854078561068, + 0.03320878744125366, + -0.005904147867113352, + 0.04386003315448761, + 0.022143641486763954, + -0.030258458107709885, + 0.005923417862504721, + 0.03665343299508095, + 0.03368106856942177, + -0.03855093941092491, + 0.05389492213726044, + -0.03243345394730568, + 0.014403747394680977, + 0.01844039000570774, + -0.04507424309849739, + -0.0353391207754612, + 0.02985268644988537, + -0.1257036328315735, + 0.04566779360175133, + 0.00108715845271945, + 0.011796748265624046, + -0.010499436408281326, + -0.006459049414843321, + 0.019375959411263466, + -0.04014842212200165, + -0.03018513321876526, + 0.0006804278818890452, + -0.024089330807328224, + -0.05178503692150116, + 0.03820057213306427, + 0.04591234400868416, + 0.01584138721227646, + 0.0013118565548211336, + 0.05431056767702103, + -0.04110536351799965, + -0.04406438022851944, + -0.08887076377868652, + -0.04624929651618004, + 0.01865711249411106, + -0.012675807811319828, + -0.00916767306625843, + 0.046412695199251175, + -0.02968359738588333, + 0.034033484756946564, + -0.05128427594900131, + 0.0004786983772646636, + -0.010109355673193932, + 0.016439290717244148, + -0.043365489691495895, + 0.009784338064491749, + -0.014746462926268578, + -0.02255125343799591, + -0.03336954489350319, + -0.013219241052865982, + 0.012832749634981155, + -0.054642386734485626, + 0.021693484857678413, + -0.010907863266766071, + -0.01638379506766796, + -0.004628440830856562, + -0.02702217921614647, + 0.02485765516757965, + 0.0015859740087762475, + 0.014810957945883274, + 0.014514460228383541, + 0.049271535128355026, + -0.011239118874073029, + 0.012005401775240898, + 0.041765641421079636, + -0.06757067143917084, + 0.09190651774406433, + 0.02942199446260929, + -0.07001000642776489, + -0.027379410341382027, + 0.022311899811029434, + 0.006803853902965784, + -0.033739957958459854, + 0.014822928234934807, + 0.07009675353765488, + 0.01265542022883892, + -0.013862154446542263, + -0.13826966285705566, + 0.06718281656503677, + 0.009786676615476608, + -0.04935590550303459, + -0.007003592327237129, + 0.005271278787404299, + 0.003907268401235342, + -0.06191864237189293, + -0.08406338840723038, + 0.059670574963092804, + -0.03440184146165848, + -0.004656089469790459, + -0.05913826450705528, + 0.07360323518514633, + -0.05216832086443901, + 0.01305945124477148, + -0.04029037803411484, + -0.013935432769358158, + -0.008672966621816158, + -0.04508724436163902, + 0.011632713489234447, + 0.04962510988116264, + -0.007929306477308273, + -0.015910180285573006, + 0.11333373934030533, + -0.09912213683128357, + -0.004115979187190533, + -0.046902671456336975, + 0.011006402783095837, + 0.014275251887738705, + -0.0009168803226202726, + 0.053979601711034775, + 0.0040133120492100716, + 0.013177922926843166, + 0.026463385671377182, + 0.04751366749405861, + 0.0579240657389164, + -0.03787180781364441, + 0.08349741250276566, + 0.05076466500759125, + 0.0354430265724659, + 0.029994670301675797, + 0.031569115817546844, + -0.002271361416205764, + -0.03959103301167488, + -0.00116530095692724, + -0.010205492377281189, + -0.055082183331251144, + 0.0010017730528488755, + -0.012688984163105488, + 0.025854796171188354, + 0.019687794148921967, + 0.11897709220647812, + -0.018763957545161247, + -0.09455431252717972, + -0.0004727896011900157, + -0.016428187489509583, + 0.05448509380221367, + -0.02335636131465435, + 0.06281369179487228, + 0.0008048227173276246, + 0.010531709529459476, + 0.07564940303564072, + -0.07394172996282578, + -0.0077888248488307, + 0.028107117861509323, + 0.011597340926527977, + -0.056152522563934326, + -0.05610967427492142, + 0.0048665632493793964, + -0.05508267506957054, + 0.1188877671957016, + 0.013651496730744839, + -0.002225268632173538, + -0.03457065671682358, + -0.07814210653305054, + 0.062431029975414276, + 0.015777068212628365, + 0.05874136835336685, + -0.02467568963766098, + 0.08875864744186401, + -0.023964574560523033, + -0.012265834026038647, + 0.0441846139729023, + -0.06669578701257706, + -0.059913307428359985, + 0.06672590225934982, + -0.030995339155197144, + -0.021182818338274956, + -0.023741241544485092, + 0.017112649977207184, + -0.00318331690505147, + 0.013586549088358879, + 0.016403738409280777, + -0.03456692397594452, + -0.07706793397665024, + 0.07028163969516754, + -0.004563847556710243, + 0.05896731838583946, + 0.03370149806141853, + 0.08598394691944122, + -0.028344471007585526, + -0.00012640655040740967, + -0.020437706261873245, + 0.020452480763196945, + -0.07386474311351776, + -0.022961962968111038, + -0.00956758577376604, + 0.0572735033929348, + 0.00888572633266449, + 0.049277760088443756, + -0.035784464329481125, + -0.024803629145026207, + -0.033097684383392334, + 0.0628223791718483, + -0.037873413413763046, + 0.018132388591766357, + -0.0570320300757885, + -0.03685370087623596, + -0.01412233803421259, + 0.00909410696476698, + -0.05424374341964722, + 0.00796805415302515, + -0.05229536443948746, + 0.009670494124293327, + -0.009895792230963707, + 0.017865560948848724, + 0.05613577738404274, + -0.013700703158974648, + -0.09394590556621552, + -0.06554463505744934, + 0.006992490496486425, + -0.02259184792637825, + -0.024195179343223572, + 0.056506190448999405, + -0.014457941986620426, + 0.023873861879110336, + -0.00012435298413038254, + 0.005703497212380171, + 0.012352116405963898, + -0.02086440473794937, + 0.07235981523990631, + 0.01831240952014923, + 0.009411456063389778, + -0.05372312664985657, + -0.025770995765924454, + -0.004489639308303595, + 0.05335519090294838, + -0.02515813335776329, + -0.00395063403993845, + 0.07238995283842087, + -0.0033302258234471083, + -0.01983746699988842, + -0.01599535159766674, + -0.0008172772941179574, + -0.05466737970709801, + 0.03392226621508598, + 0.07594592124223709, + -0.009340176358819008, + 0.0685979351401329, + 0.03870048373937607, + -0.02050076425075531, + -0.0707913190126419, + 0.002426006831228733, + 0.03580603376030922, + 0.0391516275703907, + -0.0475793331861496, + -0.01934715174138546, + 0.09019213169813156, + -0.023854458704590797, + 0.09640078991651535, + 0.025748809799551964, + -0.04934404045343399, + -0.018955113366246223, + 0.04065977409482002, + -0.003897663438692689, + -0.029766447842121124, + -0.09338818490505219, + 0.015848957002162933, + -0.06712503731250763, + -0.04601748287677765, + 0.013102288357913494, + 0.015960464254021645, + 0.01131692249327898, + -0.09787366539239883, + -0.024784227833151817, + -0.059856679290533066, + -0.018397631123661995, + 0.04785679280757904, + 0.028324270620942116, + -0.021970495581626892, + -0.10152556747198105, + 0.036651235073804855, + 0.10924217104911804, + 0.03857167437672615, + 0.018847741186618805, + -0.018971268087625504, + -0.020804740488529205, + -0.031007297337055206, + -0.03123946115374565, + -0.06185399368405342, + -0.0005774162127636373, + 0.05364489555358887, + 0.034990180283784866, + 0.015288084745407104, + -0.08519966155290604, + -0.02135700359940529, + -0.11396247148513794, + -0.032443221658468246, + 0.03247451409697533, + -0.09251630306243896, + -0.027148332446813583, + -0.0010909098200500011, + 0.03239751607179642, + 0.016580209136009216, + 0.04813570901751518, + -0.02053685672581196, + -0.006615726742893457, + 0.04650004953145981, + -0.05042275786399841, + -0.1390020102262497, + 0.02904166281223297, + -0.08724252879619598, + 0.05358317494392395, + -0.07751209288835526, + -0.08581648021936417, + -0.03441935405135155, + -0.010417298413813114, + 0.05497601628303528, + -0.0005697793676517904, + -0.017994984984397888, + 0.03513611853122711, + 0.17318987846374512, + 0.0068072183057665825, + 0.02047453075647354, + -0.0013765395851805806, + -0.06979061663150787, + 0.0050995745696127415, + 0.04374051094055176, + 0.012496848590672016, + -0.04901368170976639, + 0.06716548651456833, + -0.0057524219155311584, + -0.001631277147680521, + 0.009543255902826786, + -0.12455476820468903, + -0.03447726368904114, + 0.05795378237962723, + -0.03234371170401573, + -0.008605395443737507, + -0.009710922837257385, + -0.02412606216967106, + -0.06345447897911072, + 0.00020711123943328857, + -0.007918517105281353, + 0.012251642532646656, + -0.072933629155159, + -0.005882172845304012, + 0.014688358642160892, + -0.05061021074652672, + -0.01772920787334442, + -0.10720483213663101, + 0.024525122717022896, + -0.03410802409052849, + -0.029861919581890106, + 0.01121978648006916, + 0.03064989671111107, + 0.06948171555995941, + 0.02422528900206089, + 0.041864924132823944, + -0.0060437703505158424, + -0.04014107957482338, + -0.05345838889479637, + 0.08462578058242798, + -0.021888302639126778, + 0.02760351076722145, + -0.06208560988306999, + 0.010669044218957424, + 0.009895195253193378, + 0.04011973366141319, + -0.0027158602606505156, + 0.03309660777449608, + 0.015698090195655823, + 0.0012504097539931536, + -0.06713616102933884, + 0.01714659109711647, + 0.04267580062150955, + -0.100189708173275, + 0.02179231308400631, + -0.05325351282954216, + 0.040056344121694565, + 0.05891250818967819, + 0.06118196249008179, + 0.02449502795934677, + -0.005512666888535023, + -0.05754562094807625, + 0.04250011593103409, + -0.0280450452119112, + 0.05799516290426254, + 0.05134669318795204, + -0.07423847913742065, + -0.052621182054281235, + 0.044754717499017715, + -0.0498635396361351, + -0.024358481168746948, + 0.017813928425312042, + 0.049917787313461304, + -0.06214871630072594, + 0.028665436431765556, + -0.045065607875585556, + 0.026900598779320717, + 0.050857800990343094, + -0.067425936460495, + 0.004570877179503441, + 0.000553375983145088, + 0.011435381136834621, + 0.02447129599750042, + 0.035013604909181595, + 0.008408213965594769, + -0.09106679260730743, + -0.05746156722307205, + 0.019560588523745537, + -0.07232211530208588, + 0.04495194926857948, + -0.07498367130756378, + 0.023491332307457924, + 0.00814443826675415, + -0.033822815865278244, + 0.0007444656221196055, + -0.05174757167696953, + -0.07039020955562592, + 0.047565776854753494, + 0.045103445649147034, + -0.0015524910995736718, + 0.0266417246311903, + 0.025849921628832817, + 0.04197035729885101, + 0.05096474662423134, + -0.03653767332434654, + -0.010587411932647228, + -0.0294844601303339, + 0.05015818029642105, + 0.04084649309515953, + 0.028987864032387733, + -0.04201335832476616, + 0.07595627754926682, + -0.021202752366662025, + -0.03432992473244667, + 0.021856922656297684, + 0.022634290158748627, + -0.003617837093770504, + 0.0707993432879448, + 0.004863708280026913, + 0.05238958075642586, + -0.032469477504491806, + 0.007123141083866358, + -0.04516129195690155, + -0.05961206182837486, + 0.07076875120401382, + 0.096811443567276, + -0.027327029034495354, + 0.06346990913152695 + ], + "index": 0, + "object": "embedding" + }, + { + "embedding": [ + -0.015361337922513485, + 0.04979732632637024, + 0.03271178901195526, + -0.023676365613937378, + 0.04331335425376892, + 0.00562778115272522, + 0.03926454484462738, + -0.06629609316587448, + -0.005185229703783989, + -0.12151318043470383, + -0.008604802191257477, + -0.032601498067379, + 0.011911311186850071, + -0.03212691843509674, + 0.028529010713100433, + -0.06378806382417679, + -0.009742745198309422, + -0.01227179728448391, + 0.03821500390768051, + 0.049727663397789, + 0.0056787827052176, + -0.0215577594935894, + 0.028353586792945862, + 0.009897884912788868, + 0.014786846935749054, + 0.00024352222681045532, + 0.01381521113216877, + -0.04508408531546593, + 0.022661438211798668, + -0.0010912897996604443, + -0.04025668650865555, + 0.023755939677357674, + 0.0451127290725708, + -0.008986257016658783, + -0.08380444347858429, + 0.046146638691425323, + 0.010871831327676773, + 0.0017496348591521382, + 0.03738158196210861, + 0.08895260095596313, + 0.07399918138980865, + 0.04653134196996689, + -0.02871764823794365, + -0.014150945469737053, + 0.02770884335041046, + 0.1143602654337883, + -0.006745737046003342, + -0.021923422813415527, + 0.024092191830277443, + 0.08299314230680466, + 0.01074399147182703, + 0.05946294218301773, + 0.07587448507547379, + 0.03752659633755684, + -0.013794900849461555, + -0.11456605792045593, + -0.045754849910736084, + 0.1185627356171608, + 0.05171286314725876, + -0.00011203205212950706, + 0.03786885738372803, + -0.020881952717900276, + -0.04263683781027794, + -0.0693858191370964, + 6.804987788200378e-05, + 0.06546545773744583, + -0.04958876594901085, + 0.02872016280889511, + 0.02686113491654396, + 0.01706119067966938, + 0.024307388812303543, + -0.10877911746501923, + 0.06306217610836029, + 0.018824364989995956, + 0.009414511732757092, + 0.029292665421962738, + -0.03701861575245857, + 0.04195621982216835, + -0.024835936725139618, + 0.0075477007776498795, + -0.08807897567749023, + 0.028510818257927895, + 0.02435067668557167, + -0.06579336524009705, + -0.07196126878261566, + -0.10865594446659088, + 0.09111516922712326, + 0.014166605658829212, + -0.013762171380221844, + -0.053920987993478775, + 0.04987506568431854, + 0.04085454344749451, + -0.04871196672320366, + 0.014562679454684258, + 2.7124769985675812e-05, + -0.07960894703865051, + -0.07389690726995468, + 0.09588716924190521, + -0.05884701758623123, + -0.05994487181305885, + -0.050043534487485886, + -0.05509130656719208, + 0.0815657302737236, + 0.006192589178681374, + 0.009257589466869831, + 0.05459251627326012, + 0.05741984024643898, + 0.05948534980416298, + 0.054572172462940216, + 0.023488275706768036, + -0.019055640324950218, + 0.00615002540871501, + -0.0032463304232805967, + -0.046519290655851364, + -0.009281368926167488, + 0.07151860743761063, + -0.11087965220212936, + 0.013657445088028908, + -0.02288041263818741, + 0.00833470281213522, + -0.011994874104857445, + 0.04166214168071747, + 0.019814645871520042, + -0.005959265399724245, + -0.029590584337711334, + 0.0467841774225235, + -0.03742105886340141, + -0.04282886162400246, + -0.04398249089717865, + -0.005584442522376776, + -0.06762321293354034, + 0.016560424119234085, + 0.0217873677611351, + -0.006113113835453987, + 0.07774721831083298, + -0.11724946647882462, + -0.0002933871001005173, + 0.039364125579595566, + -0.08362074941396713, + 0.05478771775960922, + -0.04234299063682556, + 0.07230759412050247, + -0.048544302582740784, + -0.01755920611321926, + -0.00995259452611208, + -0.035509686917066574, + -0.00980092491954565, + 0.039687275886535645, + -0.040955644100904465, + 0.0381891131401062, + -0.012842523865401745, + 0.004032530356198549, + 0.016712332144379616, + 0.029597990214824677, + -0.034297894686460495, + 0.006014276295900345, + 0.011363453231751919, + 0.06677766889333725, + 0.04599393531680107, + -0.014803525060415268, + -0.016744986176490784, + 0.11920218914747238, + 0.030317414551973343, + 0.04242571443319321, + 0.03874458745121956, + -0.01793624646961689, + -0.036565884947776794, + -0.03301650285720825, + 0.024855205789208412, + -0.010297720320522785, + 0.04388566315174103, + -0.03274819254875183, + -0.016810191795229912, + 0.03532342612743378, + 0.06536063551902771, + -0.0817088782787323, + 0.006184013094753027, + 0.011433233506977558, + 0.06383803486824036, + -0.009013976901769638, + 0.025454776361584663, + 0.02626669965684414, + 0.011064855381846428, + -0.02197151631116867, + -0.027108222246170044, + -0.028486957773566246, + -0.06910926848649979, + -0.09564097970724106, + -0.0111482422798872, + 0.00673531973734498, + -0.04979623109102249, + -0.01774590089917183, + 0.05719239264726639, + -0.021102268248796463, + 0.03859343379735947, + -0.03388996794819832, + 0.06620153039693832, + 0.05658755823969841, + 0.04461687430739403, + 0.008244774304330349, + 0.08090010285377502, + -0.020973902195692062, + 0.027902625501155853, + -0.005069726146757603, + 0.04092751443386078, + 0.028494378551840782, + 0.04706457257270813, + 0.02406517043709755, + -0.01908239722251892, + 0.047541894018650055, + -0.10538053512573242, + -0.017673633992671967, + 0.003507752437144518, + -0.014344931580126286, + -0.08872779458761215, + 0.03517497703433037, + -0.05151273310184479, + -0.023954737931489944, + 0.023528343066573143, + 0.009684438817203045, + 0.15286873281002045, + 0.027397500351071358, + 0.06226097792387009, + -0.06906573474407196, + -0.07003753632307053, + -0.05613531917333603, + -0.08828873932361603, + -0.007893010973930359, + -0.029567312449216843, + -0.05602081120014191, + 0.08579984307289124, + 0.014959411695599556, + 0.07096278667449951, + -0.003278569784015417, + 0.022950153797864914, + 0.057388585060834885, + -0.026718785986304283, + 0.018892308697104454, + 0.0030237678438425064, + -0.038765233010053635, + 0.024887332692742348, + -0.03802492469549179, + -0.007899444550275803, + -0.05057225748896599, + -0.0390341617166996, + -0.0393683947622776, + -0.005173178855329752, + 0.09574467688798904, + 0.019188078120350838, + -0.11092545837163925, + 0.03209153190255165, + 0.058751750737428665, + 0.059988170862197876, + -0.0016372561221942306, + 0.02613435499370098, + 0.09558931738138199, + 0.012428957037627697, + -0.0026045830454677343, + -0.060734279453754425, + -0.027990173548460007, + 0.006931353360414505, + -0.01127802487462759, + -0.0020152078941464424, + 0.03164041042327881, + -0.05462252348661423, + 0.024447927251458168, + -0.09599866718053818, + 0.061225686222314835, + -0.0571819506585598, + -0.013216754421591759, + -0.013812162913382053, + -0.018582651391625404, + 0.04117383807897568, + -0.004140737000852823, + -0.011398440226912498, + 0.02741027995944023, + -0.006830500438809395, + -0.05662134289741516, + -0.04001370444893837, + 0.04929124936461449, + -0.04428812488913536, + -0.02879948727786541, + -0.025966327637434006, + 0.009408105164766312, + -0.04173823073506355, + -0.07505793869495392, + 0.021572459489107132, + -0.007669119630008936, + -0.002902193693444133, + -0.006382218562066555, + 0.05644381791353226, + 0.040468472987413406, + 0.009106801822781563, + 0.017947839573025703, + -0.04145249351859093, + -0.03256900981068611, + -0.05382244661450386, + -0.044650137424468994, + -0.06638733297586441, + 0.046384405344724655, + 0.02809322625398636, + -0.01998932659626007, + -0.04632442817091942, + -0.010976413264870644, + -0.00509654963389039, + -0.073309987783432, + -0.04585064575076103, + 0.008297815918922424, + 0.0039430540055036545, + 0.015605848282575607, + -0.07540711760520935, + 0.06524986773729324, + -0.0617227628827095, + 0.008256766013801098, + 0.09450311213731766, + -0.06782697886228561, + -0.018096381798386574, + 0.012561279349029064, + 0.03959236294031143, + 0.03463498502969742, + -0.08430229872465134, + -0.014576047658920288, + -0.02732141688466072, + 0.0023050191812217236, + 0.01132742315530777, + 0.017395304515957832, + 0.007441606372594833, + -0.0005612037493847311, + 0.05836282670497894, + 0.017117882147431374, + -0.062275663018226624, + 0.015526678413152695, + 0.05699259787797928, + 0.027221817523241043, + -0.02318861335515976, + 0.037044625729322433, + -0.03516511619091034, + 0.01816411130130291, + 0.03657243400812149, + -0.0540056936442852, + -0.041532788425683975, + 0.01776343397796154, + -0.1374245584011078, + 0.048444654792547226, + 0.001481178100220859, + -0.01506276149302721, + -0.006925682537257671, + -0.010343946516513824, + 0.027674799785017967, + -0.01607011817395687, + -0.011990036815404892, + 0.000328991562128067, + -0.03176268935203552, + -0.04833264276385307, + 0.04565209895372391, + 0.029886703938245773, + 0.02656581811606884, + 0.009315724484622478, + 0.06952857226133347, + -0.05008822679519653, + -0.039076611399650574, + -0.0869642049074173, + -0.04559170827269554, + 0.046816784888505936, + -0.042257022112607956, + -0.009282849729061127, + 0.05430670082569122, + -0.0024332876782864332, + 0.04428991675376892, + -0.03964092209935188, + 0.020234989002346992, + -0.022099189460277557, + 0.024847362190485, + -0.022718198597431183, + 0.0034596140030771494, + -0.001875469577498734, + -0.01668890006840229, + -0.026463262736797333, + -0.013704000972211361, + 0.012499495409429073, + -0.03913261368870735, + 0.019017167389392853, + 0.010459711775183678, + -0.008595886640250683, + 0.020271865651011467, + -0.021375395357608795, + 0.03144679218530655, + -0.004564618691802025, + 0.019402271136641502, + 0.01132645457983017, + 0.06189865991473198, + -0.042048193514347076, + 0.005936063826084137, + 0.04543835669755936, + -0.08055179566144943, + 0.10063067078590393, + 0.04266902431845665, + -0.048124704509973526, + -0.025517867878079414, + 0.029023073613643646, + 0.009926171973347664, + -0.014497719705104828, + 0.039107274264097214, + 0.0890098586678505, + 0.009432201273739338, + -0.010217288509011269, + -0.1440952867269516, + 0.09182045608758926, + 0.012247048318386078, + -0.037289105355739594, + 0.027401182800531387, + 0.021840354427695274, + 0.016772400587797165, + -0.05396120995283127, + -0.08320195972919464, + 0.052276089787483215, + -0.012742032296955585, + -0.01752757653594017, + -0.05801304802298546, + 0.07745608687400818, + -0.051807988435029984, + 0.04372185096144676, + -0.06284715980291367, + 0.0043107192032039165, + -0.007824349217116833, + -0.0494004525244236, + 0.016916688531637192, + 0.04830336198210716, + -0.0010573450708761811, + -0.03315906971693039, + 0.12929977476596832, + -0.08101428300142288, + -0.0027075791731476784, + -0.0722334161400795, + 0.009380863048136234, + 0.012343528680503368, + 0.02405666559934616, + 0.06400652229785919, + -0.0024543001782149076, + 0.03233429417014122, + 0.025860365480184555, + 0.04825374484062195, + 0.056571926921606064, + -0.034791190177202225, + 0.06618403643369675, + 0.05867554992437363, + 0.05182604119181633, + 0.029335688799619675, + 0.024195488542318344, + 0.001890279003418982, + -0.06057992950081825, + -0.010036561638116837, + -0.0021472577936947346, + -0.04559304937720299, + -0.011949785985052586, + -0.023587634786963463, + 0.026771588250994682, + 0.039690300822257996, + 0.12270307540893555, + -0.029393410310149193, + -0.09134140610694885, + -0.016705969348549843, + -0.04571916535496712, + 0.034329887479543686, + -0.02967034839093685, + 0.05135393515229225, + -0.011602927930653095, + -0.0018752372125163674, + 0.07674635201692581, + -0.06370355188846588, + -0.01882878504693508, + 0.039709366858005524, + 0.044876694679260254, + -0.03650888800621033, + -0.06003671512007713, + 0.010745085775852203, + -0.04883512482047081, + 0.11235933005809784, + 0.02238980308175087, + -0.020656201988458633, + -0.02710459567606449, + -0.0775383785367012, + 0.06174652278423309, + 0.011263877153396606, + 0.0485197938978672, + -0.028834793716669083, + 0.06819545477628708, + -0.045194387435913086, + -0.02543921023607254, + 0.07541649043560028, + -0.06487034261226654, + -0.06507067382335663, + 0.05682060122489929, + -0.032081909477710724, + -0.022331714630126953, + -0.026010040193796158, + 0.024498462677001953, + -0.010863200761377811, + 0.019683634862303734, + 0.022145412862300873, + -0.024490060284733772, + -0.09808242321014404, + 0.06603729724884033, + 0.0008643332403153181, + 0.053186941891908646, + 0.029886461794376373, + 0.09229453653097153, + -0.02558288723230362, + 0.0009047302883118391, + -0.02650485746562481, + 0.026190437376499176, + -0.07194231450557709, + -0.04317126423120499, + -0.02306477539241314, + 0.060700833797454834, + 0.015479233115911484, + 0.038826487958431244, + -0.004164276644587517, + -0.04245039075613022, + -0.03095369227230549, + 0.07360131293535233, + -0.03196020796895027, + 0.040354955941438675, + -0.06453597545623779, + -0.05701097846031189, + -0.02466483600437641, + -0.007983763702213764, + -0.03923703730106354, + -0.006017658859491348, + -0.05010092258453369, + 0.003703599562868476, + -0.026579122990369797, + 0.02254307270050049, + 0.052385956048965454, + -0.008452912792563438, + -0.07548537105321884, + -0.06657058000564575, + -0.016360051929950714, + -0.018614931032061577, + -0.03082110732793808, + 0.07257220149040222, + -0.001414465717971325, + 0.041274577379226685, + -0.008301679976284504, + -0.01321034412831068, + 0.015248333103954792, + -0.020154261961579323, + 0.101469025015831, + 0.01585543528199196, + 0.002645175438374281, + -0.049937617033720016, + -0.03522094711661339, + -0.007624450605362654, + 0.06031561270356178, + -0.03901735693216324, + -0.01669773831963539, + 0.09752428531646729, + 0.003536623204126954, + -0.005628792569041252, + -0.0032295831479132175, + -0.02563372440636158, + -0.06533733755350113, + 0.03446664288640022, + 0.07987730950117111, + -0.02419549785554409, + 0.08040162920951843, + 0.04983095824718475, + -0.022777540609240532, + -0.06979881227016449, + -0.004015090875327587, + 0.020165536552667618, + 0.06837652623653412, + -0.05738420411944389, + -0.04372645542025566, + 0.08846695721149445, + -0.022193668410182, + 0.0711817666888237, + 0.018215814605355263, + -0.030950257554650307, + -0.029878899455070496, + 0.044328805059194565, + 0.010670371353626251, + -0.047608181834220886, + -0.08216201514005661, + 0.02052650973200798, + -0.06995323300361633, + -0.05452963709831238, + 0.005458220839500427, + 0.03337837755680084, + 0.0025598257780075073, + -0.116226926445961, + -0.02156931906938553, + -0.05796385183930397, + -0.009794939309358597, + 0.05544780194759369, + 0.03582090884447098, + -0.014857760630548, + -0.1300913542509079, + 0.05724838748574257, + 0.1262546330690384, + 0.061897747218608856, + 0.030348174273967743, + -0.03668152540922165, + -0.0060008675791323185, + -0.051052678376436234, + -0.046703752130270004, + -0.04180048406124115, + -0.022444427013397217, + 0.054750073701143265, + 0.04374520108103752, + 0.01672930270433426, + -0.08269748091697693, + -0.005237598437815905, + -0.13462458550930023, + -0.030058937147259712, + 0.055429887026548386, + -0.0993039608001709, + -0.007333341054618359, + -0.01444720197468996, + 0.011755740270018578, + 0.009830908849835396, + 0.06294649839401245, + -0.018156779929995537, + -0.002377038123086095, + 0.022828172892332077, + -0.04380093514919281, + -0.1374298334121704, + 0.02294309064745903, + -0.10297873616218567, + 0.08140749484300613, + -0.07215467095375061, + -0.1083482950925827, + -0.02114628069102764, + 0.001371038262732327, + 0.04278431087732315, + 0.010219978168606758, + -0.01512727327644825, + 0.052158843725919724, + 0.16372422873973846, + 0.013676319271326065, + 0.05495218187570572, + 0.0007175997598096728, + -0.05663706734776497, + 0.012069991789758205, + 0.037649329751729965, + 0.01948447711765766, + -0.0512474849820137, + 0.11020005494356155, + -0.023771697655320168, + -0.0012304888805374503, + 0.020092930644750595, + -0.1146860346198082, + -0.0438794381916523, + 0.04300037398934364, + -0.03867381811141968, + -0.019312717020511627, + -0.024950552731752396, + -0.002534549916163087, + -0.05829746276140213, + 0.008972163312137127, + -0.012780758552253246, + 0.016386160627007484, + -0.05619106441736221, + -0.018208717927336693, + 0.012152047827839851, + -0.07076022773981094, + -0.01682194694876671, + -0.10017739981412888, + -0.005465097259730101, + -0.02382689341902733, + -0.03370961546897888, + 0.017112525179982185, + 0.03918546810746193, + 0.07431663572788239, + 0.015576801262795925, + 0.03063770942389965, + -0.004469059407711029, + -0.014501787722110748, + -0.05347658693790436, + 0.09268268197774887, + -0.00994704756885767, + 0.02416958659887314, + -0.042959343641996384, + 0.0054460130631923676, + 0.021496713161468506, + 0.03000027686357498, + 0.005273900460451841, + 0.026996662840247154, + 0.02276689000427723, + -0.0014472146285697818, + -0.060917966067790985, + 0.027655525133013725, + 0.061502259224653244, + -0.11952031403779984, + 0.030011385679244995, + -0.05687326937913895, + 0.060966480523347855, + 0.06150035932660103, + 0.061746325343847275, + 0.0011644040932878852, + -0.0001445966772735119, + -0.05848454684019089, + 0.05940479040145874, + -0.014085628092288971, + 0.05619577690958977, + 0.03799273446202278, + -0.07565603405237198, + -0.04841205105185509, + 0.031207634136080742, + -0.04953097924590111, + -0.056904587894678116, + 0.033963192254304886, + 0.0389089360833168, + -0.07990080118179321, + 0.03592197224497795, + -0.04781241714954376, + 0.027791690081357956, + 0.05541560426354408, + -0.06685712933540344, + 0.03614518418908119, + -0.01009571272879839, + -0.0020356131717562675, + 0.005716889165341854, + 0.048633426427841187, + 0.029368242248892784, + -0.09492899477481842, + -0.04998498037457466, + 0.011321512050926685, + -0.08635962754487991, + 0.04048946872353554, + -0.09824447333812714, + 0.03232910856604576, + 0.026718610897660255, + -0.02435564249753952, + 0.010990184731781483, + -0.02275647222995758, + -0.05113140493631363, + 0.04541943222284317, + 0.04781690984964371, + -0.012362008914351463, + 0.059204503893852234, + 0.012072917073965073, + 0.04243623837828636, + 0.04804222658276558, + -0.04864563047885895, + -0.008150506764650345, + -0.02444041147828102, + 0.045178886502981186, + 0.04454648867249489, + 0.03072039783000946, + -0.07096579670906067, + 0.05970869958400726, + -0.028193918988108635, + -0.020626066252589226, + 0.024492233991622925, + 0.008633643388748169, + -0.025644412264227867, + 0.06317812204360962, + -0.00013752281665802002, + 0.038114745169878006, + -0.020713621750473976, + -0.020945874974131584, + -0.03710843622684479, + -0.07926821708679199, + 0.068260557949543, + 0.07304906100034714, + 0.0012549443636089563, + 0.06902801245450974 + ], + "index": 1, + "object": "embedding" + }, + { + "embedding": [ + -0.012515432201325893, + 0.03260233998298645, + 0.02720189094543457, + -0.03063809871673584, + 0.03477800264954567, + -0.0005420063971541822, + 0.03848633915185928, + -0.07008987665176392, + -0.005540861748158932, + -0.12454225867986679, + -0.03335544839501381, + -0.01859859749674797, + 0.016931841149926186, + -0.0417923778295517, + 0.02759881317615509, + -0.05975465476512909, + -0.014693298377096653, + 0.004260290879756212, + 0.0316493920981884, + 0.04292448237538338, + -0.015032760798931122, + -0.012787492014467716, + 0.0445796437561512, + -0.00853970367461443, + 0.008431212045252323, + 0.014480143785476685, + 0.004353893455117941, + -0.022154586389660835, + 0.055982958525419235, + -0.002053084783256054, + -0.029908252879977226, + 0.03852834925055504, + 0.015174348838627338, + 0.005734920967370272, + -0.07095876336097717, + 0.056373488157987595, + 0.021792849525809288, + 0.01672499068081379, + 0.04869721084833145, + 0.11365382373332977, + 0.05500693991780281, + 0.05714111775159836, + -0.057067856192588806, + -0.015970412641763687, + 0.04116453230381012, + 0.10372499376535416, + -0.014045807532966137, + -0.023079970851540565, + 0.05282428488135338, + 0.07795163244009018, + 0.002015302889049053, + 0.0719466581940651, + 0.11998643726110458, + 0.03806350380182266, + 0.009247318841516972, + -0.08772578090429306, + -0.01913667656481266, + 0.08762997388839722, + 0.04261832311749458, + -0.041809290647506714, + 0.019670585170388222, + 0.003269221168011427, + -0.031362734735012054, + -0.05653807520866394, + 0.0086217587813735, + 0.07690869271755219, + -0.008498962968587875, + 0.01883823610842228, + 0.034656062722206116, + 0.012021624483168125, + 0.04522744566202164, + -0.11988889425992966, + 0.05314110592007637, + 0.021781332790851593, + 0.0069904024712741375, + 0.022117121145129204, + -0.045297060161828995, + 0.030793005600571632, + -0.036237362772226334, + 0.00751606747508049, + -0.05219532176852226, + 0.031398966908454895, + 0.017320938408374786, + -0.05713142082095146, + -0.02045215107500553, + -0.10069804638624191, + 0.0858391746878624, + 0.009377778507769108, + -0.022318389266729355, + -0.03138192370533943, + 0.050704389810562134, + 0.06078115105628967, + -0.01579766720533371, + 0.015833856537938118, + 0.004209970589727163, + -0.08698860555887222, + -0.05849804729223251, + 0.07033050805330276, + -0.04091642424464226, + -0.06414582580327988, + -0.07127337902784348, + -0.04292427748441696, + 0.07248425483703613, + 0.017845110967755318, + 0.02412467449903488, + 0.06425701826810837, + 0.02847393788397312, + 0.07783179730176926, + 0.05828293412923813, + 0.014767034910619259, + -0.01587904617190361, + 0.019848834723234177, + -0.01861366629600525, + -0.057433173060417175, + -0.015352700836956501, + 0.06340795010328293, + -0.10458502918481827, + -0.0013390789972618222, + -0.0007215099176391959, + 0.026150047779083252, + -0.02329542487859726, + 0.06535427272319794, + 0.0006045400514267385, + -0.019903065636754036, + -0.014266586862504482, + 0.046450741589069366, + -0.025217456743121147, + -0.03382576256990433, + -0.04488691687583923, + -0.024416420608758926, + -0.08216138184070587, + 0.030968768522143364, + 0.033012744039297104, + 0.017675388604402542, + 0.09381162375211716, + -0.09850151836872101, + 0.004139481578022242, + 0.03229626268148422, + -0.06893876940011978, + 0.05431831628084183, + -0.053904321044683456, + 0.0735350176692009, + -0.053244028240442276, + -0.023420289158821106, + -0.002636925783008337, + -0.03822736814618111, + -0.00785704143345356, + 0.003931798040866852, + -0.03736377879977226, + 0.008813220076262951, + -0.030051087960600853, + 0.01478652935475111, + 0.013907031156122684, + 0.03155709058046341, + -0.03207581117749214, + 0.001005080179311335, + 0.039515431970357895, + 0.05144026502966881, + 0.03285501152276993, + 0.025997433811426163, + -0.022351136431097984, + 0.08124064654111862, + -0.00038137283991090953, + 0.03365359455347061, + 0.029545608907938004, + -0.02969249337911606, + -0.05561249703168869, + -0.028099672868847847, + 0.01337841060012579, + 0.006064951419830322, + 0.03557957336306572, + -0.040300022810697556, + 0.006043149158358574, + 0.037366122007369995, + 0.057810332626104355, + -0.0819191262125969, + -0.000972002453636378, + 0.004794939886778593, + 0.03518398106098175, + -0.01995996944606304, + 0.042792342603206635, + 0.009072910062968731, + 0.023623615503311157, + -0.030623145401477814, + -0.024775559082627296, + -0.030295735225081444, + -0.057979218661785126, + -0.08435564488172531, + -0.022110700607299805, + -0.0043212613090872765, + -0.04147777333855629, + -0.026760468259453773, + 0.03731884807348251, + -0.009823962114751339, + 0.03550677374005318, + -0.011399107053875923, + 0.06699027121067047, + 0.07271561771631241, + 0.042543623596429825, + -0.010588261298835278, + 0.07651684433221817, + -0.014598710462450981, + 0.03448832780122757, + -0.002902877749875188, + 0.04212474077939987, + 0.0471639409661293, + 0.04418337717652321, + 0.0016587156569585204, + -0.017351144924759865, + 0.05114859342575073, + -0.0682496652007103, + -0.02260199747979641, + 0.00673691974952817, + -0.0077768792398273945, + -0.06297172605991364, + 0.040459513664245605, + -0.05914584547281265, + -0.04049861431121826, + 0.0461801141500473, + 0.012582770548760891, + 0.14274302124977112, + 0.04847661405801773, + 0.08519135415554047, + -0.057096946984529495, + -0.08793361485004425, + -0.03734228014945984, + -0.09761207550764084, + -0.001482452149502933, + -0.030877260491251945, + -0.041506871581077576, + 0.0691782683134079, + 0.012989937327802181, + 0.08646338433027267, + 0.01953308656811714, + 0.023443715646862984, + 0.057724956423044205, + -0.007654010783880949, + 0.03466172516345978, + 0.0006843915907666087, + -0.04486618936061859, + 0.024276461452245712, + -0.021629629656672478, + -0.022282570600509644, + -0.035966772586107254, + -0.005518535152077675, + -0.026481663808226585, + -0.013767787255346775, + 0.06516901403665543, + 0.01969030871987343, + -0.13317345082759857, + 0.019300242885947227, + 0.019933084025979042, + 0.06287774443626404, + 0.013750261627137661, + 0.03447985649108887, + 0.07810985296964645, + 0.018358970060944557, + 0.012795176357030869, + -0.06612854450941086, + -0.058563198894262314, + 0.016424410045146942, + -0.02067185379564762, + -0.015918921679258347, + 0.025390373542904854, + -0.028407646343111992, + 0.03124193102121353, + -0.10122860223054886, + 0.04197580739855766, + -0.08963284641504288, + 0.026146190240979195, + -0.01856786198914051, + -0.010458329692482948, + 0.031608697026968, + -0.021787671372294426, + -0.028194308280944824, + 0.02720602974295616, + -0.008009547367691994, + -0.06270723789930344, + -0.03005572222173214, + 0.0553298182785511, + -0.046275507658720016, + -0.025675464421510696, + -0.007803676649928093, + -0.00633775070309639, + -0.04232168197631836, + -0.08986468613147736, + 0.04186020791530609, + -0.006163034588098526, + -0.014706314541399479, + -0.002399338409304619, + 0.054564133286476135, + 0.02417084388434887, + 0.028201937675476074, + 0.0034926559310406446, + -0.04690483585000038, + -0.026523549109697342, + -0.05147939175367355, + -0.05148949474096298, + -0.05623650923371315, + 0.036759570240974426, + 0.00020510796457529068, + -0.014181791804730892, + -0.049038566648960114, + -0.02344380132853985, + -0.0317348949611187, + -0.0425717867910862, + -0.05112219601869583, + 0.01621064729988575, + 0.02486266754567623, + -0.00010788533836603165, + -0.04794544354081154, + 0.052890051156282425, + -0.045355793088674545, + 0.0008289514225907624, + 0.07432115077972412, + -0.06217609718441963, + -0.03727240115404129, + 0.01275230385363102, + 0.0683804526925087, + 0.02098444290459156, + -0.07274900376796722, + 0.0001914510503411293, + -0.00959416851401329, + -0.0031833224929869175, + 0.025968821719288826, + 0.003827204927802086, + 0.030850160866975784, + -0.004250509198755026, + 0.04129109904170036, + 0.024965768679976463, + -0.02617574669420719, + 0.002525634365156293, + 0.03409614413976669, + 0.027047012001276016, + -0.04093309864401817, + 0.06229269877076149, + -0.02466038428246975, + 0.01959075592458248, + 0.011115537956357002, + -0.03819743171334267, + -0.04244459792971611, + 0.02954724431037903, + -0.1223335936665535, + 0.0425892136991024, + 0.0009347691084258258, + 0.014465676620602608, + -0.004433237947523594, + -0.0181916281580925, + 0.01647932454943657, + -0.04831191897392273, + -0.041808366775512695, + -0.011575737036764622, + -0.029532505199313164, + -0.04887956380844116, + 0.039505910128355026, + 0.05488383024930954, + 0.014826108701527119, + -0.0035568978637456894, + 0.04775412380695343, + -0.03506261110305786, + -0.041741132736206055, + -0.08753718435764313, + -0.05189897119998932, + 0.016402943059802055, + -0.017528891563415527, + -0.014408205635845661, + 0.04142659157514572, + -0.03414402902126312, + 0.030394863337278366, + -0.05494023486971855, + -0.0020147650502622128, + -0.015078254044055939, + 0.014495639130473137, + -0.048556774854660034, + -0.0017153157386928797, + -0.019573288038372993, + -0.016060980036854744, + -0.03694693371653557, + -0.01534409262239933, + 0.018440935760736465, + -0.05878711864352226, + 0.025446785613894463, + -0.013849408365786076, + -0.02725357934832573, + 0.003758995793759823, + -0.03052379935979843, + 0.023064110428094864, + 0.003202371532097459, + 0.012115336023271084, + 0.017133090645074844, + 0.05075334012508392, + -0.007249451708048582, + 0.012151451781392097, + 0.03456561639904976, + -0.06746973097324371, + 0.07573828101158142, + 0.01949349232017994, + -0.07276243716478348, + -0.015839863568544388, + 0.018274053931236267, + 0.003989342134445906, + -0.03206317499279976, + 0.010148841887712479, + 0.06937778741121292, + 0.013019630685448647, + -0.012600183486938477, + -0.13619281351566315, + 0.0681464821100235, + 0.004287313669919968, + -0.05014709755778313, + -0.010993806645274162, + 0.011272232048213482, + 0.0038220612332224846, + -0.0731922909617424, + -0.08350039273500443, + 0.04869406670331955, + -0.030828624963760376, + -0.003825632855296135, + -0.048009078949689865, + 0.07904882729053497, + -0.0480419360101223, + 0.014385851100087166, + -0.035874683409929276, + -0.009149832651019096, + 0.0022898276802152395, + -0.04600370675325394, + 0.016496647149324417, + 0.04642873629927635, + -0.005550712812691927, + -0.015640679746866226, + 0.10773736983537674, + -0.10888604819774628, + -0.004197744186967611, + -0.04975472763180733, + 0.018129728734493256, + 0.016478830948472023, + 0.007430907338857651, + 0.041030142456293106, + 0.0028355473186820745, + 0.01874443329870701, + 0.022451285272836685, + 0.05587637424468994, + 0.0629202276468277, + -0.038079120218753815, + 0.08001914620399475, + 0.050176240503787994, + 0.029776310548186302, + 0.03715231642127037, + 0.027659498155117035, + 0.004129384644329548, + -0.04897352680563927, + -0.0036505744792521, + -0.012148413807153702, + -0.0634574294090271, + -0.00014068372547626495, + -0.015438939444720745, + 0.0234787967056036, + 0.023546701297163963, + 0.11989669501781464, + -0.02286195009946823, + -0.09922581166028976, + 0.010974395088851452, + -0.015065480023622513, + 0.04465459659695625, + -0.019842462614178658, + 0.0668787956237793, + 1.804158091545105e-05, + 0.007084874901920557, + 0.06900306046009064, + -0.07443176954984665, + -0.016705479472875595, + 0.027354076504707336, + 0.011424290016293526, + -0.053201232105493546, + -0.05392533168196678, + 0.005875579547137022, + -0.06356683373451233, + 0.11036472767591476, + 0.006547355558723211, + -0.008861691690981388, + -0.03610360249876976, + -0.0851614773273468, + 0.05843200162053108, + 0.008612367324531078, + 0.05748013034462929, + -0.032950904220342636, + 0.08398287743330002, + -0.023840034380555153, + -0.010651693679392338, + 0.04326775297522545, + -0.06472321599721909, + -0.05850466713309288, + 0.07644739747047424, + -0.029800835996866226, + -0.017040502279996872, + -0.02012176625430584, + 0.0241094958037138, + -0.004349792841821909, + 0.01589028351008892, + 0.026318684220314026, + -0.017132360488176346, + -0.0760699138045311, + 0.06471116840839386, + 0.0036099611315876245, + 0.057122085243463516, + 0.02487128973007202, + 0.09268424659967422, + -0.03311850503087044, + 0.00805120263248682, + -0.01722189038991928, + 0.027575809508562088, + -0.07266110181808472, + -0.020801866427063942, + -0.002835495164617896, + 0.054792169481515884, + -0.00043203120003454387, + 0.05070323869585991, + -0.03546581789851189, + -0.03175608441233635, + -0.02117747813463211, + 0.05899014696478844, + -0.04069221392273903, + 0.012186076492071152, + -0.0477367602288723, + -0.042937543243169785, + -0.011687318794429302, + 0.007221126928925514, + -0.06172960624098778, + 0.011092118918895721, + -0.04225287586450577, + 0.00943679641932249, + -0.0035681461449712515, + 0.02226758562028408, + 0.04908335208892822, + 0.0050078872591257095, + -0.08368325978517532, + -0.06465264409780502, + 0.019280916079878807, + -0.02791602537035942, + -0.016978342086076736, + 0.05448430776596069, + -0.018466975539922714, + 0.027838630601763725, + 0.006129787303507328, + -0.00636322982609272, + 0.012559954077005386, + -0.01729779876768589, + 0.08228688687086105, + 0.018394023180007935, + 0.014464118517935276, + -0.053292542695999146, + -0.01751112751662731, + -0.009948067367076874, + 0.05636981874704361, + -0.023487884551286697, + -0.009742247872054577, + 0.07505694776773453, + -0.005170504096895456, + -0.003190675051882863, + -0.00279915239661932, + 0.0005545867024920881, + -0.053126152604818344, + 0.037578996270895004, + 0.0763295441865921, + -0.014111213386058807, + 0.06626037508249283, + 0.03896726295351982, + -0.006059445906430483, + -0.0651235282421112, + 0.01087851170450449, + 0.03649519383907318, + 0.04939142242074013, + -0.055007562041282654, + -0.022154496982693672, + 0.0862228125333786, + -0.025579020380973816, + 0.09164395183324814, + 0.03109506517648697, + -0.05226036161184311, + -0.013268224895000458, + 0.04804699867963791, + 4.490138962864876e-05, + -0.0385504774749279, + -0.08635174483060837, + 0.013357405550777912, + -0.06919165700674057, + -0.04143214225769043, + 0.016120348125696182, + 0.019461655989289284, + 0.008062552660703659, + -0.10073893517255783, + -0.023437203839421272, + -0.05571995675563812, + -0.0134874964132905, + 0.04823806881904602, + 0.03130027651786804, + -0.025198806077241898, + -0.09797971695661545, + 0.03771478682756424, + 0.10405509173870087, + 0.03516940772533417, + 0.01420576125383377, + -0.024177469313144684, + -0.01987389661371708, + -0.030255047604441643, + -0.02431170642375946, + -0.0625421479344368, + 0.008973737247288227, + 0.05231521278619766, + 0.0426374226808548, + 0.0066823940724134445, + -0.09096067398786545, + -0.01626681350171566, + -0.11594285815954208, + -0.0359799899160862, + 0.029743840917944908, + -0.10215539485216141, + -0.03258639574050903, + 0.0018218549666926265, + 0.03432832658290863, + 0.01830124296247959, + 0.047193076461553574, + -0.025630492717027664, + -0.000209759920835495, + 0.04906989261507988, + -0.04863372817635536, + -0.13231651484966278, + 0.02664823830127716, + -0.08732496201992035, + 0.047821857035160065, + -0.06816985458135605, + -0.07838636636734009, + -0.04244186356663704, + -0.005295990966260433, + 0.05835377424955368, + 0.000430088461143896, + -0.015599140897393227, + 0.03446502611041069, + 0.16954639554023743, + -0.0026430650614202023, + 0.018939455971121788, + 0.002524139592424035, + -0.05941304564476013, + -0.00018306449055671692, + 0.040990184992551804, + 0.0026893923059105873, + -0.04742790013551712, + 0.061212047934532166, + -0.008863217197358608, + 0.0034324615262448788, + 0.01018920261412859, + -0.1257857233285904, + -0.033470820635557175, + 0.06259030848741531, + -0.032041486352682114, + -0.013030152767896652, + -0.015315528959035873, + -0.0262373685836792, + -0.06656482815742493, + -0.006664900109171867, + -0.005345784593373537, + 0.02795189805328846, + -0.06794386357069016, + -0.007617181167006493, + 0.018953045830130577, + -0.04215746372938156, + -0.020535781979560852, + -0.0974135473370552, + 0.021170664578676224, + -0.03232649341225624, + -0.02226462960243225, + 0.0033799775410443544, + 0.03139590099453926, + 0.07702428847551346, + 0.020632006227970123, + 0.04135206341743469, + -0.005838264711201191, + -0.04882073029875755, + -0.0546310618519783, + 0.08807472884654999, + -0.02597636543214321, + 0.02731456607580185, + -0.07378196716308594, + 0.0023201811127364635, + 0.015087456442415714, + 0.03850467503070831, + 6.568059325218201e-05, + 0.028357921168208122, + 0.008075999096035957, + 0.01279203500598669, + -0.07228657603263855, + 0.02025614306330681, + 0.042001038789749146, + -0.10098549723625183, + 0.01813703402876854, + -0.05564628541469574, + 0.04947810247540474, + 0.06144997105002403, + 0.06511534005403519, + 0.028459731489419937, + -0.0202501080930233, + -0.054074160754680634, + 0.035052791237831116, + -0.02881743386387825, + 0.05614350363612175, + 0.0564420223236084, + -0.06703104823827744, + -0.05826301500201225, + 0.045137058943510056, + -0.050847675651311874, + -0.024736888706684113, + 0.014058568514883518, + 0.05113906040787697, + -0.06775201112031937, + 0.034619346261024475, + -0.049128640443086624, + 0.024221250787377357, + 0.04866266995668411, + -0.06085849925875664, + 0.0019210544414818287, + 0.012623196467757225, + 0.012382696382701397, + 0.028603874146938324, + 0.03873681649565697, + 0.007176251616328955, + -0.080104760825634, + -0.06235386058688164, + 0.025732800364494324, + -0.06737439334392548, + 0.04096699506044388, + -0.079249806702137, + 0.016131388023495674, + 0.010090269148349762, + -0.034486234188079834, + 0.0038874847814440727, + -0.05507781729102135, + -0.07303879410028458, + 0.04909278079867363, + 0.046375684440135956, + 0.0017833691090345383, + 0.029175374656915665, + 0.02261977642774582, + 0.034264303743839264, + 0.04648405686020851, + -0.038263995200395584, + -0.008774058893322945, + -0.0252663753926754, + 0.036237649619579315, + 0.03748451545834541, + 0.0358039066195488, + -0.04108024761080742, + 0.07002699375152588, + -0.028500907123088837, + -0.02754187397658825, + 0.029117228463292122, + 0.02439846843481064, + 0.0012119816383346915, + 0.06623277813196182, + 0.0010657437378540635, + 0.05972994118928909, + -0.027077756822109222, + 0.009675722569227219, + -0.048254966735839844, + -0.05424213036894798, + 0.07243489474058151, + 0.08056811988353729, + -0.031383778899908066, + 0.05910726264119148 + ], + "index": 2, + "object": "embedding" + } + ], + "model": "togethercomputer/m2-bert-80M-32k-retrieval", + "object": "list", + "usage": null + } + }, + "is_streaming": false + } +} diff --git a/tests/integration/recordings/responses/e8b427b3d631.json b/tests/integration/recordings/responses/e8b427b3d631.json new file mode 100644 index 000000000..89a16720e --- /dev/null +++ b/tests/integration/recordings/responses/e8b427b3d631.json @@ -0,0 +1,802 @@ +{ + "request": { + "method": "POST", + "url": "https://api.together.xyz/v1/v1/embeddings", + "headers": {}, + "body": { + "model": "togethercomputer/m2-bert-80M-32k-retrieval", + "input": [ + "How do systems learn without explicit programming?" + ] + }, + "endpoint": "/v1/embeddings", + "model": "togethercomputer/m2-bert-80M-32k-retrieval" + }, + "response": { + "body": { + "__type__": "openai.types.create_embedding_response.CreateEmbeddingResponse", + "__data__": { + "data": [ + { + "embedding": [ + -0.028625313192605972, + 0.009644811041653156, + 0.0526261106133461, + -0.010888906195759773, + -0.009496178478002548, + 0.001263381214812398, + 0.023293282836675644, + -0.08243905007839203, + -0.026478247717022896, + -0.13464388251304626, + -0.0512986034154892, + 0.026655403897166252, + 0.0030439384281635284, + -0.035521239042282104, + 0.020391393452882767, + -0.07780768722295761, + 0.006606558337807655, + 0.008830295875668526, + -0.001793196308426559, + 0.022731754928827286, + 0.049890514463186264, + 0.013548094779253006, + 0.012267746031284332, + 0.03063983842730522, + 0.06707301735877991, + -0.007570159155875444, + 0.04272060468792915, + 0.002707085572183132, + 0.07793699949979782, + -0.0068320054560899734, + 0.004189986269921064, + 0.02070143073797226, + 0.015760784968733788, + 0.0042287008836865425, + -0.03386549651622772, + 0.02033020369708538, + 0.01456975657492876, + 0.048187460750341415, + 0.03820285201072693, + 0.10077767074108124, + 0.04321419447660446, + 0.01897420734167099, + -0.014983413740992546, + -0.018025003373622894, + 0.04455850273370743, + 0.022786501795053482, + -0.011920962482690811, + -0.008890517055988312, + 0.11744298040866852, + 0.03246714919805527, + -0.029088173061609268, + 0.09496089071035385, + 0.12422505766153336, + 0.0069929324090480804, + 0.0178871750831604, + -0.05463777855038643, + 0.03657285496592522, + 0.04830474033951759, + 0.06253045797348022, + -0.05359767749905586, + 0.025412533432245255, + 0.01953939162194729, + 0.021154027432203293, + -0.02993696928024292, + 0.028013402596116066, + 0.07734477519989014, + -0.016874393448233604, + 0.030011700466275215, + 6.0238875448703766e-05, + 0.023803716525435448, + 0.009123258292675018, + -0.07111874222755432, + 0.02250090055167675, + 0.04815131053328514, + -0.008147301152348518, + -0.005537823773920536, + -0.016138499602675438, + 0.035387761890888214, + -0.0352698490023613, + -0.025574462488293648, + -0.010039239190518856, + 0.03524880111217499, + 0.04696853831410408, + -0.04174993932247162, + -0.000597537902649492, + -0.08016331493854523, + 0.10956454277038574, + -0.016568735241889954, + -0.016319751739501953, + -0.017709530889987946, + 0.041958339512348175, + 0.04584357887506485, + 0.03287360444664955, + 0.018359653651714325, + 0.04788267984986305, + -0.12737058103084564, + 0.007353549357503653, + -0.00445661460980773, + -0.041159022599458694, + -0.04949790611863136, + -0.06846798211336136, + -0.018516182899475098, + 0.058480989187955856, + 0.009973258711397648, + 0.0295123178511858, + 0.06923972070217133, + 0.081133633852005, + 0.1264415681362152, + 0.06378389894962311, + -0.02661179006099701, + -0.03658208250999451, + -0.000912379240617156, + 0.030871083959937096, + -0.05931675806641579, + -0.023184625431895256, + 0.039929017424583435, + -0.09083712100982666, + -0.0017611589282751083, + -0.011387099511921406, + -0.00693067442625761, + -0.02676786482334137, + 0.03417220711708069, + -0.02904115431010723, + -0.029341822490096092, + -0.030477264896035194, + 0.08719369769096375, + -0.04031936824321747, + -0.02029283717274666, + -0.02824019454419613, + -0.051644641906023026, + -0.07474397867918015, + -0.0038978576194494963, + -0.008521780371665955, + 0.057304758578538895, + 0.12079010158777237, + -0.08006061613559723, + -0.00023946911096572876, + 0.012549451552331448, + -0.018327832221984863, + 0.02607034333050251, + -0.026688536629080772, + 0.06374310702085495, + -0.03221059590578079, + -0.0324493870139122, + 0.03480648994445801, + -0.07498053461313248, + 0.011165045201778412, + -0.006876140367239714, + -0.020638445392251015, + -0.020414652302861214, + -0.04233550652861595, + 0.08592729270458221, + 0.02854750119149685, + -0.004440763499587774, + -0.017464132979512215, + 0.06481487303972244, + 0.0724131390452385, + -0.02446877211332321, + 0.04632553830742836, + 0.03923669457435608, + -0.010415825992822647, + 0.012624293565750122, + -0.015182485803961754, + -0.0016301083378493786, + 0.0013908827677369118, + -0.0366278700530529, + -0.06706399470567703, + -0.0017571141943335533, + 0.0017132752109318972, + 0.023335183039307594, + 0.02417340688407421, + -0.039039384573698044, + 0.007053125184029341, + 0.007630909793078899, + 0.04440589249134064, + -0.037289854139089584, + 0.01810174249112606, + 0.005866652820259333, + 0.008196947164833546, + -0.0303290244191885, + 0.05941026285290718, + 0.042503952980041504, + 0.012326585128903389, + -0.034453555941581726, + 0.006171736866235733, + -0.018924523144960403, + -0.0459442138671875, + -0.11310747265815735, + -0.03640446811914444, + -0.013007266446948051, + 0.03633805736899376, + -0.0325576551258564, + 0.0018916280241683125, + -0.011488232761621475, + 0.017741020768880844, + -0.007206412963569164, + 0.10348206758499146, + 0.10330463945865631, + 0.06081323325634003, + -0.06818842887878418, + 0.06551844626665115, + -0.04395010694861412, + 0.06050333008170128, + 0.021237587556242943, + 0.06765849143266678, + 0.020056981593370438, + 0.027479903772473335, + -0.010500827804207802, + -0.05388624593615532, + 0.05339483544230461, + -0.0213683620095253, + -0.020162755623459816, + 0.021549290046095848, + -0.005261938087642193, + -0.02159097045660019, + 0.04545314237475395, + 0.005680753383785486, + -0.03225092962384224, + 0.024309150874614716, + 0.030616233125329018, + 0.07422983646392822, + 0.026326946914196014, + 0.11893181502819061, + -0.032128795981407166, + -0.08504871279001236, + 0.002689552726224065, + -0.05723441764712334, + -0.007339973468333483, + 0.030395880341529846, + -0.03447697311639786, + 0.041313640773296356, + -0.012177404016256332, + 0.15924645960330963, + 0.007271280977874994, + 0.111238494515419, + 0.03315158933401108, + 0.029128430411219597, + 0.06465847790241241, + 0.005114587023854256, + -0.048711519688367844, + 0.08425623178482056, + 0.011614371091127396, + 0.03426260128617287, + -0.02214323729276657, + -0.005649253260344267, + -0.04427102580666542, + -0.025260724127292633, + 0.09123050421476364, + 0.055081237107515335, + -0.12634575366973877, + 0.03898511081933975, + -0.009349959902465343, + 0.10305799543857574, + 0.007667106110602617, + -0.0027667051181197166, + 0.08985280245542526, + 0.01930035464465618, + -0.0392981581389904, + -0.08319897949695587, + -0.08484388142824173, + 0.007134219631552696, + 0.0065269810147583485, + -0.05087956413626671, + 0.012833445332944393, + -0.002945164917036891, + 0.05391121283173561, + -0.06924069672822952, + 0.03136086091399193, + -0.10177676379680634, + 0.03596206381917, + -0.02389192022383213, + 0.05924130603671074, + 0.057269271463155746, + -0.010541991330683231, + -0.0406109020113945, + 0.0182547178119421, + -0.032190173864364624, + -0.04907294735312462, + -0.022161107510328293, + 0.0739339217543602, + -0.029147034510970116, + 0.0037474066484719515, + -0.03018752671778202, + -0.023249927908182144, + -0.015383096411824226, + -0.09470201283693314, + 0.0773773118853569, + -0.027345556765794754, + -0.0055006989277899265, + 0.0180343110114336, + 0.005922022741287947, + -0.019098954275250435, + -0.0004729041538666934, + 0.0007953455788083375, + -0.0033485391177237034, + -0.06081382557749748, + -0.010261679999530315, + -0.046479422599077225, + 0.02741287462413311, + 0.0127688804641366, + -0.008467267267405987, + -0.05143937095999718, + -0.03136477991938591, + -0.0019047032110393047, + -0.052847668528556824, + -0.02513357810676098, + -0.08015158772468567, + 0.039745401591062546, + 0.04605329409241676, + 0.0016742408042773604, + -0.05091538652777672, + 0.0445074662566185, + -0.03700404241681099, + -0.010182363912463188, + 0.08301099389791489, + -0.03250614181160927, + -0.03088577836751938, + -0.014350837096571922, + -0.009772134944796562, + -0.07475752383470535, + -0.060355402529239655, + 0.04241859167814255, + -0.012378721497952938, + 0.015629982575774193, + 0.033994343131780624, + -0.009667688049376011, + 0.04006745293736458, + -0.013781498186290264, + 0.021493006497621536, + 0.01062044221907854, + -0.03500600531697273, + 0.01835126429796219, + 0.014531598426401615, + 0.044000912457704544, + -0.02036239020526409, + 0.04688846692442894, + -0.0877162292599678, + 0.011904492974281311, + 0.03603767976164818, + -0.040766313672065735, + 0.020568832755088806, + 0.03657219186425209, + -0.08737213909626007, + 0.03322440758347511, + 0.02375749684870243, + 0.03609689697623253, + -0.019078781828284264, + 0.024186642840504646, + -0.007216745521873236, + -0.04318151995539665, + -0.028063487261533737, + 0.019065067172050476, + 0.02101775072515011, + -0.05957315117120743, + -0.014263416640460491, + 0.03555794805288315, + 0.0019766625482589006, + 0.04911893233656883, + 0.04590733349323273, + -0.03957784175872803, + -0.030610496178269386, + -0.04111376404762268, + -0.02033582329750061, + 0.006346330512315035, + 0.053494278341531754, + 0.014476560987532139, + 0.04860546439886093, + -0.023068532347679138, + 0.021707303822040558, + -0.04493881016969681, + -0.027079777792096138, + 0.04397837817668915, + 0.0118066081777215, + -0.004798768553882837, + 0.042905017733573914, + 0.005226527340710163, + -0.03075316548347473, + -0.030176855623722076, + 0.013604848645627499, + -0.0032692099921405315, + -0.04218987375497818, + 0.025406524538993835, + -0.016121670603752136, + -0.014863152988255024, + -0.0429101325571537, + -0.026481537148356438, + -0.012901737354695797, + 0.0442282110452652, + 0.036592260003089905, + 0.039383288472890854, + 0.003789229318499565, + 0.05980289354920387, + -0.0044682323932647705, + 0.07192400097846985, + -0.026064269244670868, + 0.11905914545059204, + 0.046934809535741806, + -0.06404329091310501, + -0.06687674671411514, + 0.0077804806642234325, + 0.011265481822192669, + -0.017687633633613586, + -0.014395356178283691, + 0.08574871718883514, + 0.0031307553872466087, + 0.021320363506674767, + -0.08204923570156097, + 0.009053068235516548, + 0.023229874670505524, + -0.052366625517606735, + -0.01396441925317049, + -0.03636457398533821, + -0.020884208381175995, + -0.02954680472612381, + -0.06550683081150055, + 0.08037273585796356, + -0.06033521890640259, + 0.01978268101811409, + -0.032372940331697464, + 0.022555716335773468, + -0.05029283091425896, + -0.016428381204605103, + 0.0025750305503606796, + -0.04512976109981537, + -0.03814585879445076, + -0.04166992008686066, + -0.011879000812768936, + 0.049479953944683075, + -0.02096664160490036, + -0.00909265223890543, + 0.06755069643259048, + -0.0926649197936058, + -0.002196504035964608, + -0.018177812919020653, + -0.005087037570774555, + 0.0161594171077013, + -0.01627577282488346, + 0.09823250025510788, + 0.025837138295173645, + -0.01585749164223671, + 0.02263566479086876, + 0.01224441546946764, + 0.024671562016010284, + -0.033585235476493835, + 0.1028127670288086, + 0.04315044358372688, + 0.020170297473669052, + -0.007471140008419752, + 0.049660082906484604, + 0.007516088895499706, + -0.010756206698715687, + -0.002503633964806795, + -0.033192023634910583, + -0.07095880061388016, + 0.019720053300261497, + 0.022650761529803276, + -0.005902944598346949, + -0.007311234250664711, + 0.10586094111204147, + 0.018423765897750854, + -0.06882017105817795, + -0.005236598197370768, + 0.02164839580655098, + 0.09039415419101715, + -0.01244199089705944, + 0.0474860854446888, + -0.0025995743926614523, + 0.02571304515004158, + 0.04335891455411911, + -0.06636872887611389, + 0.03492670878767967, + 0.02623179368674755, + -0.051421213895082474, + -0.06957545876502991, + -0.035445429384708405, + -0.0009482369641773403, + -0.02960582636296749, + 0.13412357866764069, + 0.019430331885814667, + 0.024845613166689873, + -0.04852084815502167, + -0.056044016033411026, + 0.062490787357091904, + 0.04769270494580269, + 0.03782081604003906, + -0.022404221817851067, + 0.11534290015697479, + -0.005633706226944923, + 0.0005008987500332296, + 0.025920547544956207, + -0.01304088905453682, + -0.05654619261622429, + 0.0008111510542221367, + -0.04102508723735809, + -0.01159842498600483, + -0.04102790355682373, + -0.018860163167119026, + -0.01706078089773655, + -0.005253573879599571, + 0.0071600270457565784, + -0.0641237124800682, + 0.01663907617330551, + 0.06719237565994263, + -0.027118725702166557, + 0.05404188111424446, + 0.06418643891811371, + 0.046228472143411636, + 0.00460213515907526, + -0.04415186867117882, + -0.000821807247120887, + -0.01879318617284298, + -0.06903015822172165, + 0.02069322019815445, + 0.01168833114206791, + 0.06540673226118088, + -0.004066139459609985, + 0.054738085716962814, + -0.034385669976472855, + 0.04338647425174713, + -0.04916132614016533, + 0.03518104925751686, + -0.02761712856590748, + -0.009327040985226631, + -0.007298008538782597, + 0.01527714729309082, + -0.02005157433450222, + 0.0429161936044693, + -0.03560428321361542, + 0.021534021943807602, + -0.08968672156333923, + 0.02676641382277012, + -0.004024573136121035, + -0.0036590290255844593, + 0.10452567040920258, + -0.060867004096508026, + -0.12179668247699738, + -0.03129281476140022, + 0.005221501924097538, + -0.0313928984105587, + -0.019577259197831154, + 0.042463574558496475, + -0.0006677712081000209, + 0.009064980782568455, + 0.003938136622309685, + 0.06904369592666626, + -0.008350541815161705, + 0.001019842573441565, + -0.016418535262346268, + 0.019143449142575264, + 0.021327154710888863, + -0.04326558858156204, + -0.0032139429822564125, + 0.051620472222566605, + 0.0051500024273991585, + 0.006842610891908407, + 0.017715459689497948, + 0.03285397216677666, + -0.029920704662799835, + -0.04683506861329079, + -0.05269252881407738, + 0.04261148348450661, + -0.021699104458093643, + 0.009875484742224216, + 0.038206521421670914, + 0.023899832740426064, + 0.04733270779252052, + 0.025072474032640457, + -0.011955616995692253, + -0.0911836326122284, + -0.027430472895503044, + 0.03977897763252258, + -0.04646480828523636, + 0.009046212770044804, + 0.016102170571684837, + 0.08183404058218002, + -0.03012625128030777, + 0.13459521532058716, + 0.024172481149435043, + -0.06742963194847107, + -0.01054252777248621, + -0.002808552235364914, + -0.01470745075494051, + 0.020792432129383087, + -0.10967203229665756, + 0.0326918289065361, + -0.013522210530936718, + -0.012200890108942986, + 0.019441930577158928, + -0.007326868362724781, + 0.01742427609860897, + -0.00791930966079235, + -0.015951860696077347, + -0.07966145873069763, + -0.02597867138683796, + 0.028643600642681122, + -0.0009648172999732196, + -0.018818242475390434, + -0.06351518630981445, + -0.0025841889437288046, + 0.06423984467983246, + 0.03219998627901077, + 0.023542635142803192, + 0.03236274793744087, + -0.04657657444477081, + 0.0035329016391187906, + -0.03991316258907318, + -0.08277847617864609, + 0.026228271424770355, + 0.06054516136646271, + -0.031066352501511574, + 0.016718082129955292, + -0.05617064610123634, + -0.05071862041950226, + -0.05031099542975426, + -0.038091082125902176, + 0.03737860545516014, + -0.03760669007897377, + -0.02294175513088703, + 0.004769078455865383, + 0.036339402198791504, + 0.01194134633988142, + 0.05540051311254501, + -0.0023583073634654284, + -0.0004474227025639266, + 0.03956727683544159, + -0.026903294026851654, + -0.14041468501091003, + 0.023754306137561798, + -0.06810899823904037, + 0.034333907067775726, + -0.07242204248905182, + -0.06669372320175171, + -0.004059847444295883, + -0.05053563788533211, + 0.04531155154109001, + 0.0096511822193861, + -0.02245948649942875, + 0.03169103339314461, + 0.13549870252609253, + -0.012408362701535225, + -0.02813619002699852, + 0.007518284022808075, + -0.1057506576180458, + 0.011356416158378124, + 0.039891116321086884, + 0.020536471158266068, + -0.04081280156970024, + 0.0358579196035862, + 0.047813210636377335, + 0.00611690990626812, + -0.03651907667517662, + -0.09735521674156189, + -0.037454377859830856, + 0.06075636297464371, + -0.017364319413900375, + 0.01145813800394535, + -0.0012936473358422518, + -0.040848348289728165, + -0.054882243275642395, + -0.004391546826809645, + 0.02311932109296322, + -0.059448402374982834, + -0.08560369908809662, + 0.024578850716352463, + -0.018858933821320534, + -0.04784354940056801, + 0.01785934343934059, + -0.1501590758562088, + 0.0545523464679718, + -0.028424229472875595, + -0.04118866100907326, + 0.03065965510904789, + 0.020051728934049606, + 0.02137753553688526, + 0.04693467542529106, + 0.09217966347932816, + -0.003789104986935854, + -0.03935939818620682, + -0.015190028585493565, + 0.02737855538725853, + -0.0399165078997612, + 0.02010611817240715, + -0.07557865232229233, + 0.07543471455574036, + -0.007976854220032692, + 0.042613375931978226, + -0.0014642559690400958, + 0.05411304160952568, + 0.03604671359062195, + -0.016428142786026, + -0.06250452250242233, + -0.015860218554735184, + 0.006275616120547056, + -0.07317031919956207, + -0.0053979321382939816, + -0.013590694405138493, + -0.036944758147001266, + 0.026295272633433342, + 0.07390531897544861, + 0.00654491176828742, + 0.06338920444250107, + -0.07365646958351135, + 0.02546025440096855, + -0.0912703424692154, + 0.03761362284421921, + 0.054920073598623276, + -0.07621566951274872, + -0.04062889888882637, + 0.041005026549100876, + -0.03953169658780098, + 0.009674740023911, + 0.01588456705212593, + 0.016106106340885162, + -0.014508946798741817, + -0.02321682870388031, + -0.031492218375205994, + -0.007039207033813, + 0.0502975694835186, + -0.07446885854005814, + -0.021667229011654854, + -0.016179269179701805, + 0.007176062557846308, + 0.028238704428076744, + -0.012822098098695278, + 0.011626574210822582, + -0.07122310250997543, + -0.059748850762844086, + 0.00676912534981966, + -0.061197683215141296, + 0.03426061198115349, + -0.007777668070048094, + 0.05285013094544411, + -0.010367357172071934, + -0.04381755739450455, + -0.04318838566541672, + -0.04743385314941406, + -0.07497932761907578, + 0.052410174161195755, + 0.003218524158000946, + -0.0017081985715776682, + -0.005368508864194155, + 0.04883018881082535, + 0.05742465704679489, + 0.051667261868715286, + 0.016194365918636322, + -0.028298640623688698, + -0.0371987409889698, + 0.07627178728580475, + 0.02160925231873989, + 0.028924649581313133, + -0.0026495244819670916, + 0.13363255560398102, + 0.0059050279669463634, + -0.03723873198032379, + 0.03029952198266983, + 0.03271273523569107, + -0.001898010727018118, + 0.059062160551548004, + -0.00840494129806757, + 0.04586789384484291, + -0.031058136373758316, + 0.042859043926000595, + -0.05417613312602043, + -0.056918635964393616, + 0.03155701607465744, + 0.1333579570055008, + -0.05978989601135254, + 0.053831737488508224 + ], + "index": 0, + "object": "embedding" + } + ], + "model": "togethercomputer/m2-bert-80M-32k-retrieval", + "object": "list", + "usage": null + } + }, + "is_streaming": false + } +} diff --git a/tests/integration/recordings/responses/ef4d211b38bf.json b/tests/integration/recordings/responses/ef4d211b38bf.json new file mode 100644 index 000000000..b47f714b1 --- /dev/null +++ b/tests/integration/recordings/responses/ef4d211b38bf.json @@ -0,0 +1,59 @@ +{ + "request": { + "method": "POST", + "url": "https://api.together.xyz/v1/v1/chat/completions", + "headers": {}, + "body": { + "model": "meta-llama/Llama-3.3-70B-Instruct-Turbo-Free", + "messages": [ + { + "role": "user", + "content": "Say hello" + } + ], + "max_tokens": 20 + }, + "endpoint": "/v1/chat/completions", + "model": "meta-llama/Llama-3.3-70B-Instruct-Turbo-Free" + }, + "response": { + "body": { + "__type__": "openai.types.chat.chat_completion.ChatCompletion", + "__data__": { + "id": "oCfwSxL-4Yz4kd-984c278f1f0b4d19", + "choices": [ + { + "finish_reason": "length", + "index": 0, + "logprobs": null, + "message": { + "content": "Hello! It's nice to meet you. Is there something I can help you with or would you", + "refusal": null, + "role": "assistant", + "annotations": null, + "audio": null, + "function_call": null, + "tool_calls": [] + }, + "seed": 11825451844891908000 + } + ], + "created": 1758820431, + "model": "meta-llama/Llama-3.3-70B-Instruct-Turbo-Free", + "object": "chat.completion", + "service_tier": null, + "system_fingerprint": null, + "usage": { + "completion_tokens": 20, + "prompt_tokens": 37, + "total_tokens": 57, + "completion_tokens_details": null, + "prompt_tokens_details": null, + "cached_tokens": 0 + }, + "prompt": [] + } + }, + "is_streaming": false + } +} diff --git a/tests/integration/recordings/responses/f4c5ae637cd1.json b/tests/integration/recordings/responses/f4c5ae637cd1.json new file mode 100644 index 000000000..cd47130c8 --- /dev/null +++ b/tests/integration/recordings/responses/f4c5ae637cd1.json @@ -0,0 +1,59 @@ +{ + "request": { + "method": "POST", + "url": "https://api.together.xyz/v1/v1/chat/completions", + "headers": {}, + "body": { + "model": "meta-llama/Llama-3.3-70B-Instruct-Turbo-Free", + "messages": [ + { + "role": "user", + "content": "Hello" + } + ], + "max_tokens": 10 + }, + "endpoint": "/v1/chat/completions", + "model": "meta-llama/Llama-3.3-70B-Instruct-Turbo-Free" + }, + "response": { + "body": { + "__type__": "openai.types.chat.chat_completion.ChatCompletion", + "__data__": { + "id": "oCfwJnF-4Yz4kd-984c26e45a790f88", + "choices": [ + { + "finish_reason": "stop", + "index": 0, + "logprobs": null, + "message": { + "content": "Hello. How can I assist you today?", + "refusal": null, + "role": "assistant", + "annotations": null, + "audio": null, + "function_call": null, + "tool_calls": [] + }, + "seed": 6760981245874068000 + } + ], + "created": 1758820404, + "model": "meta-llama/Llama-3.3-70B-Instruct-Turbo-Free", + "object": "chat.completion", + "service_tier": null, + "system_fingerprint": null, + "usage": { + "completion_tokens": 10, + "prompt_tokens": 36, + "total_tokens": 46, + "completion_tokens_details": null, + "prompt_tokens_details": null, + "cached_tokens": 0 + }, + "prompt": [] + } + }, + "is_streaming": false + } +} From c88c4ff2c63536350ca9f714bf804f7fc69995c0 Mon Sep 17 00:00:00 2001 From: Charlie Doern Date: Fri, 26 Sep 2025 10:18:07 -0400 Subject: [PATCH 150/150] feat: introduce API leveling, post_training, eval to v1alpha (#3449) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit # What does this PR do? Rather than have a single `LLAMA_STACK_VERSION`, we need to have a `_V1`, `_V1ALPHA`, and `_V1BETA` constant. This also necessitated addition of `level` to the `WebMethod` so that routing can be handeled properly. For backwards compat, the `v1` routes are being kept around and marked as `deprecated`. When used, the server will log a deprecation warning. Deprecation log: Screenshot 2025-09-25 at 2 43 36 PM move: 1. post_training to `v1alpha` as it is under heavy development and not near its final state 2. eval: job scheduling is not implemented. Relies heavily on the datasetio API which is under development missing implementations of specific routes indicating the structure of those routes might change. Additionally eval depends on the `inference` API which is going to be deprecated, eval will likely need a major API surface change to conform to using completions properly implements leveling in #3317 note: integration tests will fail until the SDK is regenerated with v1alpha/inference as opposed to v1/inference ## Test Plan existing tests should pass with newly generated schema. Conformance will also pass as these routes are not the ones we currently test for stability Signed-off-by: Charlie Doern --- docs/openapi_generator/generate.py | 6 +- docs/openapi_generator/pyopenapi/generator.py | 2 +- .../openapi_generator/pyopenapi/operations.py | 233 ++++--- docs/static/llama-stack-spec.html | 653 ++++++++++++++++++ docs/static/llama-stack-spec.yaml | 458 ++++++++++++ llama_stack/apis/agents/agents.py | 40 +- .../apis/batch_inference/batch_inference.py | 5 +- llama_stack/apis/batches/batches.py | 9 +- llama_stack/apis/benchmarks/benchmarks.py | 13 +- llama_stack/apis/datasetio/datasetio.py | 5 +- llama_stack/apis/datasets/datasets.py | 9 +- llama_stack/apis/eval/eval.py | 32 +- llama_stack/apis/files/files.py | 11 +- llama_stack/apis/inference/inference.py | 23 +- llama_stack/apis/inspect/inspect.py | 7 +- llama_stack/apis/models/models.py | 11 +- .../apis/post_training/post_training.py | 19 +- llama_stack/apis/prompts/prompts.py | 15 +- llama_stack/apis/providers/providers.py | 5 +- llama_stack/apis/safety/safety.py | 5 +- llama_stack/apis/scoring/scoring.py | 5 +- .../scoring_functions/scoring_functions.py | 9 +- llama_stack/apis/shields/shields.py | 9 +- .../synthetic_data_generation.py | 3 +- llama_stack/apis/telemetry/telemetry.py | 29 +- llama_stack/apis/tools/rag_tool.py | 5 +- llama_stack/apis/tools/tools.py | 17 +- llama_stack/apis/vector_dbs/vector_dbs.py | 9 +- llama_stack/apis/vector_io/vector_io.py | 39 +- llama_stack/apis/version.py | 4 +- llama_stack/core/client.py | 20 +- llama_stack/core/server/routes.py | 30 +- llama_stack/core/server/tracing.py | 8 + llama_stack/schema_utils.py | 16 +- .../src/llama_stack_api_weather/weather.py | 3 +- 35 files changed, 1507 insertions(+), 260 deletions(-) diff --git a/docs/openapi_generator/generate.py b/docs/openapi_generator/generate.py index c27bc6440..54031d839 100644 --- a/docs/openapi_generator/generate.py +++ b/docs/openapi_generator/generate.py @@ -16,7 +16,7 @@ import sys import fire import ruamel.yaml as yaml -from llama_stack.apis.version import LLAMA_STACK_API_VERSION # noqa: E402 +from llama_stack.apis.version import LLAMA_STACK_API_V1 # noqa: E402 from llama_stack.core.stack import LlamaStack # noqa: E402 from .pyopenapi.options import Options # noqa: E402 @@ -25,7 +25,7 @@ from .pyopenapi.utility import Specification, validate_api # noqa: E402 def str_presenter(dumper, data): - if data.startswith(f"/{LLAMA_STACK_API_VERSION}") or data.startswith( + if data.startswith(f"/{LLAMA_STACK_API_V1}") or data.startswith( "#/components/schemas/" ): style = None @@ -58,7 +58,7 @@ def main(output_dir: str): server=Server(url="http://any-hosted-llama-stack.com"), info=Info( title="Llama Stack Specification", - version=LLAMA_STACK_API_VERSION, + version=LLAMA_STACK_API_V1, description="""This is the specification of the Llama Stack that provides a set of endpoints and their corresponding interfaces that are tailored to best leverage Llama Models.""", diff --git a/docs/openapi_generator/pyopenapi/generator.py b/docs/openapi_generator/pyopenapi/generator.py index 5ac712f02..cdbf1c60c 100644 --- a/docs/openapi_generator/pyopenapi/generator.py +++ b/docs/openapi_generator/pyopenapi/generator.py @@ -829,7 +829,7 @@ class Generator: else: raise NotImplementedError(f"unknown HTTP method: {op.http_method}") - route = op.get_route() + route = op.get_route(op.webmethod) route = route.replace(":path", "") print(f"route: {route}") if route in paths: diff --git a/docs/openapi_generator/pyopenapi/operations.py b/docs/openapi_generator/pyopenapi/operations.py index 045e33848..ce33d3bb9 100644 --- a/docs/openapi_generator/pyopenapi/operations.py +++ b/docs/openapi_generator/pyopenapi/operations.py @@ -11,7 +11,7 @@ import typing from dataclasses import dataclass from typing import Any, Callable, Dict, Iterable, Iterator, List, Optional, Tuple, Union -from llama_stack.apis.version import LLAMA_STACK_API_VERSION +from llama_stack.apis.version import LLAMA_STACK_API_V1, LLAMA_STACK_API_V1BETA, LLAMA_STACK_API_V1ALPHA from termcolor import colored @@ -113,11 +113,13 @@ class EndpointOperation: request_examples: Optional[List[Any]] = None response_examples: Optional[List[Any]] = None - def get_route(self) -> str: - if self.route is not None: - return "/".join(["", LLAMA_STACK_API_VERSION, self.route.lstrip("/")]) + def get_route(self, webmethod) -> str: + api_level = webmethod.level - route_parts = ["", LLAMA_STACK_API_VERSION, self.name] + if self.route is not None: + return "/".join(["", api_level, self.route.lstrip("/")]) + + route_parts = ["", api_level, self.name] for param_name, _ in self.path_params: route_parts.append("{" + param_name + "}") return "/".join(route_parts) @@ -152,33 +154,39 @@ def _get_endpoint_functions( functions = inspect.getmembers(endpoint, inspect.isfunction) for func_name, func_ref in functions: - webmethod = getattr(func_ref, "__webmethod__", None) - if not webmethod: + webmethods = [] + + # Check for multiple webmethods (stacked decorators) + if hasattr(func_ref, "__webmethods__"): + webmethods = func_ref.__webmethods__ + + if not webmethods: continue - print(f"Processing {colored(func_name, 'white')}...") - operation_name = func_name - - if webmethod.method == "GET": - prefix = "get" - elif webmethod.method == "DELETE": - prefix = "delete" - elif webmethod.method == "POST": - prefix = "post" - elif operation_name.startswith("get_") or operation_name.endswith("/get"): - prefix = "get" - elif ( - operation_name.startswith("delete_") - or operation_name.startswith("remove_") - or operation_name.endswith("/delete") - or operation_name.endswith("/remove") - ): - prefix = "delete" - else: - # by default everything else is a POST - prefix = "post" + for webmethod in webmethods: + print(f"Processing {colored(func_name, 'white')}...") + operation_name = func_name + + if webmethod.method == "GET": + prefix = "get" + elif webmethod.method == "DELETE": + prefix = "delete" + elif webmethod.method == "POST": + prefix = "post" + elif operation_name.startswith("get_") or operation_name.endswith("/get"): + prefix = "get" + elif ( + operation_name.startswith("delete_") + or operation_name.startswith("remove_") + or operation_name.endswith("/delete") + or operation_name.endswith("/remove") + ): + prefix = "delete" + else: + # by default everything else is a POST + prefix = "post" - yield prefix, operation_name, func_name, func_ref + yield prefix, operation_name, func_name, func_ref def _get_defining_class(member_fn: str, derived_cls: type) -> type: @@ -239,105 +247,101 @@ def get_endpoint_operations( "update", ], ): - # extract routing information from function metadata - webmethod = getattr(func_ref, "__webmethod__", None) - if webmethod is not None: + # Get all webmethods for this function + webmethods = getattr(func_ref, "__webmethods__", []) + + # Create one EndpointOperation for each webmethod + for webmethod in webmethods: route = webmethod.route route_params = _get_route_parameters(route) if route is not None else None public = webmethod.public request_examples = webmethod.request_examples response_examples = webmethod.response_examples - else: - route = None - route_params = None - public = False - request_examples = None - response_examples = None - # inspect function signature for path and query parameters, and request/response payload type - signature = get_signature(func_ref) + # inspect function signature for path and query parameters, and request/response payload type + signature = get_signature(func_ref) - path_params = [] - query_params = [] - request_params = [] - multipart_params = [] + path_params = [] + query_params = [] + request_params = [] + multipart_params = [] - for param_name, parameter in signature.parameters.items(): - param_type = _get_annotation_type(parameter.annotation, func_ref) + for param_name, parameter in signature.parameters.items(): + param_type = _get_annotation_type(parameter.annotation, func_ref) - # omit "self" for instance methods - if param_name == "self" and param_type is inspect.Parameter.empty: - continue + # omit "self" for instance methods + if param_name == "self" and param_type is inspect.Parameter.empty: + continue - # check if all parameters have explicit type - if parameter.annotation is inspect.Parameter.empty: + # check if all parameters have explicit type + if parameter.annotation is inspect.Parameter.empty: + raise ValidationError( + f"parameter '{param_name}' in function '{func_name}' has no type annotation" + ) + + is_multipart = _is_multipart_param(param_type) + + if prefix in ["get", "delete"]: + if route_params is not None and param_name in route_params: + path_params.append((param_name, param_type)) + else: + query_params.append((param_name, param_type)) + else: + if route_params is not None and param_name in route_params: + path_params.append((param_name, param_type)) + elif is_multipart: + multipart_params.append((param_name, param_type)) + else: + request_params.append((param_name, param_type)) + + # check if function has explicit return type + if signature.return_annotation is inspect.Signature.empty: raise ValidationError( - f"parameter '{param_name}' in function '{func_name}' has no type annotation" + f"function '{func_name}' has no return type annotation" ) - is_multipart = _is_multipart_param(param_type) - - if prefix in ["get", "delete"]: - if route_params is not None and param_name in route_params: - path_params.append((param_name, param_type)) - else: - query_params.append((param_name, param_type)) + return_type = _get_annotation_type(signature.return_annotation, func_ref) + + # operations that produce events are labeled as Generator[YieldType, SendType, ReturnType] + # where YieldType is the event type, SendType is None, and ReturnType is the immediate response type to the request + if typing.get_origin(return_type) is collections.abc.Generator: + event_type, send_type, response_type = typing.get_args(return_type) + if send_type is not type(None): + raise ValidationError( + f"function '{func_name}' has a return type Generator[Y,S,R] and therefore looks like an event but has an explicit send type" + ) else: - if route_params is not None and param_name in route_params: - path_params.append((param_name, param_type)) - elif is_multipart: - multipart_params.append((param_name, param_type)) + event_type = None + + def process_type(t): + if typing.get_origin(t) is collections.abc.AsyncIterator: + # NOTE(ashwin): this is SSE and there is no way to represent it. either we make it a List + # or the item type. I am choosing it to be the latter + args = typing.get_args(t) + return args[0] + elif typing.get_origin(t) is typing.Union: + types = [process_type(a) for a in typing.get_args(t)] + return typing._UnionGenericAlias(typing.Union, tuple(types)) + else: + return t + + response_type = process_type(return_type) + + if prefix in ["delete", "remove"]: + http_method = HTTPMethod.DELETE + elif prefix == "post": + http_method = HTTPMethod.POST + elif prefix == "get": + http_method = HTTPMethod.GET + elif prefix == "set": + http_method = HTTPMethod.PUT + elif prefix == "update": + http_method = HTTPMethod.PATCH else: - request_params.append((param_name, param_type)) + raise ValidationError(f"unknown prefix {prefix}") - # check if function has explicit return type - if signature.return_annotation is inspect.Signature.empty: - raise ValidationError( - f"function '{func_name}' has no return type annotation" - ) - - return_type = _get_annotation_type(signature.return_annotation, func_ref) - - # operations that produce events are labeled as Generator[YieldType, SendType, ReturnType] - # where YieldType is the event type, SendType is None, and ReturnType is the immediate response type to the request - if typing.get_origin(return_type) is collections.abc.Generator: - event_type, send_type, response_type = typing.get_args(return_type) - if send_type is not type(None): - raise ValidationError( - f"function '{func_name}' has a return type Generator[Y,S,R] and therefore looks like an event but has an explicit send type" - ) - else: - event_type = None - - def process_type(t): - if typing.get_origin(t) is collections.abc.AsyncIterator: - # NOTE(ashwin): this is SSE and there is no way to represent it. either we make it a List - # or the item type. I am choosing it to be the latter - args = typing.get_args(t) - return args[0] - elif typing.get_origin(t) is typing.Union: - types = [process_type(a) for a in typing.get_args(t)] - return typing._UnionGenericAlias(typing.Union, tuple(types)) - else: - return t - - response_type = process_type(return_type) - - if prefix in ["delete", "remove"]: - http_method = HTTPMethod.DELETE - elif prefix == "post": - http_method = HTTPMethod.POST - elif prefix == "get": - http_method = HTTPMethod.GET - elif prefix == "set": - http_method = HTTPMethod.PUT - elif prefix == "update": - http_method = HTTPMethod.PATCH - else: - raise ValidationError(f"unknown prefix {prefix}") - - result.append( - EndpointOperation( + # Create an EndpointOperation for this specific webmethod + operation = EndpointOperation( defining_class=_get_defining_class(func_name, endpoint), name=operation_name, func_name=func_name, @@ -354,7 +358,10 @@ def get_endpoint_operations( request_examples=request_examples if use_examples else None, response_examples=response_examples if use_examples else None, ) - ) + + # Store the specific webmethod with this operation + operation.webmethod = webmethod + result.append(operation) if not result: raise ValidationError(f"no eligible endpoint operations in type {endpoint}") diff --git a/docs/static/llama-stack-spec.html b/docs/static/llama-stack-spec.html index 36cb025c4..5a61221c1 100644 --- a/docs/static/llama-stack-spec.html +++ b/docs/static/llama-stack-spec.html @@ -175,6 +175,43 @@ } } }, + "/v1alpha/post-training/job/cancel": { + "post": { + "responses": { + "200": { + "description": "OK" + }, + "400": { + "$ref": "#/components/responses/BadRequest400" + }, + "429": { + "$ref": "#/components/responses/TooManyRequests429" + }, + "500": { + "$ref": "#/components/responses/InternalServerError500" + }, + "default": { + "$ref": "#/components/responses/DefaultError" + } + }, + "tags": [ + "PostTraining (Coming Soon)" + ], + "summary": "Cancel a training job.", + "description": "Cancel a training job.", + "parameters": [], + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/CancelTrainingJobRequest" + } + } + }, + "required": true + } + } + }, "/v1/post-training/job/cancel": { "post": { "responses": { @@ -1179,6 +1216,60 @@ } } }, + "/v1alpha/eval/benchmarks/{benchmark_id}/evaluations": { + "post": { + "responses": { + "200": { + "description": "EvaluateResponse object containing generations and scores.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/EvaluateResponse" + } + } + } + }, + "400": { + "$ref": "#/components/responses/BadRequest400" + }, + "429": { + "$ref": "#/components/responses/TooManyRequests429" + }, + "500": { + "$ref": "#/components/responses/InternalServerError500" + }, + "default": { + "$ref": "#/components/responses/DefaultError" + } + }, + "tags": [ + "Eval" + ], + "summary": "Evaluate a list of rows on a benchmark.", + "description": "Evaluate a list of rows on a benchmark.", + "parameters": [ + { + "name": "benchmark_id", + "in": "path", + "description": "The ID of the benchmark to run the evaluation on.", + "required": true, + "schema": { + "type": "string" + } + } + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/EvaluateRowsRequest" + } + } + }, + "required": true + } + } + }, "/v1/eval/benchmarks/{benchmark_id}/evaluations": { "post": { "responses": { @@ -1366,6 +1457,85 @@ ] } }, + "/v1alpha/eval/benchmarks/{benchmark_id}": { + "get": { + "responses": { + "200": { + "description": "A Benchmark.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Benchmark" + } + } + } + }, + "400": { + "$ref": "#/components/responses/BadRequest400" + }, + "429": { + "$ref": "#/components/responses/TooManyRequests429" + }, + "500": { + "$ref": "#/components/responses/InternalServerError500" + }, + "default": { + "$ref": "#/components/responses/DefaultError" + } + }, + "tags": [ + "Benchmarks" + ], + "summary": "Get a benchmark by its ID.", + "description": "Get a benchmark by its ID.", + "parameters": [ + { + "name": "benchmark_id", + "in": "path", + "description": "The ID of the benchmark to get.", + "required": true, + "schema": { + "type": "string" + } + } + ] + }, + "delete": { + "responses": { + "200": { + "description": "OK" + }, + "400": { + "$ref": "#/components/responses/BadRequest400" + }, + "429": { + "$ref": "#/components/responses/TooManyRequests429" + }, + "500": { + "$ref": "#/components/responses/InternalServerError500" + }, + "default": { + "$ref": "#/components/responses/DefaultError" + } + }, + "tags": [ + "Benchmarks" + ], + "summary": "Unregister a benchmark.", + "description": "Unregister a benchmark.", + "parameters": [ + { + "name": "benchmark_id", + "in": "path", + "description": "The ID of the benchmark to unregister.", + "required": true, + "schema": { + "type": "string" + } + } + ] + } + }, "/v1/eval/benchmarks/{benchmark_id}": { "get": { "responses": { @@ -2079,6 +2249,50 @@ ] } }, + "/v1alpha/post-training/job/artifacts": { + "get": { + "responses": { + "200": { + "description": "A PostTrainingJobArtifactsResponse.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/PostTrainingJobArtifactsResponse" + } + } + } + }, + "400": { + "$ref": "#/components/responses/BadRequest400" + }, + "429": { + "$ref": "#/components/responses/TooManyRequests429" + }, + "500": { + "$ref": "#/components/responses/InternalServerError500" + }, + "default": { + "$ref": "#/components/responses/DefaultError" + } + }, + "tags": [ + "PostTraining (Coming Soon)" + ], + "summary": "Get the artifacts of a training job.", + "description": "Get the artifacts of a training job.", + "parameters": [ + { + "name": "job_uuid", + "in": "query", + "description": "The UUID of the job to get the artifacts of.", + "required": true, + "schema": { + "type": "string" + } + } + ] + } + }, "/v1/post-training/job/artifacts": { "get": { "responses": { @@ -2123,6 +2337,50 @@ ] } }, + "/v1alpha/post-training/job/status": { + "get": { + "responses": { + "200": { + "description": "A PostTrainingJobStatusResponse.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/PostTrainingJobStatusResponse" + } + } + } + }, + "400": { + "$ref": "#/components/responses/BadRequest400" + }, + "429": { + "$ref": "#/components/responses/TooManyRequests429" + }, + "500": { + "$ref": "#/components/responses/InternalServerError500" + }, + "default": { + "$ref": "#/components/responses/DefaultError" + } + }, + "tags": [ + "PostTraining (Coming Soon)" + ], + "summary": "Get the status of a training job.", + "description": "Get the status of a training job.", + "parameters": [ + { + "name": "job_uuid", + "in": "query", + "description": "The UUID of the job to get the status of.", + "required": true, + "schema": { + "type": "string" + } + } + ] + } + }, "/v1/post-training/job/status": { "get": { "responses": { @@ -2167,6 +2425,40 @@ ] } }, + "/v1alpha/post-training/jobs": { + "get": { + "responses": { + "200": { + "description": "A ListPostTrainingJobsResponse.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ListPostTrainingJobsResponse" + } + } + } + }, + "400": { + "$ref": "#/components/responses/BadRequest400" + }, + "429": { + "$ref": "#/components/responses/TooManyRequests429" + }, + "500": { + "$ref": "#/components/responses/InternalServerError500" + }, + "default": { + "$ref": "#/components/responses/DefaultError" + } + }, + "tags": [ + "PostTraining (Coming Soon)" + ], + "summary": "Get all training jobs.", + "description": "Get all training jobs.", + "parameters": [] + } + }, "/v1/post-training/jobs": { "get": { "responses": { @@ -2538,6 +2830,103 @@ ] } }, + "/v1alpha/eval/benchmarks/{benchmark_id}/jobs/{job_id}": { + "get": { + "responses": { + "200": { + "description": "The status of the evaluation job.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Job" + } + } + } + }, + "400": { + "$ref": "#/components/responses/BadRequest400" + }, + "429": { + "$ref": "#/components/responses/TooManyRequests429" + }, + "500": { + "$ref": "#/components/responses/InternalServerError500" + }, + "default": { + "$ref": "#/components/responses/DefaultError" + } + }, + "tags": [ + "Eval" + ], + "summary": "Get the status of a job.", + "description": "Get the status of a job.", + "parameters": [ + { + "name": "benchmark_id", + "in": "path", + "description": "The ID of the benchmark to run the evaluation on.", + "required": true, + "schema": { + "type": "string" + } + }, + { + "name": "job_id", + "in": "path", + "description": "The ID of the job to get the status of.", + "required": true, + "schema": { + "type": "string" + } + } + ] + }, + "delete": { + "responses": { + "200": { + "description": "OK" + }, + "400": { + "$ref": "#/components/responses/BadRequest400" + }, + "429": { + "$ref": "#/components/responses/TooManyRequests429" + }, + "500": { + "$ref": "#/components/responses/InternalServerError500" + }, + "default": { + "$ref": "#/components/responses/DefaultError" + } + }, + "tags": [ + "Eval" + ], + "summary": "Cancel a job.", + "description": "Cancel a job.", + "parameters": [ + { + "name": "benchmark_id", + "in": "path", + "description": "The ID of the benchmark to run the evaluation on.", + "required": true, + "schema": { + "type": "string" + } + }, + { + "name": "job_id", + "in": "path", + "description": "The ID of the job to cancel.", + "required": true, + "schema": { + "type": "string" + } + } + ] + } + }, "/v1/eval/benchmarks/{benchmark_id}/jobs/{job_id}": { "get": { "responses": { @@ -2635,6 +3024,59 @@ ] } }, + "/v1alpha/eval/benchmarks/{benchmark_id}/jobs/{job_id}/result": { + "get": { + "responses": { + "200": { + "description": "The result of the job.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/EvaluateResponse" + } + } + } + }, + "400": { + "$ref": "#/components/responses/BadRequest400" + }, + "429": { + "$ref": "#/components/responses/TooManyRequests429" + }, + "500": { + "$ref": "#/components/responses/InternalServerError500" + }, + "default": { + "$ref": "#/components/responses/DefaultError" + } + }, + "tags": [ + "Eval" + ], + "summary": "Get the result of a job.", + "description": "Get the result of a job.", + "parameters": [ + { + "name": "benchmark_id", + "in": "path", + "description": "The ID of the benchmark to run the evaluation on.", + "required": true, + "schema": { + "type": "string" + } + }, + { + "name": "job_id", + "in": "path", + "description": "The ID of the job to get the result of.", + "required": true, + "schema": { + "type": "string" + } + } + ] + } + }, "/v1/eval/benchmarks/{benchmark_id}/jobs/{job_id}/result": { "get": { "responses": { @@ -2750,6 +3192,75 @@ ] } }, + "/v1alpha/eval/benchmarks": { + "get": { + "responses": { + "200": { + "description": "A ListBenchmarksResponse.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ListBenchmarksResponse" + } + } + } + }, + "400": { + "$ref": "#/components/responses/BadRequest400" + }, + "429": { + "$ref": "#/components/responses/TooManyRequests429" + }, + "500": { + "$ref": "#/components/responses/InternalServerError500" + }, + "default": { + "$ref": "#/components/responses/DefaultError" + } + }, + "tags": [ + "Benchmarks" + ], + "summary": "List all benchmarks.", + "description": "List all benchmarks.", + "parameters": [] + }, + "post": { + "responses": { + "200": { + "description": "OK" + }, + "400": { + "$ref": "#/components/responses/BadRequest400" + }, + "429": { + "$ref": "#/components/responses/TooManyRequests429" + }, + "500": { + "$ref": "#/components/responses/InternalServerError500" + }, + "default": { + "$ref": "#/components/responses/DefaultError" + } + }, + "tags": [ + "Benchmarks" + ], + "summary": "Register a benchmark.", + "description": "Register a benchmark.", + "parameters": [], + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/RegisterBenchmarkRequest" + } + } + }, + "required": true + } + } + }, "/v1/eval/benchmarks": { "get": { "responses": { @@ -4783,6 +5294,50 @@ } } }, + "/v1alpha/post-training/preference-optimize": { + "post": { + "responses": { + "200": { + "description": "A PostTrainingJob.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/PostTrainingJob" + } + } + } + }, + "400": { + "$ref": "#/components/responses/BadRequest400" + }, + "429": { + "$ref": "#/components/responses/TooManyRequests429" + }, + "500": { + "$ref": "#/components/responses/InternalServerError500" + }, + "default": { + "$ref": "#/components/responses/DefaultError" + } + }, + "tags": [ + "PostTraining (Coming Soon)" + ], + "summary": "Run preference optimization of a model.", + "description": "Run preference optimization of a model.", + "parameters": [], + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/PreferenceOptimizeRequest" + } + } + }, + "required": true + } + } + }, "/v1/post-training/preference-optimize": { "post": { "responses": { @@ -5178,6 +5733,60 @@ } } }, + "/v1alpha/eval/benchmarks/{benchmark_id}/jobs": { + "post": { + "responses": { + "200": { + "description": "The job that was created to run the evaluation.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Job" + } + } + } + }, + "400": { + "$ref": "#/components/responses/BadRequest400" + }, + "429": { + "$ref": "#/components/responses/TooManyRequests429" + }, + "500": { + "$ref": "#/components/responses/InternalServerError500" + }, + "default": { + "$ref": "#/components/responses/DefaultError" + } + }, + "tags": [ + "Eval" + ], + "summary": "Run an evaluation on a benchmark.", + "description": "Run an evaluation on a benchmark.", + "parameters": [ + { + "name": "benchmark_id", + "in": "path", + "description": "The ID of the benchmark to run the evaluation on.", + "required": true, + "schema": { + "type": "string" + } + } + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/RunEvalRequest" + } + } + }, + "required": true + } + } + }, "/v1/eval/benchmarks/{benchmark_id}/jobs": { "post": { "responses": { @@ -5499,6 +6108,50 @@ } } }, + "/v1alpha/post-training/supervised-fine-tune": { + "post": { + "responses": { + "200": { + "description": "A PostTrainingJob.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/PostTrainingJob" + } + } + } + }, + "400": { + "$ref": "#/components/responses/BadRequest400" + }, + "429": { + "$ref": "#/components/responses/TooManyRequests429" + }, + "500": { + "$ref": "#/components/responses/InternalServerError500" + }, + "default": { + "$ref": "#/components/responses/DefaultError" + } + }, + "tags": [ + "PostTraining (Coming Soon)" + ], + "summary": "Run supervised fine-tuning of a model.", + "description": "Run supervised fine-tuning of a model.", + "parameters": [], + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/SupervisedFineTuneRequest" + } + } + }, + "required": true + } + } + }, "/v1/post-training/supervised-fine-tune": { "post": { "responses": { diff --git a/docs/static/llama-stack-spec.yaml b/docs/static/llama-stack-spec.yaml index c4b82b630..9c0558658 100644 --- a/docs/static/llama-stack-spec.yaml +++ b/docs/static/llama-stack-spec.yaml @@ -109,6 +109,32 @@ paths: schema: $ref: '#/components/schemas/BatchCompletionRequest' required: true + /v1alpha/post-training/job/cancel: + post: + responses: + '200': + description: OK + '400': + $ref: '#/components/responses/BadRequest400' + '429': + $ref: >- + #/components/responses/TooManyRequests429 + '500': + $ref: >- + #/components/responses/InternalServerError500 + default: + $ref: '#/components/responses/DefaultError' + tags: + - PostTraining (Coming Soon) + summary: Cancel a training job. + description: Cancel a training job. + parameters: [] + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/CancelTrainingJobRequest' + required: true /v1/post-training/job/cancel: post: responses: @@ -832,6 +858,44 @@ paths: schema: $ref: '#/components/schemas/EmbeddingsRequest' required: true + /v1alpha/eval/benchmarks/{benchmark_id}/evaluations: + post: + responses: + '200': + description: >- + EvaluateResponse object containing generations and scores. + content: + application/json: + schema: + $ref: '#/components/schemas/EvaluateResponse' + '400': + $ref: '#/components/responses/BadRequest400' + '429': + $ref: >- + #/components/responses/TooManyRequests429 + '500': + $ref: >- + #/components/responses/InternalServerError500 + default: + $ref: '#/components/responses/DefaultError' + tags: + - Eval + summary: Evaluate a list of rows on a benchmark. + description: Evaluate a list of rows on a benchmark. + parameters: + - name: benchmark_id + in: path + description: >- + The ID of the benchmark to run the evaluation on. + required: true + schema: + type: string + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/EvaluateRowsRequest' + required: true /v1/eval/benchmarks/{benchmark_id}/evaluations: post: responses: @@ -962,6 +1026,61 @@ paths: required: true schema: type: string + /v1alpha/eval/benchmarks/{benchmark_id}: + get: + responses: + '200': + description: A Benchmark. + content: + application/json: + schema: + $ref: '#/components/schemas/Benchmark' + '400': + $ref: '#/components/responses/BadRequest400' + '429': + $ref: >- + #/components/responses/TooManyRequests429 + '500': + $ref: >- + #/components/responses/InternalServerError500 + default: + $ref: '#/components/responses/DefaultError' + tags: + - Benchmarks + summary: Get a benchmark by its ID. + description: Get a benchmark by its ID. + parameters: + - name: benchmark_id + in: path + description: The ID of the benchmark to get. + required: true + schema: + type: string + delete: + responses: + '200': + description: OK + '400': + $ref: '#/components/responses/BadRequest400' + '429': + $ref: >- + #/components/responses/TooManyRequests429 + '500': + $ref: >- + #/components/responses/InternalServerError500 + default: + $ref: '#/components/responses/DefaultError' + tags: + - Benchmarks + summary: Unregister a benchmark. + description: Unregister a benchmark. + parameters: + - name: benchmark_id + in: path + description: The ID of the benchmark to unregister. + required: true + schema: + type: string /v1/eval/benchmarks/{benchmark_id}: get: responses: @@ -1458,6 +1577,37 @@ paths: required: true schema: type: string + /v1alpha/post-training/job/artifacts: + get: + responses: + '200': + description: A PostTrainingJobArtifactsResponse. + content: + application/json: + schema: + $ref: '#/components/schemas/PostTrainingJobArtifactsResponse' + '400': + $ref: '#/components/responses/BadRequest400' + '429': + $ref: >- + #/components/responses/TooManyRequests429 + '500': + $ref: >- + #/components/responses/InternalServerError500 + default: + $ref: '#/components/responses/DefaultError' + tags: + - PostTraining (Coming Soon) + summary: Get the artifacts of a training job. + description: Get the artifacts of a training job. + parameters: + - name: job_uuid + in: query + description: >- + The UUID of the job to get the artifacts of. + required: true + schema: + type: string /v1/post-training/job/artifacts: get: responses: @@ -1489,6 +1639,37 @@ paths: required: true schema: type: string + /v1alpha/post-training/job/status: + get: + responses: + '200': + description: A PostTrainingJobStatusResponse. + content: + application/json: + schema: + $ref: '#/components/schemas/PostTrainingJobStatusResponse' + '400': + $ref: '#/components/responses/BadRequest400' + '429': + $ref: >- + #/components/responses/TooManyRequests429 + '500': + $ref: >- + #/components/responses/InternalServerError500 + default: + $ref: '#/components/responses/DefaultError' + tags: + - PostTraining (Coming Soon) + summary: Get the status of a training job. + description: Get the status of a training job. + parameters: + - name: job_uuid + in: query + description: >- + The UUID of the job to get the status of. + required: true + schema: + type: string /v1/post-training/job/status: get: responses: @@ -1520,6 +1701,30 @@ paths: required: true schema: type: string + /v1alpha/post-training/jobs: + get: + responses: + '200': + description: A ListPostTrainingJobsResponse. + content: + application/json: + schema: + $ref: '#/components/schemas/ListPostTrainingJobsResponse' + '400': + $ref: '#/components/responses/BadRequest400' + '429': + $ref: >- + #/components/responses/TooManyRequests429 + '500': + $ref: >- + #/components/responses/InternalServerError500 + default: + $ref: '#/components/responses/DefaultError' + tags: + - PostTraining (Coming Soon) + summary: Get all training jobs. + description: Get all training jobs. + parameters: [] /v1/post-training/jobs: get: responses: @@ -1804,6 +2009,75 @@ paths: required: false schema: type: integer + /v1alpha/eval/benchmarks/{benchmark_id}/jobs/{job_id}: + get: + responses: + '200': + description: The status of the evaluation job. + content: + application/json: + schema: + $ref: '#/components/schemas/Job' + '400': + $ref: '#/components/responses/BadRequest400' + '429': + $ref: >- + #/components/responses/TooManyRequests429 + '500': + $ref: >- + #/components/responses/InternalServerError500 + default: + $ref: '#/components/responses/DefaultError' + tags: + - Eval + summary: Get the status of a job. + description: Get the status of a job. + parameters: + - name: benchmark_id + in: path + description: >- + The ID of the benchmark to run the evaluation on. + required: true + schema: + type: string + - name: job_id + in: path + description: The ID of the job to get the status of. + required: true + schema: + type: string + delete: + responses: + '200': + description: OK + '400': + $ref: '#/components/responses/BadRequest400' + '429': + $ref: >- + #/components/responses/TooManyRequests429 + '500': + $ref: >- + #/components/responses/InternalServerError500 + default: + $ref: '#/components/responses/DefaultError' + tags: + - Eval + summary: Cancel a job. + description: Cancel a job. + parameters: + - name: benchmark_id + in: path + description: >- + The ID of the benchmark to run the evaluation on. + required: true + schema: + type: string + - name: job_id + in: path + description: The ID of the job to cancel. + required: true + schema: + type: string /v1/eval/benchmarks/{benchmark_id}/jobs/{job_id}: get: responses: @@ -1873,6 +2147,43 @@ paths: required: true schema: type: string + /v1alpha/eval/benchmarks/{benchmark_id}/jobs/{job_id}/result: + get: + responses: + '200': + description: The result of the job. + content: + application/json: + schema: + $ref: '#/components/schemas/EvaluateResponse' + '400': + $ref: '#/components/responses/BadRequest400' + '429': + $ref: >- + #/components/responses/TooManyRequests429 + '500': + $ref: >- + #/components/responses/InternalServerError500 + default: + $ref: '#/components/responses/DefaultError' + tags: + - Eval + summary: Get the result of a job. + description: Get the result of a job. + parameters: + - name: benchmark_id + in: path + description: >- + The ID of the benchmark to run the evaluation on. + required: true + schema: + type: string + - name: job_id + in: path + description: The ID of the job to get the result of. + required: true + schema: + type: string /v1/eval/benchmarks/{benchmark_id}/jobs/{job_id}/result: get: responses: @@ -1953,6 +2264,55 @@ paths: required: false schema: type: integer + /v1alpha/eval/benchmarks: + get: + responses: + '200': + description: A ListBenchmarksResponse. + content: + application/json: + schema: + $ref: '#/components/schemas/ListBenchmarksResponse' + '400': + $ref: '#/components/responses/BadRequest400' + '429': + $ref: >- + #/components/responses/TooManyRequests429 + '500': + $ref: >- + #/components/responses/InternalServerError500 + default: + $ref: '#/components/responses/DefaultError' + tags: + - Benchmarks + summary: List all benchmarks. + description: List all benchmarks. + parameters: [] + post: + responses: + '200': + description: OK + '400': + $ref: '#/components/responses/BadRequest400' + '429': + $ref: >- + #/components/responses/TooManyRequests429 + '500': + $ref: >- + #/components/responses/InternalServerError500 + default: + $ref: '#/components/responses/DefaultError' + tags: + - Benchmarks + summary: Register a benchmark. + description: Register a benchmark. + parameters: [] + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/RegisterBenchmarkRequest' + required: true /v1/eval/benchmarks: get: responses: @@ -3454,6 +3814,36 @@ paths: schema: $ref: '#/components/schemas/OpenaiSearchVectorStoreRequest' required: true + /v1alpha/post-training/preference-optimize: + post: + responses: + '200': + description: A PostTrainingJob. + content: + application/json: + schema: + $ref: '#/components/schemas/PostTrainingJob' + '400': + $ref: '#/components/responses/BadRequest400' + '429': + $ref: >- + #/components/responses/TooManyRequests429 + '500': + $ref: >- + #/components/responses/InternalServerError500 + default: + $ref: '#/components/responses/DefaultError' + tags: + - PostTraining (Coming Soon) + summary: Run preference optimization of a model. + description: Run preference optimization of a model. + parameters: [] + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/PreferenceOptimizeRequest' + required: true /v1/post-training/preference-optimize: post: responses: @@ -3735,6 +4125,44 @@ paths: schema: $ref: '#/components/schemas/ResumeAgentTurnRequest' required: true + /v1alpha/eval/benchmarks/{benchmark_id}/jobs: + post: + responses: + '200': + description: >- + The job that was created to run the evaluation. + content: + application/json: + schema: + $ref: '#/components/schemas/Job' + '400': + $ref: '#/components/responses/BadRequest400' + '429': + $ref: >- + #/components/responses/TooManyRequests429 + '500': + $ref: >- + #/components/responses/InternalServerError500 + default: + $ref: '#/components/responses/DefaultError' + tags: + - Eval + summary: Run an evaluation on a benchmark. + description: Run an evaluation on a benchmark. + parameters: + - name: benchmark_id + in: path + description: >- + The ID of the benchmark to run the evaluation on. + required: true + schema: + type: string + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/RunEvalRequest' + required: true /v1/eval/benchmarks/{benchmark_id}/jobs: post: responses: @@ -3961,6 +4389,36 @@ paths: schema: $ref: '#/components/schemas/SetDefaultVersionRequest' required: true + /v1alpha/post-training/supervised-fine-tune: + post: + responses: + '200': + description: A PostTrainingJob. + content: + application/json: + schema: + $ref: '#/components/schemas/PostTrainingJob' + '400': + $ref: '#/components/responses/BadRequest400' + '429': + $ref: >- + #/components/responses/TooManyRequests429 + '500': + $ref: >- + #/components/responses/InternalServerError500 + default: + $ref: '#/components/responses/DefaultError' + tags: + - PostTraining (Coming Soon) + summary: Run supervised fine-tuning of a model. + description: Run supervised fine-tuning of a model. + parameters: [] + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/SupervisedFineTuneRequest' + required: true /v1/post-training/supervised-fine-tune: post: responses: diff --git a/llama_stack/apis/agents/agents.py b/llama_stack/apis/agents/agents.py index 7dd3e9289..e53ca82e2 100644 --- a/llama_stack/apis/agents/agents.py +++ b/llama_stack/apis/agents/agents.py @@ -27,6 +27,7 @@ from llama_stack.apis.inference import ( ) from llama_stack.apis.safety import SafetyViolation from llama_stack.apis.tools import ToolDef +from llama_stack.apis.version import LLAMA_STACK_API_V1 from llama_stack.schema_utils import json_schema_type, register_schema, webmethod from .openai_responses import ( @@ -481,7 +482,7 @@ class Agents(Protocol): - Agents can also use Memory to retrieve information from knowledge bases. See the RAG Tool and Vector IO APIs for more details. """ - @webmethod(route="/agents", method="POST", descriptive_name="create_agent") + @webmethod(route="/agents", method="POST", descriptive_name="create_agent", level=LLAMA_STACK_API_V1) async def create_agent( self, agent_config: AgentConfig, @@ -494,7 +495,10 @@ class Agents(Protocol): ... @webmethod( - route="/agents/{agent_id}/session/{session_id}/turn", method="POST", descriptive_name="create_agent_turn" + route="/agents/{agent_id}/session/{session_id}/turn", + method="POST", + descriptive_name="create_agent_turn", + level=LLAMA_STACK_API_V1, ) async def create_agent_turn( self, @@ -524,6 +528,7 @@ class Agents(Protocol): route="/agents/{agent_id}/session/{session_id}/turn/{turn_id}/resume", method="POST", descriptive_name="resume_agent_turn", + level=LLAMA_STACK_API_V1, ) async def resume_agent_turn( self, @@ -549,6 +554,7 @@ class Agents(Protocol): @webmethod( route="/agents/{agent_id}/session/{session_id}/turn/{turn_id}", method="GET", + level=LLAMA_STACK_API_V1, ) async def get_agents_turn( self, @@ -568,6 +574,7 @@ class Agents(Protocol): @webmethod( route="/agents/{agent_id}/session/{session_id}/turn/{turn_id}/step/{step_id}", method="GET", + level=LLAMA_STACK_API_V1, ) async def get_agents_step( self, @@ -586,7 +593,12 @@ class Agents(Protocol): """ ... - @webmethod(route="/agents/{agent_id}/session", method="POST", descriptive_name="create_agent_session") + @webmethod( + route="/agents/{agent_id}/session", + method="POST", + descriptive_name="create_agent_session", + level=LLAMA_STACK_API_V1, + ) async def create_agent_session( self, agent_id: str, @@ -600,7 +612,7 @@ class Agents(Protocol): """ ... - @webmethod(route="/agents/{agent_id}/session/{session_id}", method="GET") + @webmethod(route="/agents/{agent_id}/session/{session_id}", method="GET", level=LLAMA_STACK_API_V1) async def get_agents_session( self, session_id: str, @@ -616,7 +628,7 @@ class Agents(Protocol): """ ... - @webmethod(route="/agents/{agent_id}/session/{session_id}", method="DELETE") + @webmethod(route="/agents/{agent_id}/session/{session_id}", method="DELETE", level=LLAMA_STACK_API_V1) async def delete_agents_session( self, session_id: str, @@ -629,7 +641,7 @@ class Agents(Protocol): """ ... - @webmethod(route="/agents/{agent_id}", method="DELETE") + @webmethod(route="/agents/{agent_id}", method="DELETE", level=LLAMA_STACK_API_V1) async def delete_agent( self, agent_id: str, @@ -640,7 +652,7 @@ class Agents(Protocol): """ ... - @webmethod(route="/agents", method="GET") + @webmethod(route="/agents", method="GET", level=LLAMA_STACK_API_V1) async def list_agents(self, start_index: int | None = None, limit: int | None = None) -> PaginatedResponse: """List all agents. @@ -650,7 +662,7 @@ class Agents(Protocol): """ ... - @webmethod(route="/agents/{agent_id}", method="GET") + @webmethod(route="/agents/{agent_id}", method="GET", level=LLAMA_STACK_API_V1) async def get_agent(self, agent_id: str) -> Agent: """Describe an agent by its ID. @@ -659,7 +671,7 @@ class Agents(Protocol): """ ... - @webmethod(route="/agents/{agent_id}/sessions", method="GET") + @webmethod(route="/agents/{agent_id}/sessions", method="GET", level=LLAMA_STACK_API_V1) async def list_agent_sessions( self, agent_id: str, @@ -682,7 +694,7 @@ class Agents(Protocol): # # Both of these APIs are inherently stateful. - @webmethod(route="/openai/v1/responses/{response_id}", method="GET") + @webmethod(route="/openai/v1/responses/{response_id}", method="GET", level=LLAMA_STACK_API_V1) async def get_openai_response( self, response_id: str, @@ -694,7 +706,7 @@ class Agents(Protocol): """ ... - @webmethod(route="/openai/v1/responses", method="POST") + @webmethod(route="/openai/v1/responses", method="POST", level=LLAMA_STACK_API_V1) async def create_openai_response( self, input: str | list[OpenAIResponseInput], @@ -719,7 +731,7 @@ class Agents(Protocol): """ ... - @webmethod(route="/openai/v1/responses", method="GET") + @webmethod(route="/openai/v1/responses", method="GET", level=LLAMA_STACK_API_V1) async def list_openai_responses( self, after: str | None = None, @@ -737,7 +749,7 @@ class Agents(Protocol): """ ... - @webmethod(route="/openai/v1/responses/{response_id}/input_items", method="GET") + @webmethod(route="/openai/v1/responses/{response_id}/input_items", method="GET", level=LLAMA_STACK_API_V1) async def list_openai_response_input_items( self, response_id: str, @@ -759,7 +771,7 @@ class Agents(Protocol): """ ... - @webmethod(route="/openai/v1/responses/{response_id}", method="DELETE") + @webmethod(route="/openai/v1/responses/{response_id}", method="DELETE", level=LLAMA_STACK_API_V1) async def delete_openai_response(self, response_id: str) -> OpenAIDeleteResponseObject: """Delete an OpenAI response by its ID. diff --git a/llama_stack/apis/batch_inference/batch_inference.py b/llama_stack/apis/batch_inference/batch_inference.py index b2aa637e2..43ade0221 100644 --- a/llama_stack/apis/batch_inference/batch_inference.py +++ b/llama_stack/apis/batch_inference/batch_inference.py @@ -17,6 +17,7 @@ from llama_stack.apis.inference import ( ToolDefinition, ToolPromptFormat, ) +from llama_stack.apis.version import LLAMA_STACK_API_V1 from llama_stack.schema_utils import webmethod @@ -30,7 +31,7 @@ class BatchInference(Protocol): including (post-training, evals, etc). """ - @webmethod(route="/batch-inference/completion", method="POST") + @webmethod(route="/batch-inference/completion", method="POST", level=LLAMA_STACK_API_V1) async def completion( self, model: str, @@ -50,7 +51,7 @@ class BatchInference(Protocol): """ ... - @webmethod(route="/batch-inference/chat-completion", method="POST") + @webmethod(route="/batch-inference/chat-completion", method="POST", level=LLAMA_STACK_API_V1) async def chat_completion( self, model: str, diff --git a/llama_stack/apis/batches/batches.py b/llama_stack/apis/batches/batches.py index c6bbd92eb..5890cbe04 100644 --- a/llama_stack/apis/batches/batches.py +++ b/llama_stack/apis/batches/batches.py @@ -8,6 +8,7 @@ from typing import Literal, Protocol, runtime_checkable from pydantic import BaseModel, Field +from llama_stack.apis.version import LLAMA_STACK_API_V1 from llama_stack.schema_utils import json_schema_type, webmethod try: @@ -42,7 +43,7 @@ class Batches(Protocol): Note: This API is currently under active development and may undergo changes. """ - @webmethod(route="/openai/v1/batches", method="POST") + @webmethod(route="/openai/v1/batches", method="POST", level=LLAMA_STACK_API_V1) async def create_batch( self, input_file_id: str, @@ -62,7 +63,7 @@ class Batches(Protocol): """ ... - @webmethod(route="/openai/v1/batches/{batch_id}", method="GET") + @webmethod(route="/openai/v1/batches/{batch_id}", method="GET", level=LLAMA_STACK_API_V1) async def retrieve_batch(self, batch_id: str) -> BatchObject: """Retrieve information about a specific batch. @@ -71,7 +72,7 @@ class Batches(Protocol): """ ... - @webmethod(route="/openai/v1/batches/{batch_id}/cancel", method="POST") + @webmethod(route="/openai/v1/batches/{batch_id}/cancel", method="POST", level=LLAMA_STACK_API_V1) async def cancel_batch(self, batch_id: str) -> BatchObject: """Cancel a batch that is in progress. @@ -80,7 +81,7 @@ class Batches(Protocol): """ ... - @webmethod(route="/openai/v1/batches", method="GET") + @webmethod(route="/openai/v1/batches", method="GET", level=LLAMA_STACK_API_V1) async def list_batches( self, after: str | None = None, diff --git a/llama_stack/apis/benchmarks/benchmarks.py b/llama_stack/apis/benchmarks/benchmarks.py index 8d0a25e7b..d87d45a60 100644 --- a/llama_stack/apis/benchmarks/benchmarks.py +++ b/llama_stack/apis/benchmarks/benchmarks.py @@ -8,6 +8,7 @@ from typing import Any, Literal, Protocol, runtime_checkable from pydantic import BaseModel, Field from llama_stack.apis.resource import Resource, ResourceType +from llama_stack.apis.version import LLAMA_STACK_API_V1, LLAMA_STACK_API_V1ALPHA from llama_stack.schema_utils import json_schema_type, webmethod @@ -53,7 +54,8 @@ class ListBenchmarksResponse(BaseModel): @runtime_checkable class Benchmarks(Protocol): - @webmethod(route="/eval/benchmarks", method="GET") + @webmethod(route="/eval/benchmarks", method="GET", level=LLAMA_STACK_API_V1, deprecated=True) + @webmethod(route="/eval/benchmarks", method="GET", level=LLAMA_STACK_API_V1ALPHA) async def list_benchmarks(self) -> ListBenchmarksResponse: """List all benchmarks. @@ -61,7 +63,8 @@ class Benchmarks(Protocol): """ ... - @webmethod(route="/eval/benchmarks/{benchmark_id}", method="GET") + @webmethod(route="/eval/benchmarks/{benchmark_id}", method="GET", level=LLAMA_STACK_API_V1, deprecated=True) + @webmethod(route="/eval/benchmarks/{benchmark_id}", method="GET", level=LLAMA_STACK_API_V1ALPHA) async def get_benchmark( self, benchmark_id: str, @@ -73,7 +76,8 @@ class Benchmarks(Protocol): """ ... - @webmethod(route="/eval/benchmarks", method="POST") + @webmethod(route="/eval/benchmarks", method="POST", level=LLAMA_STACK_API_V1, deprecated=True) + @webmethod(route="/eval/benchmarks", method="POST", level=LLAMA_STACK_API_V1ALPHA) async def register_benchmark( self, benchmark_id: str, @@ -94,7 +98,8 @@ class Benchmarks(Protocol): """ ... - @webmethod(route="/eval/benchmarks/{benchmark_id}", method="DELETE") + @webmethod(route="/eval/benchmarks/{benchmark_id}", method="DELETE", level=LLAMA_STACK_API_V1, deprecated=True) + @webmethod(route="/eval/benchmarks/{benchmark_id}", method="DELETE", level=LLAMA_STACK_API_V1ALPHA) async def unregister_benchmark(self, benchmark_id: str) -> None: """Unregister a benchmark. diff --git a/llama_stack/apis/datasetio/datasetio.py b/llama_stack/apis/datasetio/datasetio.py index 1183983cc..27e5336bc 100644 --- a/llama_stack/apis/datasetio/datasetio.py +++ b/llama_stack/apis/datasetio/datasetio.py @@ -8,6 +8,7 @@ from typing import Any, Protocol, runtime_checkable from llama_stack.apis.common.responses import PaginatedResponse from llama_stack.apis.datasets import Dataset +from llama_stack.apis.version import LLAMA_STACK_API_V1 from llama_stack.schema_utils import webmethod @@ -20,7 +21,7 @@ class DatasetIO(Protocol): # keeping for aligning with inference/safety, but this is not used dataset_store: DatasetStore - @webmethod(route="/datasetio/iterrows/{dataset_id:path}", method="GET") + @webmethod(route="/datasetio/iterrows/{dataset_id:path}", method="GET", level=LLAMA_STACK_API_V1) async def iterrows( self, dataset_id: str, @@ -44,7 +45,7 @@ class DatasetIO(Protocol): """ ... - @webmethod(route="/datasetio/append-rows/{dataset_id:path}", method="POST") + @webmethod(route="/datasetio/append-rows/{dataset_id:path}", method="POST", level=LLAMA_STACK_API_V1) async def append_rows(self, dataset_id: str, rows: list[dict[str, Any]]) -> None: """Append rows to a dataset. diff --git a/llama_stack/apis/datasets/datasets.py b/llama_stack/apis/datasets/datasets.py index f347e0e29..be0cbf09a 100644 --- a/llama_stack/apis/datasets/datasets.py +++ b/llama_stack/apis/datasets/datasets.py @@ -10,6 +10,7 @@ from typing import Annotated, Any, Literal, Protocol from pydantic import BaseModel, Field from llama_stack.apis.resource import Resource, ResourceType +from llama_stack.apis.version import LLAMA_STACK_API_V1 from llama_stack.schema_utils import json_schema_type, register_schema, webmethod @@ -145,7 +146,7 @@ class ListDatasetsResponse(BaseModel): class Datasets(Protocol): - @webmethod(route="/datasets", method="POST") + @webmethod(route="/datasets", method="POST", level=LLAMA_STACK_API_V1) async def register_dataset( self, purpose: DatasetPurpose, @@ -214,7 +215,7 @@ class Datasets(Protocol): """ ... - @webmethod(route="/datasets/{dataset_id:path}", method="GET") + @webmethod(route="/datasets/{dataset_id:path}", method="GET", level=LLAMA_STACK_API_V1) async def get_dataset( self, dataset_id: str, @@ -226,7 +227,7 @@ class Datasets(Protocol): """ ... - @webmethod(route="/datasets", method="GET") + @webmethod(route="/datasets", method="GET", level=LLAMA_STACK_API_V1) async def list_datasets(self) -> ListDatasetsResponse: """List all datasets. @@ -234,7 +235,7 @@ class Datasets(Protocol): """ ... - @webmethod(route="/datasets/{dataset_id:path}", method="DELETE") + @webmethod(route="/datasets/{dataset_id:path}", method="DELETE", level=LLAMA_STACK_API_V1) async def unregister_dataset( self, dataset_id: str, diff --git a/llama_stack/apis/eval/eval.py b/llama_stack/apis/eval/eval.py index 83a0a8e56..bb81778f1 100644 --- a/llama_stack/apis/eval/eval.py +++ b/llama_stack/apis/eval/eval.py @@ -13,6 +13,7 @@ from llama_stack.apis.common.job_types import Job from llama_stack.apis.inference import SamplingParams, SystemMessage from llama_stack.apis.scoring import ScoringResult from llama_stack.apis.scoring_functions import ScoringFnParams +from llama_stack.apis.version import LLAMA_STACK_API_V1, LLAMA_STACK_API_V1ALPHA from llama_stack.schema_utils import json_schema_type, register_schema, webmethod @@ -83,7 +84,8 @@ class EvaluateResponse(BaseModel): class Eval(Protocol): """Llama Stack Evaluation API for running evaluations on model and agent candidates.""" - @webmethod(route="/eval/benchmarks/{benchmark_id}/jobs", method="POST") + @webmethod(route="/eval/benchmarks/{benchmark_id}/jobs", method="POST", level=LLAMA_STACK_API_V1, deprecated=True) + @webmethod(route="/eval/benchmarks/{benchmark_id}/jobs", method="POST", level=LLAMA_STACK_API_V1ALPHA) async def run_eval( self, benchmark_id: str, @@ -97,7 +99,10 @@ class Eval(Protocol): """ ... - @webmethod(route="/eval/benchmarks/{benchmark_id}/evaluations", method="POST") + @webmethod( + route="/eval/benchmarks/{benchmark_id}/evaluations", method="POST", level=LLAMA_STACK_API_V1, deprecated=True + ) + @webmethod(route="/eval/benchmarks/{benchmark_id}/evaluations", method="POST", level=LLAMA_STACK_API_V1ALPHA) async def evaluate_rows( self, benchmark_id: str, @@ -115,7 +120,10 @@ class Eval(Protocol): """ ... - @webmethod(route="/eval/benchmarks/{benchmark_id}/jobs/{job_id}", method="GET") + @webmethod( + route="/eval/benchmarks/{benchmark_id}/jobs/{job_id}", method="GET", level=LLAMA_STACK_API_V1, deprecated=True + ) + @webmethod(route="/eval/benchmarks/{benchmark_id}/jobs/{job_id}", method="GET", level=LLAMA_STACK_API_V1ALPHA) async def job_status(self, benchmark_id: str, job_id: str) -> Job: """Get the status of a job. @@ -125,7 +133,13 @@ class Eval(Protocol): """ ... - @webmethod(route="/eval/benchmarks/{benchmark_id}/jobs/{job_id}", method="DELETE") + @webmethod( + route="/eval/benchmarks/{benchmark_id}/jobs/{job_id}", + method="DELETE", + level=LLAMA_STACK_API_V1, + deprecated=True, + ) + @webmethod(route="/eval/benchmarks/{benchmark_id}/jobs/{job_id}", method="DELETE", level=LLAMA_STACK_API_V1ALPHA) async def job_cancel(self, benchmark_id: str, job_id: str) -> None: """Cancel a job. @@ -134,7 +148,15 @@ class Eval(Protocol): """ ... - @webmethod(route="/eval/benchmarks/{benchmark_id}/jobs/{job_id}/result", method="GET") + @webmethod( + route="/eval/benchmarks/{benchmark_id}/jobs/{job_id}/result", + method="GET", + level=LLAMA_STACK_API_V1, + deprecated=True, + ) + @webmethod( + route="/eval/benchmarks/{benchmark_id}/jobs/{job_id}/result", method="GET", level=LLAMA_STACK_API_V1ALPHA + ) async def job_result(self, benchmark_id: str, job_id: str) -> EvaluateResponse: """Get the result of a job. diff --git a/llama_stack/apis/files/files.py b/llama_stack/apis/files/files.py index 124e4bc8e..7e45b55ee 100644 --- a/llama_stack/apis/files/files.py +++ b/llama_stack/apis/files/files.py @@ -11,6 +11,7 @@ from fastapi import File, Form, Response, UploadFile from pydantic import BaseModel, Field from llama_stack.apis.common.responses import Order +from llama_stack.apis.version import LLAMA_STACK_API_V1 from llama_stack.providers.utils.telemetry.trace_protocol import trace_protocol from llama_stack.schema_utils import json_schema_type, webmethod @@ -104,7 +105,7 @@ class OpenAIFileDeleteResponse(BaseModel): @trace_protocol class Files(Protocol): # OpenAI Files API Endpoints - @webmethod(route="/openai/v1/files", method="POST") + @webmethod(route="/openai/v1/files", method="POST", level=LLAMA_STACK_API_V1) async def openai_upload_file( self, file: Annotated[UploadFile, File()], @@ -127,7 +128,7 @@ class Files(Protocol): """ ... - @webmethod(route="/openai/v1/files", method="GET") + @webmethod(route="/openai/v1/files", method="GET", level=LLAMA_STACK_API_V1) async def openai_list_files( self, after: str | None = None, @@ -146,7 +147,7 @@ class Files(Protocol): """ ... - @webmethod(route="/openai/v1/files/{file_id}", method="GET") + @webmethod(route="/openai/v1/files/{file_id}", method="GET", level=LLAMA_STACK_API_V1) async def openai_retrieve_file( self, file_id: str, @@ -159,7 +160,7 @@ class Files(Protocol): """ ... - @webmethod(route="/openai/v1/files/{file_id}", method="DELETE") + @webmethod(route="/openai/v1/files/{file_id}", method="DELETE", level=LLAMA_STACK_API_V1) async def openai_delete_file( self, file_id: str, @@ -172,7 +173,7 @@ class Files(Protocol): """ ... - @webmethod(route="/openai/v1/files/{file_id}/content", method="GET") + @webmethod(route="/openai/v1/files/{file_id}/content", method="GET", level=LLAMA_STACK_API_V1) async def openai_retrieve_file_content( self, file_id: str, diff --git a/llama_stack/apis/inference/inference.py b/llama_stack/apis/inference/inference.py index bd4737ca7..4f5332b5f 100644 --- a/llama_stack/apis/inference/inference.py +++ b/llama_stack/apis/inference/inference.py @@ -21,6 +21,7 @@ from llama_stack.apis.common.content_types import ContentDelta, InterleavedConte from llama_stack.apis.common.responses import Order from llama_stack.apis.models import Model from llama_stack.apis.telemetry import MetricResponseMixin +from llama_stack.apis.version import LLAMA_STACK_API_V1 from llama_stack.models.llama.datatypes import ( BuiltinTool, StopReason, @@ -1026,7 +1027,7 @@ class InferenceProvider(Protocol): model_store: ModelStore | None = None - @webmethod(route="/inference/completion", method="POST") + @webmethod(route="/inference/completion", method="POST", level=LLAMA_STACK_API_V1) async def completion( self, model_id: str, @@ -1049,7 +1050,7 @@ class InferenceProvider(Protocol): """ ... - @webmethod(route="/inference/batch-completion", method="POST", experimental=True) + @webmethod(route="/inference/batch-completion", method="POST", experimental=True, level=LLAMA_STACK_API_V1) async def batch_completion( self, model_id: str, @@ -1070,7 +1071,7 @@ class InferenceProvider(Protocol): raise NotImplementedError("Batch completion is not implemented") return # this is so mypy's safe-super rule will consider the method concrete - @webmethod(route="/inference/chat-completion", method="POST") + @webmethod(route="/inference/chat-completion", method="POST", level=LLAMA_STACK_API_V1) async def chat_completion( self, model_id: str, @@ -1110,7 +1111,7 @@ class InferenceProvider(Protocol): """ ... - @webmethod(route="/inference/batch-chat-completion", method="POST", experimental=True) + @webmethod(route="/inference/batch-chat-completion", method="POST", experimental=True, level=LLAMA_STACK_API_V1) async def batch_chat_completion( self, model_id: str, @@ -1135,7 +1136,7 @@ class InferenceProvider(Protocol): raise NotImplementedError("Batch chat completion is not implemented") return # this is so mypy's safe-super rule will consider the method concrete - @webmethod(route="/inference/embeddings", method="POST") + @webmethod(route="/inference/embeddings", method="POST", level=LLAMA_STACK_API_V1) async def embeddings( self, model_id: str, @@ -1155,7 +1156,7 @@ class InferenceProvider(Protocol): """ ... - @webmethod(route="/inference/rerank", method="POST", experimental=True) + @webmethod(route="/inference/rerank", method="POST", experimental=True, level=LLAMA_STACK_API_V1) async def rerank( self, model: str, @@ -1174,7 +1175,7 @@ class InferenceProvider(Protocol): raise NotImplementedError("Reranking is not implemented") return # this is so mypy's safe-super rule will consider the method concrete - @webmethod(route="/openai/v1/completions", method="POST") + @webmethod(route="/openai/v1/completions", method="POST", level=LLAMA_STACK_API_V1) async def openai_completion( self, # Standard OpenAI completion parameters @@ -1225,7 +1226,7 @@ class InferenceProvider(Protocol): """ ... - @webmethod(route="/openai/v1/chat/completions", method="POST") + @webmethod(route="/openai/v1/chat/completions", method="POST", level=LLAMA_STACK_API_V1) async def openai_chat_completion( self, model: str, @@ -1281,7 +1282,7 @@ class InferenceProvider(Protocol): """ ... - @webmethod(route="/openai/v1/embeddings", method="POST") + @webmethod(route="/openai/v1/embeddings", method="POST", level=LLAMA_STACK_API_V1) async def openai_embeddings( self, model: str, @@ -1310,7 +1311,7 @@ class Inference(InferenceProvider): - Embedding models: these models generate embeddings to be used for semantic search. """ - @webmethod(route="/openai/v1/chat/completions", method="GET") + @webmethod(route="/openai/v1/chat/completions", method="GET", level=LLAMA_STACK_API_V1) async def list_chat_completions( self, after: str | None = None, @@ -1328,7 +1329,7 @@ class Inference(InferenceProvider): """ raise NotImplementedError("List chat completions is not implemented") - @webmethod(route="/openai/v1/chat/completions/{completion_id}", method="GET") + @webmethod(route="/openai/v1/chat/completions/{completion_id}", method="GET", level=LLAMA_STACK_API_V1) async def get_chat_completion(self, completion_id: str) -> OpenAICompletionWithInputMessages: """Describe a chat completion by its ID. diff --git a/llama_stack/apis/inspect/inspect.py b/llama_stack/apis/inspect/inspect.py index 91d9c3da7..e859dbe59 100644 --- a/llama_stack/apis/inspect/inspect.py +++ b/llama_stack/apis/inspect/inspect.py @@ -8,6 +8,7 @@ from typing import Protocol, runtime_checkable from pydantic import BaseModel +from llama_stack.apis.version import LLAMA_STACK_API_V1 from llama_stack.providers.datatypes import HealthStatus from llama_stack.schema_utils import json_schema_type, webmethod @@ -57,7 +58,7 @@ class ListRoutesResponse(BaseModel): @runtime_checkable class Inspect(Protocol): - @webmethod(route="/inspect/routes", method="GET") + @webmethod(route="/inspect/routes", method="GET", level=LLAMA_STACK_API_V1) async def list_routes(self) -> ListRoutesResponse: """List all available API routes with their methods and implementing providers. @@ -65,7 +66,7 @@ class Inspect(Protocol): """ ... - @webmethod(route="/health", method="GET") + @webmethod(route="/health", method="GET", level=LLAMA_STACK_API_V1) async def health(self) -> HealthInfo: """Get the current health status of the service. @@ -73,7 +74,7 @@ class Inspect(Protocol): """ ... - @webmethod(route="/version", method="GET") + @webmethod(route="/version", method="GET", level=LLAMA_STACK_API_V1) async def version(self) -> VersionInfo: """Get the version of the service. diff --git a/llama_stack/apis/models/models.py b/llama_stack/apis/models/models.py index 1af6fc9df..a4f6a888b 100644 --- a/llama_stack/apis/models/models.py +++ b/llama_stack/apis/models/models.py @@ -10,6 +10,7 @@ from typing import Any, Literal, Protocol, runtime_checkable from pydantic import BaseModel, ConfigDict, Field, field_validator from llama_stack.apis.resource import Resource, ResourceType +from llama_stack.apis.version import LLAMA_STACK_API_V1 from llama_stack.providers.utils.telemetry.trace_protocol import trace_protocol from llama_stack.schema_utils import json_schema_type, webmethod @@ -102,7 +103,7 @@ class OpenAIListModelsResponse(BaseModel): @runtime_checkable @trace_protocol class Models(Protocol): - @webmethod(route="/models", method="GET") + @webmethod(route="/models", method="GET", level=LLAMA_STACK_API_V1) async def list_models(self) -> ListModelsResponse: """List all models. @@ -110,7 +111,7 @@ class Models(Protocol): """ ... - @webmethod(route="/openai/v1/models", method="GET") + @webmethod(route="/openai/v1/models", method="GET", level=LLAMA_STACK_API_V1) async def openai_list_models(self) -> OpenAIListModelsResponse: """List models using the OpenAI API. @@ -118,7 +119,7 @@ class Models(Protocol): """ ... - @webmethod(route="/models/{model_id:path}", method="GET") + @webmethod(route="/models/{model_id:path}", method="GET", level=LLAMA_STACK_API_V1) async def get_model( self, model_id: str, @@ -130,7 +131,7 @@ class Models(Protocol): """ ... - @webmethod(route="/models", method="POST") + @webmethod(route="/models", method="POST", level=LLAMA_STACK_API_V1) async def register_model( self, model_id: str, @@ -150,7 +151,7 @@ class Models(Protocol): """ ... - @webmethod(route="/models/{model_id:path}", method="DELETE") + @webmethod(route="/models/{model_id:path}", method="DELETE", level=LLAMA_STACK_API_V1) async def unregister_model( self, model_id: str, diff --git a/llama_stack/apis/post_training/post_training.py b/llama_stack/apis/post_training/post_training.py index c16221289..30a51f765 100644 --- a/llama_stack/apis/post_training/post_training.py +++ b/llama_stack/apis/post_training/post_training.py @@ -13,6 +13,7 @@ from pydantic import BaseModel, Field from llama_stack.apis.common.content_types import URL from llama_stack.apis.common.job_types import JobStatus from llama_stack.apis.common.training_types import Checkpoint +from llama_stack.apis.version import LLAMA_STACK_API_V1, LLAMA_STACK_API_V1ALPHA from llama_stack.schema_utils import json_schema_type, register_schema, webmethod @@ -283,7 +284,8 @@ class PostTrainingJobArtifactsResponse(BaseModel): class PostTraining(Protocol): - @webmethod(route="/post-training/supervised-fine-tune", method="POST") + @webmethod(route="/post-training/supervised-fine-tune", method="POST", level=LLAMA_STACK_API_V1, deprecated=True) + @webmethod(route="/post-training/supervised-fine-tune", method="POST", level=LLAMA_STACK_API_V1ALPHA) async def supervised_fine_tune( self, job_uuid: str, @@ -310,7 +312,8 @@ class PostTraining(Protocol): """ ... - @webmethod(route="/post-training/preference-optimize", method="POST") + @webmethod(route="/post-training/preference-optimize", method="POST", level=LLAMA_STACK_API_V1, deprecated=True) + @webmethod(route="/post-training/preference-optimize", method="POST", level=LLAMA_STACK_API_V1ALPHA) async def preference_optimize( self, job_uuid: str, @@ -332,7 +335,8 @@ class PostTraining(Protocol): """ ... - @webmethod(route="/post-training/jobs", method="GET") + @webmethod(route="/post-training/jobs", method="GET", level=LLAMA_STACK_API_V1, deprecated=True) + @webmethod(route="/post-training/jobs", method="GET", level=LLAMA_STACK_API_V1ALPHA) async def get_training_jobs(self) -> ListPostTrainingJobsResponse: """Get all training jobs. @@ -340,7 +344,8 @@ class PostTraining(Protocol): """ ... - @webmethod(route="/post-training/job/status", method="GET") + @webmethod(route="/post-training/job/status", method="GET", level=LLAMA_STACK_API_V1, deprecated=True) + @webmethod(route="/post-training/job/status", method="GET", level=LLAMA_STACK_API_V1ALPHA) async def get_training_job_status(self, job_uuid: str) -> PostTrainingJobStatusResponse: """Get the status of a training job. @@ -349,7 +354,8 @@ class PostTraining(Protocol): """ ... - @webmethod(route="/post-training/job/cancel", method="POST") + @webmethod(route="/post-training/job/cancel", method="POST", level=LLAMA_STACK_API_V1, deprecated=True) + @webmethod(route="/post-training/job/cancel", method="POST", level=LLAMA_STACK_API_V1ALPHA) async def cancel_training_job(self, job_uuid: str) -> None: """Cancel a training job. @@ -357,7 +363,8 @@ class PostTraining(Protocol): """ ... - @webmethod(route="/post-training/job/artifacts", method="GET") + @webmethod(route="/post-training/job/artifacts", method="GET", level=LLAMA_STACK_API_V1, deprecated=True) + @webmethod(route="/post-training/job/artifacts", method="GET", level=LLAMA_STACK_API_V1ALPHA) async def get_training_job_artifacts(self, job_uuid: str) -> PostTrainingJobArtifactsResponse: """Get the artifacts of a training job. diff --git a/llama_stack/apis/prompts/prompts.py b/llama_stack/apis/prompts/prompts.py index e6a376c3f..c56185e25 100644 --- a/llama_stack/apis/prompts/prompts.py +++ b/llama_stack/apis/prompts/prompts.py @@ -10,6 +10,7 @@ from typing import Protocol, runtime_checkable from pydantic import BaseModel, Field, field_validator, model_validator +from llama_stack.apis.version import LLAMA_STACK_API_V1 from llama_stack.providers.utils.telemetry.trace_protocol import trace_protocol from llama_stack.schema_utils import json_schema_type, webmethod @@ -95,7 +96,7 @@ class ListPromptsResponse(BaseModel): class Prompts(Protocol): """Protocol for prompt management operations.""" - @webmethod(route="/prompts", method="GET") + @webmethod(route="/prompts", method="GET", level=LLAMA_STACK_API_V1) async def list_prompts(self) -> ListPromptsResponse: """List all prompts. @@ -103,7 +104,7 @@ class Prompts(Protocol): """ ... - @webmethod(route="/prompts/{prompt_id}/versions", method="GET") + @webmethod(route="/prompts/{prompt_id}/versions", method="GET", level=LLAMA_STACK_API_V1) async def list_prompt_versions( self, prompt_id: str, @@ -115,7 +116,7 @@ class Prompts(Protocol): """ ... - @webmethod(route="/prompts/{prompt_id}", method="GET") + @webmethod(route="/prompts/{prompt_id}", method="GET", level=LLAMA_STACK_API_V1) async def get_prompt( self, prompt_id: str, @@ -129,7 +130,7 @@ class Prompts(Protocol): """ ... - @webmethod(route="/prompts", method="POST") + @webmethod(route="/prompts", method="POST", level=LLAMA_STACK_API_V1) async def create_prompt( self, prompt: str, @@ -143,7 +144,7 @@ class Prompts(Protocol): """ ... - @webmethod(route="/prompts/{prompt_id}", method="PUT") + @webmethod(route="/prompts/{prompt_id}", method="PUT", level=LLAMA_STACK_API_V1) async def update_prompt( self, prompt_id: str, @@ -163,7 +164,7 @@ class Prompts(Protocol): """ ... - @webmethod(route="/prompts/{prompt_id}", method="DELETE") + @webmethod(route="/prompts/{prompt_id}", method="DELETE", level=LLAMA_STACK_API_V1) async def delete_prompt( self, prompt_id: str, @@ -174,7 +175,7 @@ class Prompts(Protocol): """ ... - @webmethod(route="/prompts/{prompt_id}/set-default-version", method="PUT") + @webmethod(route="/prompts/{prompt_id}/set-default-version", method="PUT", level=LLAMA_STACK_API_V1) async def set_default_version( self, prompt_id: str, diff --git a/llama_stack/apis/providers/providers.py b/llama_stack/apis/providers/providers.py index 8a1e93d8f..d1cff0f6c 100644 --- a/llama_stack/apis/providers/providers.py +++ b/llama_stack/apis/providers/providers.py @@ -8,6 +8,7 @@ from typing import Any, Protocol, runtime_checkable from pydantic import BaseModel +from llama_stack.apis.version import LLAMA_STACK_API_V1 from llama_stack.providers.datatypes import HealthResponse from llama_stack.schema_utils import json_schema_type, webmethod @@ -45,7 +46,7 @@ class Providers(Protocol): Providers API for inspecting, listing, and modifying providers and their configurations. """ - @webmethod(route="/providers", method="GET") + @webmethod(route="/providers", method="GET", level=LLAMA_STACK_API_V1) async def list_providers(self) -> ListProvidersResponse: """List all available providers. @@ -53,7 +54,7 @@ class Providers(Protocol): """ ... - @webmethod(route="/providers/{provider_id}", method="GET") + @webmethod(route="/providers/{provider_id}", method="GET", level=LLAMA_STACK_API_V1) async def inspect_provider(self, provider_id: str) -> ProviderInfo: """Get detailed information about a specific provider. diff --git a/llama_stack/apis/safety/safety.py b/llama_stack/apis/safety/safety.py index 25ee03ec1..98367e9b0 100644 --- a/llama_stack/apis/safety/safety.py +++ b/llama_stack/apis/safety/safety.py @@ -11,6 +11,7 @@ from pydantic import BaseModel, Field from llama_stack.apis.inference import Message from llama_stack.apis.shields import Shield +from llama_stack.apis.version import LLAMA_STACK_API_V1 from llama_stack.providers.utils.telemetry.trace_protocol import trace_protocol from llama_stack.schema_utils import json_schema_type, webmethod @@ -97,7 +98,7 @@ class ShieldStore(Protocol): class Safety(Protocol): shield_store: ShieldStore - @webmethod(route="/safety/run-shield", method="POST") + @webmethod(route="/safety/run-shield", method="POST", level=LLAMA_STACK_API_V1) async def run_shield( self, shield_id: str, @@ -113,7 +114,7 @@ class Safety(Protocol): """ ... - @webmethod(route="/openai/v1/moderations", method="POST") + @webmethod(route="/openai/v1/moderations", method="POST", level=LLAMA_STACK_API_V1) async def run_moderation(self, input: str | list[str], model: str) -> ModerationObject: """Classifies if text and/or image inputs are potentially harmful. :param input: Input (or inputs) to classify. diff --git a/llama_stack/apis/scoring/scoring.py b/llama_stack/apis/scoring/scoring.py index 8ca599b44..03d943e94 100644 --- a/llama_stack/apis/scoring/scoring.py +++ b/llama_stack/apis/scoring/scoring.py @@ -9,6 +9,7 @@ from typing import Any, Protocol, runtime_checkable from pydantic import BaseModel from llama_stack.apis.scoring_functions import ScoringFn, ScoringFnParams +from llama_stack.apis.version import LLAMA_STACK_API_V1 from llama_stack.schema_utils import json_schema_type, webmethod # mapping of metric to value @@ -61,7 +62,7 @@ class ScoringFunctionStore(Protocol): class Scoring(Protocol): scoring_function_store: ScoringFunctionStore - @webmethod(route="/scoring/score-batch", method="POST") + @webmethod(route="/scoring/score-batch", method="POST", level=LLAMA_STACK_API_V1) async def score_batch( self, dataset_id: str, @@ -77,7 +78,7 @@ class Scoring(Protocol): """ ... - @webmethod(route="/scoring/score", method="POST") + @webmethod(route="/scoring/score", method="POST", level=LLAMA_STACK_API_V1) async def score( self, input_rows: list[dict[str, Any]], diff --git a/llama_stack/apis/scoring_functions/scoring_functions.py b/llama_stack/apis/scoring_functions/scoring_functions.py index 541067766..fe49723ab 100644 --- a/llama_stack/apis/scoring_functions/scoring_functions.py +++ b/llama_stack/apis/scoring_functions/scoring_functions.py @@ -18,6 +18,7 @@ from pydantic import BaseModel, Field from llama_stack.apis.common.type_system import ParamType from llama_stack.apis.resource import Resource, ResourceType +from llama_stack.apis.version import LLAMA_STACK_API_V1 from llama_stack.schema_utils import json_schema_type, register_schema, webmethod @@ -160,7 +161,7 @@ class ListScoringFunctionsResponse(BaseModel): @runtime_checkable class ScoringFunctions(Protocol): - @webmethod(route="/scoring-functions", method="GET") + @webmethod(route="/scoring-functions", method="GET", level=LLAMA_STACK_API_V1) async def list_scoring_functions(self) -> ListScoringFunctionsResponse: """List all scoring functions. @@ -168,7 +169,7 @@ class ScoringFunctions(Protocol): """ ... - @webmethod(route="/scoring-functions/{scoring_fn_id:path}", method="GET") + @webmethod(route="/scoring-functions/{scoring_fn_id:path}", method="GET", level=LLAMA_STACK_API_V1) async def get_scoring_function(self, scoring_fn_id: str, /) -> ScoringFn: """Get a scoring function by its ID. @@ -177,7 +178,7 @@ class ScoringFunctions(Protocol): """ ... - @webmethod(route="/scoring-functions", method="POST") + @webmethod(route="/scoring-functions", method="POST", level=LLAMA_STACK_API_V1) async def register_scoring_function( self, scoring_fn_id: str, @@ -198,7 +199,7 @@ class ScoringFunctions(Protocol): """ ... - @webmethod(route="/scoring-functions/{scoring_fn_id:path}", method="DELETE") + @webmethod(route="/scoring-functions/{scoring_fn_id:path}", method="DELETE", level=LLAMA_STACK_API_V1) async def unregister_scoring_function(self, scoring_fn_id: str) -> None: """Unregister a scoring function. diff --git a/llama_stack/apis/shields/shields.py b/llama_stack/apis/shields/shields.py index ec1b85349..5d967cf02 100644 --- a/llama_stack/apis/shields/shields.py +++ b/llama_stack/apis/shields/shields.py @@ -9,6 +9,7 @@ from typing import Any, Literal, Protocol, runtime_checkable from pydantic import BaseModel from llama_stack.apis.resource import Resource, ResourceType +from llama_stack.apis.version import LLAMA_STACK_API_V1 from llama_stack.providers.utils.telemetry.trace_protocol import trace_protocol from llama_stack.schema_utils import json_schema_type, webmethod @@ -49,7 +50,7 @@ class ListShieldsResponse(BaseModel): @runtime_checkable @trace_protocol class Shields(Protocol): - @webmethod(route="/shields", method="GET") + @webmethod(route="/shields", method="GET", level=LLAMA_STACK_API_V1) async def list_shields(self) -> ListShieldsResponse: """List all shields. @@ -57,7 +58,7 @@ class Shields(Protocol): """ ... - @webmethod(route="/shields/{identifier:path}", method="GET") + @webmethod(route="/shields/{identifier:path}", method="GET", level=LLAMA_STACK_API_V1) async def get_shield(self, identifier: str) -> Shield: """Get a shield by its identifier. @@ -66,7 +67,7 @@ class Shields(Protocol): """ ... - @webmethod(route="/shields", method="POST") + @webmethod(route="/shields", method="POST", level=LLAMA_STACK_API_V1) async def register_shield( self, shield_id: str, @@ -84,7 +85,7 @@ class Shields(Protocol): """ ... - @webmethod(route="/shields/{identifier:path}", method="DELETE") + @webmethod(route="/shields/{identifier:path}", method="DELETE", level=LLAMA_STACK_API_V1) async def unregister_shield(self, identifier: str) -> None: """Unregister a shield. diff --git a/llama_stack/apis/synthetic_data_generation/synthetic_data_generation.py b/llama_stack/apis/synthetic_data_generation/synthetic_data_generation.py index a7af44b28..c13e2c17c 100644 --- a/llama_stack/apis/synthetic_data_generation/synthetic_data_generation.py +++ b/llama_stack/apis/synthetic_data_generation/synthetic_data_generation.py @@ -10,6 +10,7 @@ from typing import Any, Protocol from pydantic import BaseModel from llama_stack.apis.inference import Message +from llama_stack.apis.version import LLAMA_STACK_API_V1 from llama_stack.schema_utils import json_schema_type, webmethod @@ -59,7 +60,7 @@ class SyntheticDataGenerationResponse(BaseModel): class SyntheticDataGeneration(Protocol): - @webmethod(route="/synthetic-data-generation/generate") + @webmethod(route="/synthetic-data-generation/generate", level=LLAMA_STACK_API_V1) def synthetic_data_generate( self, dialogs: list[Message], diff --git a/llama_stack/apis/telemetry/telemetry.py b/llama_stack/apis/telemetry/telemetry.py index 8d1b5d697..29dd23989 100644 --- a/llama_stack/apis/telemetry/telemetry.py +++ b/llama_stack/apis/telemetry/telemetry.py @@ -16,6 +16,7 @@ from typing import ( from pydantic import BaseModel, Field +from llama_stack.apis.version import LLAMA_STACK_API_V1 from llama_stack.models.llama.datatypes import Primitive from llama_stack.schema_utils import json_schema_type, register_schema, webmethod @@ -412,7 +413,7 @@ class QueryMetricsResponse(BaseModel): @runtime_checkable class Telemetry(Protocol): - @webmethod(route="/telemetry/events", method="POST") + @webmethod(route="/telemetry/events", method="POST", level=LLAMA_STACK_API_V1) async def log_event( self, event: Event, @@ -425,7 +426,7 @@ class Telemetry(Protocol): """ ... - @webmethod(route="/telemetry/traces", method="POST", required_scope=REQUIRED_SCOPE) + @webmethod(route="/telemetry/traces", method="POST", required_scope=REQUIRED_SCOPE, level=LLAMA_STACK_API_V1) async def query_traces( self, attribute_filters: list[QueryCondition] | None = None, @@ -443,7 +444,9 @@ class Telemetry(Protocol): """ ... - @webmethod(route="/telemetry/traces/{trace_id:path}", method="GET", required_scope=REQUIRED_SCOPE) + @webmethod( + route="/telemetry/traces/{trace_id:path}", method="GET", required_scope=REQUIRED_SCOPE, level=LLAMA_STACK_API_V1 + ) async def get_trace(self, trace_id: str) -> Trace: """Get a trace by its ID. @@ -453,7 +456,10 @@ class Telemetry(Protocol): ... @webmethod( - route="/telemetry/traces/{trace_id:path}/spans/{span_id:path}", method="GET", required_scope=REQUIRED_SCOPE + route="/telemetry/traces/{trace_id:path}/spans/{span_id:path}", + method="GET", + required_scope=REQUIRED_SCOPE, + level=LLAMA_STACK_API_V1, ) async def get_span(self, trace_id: str, span_id: str) -> Span: """Get a span by its ID. @@ -464,7 +470,12 @@ class Telemetry(Protocol): """ ... - @webmethod(route="/telemetry/spans/{span_id:path}/tree", method="POST", required_scope=REQUIRED_SCOPE) + @webmethod( + route="/telemetry/spans/{span_id:path}/tree", + method="POST", + required_scope=REQUIRED_SCOPE, + level=LLAMA_STACK_API_V1, + ) async def get_span_tree( self, span_id: str, @@ -480,7 +491,7 @@ class Telemetry(Protocol): """ ... - @webmethod(route="/telemetry/spans", method="POST", required_scope=REQUIRED_SCOPE) + @webmethod(route="/telemetry/spans", method="POST", required_scope=REQUIRED_SCOPE, level=LLAMA_STACK_API_V1) async def query_spans( self, attribute_filters: list[QueryCondition], @@ -496,7 +507,7 @@ class Telemetry(Protocol): """ ... - @webmethod(route="/telemetry/spans/export", method="POST") + @webmethod(route="/telemetry/spans/export", method="POST", level=LLAMA_STACK_API_V1) async def save_spans_to_dataset( self, attribute_filters: list[QueryCondition], @@ -513,7 +524,9 @@ class Telemetry(Protocol): """ ... - @webmethod(route="/telemetry/metrics/{metric_name}", method="POST", required_scope=REQUIRED_SCOPE) + @webmethod( + route="/telemetry/metrics/{metric_name}", method="POST", required_scope=REQUIRED_SCOPE, level=LLAMA_STACK_API_V1 + ) async def query_metrics( self, metric_name: str, diff --git a/llama_stack/apis/tools/rag_tool.py b/llama_stack/apis/tools/rag_tool.py index 651016bd1..ed7847e23 100644 --- a/llama_stack/apis/tools/rag_tool.py +++ b/llama_stack/apis/tools/rag_tool.py @@ -11,6 +11,7 @@ from pydantic import BaseModel, Field, field_validator from typing_extensions import runtime_checkable from llama_stack.apis.common.content_types import URL, InterleavedContent +from llama_stack.apis.version import LLAMA_STACK_API_V1 from llama_stack.providers.utils.telemetry.trace_protocol import trace_protocol from llama_stack.schema_utils import json_schema_type, register_schema, webmethod @@ -185,7 +186,7 @@ class RAGQueryConfig(BaseModel): @runtime_checkable @trace_protocol class RAGToolRuntime(Protocol): - @webmethod(route="/tool-runtime/rag-tool/insert", method="POST") + @webmethod(route="/tool-runtime/rag-tool/insert", method="POST", level=LLAMA_STACK_API_V1) async def insert( self, documents: list[RAGDocument], @@ -200,7 +201,7 @@ class RAGToolRuntime(Protocol): """ ... - @webmethod(route="/tool-runtime/rag-tool/query", method="POST") + @webmethod(route="/tool-runtime/rag-tool/query", method="POST", level=LLAMA_STACK_API_V1) async def query( self, content: InterleavedContent, diff --git a/llama_stack/apis/tools/tools.py b/llama_stack/apis/tools/tools.py index 52b86375a..12bd9efa2 100644 --- a/llama_stack/apis/tools/tools.py +++ b/llama_stack/apis/tools/tools.py @@ -12,6 +12,7 @@ from typing_extensions import runtime_checkable from llama_stack.apis.common.content_types import URL, InterleavedContent from llama_stack.apis.resource import Resource, ResourceType +from llama_stack.apis.version import LLAMA_STACK_API_V1 from llama_stack.providers.utils.telemetry.trace_protocol import trace_protocol from llama_stack.schema_utils import json_schema_type, webmethod @@ -151,7 +152,7 @@ class ListToolDefsResponse(BaseModel): @runtime_checkable @trace_protocol class ToolGroups(Protocol): - @webmethod(route="/toolgroups", method="POST") + @webmethod(route="/toolgroups", method="POST", level=LLAMA_STACK_API_V1) async def register_tool_group( self, toolgroup_id: str, @@ -168,7 +169,7 @@ class ToolGroups(Protocol): """ ... - @webmethod(route="/toolgroups/{toolgroup_id:path}", method="GET") + @webmethod(route="/toolgroups/{toolgroup_id:path}", method="GET", level=LLAMA_STACK_API_V1) async def get_tool_group( self, toolgroup_id: str, @@ -180,7 +181,7 @@ class ToolGroups(Protocol): """ ... - @webmethod(route="/toolgroups", method="GET") + @webmethod(route="/toolgroups", method="GET", level=LLAMA_STACK_API_V1) async def list_tool_groups(self) -> ListToolGroupsResponse: """List tool groups with optional provider. @@ -188,7 +189,7 @@ class ToolGroups(Protocol): """ ... - @webmethod(route="/tools", method="GET") + @webmethod(route="/tools", method="GET", level=LLAMA_STACK_API_V1) async def list_tools(self, toolgroup_id: str | None = None) -> ListToolsResponse: """List tools with optional tool group. @@ -197,7 +198,7 @@ class ToolGroups(Protocol): """ ... - @webmethod(route="/tools/{tool_name:path}", method="GET") + @webmethod(route="/tools/{tool_name:path}", method="GET", level=LLAMA_STACK_API_V1) async def get_tool( self, tool_name: str, @@ -209,7 +210,7 @@ class ToolGroups(Protocol): """ ... - @webmethod(route="/toolgroups/{toolgroup_id:path}", method="DELETE") + @webmethod(route="/toolgroups/{toolgroup_id:path}", method="DELETE", level=LLAMA_STACK_API_V1) async def unregister_toolgroup( self, toolgroup_id: str, @@ -238,7 +239,7 @@ class ToolRuntime(Protocol): rag_tool: RAGToolRuntime | None = None # TODO: This needs to be renamed once OPEN API generator name conflict issue is fixed. - @webmethod(route="/tool-runtime/list-tools", method="GET") + @webmethod(route="/tool-runtime/list-tools", method="GET", level=LLAMA_STACK_API_V1) async def list_runtime_tools( self, tool_group_id: str | None = None, mcp_endpoint: URL | None = None ) -> ListToolDefsResponse: @@ -250,7 +251,7 @@ class ToolRuntime(Protocol): """ ... - @webmethod(route="/tool-runtime/invoke", method="POST") + @webmethod(route="/tool-runtime/invoke", method="POST", level=LLAMA_STACK_API_V1) async def invoke_tool(self, tool_name: str, kwargs: dict[str, Any]) -> ToolInvocationResult: """Run a tool with the given arguments. diff --git a/llama_stack/apis/vector_dbs/vector_dbs.py b/llama_stack/apis/vector_dbs/vector_dbs.py index 47820fa0f..521d129c6 100644 --- a/llama_stack/apis/vector_dbs/vector_dbs.py +++ b/llama_stack/apis/vector_dbs/vector_dbs.py @@ -9,6 +9,7 @@ from typing import Literal, Protocol, runtime_checkable from pydantic import BaseModel from llama_stack.apis.resource import Resource, ResourceType +from llama_stack.apis.version import LLAMA_STACK_API_V1 from llama_stack.providers.utils.telemetry.trace_protocol import trace_protocol from llama_stack.schema_utils import json_schema_type, webmethod @@ -65,7 +66,7 @@ class ListVectorDBsResponse(BaseModel): @runtime_checkable @trace_protocol class VectorDBs(Protocol): - @webmethod(route="/vector-dbs", method="GET") + @webmethod(route="/vector-dbs", method="GET", level=LLAMA_STACK_API_V1) async def list_vector_dbs(self) -> ListVectorDBsResponse: """List all vector databases. @@ -73,7 +74,7 @@ class VectorDBs(Protocol): """ ... - @webmethod(route="/vector-dbs/{vector_db_id:path}", method="GET") + @webmethod(route="/vector-dbs/{vector_db_id:path}", method="GET", level=LLAMA_STACK_API_V1) async def get_vector_db( self, vector_db_id: str, @@ -85,7 +86,7 @@ class VectorDBs(Protocol): """ ... - @webmethod(route="/vector-dbs", method="POST") + @webmethod(route="/vector-dbs", method="POST", level=LLAMA_STACK_API_V1) async def register_vector_db( self, vector_db_id: str, @@ -107,7 +108,7 @@ class VectorDBs(Protocol): """ ... - @webmethod(route="/vector-dbs/{vector_db_id:path}", method="DELETE") + @webmethod(route="/vector-dbs/{vector_db_id:path}", method="DELETE", level=LLAMA_STACK_API_V1) async def unregister_vector_db(self, vector_db_id: str) -> None: """Unregister a vector database. diff --git a/llama_stack/apis/vector_io/vector_io.py b/llama_stack/apis/vector_io/vector_io.py index 3e8065cfb..2850863c4 100644 --- a/llama_stack/apis/vector_io/vector_io.py +++ b/llama_stack/apis/vector_io/vector_io.py @@ -15,6 +15,7 @@ from pydantic import BaseModel, Field from llama_stack.apis.inference import InterleavedContent from llama_stack.apis.vector_dbs import VectorDB +from llama_stack.apis.version import LLAMA_STACK_API_V1 from llama_stack.providers.utils.telemetry.trace_protocol import trace_protocol from llama_stack.providers.utils.vector_io.vector_utils import generate_chunk_id from llama_stack.schema_utils import json_schema_type, webmethod @@ -437,7 +438,7 @@ class VectorIO(Protocol): # this will just block now until chunks are inserted, but it should # probably return a Job instance which can be polled for completion - @webmethod(route="/vector-io/insert", method="POST") + @webmethod(route="/vector-io/insert", method="POST", level=LLAMA_STACK_API_V1) async def insert_chunks( self, vector_db_id: str, @@ -455,7 +456,7 @@ class VectorIO(Protocol): """ ... - @webmethod(route="/vector-io/query", method="POST") + @webmethod(route="/vector-io/query", method="POST", level=LLAMA_STACK_API_V1) async def query_chunks( self, vector_db_id: str, @@ -472,7 +473,7 @@ class VectorIO(Protocol): ... # OpenAI Vector Stores API endpoints - @webmethod(route="/openai/v1/vector_stores", method="POST") + @webmethod(route="/openai/v1/vector_stores", method="POST", level=LLAMA_STACK_API_V1) async def openai_create_vector_store( self, name: str | None = None, @@ -498,7 +499,7 @@ class VectorIO(Protocol): """ ... - @webmethod(route="/openai/v1/vector_stores", method="GET") + @webmethod(route="/openai/v1/vector_stores", method="GET", level=LLAMA_STACK_API_V1) async def openai_list_vector_stores( self, limit: int | None = 20, @@ -516,7 +517,7 @@ class VectorIO(Protocol): """ ... - @webmethod(route="/openai/v1/vector_stores/{vector_store_id}", method="GET") + @webmethod(route="/openai/v1/vector_stores/{vector_store_id}", method="GET", level=LLAMA_STACK_API_V1) async def openai_retrieve_vector_store( self, vector_store_id: str, @@ -528,7 +529,7 @@ class VectorIO(Protocol): """ ... - @webmethod(route="/openai/v1/vector_stores/{vector_store_id}", method="POST") + @webmethod(route="/openai/v1/vector_stores/{vector_store_id}", method="POST", level=LLAMA_STACK_API_V1) async def openai_update_vector_store( self, vector_store_id: str, @@ -546,7 +547,7 @@ class VectorIO(Protocol): """ ... - @webmethod(route="/openai/v1/vector_stores/{vector_store_id}", method="DELETE") + @webmethod(route="/openai/v1/vector_stores/{vector_store_id}", method="DELETE", level=LLAMA_STACK_API_V1) async def openai_delete_vector_store( self, vector_store_id: str, @@ -558,7 +559,7 @@ class VectorIO(Protocol): """ ... - @webmethod(route="/openai/v1/vector_stores/{vector_store_id}/search", method="POST") + @webmethod(route="/openai/v1/vector_stores/{vector_store_id}/search", method="POST", level=LLAMA_STACK_API_V1) async def openai_search_vector_store( self, vector_store_id: str, @@ -584,7 +585,7 @@ class VectorIO(Protocol): """ ... - @webmethod(route="/openai/v1/vector_stores/{vector_store_id}/files", method="POST") + @webmethod(route="/openai/v1/vector_stores/{vector_store_id}/files", method="POST", level=LLAMA_STACK_API_V1) async def openai_attach_file_to_vector_store( self, vector_store_id: str, @@ -602,7 +603,7 @@ class VectorIO(Protocol): """ ... - @webmethod(route="/openai/v1/vector_stores/{vector_store_id}/files", method="GET") + @webmethod(route="/openai/v1/vector_stores/{vector_store_id}/files", method="GET", level=LLAMA_STACK_API_V1) async def openai_list_files_in_vector_store( self, vector_store_id: str, @@ -624,7 +625,9 @@ class VectorIO(Protocol): """ ... - @webmethod(route="/openai/v1/vector_stores/{vector_store_id}/files/{file_id}", method="GET") + @webmethod( + route="/openai/v1/vector_stores/{vector_store_id}/files/{file_id}", method="GET", level=LLAMA_STACK_API_V1 + ) async def openai_retrieve_vector_store_file( self, vector_store_id: str, @@ -638,7 +641,11 @@ class VectorIO(Protocol): """ ... - @webmethod(route="/openai/v1/vector_stores/{vector_store_id}/files/{file_id}/content", method="GET") + @webmethod( + route="/openai/v1/vector_stores/{vector_store_id}/files/{file_id}/content", + method="GET", + level=LLAMA_STACK_API_V1, + ) async def openai_retrieve_vector_store_file_contents( self, vector_store_id: str, @@ -652,7 +659,9 @@ class VectorIO(Protocol): """ ... - @webmethod(route="/openai/v1/vector_stores/{vector_store_id}/files/{file_id}", method="POST") + @webmethod( + route="/openai/v1/vector_stores/{vector_store_id}/files/{file_id}", method="POST", level=LLAMA_STACK_API_V1 + ) async def openai_update_vector_store_file( self, vector_store_id: str, @@ -668,7 +677,9 @@ class VectorIO(Protocol): """ ... - @webmethod(route="/openai/v1/vector_stores/{vector_store_id}/files/{file_id}", method="DELETE") + @webmethod( + route="/openai/v1/vector_stores/{vector_store_id}/files/{file_id}", method="DELETE", level=LLAMA_STACK_API_V1 + ) async def openai_delete_vector_store_file( self, vector_store_id: str, diff --git a/llama_stack/apis/version.py b/llama_stack/apis/version.py index 53ad6a854..6af039b1f 100644 --- a/llama_stack/apis/version.py +++ b/llama_stack/apis/version.py @@ -4,4 +4,6 @@ # This source code is licensed under the terms described in the LICENSE file in # the root directory of this source tree. -LLAMA_STACK_API_VERSION = "v1" +LLAMA_STACK_API_V1 = "v1" +LLAMA_STACK_API_V1BETA = "v1beta" +LLAMA_STACK_API_V1ALPHA = "v1alpha" diff --git a/llama_stack/core/client.py b/llama_stack/core/client.py index 03e4fb051..49e01794e 100644 --- a/llama_stack/core/client.py +++ b/llama_stack/core/client.py @@ -15,7 +15,6 @@ import httpx from pydantic import BaseModel, parse_obj_as from termcolor import cprint -from llama_stack.apis.version import LLAMA_STACK_API_VERSION from llama_stack.providers.datatypes import RemoteProviderConfig _CLIENT_CLASSES = {} @@ -114,7 +113,24 @@ def create_api_client_class(protocol) -> type: break kwargs[param.name] = args[i] - url = f"{self.base_url}/{LLAMA_STACK_API_VERSION}/{webmethod.route.lstrip('/')}" + # Get all webmethods for this method (supports multiple decorators) + webmethods = getattr(method, "__webmethods__", []) + + if not webmethods: + raise RuntimeError(f"Method {method} has no webmethod decorators") + + # Choose the preferred webmethod (non-deprecated if available) + preferred_webmethod = None + for wm in webmethods: + if not getattr(wm, "deprecated", False): + preferred_webmethod = wm + break + + # If no non-deprecated found, use the first one + if preferred_webmethod is None: + preferred_webmethod = webmethods[0] + + url = f"{self.base_url}/{preferred_webmethod.level}/{preferred_webmethod.route.lstrip('/')}" def convert(value): if isinstance(value, list): diff --git a/llama_stack/core/server/routes.py b/llama_stack/core/server/routes.py index 7baf20da5..4970d0bf8 100644 --- a/llama_stack/core/server/routes.py +++ b/llama_stack/core/server/routes.py @@ -14,7 +14,6 @@ from starlette.routing import Route from llama_stack.apis.datatypes import Api, ExternalApiSpec from llama_stack.apis.tools import RAGToolRuntime, SpecialToolGroup -from llama_stack.apis.version import LLAMA_STACK_API_VERSION from llama_stack.core.resolver import api_protocol_map from llama_stack.schema_utils import WebMethod @@ -54,22 +53,23 @@ def get_all_api_routes( protocol_methods.append((f"{tool_group.value}.{name}", method)) for name, method in protocol_methods: - if not hasattr(method, "__webmethod__"): + # Get all webmethods for this method (supports multiple decorators) + webmethods = getattr(method, "__webmethods__", []) + if not webmethods: continue - # The __webmethod__ attribute is dynamically added by the @webmethod decorator - # mypy doesn't know about this dynamic attribute, so we ignore the attr-defined error - webmethod = method.__webmethod__ # type: ignore[attr-defined] - path = f"/{LLAMA_STACK_API_VERSION}/{webmethod.route.lstrip('/')}" - if webmethod.method == hdrs.METH_GET: - http_method = hdrs.METH_GET - elif webmethod.method == hdrs.METH_DELETE: - http_method = hdrs.METH_DELETE - else: - http_method = hdrs.METH_POST - routes.append( - (Route(path=path, methods=[http_method], name=name, endpoint=None), webmethod) - ) # setting endpoint to None since don't use a Router object + # Create routes for each webmethod decorator + for webmethod in webmethods: + path = f"/{webmethod.level}/{webmethod.route.lstrip('/')}" + if webmethod.method == hdrs.METH_GET: + http_method = hdrs.METH_GET + elif webmethod.method == hdrs.METH_DELETE: + http_method = hdrs.METH_DELETE + else: + http_method = hdrs.METH_POST + routes.append( + (Route(path=path, methods=[http_method], name=name, endpoint=None), webmethod) + ) # setting endpoint to None since don't use a Router object apis[api] = routes diff --git a/llama_stack/core/server/tracing.py b/llama_stack/core/server/tracing.py index c48fc4d33..4c6df5b42 100644 --- a/llama_stack/core/server/tracing.py +++ b/llama_stack/core/server/tracing.py @@ -45,6 +45,14 @@ class TracingMiddleware: logger.debug(f"No matching route found for path: {path}, falling back to FastAPI") return await self.app(scope, receive, send) + # Log deprecation warning if route is deprecated + if getattr(webmethod, "deprecated", False): + logger.warning( + f"DEPRECATED ROUTE USED: {scope.get('method', 'GET')} {path} - " + f"This route is deprecated and may be removed in a future version. " + f"Please check the docs for the supported version." + ) + trace_attributes = {"__location__": "server", "raw_path": path} # Extract W3C trace context headers and store as trace attributes diff --git a/llama_stack/schema_utils.py b/llama_stack/schema_utils.py index 93382a881..4f8b4edff 100644 --- a/llama_stack/schema_utils.py +++ b/llama_stack/schema_utils.py @@ -13,6 +13,7 @@ from .strong_typing.schema import json_schema_type, register_schema # noqa: F40 @dataclass class WebMethod: + level: str | None = None route: str | None = None public: bool = False request_examples: list[Any] | None = None @@ -23,6 +24,7 @@ class WebMethod: descriptive_name: str | None = None experimental: bool | None = False required_scope: str | None = None + deprecated: bool | None = False T = TypeVar("T", bound=Callable[..., Any]) @@ -31,6 +33,7 @@ T = TypeVar("T", bound=Callable[..., Any]) def webmethod( route: str | None = None, method: str | None = None, + level: str | None = None, public: bool | None = False, request_examples: list[Any] | None = None, response_examples: list[Any] | None = None, @@ -38,6 +41,7 @@ def webmethod( descriptive_name: str | None = None, experimental: bool | None = False, required_scope: str | None = None, + deprecated: bool | None = False, ) -> Callable[[T], T]: """ Decorator that supplies additional metadata to an endpoint operation function. @@ -51,9 +55,10 @@ def webmethod( """ def wrap(func: T) -> T: - func.__webmethod__ = WebMethod( # type: ignore + webmethod_obj = WebMethod( route=route, method=method, + level=level, public=public or False, request_examples=request_examples, response_examples=response_examples, @@ -61,7 +66,16 @@ def webmethod( descriptive_name=descriptive_name, experimental=experimental, required_scope=required_scope, + deprecated=deprecated, ) + + # Store all webmethods in a list to support multiple decorators + if not hasattr(func, "__webmethods__"): + func.__webmethods__ = [] # type: ignore + func.__webmethods__.append(webmethod_obj) # type: ignore + + # Keep the last one as __webmethod__ for backwards compatibility + func.__webmethod__ = webmethod_obj # type: ignore return func return wrap diff --git a/tests/external/llama-stack-api-weather/src/llama_stack_api_weather/weather.py b/tests/external/llama-stack-api-weather/src/llama_stack_api_weather/weather.py index de1427bfd..e97a9d8fb 100644 --- a/tests/external/llama-stack-api-weather/src/llama_stack_api_weather/weather.py +++ b/tests/external/llama-stack-api-weather/src/llama_stack_api_weather/weather.py @@ -6,6 +6,7 @@ from typing import Protocol +from llama_stack.apis.version import LLAMA_STACK_API_V1 from llama_stack.providers.datatypes import Api, ProviderSpec, RemoteProviderSpec from llama_stack.schema_utils import webmethod @@ -28,7 +29,7 @@ class WeatherProvider(Protocol): A protocol for the Weather API. """ - @webmethod(route="/weather/locations", method="GET") + @webmethod(route="/weather/locations", method="GET", level=LLAMA_STACK_API_V1) async def get_available_locations() -> dict[str, list[str]]: """ Get the available locations.
- -