diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index a9fd555..39007d4 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -43,3 +43,42 @@ jobs: name: dist path: dist/ retention-days: 7 + + modelparams-pkg: + name: modelparams package (codegen + build + tests) + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + + - name: Set up Node + uses: actions/setup-node@v4 + with: + node-version: "20" + cache: "npm" + + - name: Install dependencies + run: npm ci + + - name: Codegen + run: npm run codegen --workspace=modelparams + + - name: Verify generated files are in sync + run: | + if ! git diff --quiet -- packages/modelparams/src/generated; then + echo "::error::Generated files in packages/modelparams/src/generated are out of date." + echo "Run \`npm run codegen --workspace=modelparams\` locally and commit the result." + git diff --stat -- packages/modelparams/src/generated + exit 1 + fi + + - name: Typecheck package + run: npm run typecheck --workspace=modelparams + + - name: Build package + run: npm run build --workspace=modelparams + + - name: Runtime tests + run: npm test --workspace=modelparams + + - name: Type-level tests (tsd) + run: npm run test:types --workspace=modelparams diff --git a/.github/workflows/release-modelparams.yml b/.github/workflows/release-modelparams.yml new file mode 100644 index 0000000..fdeb19c --- /dev/null +++ b/.github/workflows/release-modelparams.yml @@ -0,0 +1,137 @@ +name: Release modelparams + +# Publishes the `modelparams` npm package when the catalog or codegen pipeline +# changes on main. Versioning is driven by the same diff classifier +# (`findRemovedParams`) that `param-guard.yml` uses on PRs: +# • any param removed on a still-existing model → MAJOR +# • any other catalog change → PATCH +# • no semantic catalog change → skipped +# +# Provenance: signed via npm OIDC. Configure a trusted publisher for the +# `modelparams` package on npmjs.com (Settings → Trusted Publishers → GitHub +# Actions → org=mnfst, repo=modelparams.dev, workflow=release-modelparams.yml). +# Once configured, `NPM_TOKEN` is no longer needed. + +on: + push: + branches: [main] + paths: + - "models/**" + - "packages/modelparams/**" + - "src/schema/model.ts" + - "src/data/load.ts" + - "src/data/removals.ts" + - "src/data/git-baseline.ts" + - ".github/workflows/release-modelparams.yml" + workflow_dispatch: + inputs: + force_level: + description: "Force bump level (overrides auto-detect)" + required: false + type: choice + options: ["", "patch", "major"] + default: "" + +concurrency: + group: release-modelparams + cancel-in-progress: false + +jobs: + publish: + name: Build and publish + runs-on: ubuntu-latest + permissions: + contents: write # tag + auto-bump commit + id-token: write # npm OIDC provenance + steps: + - name: Check out repo + uses: actions/checkout@v4 + with: + fetch-depth: 0 # full history for diff-based version bump + + - name: Set up Node + uses: actions/setup-node@v4 + with: + node-version: "20" + cache: "npm" + registry-url: "https://registry.npmjs.org" + + - name: Install dependencies + run: npm ci + + - name: Validate catalog + run: npm run validate + + - name: Typecheck (root) + run: npm run typecheck + + - name: Codegen + run: npm run codegen --workspace=modelparams + + - name: Build package + run: npm run build --workspace=modelparams + + - name: Runtime tests + run: npm test --workspace=modelparams + + - name: Type-level tests (tsd) + run: npm run test:types --workspace=modelparams + + - name: Compute next version + id: bump + run: npx tsx packages/modelparams/scripts/compute-version.ts + env: + BASE_REF: "HEAD~1" + + - name: Apply forced level (workflow_dispatch) + if: github.event_name == 'workflow_dispatch' && inputs.force_level != '' + id: force + run: | + CURRENT=$(node -p "require('./packages/modelparams/package.json').version") + case "${{ inputs.force_level }}" in + major) NEXT=$(node -e "const [M]=process.argv[1].split('.');console.log(\`\${+M+1}.0.0\`)" "$CURRENT");; + patch) NEXT=$(node -e "const [M,m,p]=process.argv[1].split('.');console.log(\`\${M}.\${m}.\${+p+1}\`)" "$CURRENT");; + esac + echo "level=${{ inputs.force_level }}" >> "$GITHUB_OUTPUT" + echo "next=$NEXT" >> "$GITHUB_OUTPUT" + + - name: Resolve effective version + id: resolved + run: | + LEVEL="${{ steps.force.outputs.level || steps.bump.outputs.level }}" + NEXT="${{ steps.force.outputs.next || steps.bump.outputs.next }}" + echo "level=$LEVEL" >> "$GITHUB_OUTPUT" + echo "next=$NEXT" >> "$GITHUB_OUTPUT" + + - name: Skip publish (no semantic change) + if: steps.resolved.outputs.next == '' + run: echo "::notice::No semantic catalog change since HEAD~1 — nothing to publish." + + - name: Bump package.json + commit + tag + if: steps.resolved.outputs.next != '' + env: + NEXT: ${{ steps.resolved.outputs.next }} + run: | + cd packages/modelparams + npm version "$NEXT" --no-git-tag-version + cd ../.. + git config user.name "modelparams-bot" + git config user.email "bot@modelparams.dev" + git add packages/modelparams/package.json packages/modelparams/src/generated + git commit -m "release: modelparams@$NEXT" + git tag "modelparams@$NEXT" + git push origin HEAD:main --follow-tags + + - name: Publish to npm + if: steps.resolved.outputs.next != '' + run: npm publish --workspace=modelparams --provenance --access public + env: + NODE_AUTH_TOKEN: ${{ secrets.NPM_TOKEN }} + + - name: Create GitHub release + if: steps.resolved.outputs.next != '' + uses: softprops/action-gh-release@v2 + with: + tag_name: "modelparams@${{ steps.resolved.outputs.next }}" + name: "modelparams@${{ steps.resolved.outputs.next }}" + generate_release_notes: true diff --git a/.gitignore b/.gitignore index a74c524..fa02f28 100644 --- a/.gitignore +++ b/.gitignore @@ -1,6 +1,8 @@ node_modules/ /dist/ /build/ +packages/*/dist/ +packages/*/*.tsbuildinfo .cache/ *.log .DS_Store diff --git a/.prettierignore b/.prettierignore index 4d29162..730675a 100644 --- a/.prettierignore +++ b/.prettierignore @@ -4,3 +4,5 @@ build/ coverage/ *.min.js *.min.css +packages/modelparams/src/generated/ +packages/*/dist/ diff --git a/package-lock.json b/package-lock.json index 2abf59c..762f526 100644 --- a/package-lock.json +++ b/package-lock.json @@ -8,6 +8,9 @@ "name": "modelparams.dev", "version": "0.1.0", "license": "MIT", + "workspaces": [ + "packages/*" + ], "dependencies": { "ejs": "^3.1.10", "express": "^4.19.2", @@ -52,6 +55,38 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/@babel/code-frame": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.29.7.tgz", + "integrity": "sha512-Aup7aUOfpbAUg2ROOJN6Iw5f9DMBlzu0mIkm/malLQFN/YQgO48wCj0Kxa3sEHJvPVFg7siR+qRInwXd2qhQKw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-validator-identifier": "^7.29.7", + "js-tokens": "^4.0.0", + "picocolors": "^1.1.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/code-frame/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==", + "dev": true, + "license": "MIT" + }, + "node_modules/@babel/helper-validator-identifier": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.29.7.tgz", + "integrity": "sha512-qehxGkRj55h/ff8EMaJ+cYhyaKlHIxqYDn682wQD7RNp9UujOQsHog2uS0r2vzr4pW+sXf90NeeayjcNaX3fFg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, "node_modules/@esbuild/aix-ppc64": { "version": "0.21.5", "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.21.5.tgz", @@ -1090,6 +1125,16 @@ "dev": true, "license": "MIT" }, + "node_modules/@tsd/typescript": { + "version": "5.4.5", + "resolved": "https://registry.npmjs.org/@tsd/typescript/-/typescript-5.4.5.tgz", + "integrity": "sha512-saiCxzHRhUrRxQV2JhH580aQUZiKQUXI38FcAcikcfOomAil4G4lxT0RfrrKywoAYP/rqAdYXYmNRLppcd+hQQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=14.17" + } + }, "node_modules/@types/body-parser": { "version": "1.19.6", "resolved": "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.19.6.tgz", @@ -1118,6 +1163,17 @@ "dev": true, "license": "MIT" }, + "node_modules/@types/eslint": { + "version": "7.29.0", + "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-7.29.0.tgz", + "integrity": "sha512-VNcvioYDH8/FxaeTKkM4/TiTwt6pBV9E3OfGmvaw8tPl0rrHCJ4Ll15HRT+pMiFAf/MLQvAzC+6RzUMEL9Ceng==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/estree": "*", + "@types/json-schema": "*" + } + }, "node_modules/@types/estree": { "version": "1.0.9", "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.9.tgz", @@ -1165,6 +1221,13 @@ "dev": true, "license": "MIT" }, + "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==", + "dev": true, + "license": "MIT" + }, "node_modules/@types/mime": { "version": "1.3.5", "resolved": "https://registry.npmjs.org/@types/mime/-/mime-1.3.5.tgz", @@ -1172,6 +1235,13 @@ "dev": true, "license": "MIT" }, + "node_modules/@types/minimist": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/@types/minimist/-/minimist-1.2.5.tgz", + "integrity": "sha512-hov8bUuiLiyFPGyFPE1lwWhmzYbirOXQNNo40+y3zow8aFVTeyn3VWL0VFFfdNddA8S4Vf0Tc062rzyNr7Paag==", + "dev": true, + "license": "MIT" + }, "node_modules/@types/node": { "version": "20.19.41", "resolved": "https://registry.npmjs.org/@types/node/-/node-20.19.41.tgz", @@ -1182,6 +1252,13 @@ "undici-types": "~6.21.0" } }, + "node_modules/@types/normalize-package-data": { + "version": "2.4.4", + "resolved": "https://registry.npmjs.org/@types/normalize-package-data/-/normalize-package-data-2.4.4.tgz", + "integrity": "sha512-37i+OaWTh9qeK4LSHPsyRC7NahnGotNuZvjLSgcPzblpHB3rrCJxAOgI5gCdKm7coonsaX1Of0ILiTcnZjbfxA==", + "dev": true, + "license": "MIT" + }, "node_modules/@types/qs": { "version": "6.15.1", "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.15.1.tgz", @@ -1690,6 +1767,16 @@ "node": ">=8" } }, + "node_modules/arrify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz", + "integrity": "sha512-3CYzex9M9FGQjCGMGyi6/31c8GJbgb0qGyrx5HWxPd0aCwh4cB2YjMb2Xf9UuoogrMrlO9cTqnB5rI5GHZTcUA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/assertion-error": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/assertion-error/-/assertion-error-1.1.0.tgz", @@ -1928,6 +2015,16 @@ "node": ">=6" } }, + "node_modules/camelcase": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", + "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, "node_modules/camelcase-css": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/camelcase-css/-/camelcase-css-2.0.1.tgz", @@ -1938,6 +2035,24 @@ "node": ">= 6" } }, + "node_modules/camelcase-keys": { + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/camelcase-keys/-/camelcase-keys-6.2.2.tgz", + "integrity": "sha512-YrwaA0vEKazPBkn0ipTiMpSajYDSe+KjQfrjhcBMxJt/znbvlHd8Pw/Vamaz5EB4Wfhs3SUR3Z9mwRu/P3s3Yg==", + "dev": true, + "license": "MIT", + "dependencies": { + "camelcase": "^5.3.1", + "map-obj": "^4.0.0", + "quick-lru": "^4.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/caniuse-lite": { "version": "1.0.30001793", "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001793.tgz", @@ -2199,6 +2314,43 @@ } } }, + "node_modules/decamelize": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", + "integrity": "sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/decamelize-keys": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/decamelize-keys/-/decamelize-keys-1.1.1.tgz", + "integrity": "sha512-WiPxgEirIV0/eIOMcnFBA3/IJZAZqKnwAwWyvvdi4lsr1WCN22nhdf/3db3DoZcUjTV2SqfzIwNyp6y2xs3nmg==", + "dev": true, + "license": "MIT", + "dependencies": { + "decamelize": "^1.1.0", + "map-obj": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/decamelize-keys/node_modules/map-obj": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-1.0.1.tgz", + "integrity": "sha512-7N/q3lyZ+LVCp7PzuxrJr4KMbBE2hW7BT7YNia330OFxIf4d3r5zVpicP2650l7CPN6RM9zOJRl3NGpqSiw3Eg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/deep-eql": { "version": "4.1.4", "resolved": "https://registry.npmjs.org/deep-eql/-/deep-eql-4.1.4.tgz", @@ -2359,6 +2511,16 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "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==", + "dev": true, + "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", @@ -2514,6 +2676,97 @@ "url": "https://opencollective.com/eslint" } }, + "node_modules/eslint-formatter-pretty": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/eslint-formatter-pretty/-/eslint-formatter-pretty-4.1.0.tgz", + "integrity": "sha512-IsUTtGxF1hrH6lMWiSl1WbGaiP01eT6kzywdY1U+zLc0MP+nwEnUiS9UI8IaOTUhTeQJLlCEWIbXINBH4YJbBQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/eslint": "^7.2.13", + "ansi-escapes": "^4.2.1", + "chalk": "^4.1.0", + "eslint-rule-docs": "^1.1.5", + "log-symbols": "^4.0.0", + "plur": "^4.0.0", + "string-width": "^4.2.0", + "supports-hyperlinks": "^2.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/eslint-formatter-pretty/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==", + "dev": true, + "license": "MIT", + "dependencies": { + "type-fest": "^0.21.3" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/eslint-formatter-pretty/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==", + "dev": true, + "license": "MIT" + }, + "node_modules/eslint-formatter-pretty/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==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/eslint-formatter-pretty/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==", + "dev": true, + "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/eslint-formatter-pretty/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==", + "dev": true, + "license": "(MIT OR CC0-1.0)", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/eslint-rule-docs": { + "version": "1.1.235", + "resolved": "https://registry.npmjs.org/eslint-rule-docs/-/eslint-rule-docs-1.1.235.tgz", + "integrity": "sha512-+TQ+x4JdTnDoFEXXb3fDvfGOwnyNV7duH8fXWTPD1ieaBmB8omj7Gw/pMBBu4uI2uJCCU8APDaQJzWuXnTsH4A==", + "dev": true, + "license": "MIT" + }, "node_modules/eslint-scope": { "version": "7.2.2", "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.2.2.tgz", @@ -3174,6 +3427,16 @@ "dev": true, "license": "MIT" }, + "node_modules/hard-rejection": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/hard-rejection/-/hard-rejection-2.1.0.tgz", + "integrity": "sha512-VIZB+ibDhx7ObhAe7OVtoEbuP4h/MuOTHJ+J8h/eBXotJYl0fBgR72xDFCKgIh22OJZIOVNxBMWuhAr10r8HdA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, "node_modules/has-flag": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", @@ -3208,6 +3471,19 @@ "node": ">= 0.4" } }, + "node_modules/hosted-git-info": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-4.1.0.tgz", + "integrity": "sha512-kyCuEOWjJqZuDbRHzL8V93NzQhwIB71oFWSyzVo+KPZI+pnQPPxucdkrOZvkLRnrf5URsQM+IJ09Dw29cRALIA==", + "dev": true, + "license": "ISC", + "dependencies": { + "lru-cache": "^6.0.0" + }, + "engines": { + "node": ">=10" + } + }, "node_modules/http-errors": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.1.tgz", @@ -3303,6 +3579,16 @@ "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==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, "node_modules/inflight": { "version": "1.0.6", "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", @@ -3330,6 +3616,23 @@ "node": ">= 0.10" } }, + "node_modules/irregular-plurals": { + "version": "3.5.0", + "resolved": "https://registry.npmjs.org/irregular-plurals/-/irregular-plurals-3.5.0.tgz", + "integrity": "sha512-1ANGLZ+Nkv1ptFb2pa8oG8Lem4krflKuX/gINiHJHjJUKaJHk/SXk5x6K3J+39/p0h1RQ2saROclJJ+QLvETCQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "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==", + "dev": true, + "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", @@ -3415,6 +3718,16 @@ "node": ">=8" } }, + "node_modules/is-plain-obj": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-1.1.0.tgz", + "integrity": "sha512-yvkRyxmFKEOQ4pNXCmJG5AEQNlXJS5LaONXo5/cLdTZdWvsZ1ioJEonLGAosKlMWE8lwUy/bJzMjcw8az73+Fg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/is-stream": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-3.0.0.tgz", @@ -3428,6 +3741,19 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/is-unicode-supported": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz", + "integrity": "sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/isexe": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", @@ -3452,6 +3778,32 @@ "node": ">=10" } }, + "node_modules/jest-diff": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-29.7.0.tgz", + "integrity": "sha512-LMIgiIrhigmPrs03JHpxUh2yISK3vLFPkAodPeo0+BuF7wA2FoQbkEg1u8gBYBThncu7e1oEDUfIXVuTqLRUjw==", + "dev": true, + "license": "MIT", + "dependencies": { + "chalk": "^4.0.0", + "diff-sequences": "^29.6.3", + "jest-get-type": "^29.6.3", + "pretty-format": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-get-type": { + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-29.6.3.tgz", + "integrity": "sha512-zrteXnqYxfQh7l5FHyL38jL39di8H8rHoecLH3JNxH3BwOrBsNeabdap5e0I23lD4HHI8W5VFBZqG4Eaq5LNcw==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, "node_modules/jiti": { "version": "1.21.7", "resolved": "https://registry.npmjs.org/jiti/-/jiti-1.21.7.tgz", @@ -3488,6 +3840,13 @@ "dev": true, "license": "MIT" }, + "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==", + "dev": true, + "license": "MIT" + }, "node_modules/json-schema-traverse": { "version": "0.4.1", "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", @@ -3512,6 +3871,16 @@ "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==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/levn": { "version": "0.4.1", "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", @@ -3645,6 +4014,23 @@ "dev": true, "license": "MIT" }, + "node_modules/log-symbols": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.1.0.tgz", + "integrity": "sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==", + "dev": true, + "license": "MIT", + "dependencies": { + "chalk": "^4.1.0", + "is-unicode-supported": "^0.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/log-update": { "version": "6.1.0", "resolved": "https://registry.npmjs.org/log-update/-/log-update-6.1.0.tgz", @@ -3750,6 +4136,19 @@ "get-func-name": "^2.0.1" } }, + "node_modules/lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dev": true, + "license": "ISC", + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, "node_modules/magic-string": { "version": "0.30.21", "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.21.tgz", @@ -3760,6 +4159,19 @@ "@jridgewell/sourcemap-codec": "^1.5.5" } }, + "node_modules/map-obj": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-4.3.0.tgz", + "integrity": "sha512-hdN1wVrZbb29eBGiGjJbeP8JbKjq1urkHJ/LIP/NY48MZ1QVXUsQBV1G1zvYFHn1XE06cwjBsOI2K3Ulnj1YXQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/math-intrinsics": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz", @@ -3778,6 +4190,46 @@ "node": ">= 0.6" } }, + "node_modules/meow": { + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/meow/-/meow-9.0.0.tgz", + "integrity": "sha512-+obSblOQmRhcyBt62furQqRAQpNyWXo8BuQ5bN7dG8wmwQ+vwHKp/rCFD4CrTP8CsDQD1sjoZ94K417XEUk8IQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/minimist": "^1.2.0", + "camelcase-keys": "^6.2.2", + "decamelize": "^1.2.0", + "decamelize-keys": "^1.1.0", + "hard-rejection": "^2.1.0", + "minimist-options": "4.1.0", + "normalize-package-data": "^3.0.0", + "read-pkg-up": "^7.0.1", + "redent": "^3.0.0", + "trim-newlines": "^3.0.0", + "type-fest": "^0.18.0", + "yargs-parser": "^20.2.3" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/meow/node_modules/type-fest": { + "version": "0.18.1", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.18.1.tgz", + "integrity": "sha512-OIAYXk8+ISY+qTOwkHtKqzAuxchoMiD9Udx+FSGQDuiRR+PJKJHc2NJAXlbhkGwTt/4/nKZxELY1w3ReWOL8mw==", + "dev": true, + "license": "(MIT OR CC0-1.0)", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/merge-descriptors": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.3.tgz", @@ -3886,6 +4338,16 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/min-indent": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/min-indent/-/min-indent-1.0.1.tgz", + "integrity": "sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, "node_modules/minimatch": { "version": "9.0.9", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.9.tgz", @@ -3902,6 +4364,21 @@ "url": "https://github.com/sponsors/isaacs" } }, + "node_modules/minimist-options": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/minimist-options/-/minimist-options-4.1.0.tgz", + "integrity": "sha512-Q4r8ghd80yhO/0j1O3B2BjweX3fiHg9cdOwjJd2J76Q135c+NDxGCqdYKQ1SKBuFfgWbAUzBfvYjPUEeNgqN1A==", + "dev": true, + "license": "MIT", + "dependencies": { + "arrify": "^1.0.1", + "is-plain-obj": "^1.1.0", + "kind-of": "^6.0.3" + }, + "engines": { + "node": ">= 6" + } + }, "node_modules/mlly": { "version": "1.8.2", "resolved": "https://registry.npmjs.org/mlly/-/mlly-1.8.2.tgz", @@ -3922,6 +4399,10 @@ "dev": true, "license": "MIT" }, + "node_modules/modelparams": { + "resolved": "packages/modelparams", + "link": true + }, "node_modules/ms": { "version": "2.1.3", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", @@ -3982,6 +4463,22 @@ "dev": true, "license": "MIT" }, + "node_modules/normalize-package-data": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-3.0.3.tgz", + "integrity": "sha512-p2W1sgqij3zMMyRC067Dg16bfzVH+w7hyegmpIvZ4JNjqtGOVAIvLmjBx3yP7YTe9vKJgkoNOPjwQGogDoMXFA==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "hosted-git-info": "^4.0.1", + "is-core-module": "^2.5.0", + "semver": "^7.3.4", + "validate-npm-package-license": "^3.0.1" + }, + "engines": { + "node": ">=10" + } + }, "node_modules/normalize-path": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", @@ -4141,6 +4638,16 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/p-try": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", + "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, "node_modules/parent-module": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", @@ -4154,6 +4661,25 @@ "node": ">=6" } }, + "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==", + "dev": true, + "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/parseurl": { "version": "1.3.3", "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", @@ -4304,6 +4830,22 @@ "dev": true, "license": "MIT" }, + "node_modules/plur": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/plur/-/plur-4.0.0.tgz", + "integrity": "sha512-4UGewrYgqDFw9vV6zNV+ADmPAUAfJPKtGvb/VdpQAx25X5f3xXdGdyOEVFwkl8Hl/tl7+xbeHqSEM+D5/TirUg==", + "dev": true, + "license": "MIT", + "dependencies": { + "irregular-plurals": "^3.2.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/postcss": { "version": "8.5.15", "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.15.tgz", @@ -4580,6 +5122,16 @@ ], "license": "MIT" }, + "node_modules/quick-lru": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-4.0.1.tgz", + "integrity": "sha512-ARhCpm70fzdcvNQfPoy49IaanKkTlRWF2JMzqhcJbhSFRZv7nPTvZJdcY7301IPmvW+/p0RgIWnQDLJxifsQ7g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, "node_modules/range-parser": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", @@ -4621,6 +5173,146 @@ "pify": "^2.3.0" } }, + "node_modules/read-pkg": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-5.2.0.tgz", + "integrity": "sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/normalize-package-data": "^2.4.0", + "normalize-package-data": "^2.5.0", + "parse-json": "^5.0.0", + "type-fest": "^0.6.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/read-pkg-up": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-7.0.1.tgz", + "integrity": "sha512-zK0TB7Xd6JpCLmlLmufqykGE+/TlOePD6qKClNW7hHDKFh/J7/7gCWGR7joEQEW1bKq3a3yUZSObOoWLFQ4ohg==", + "dev": true, + "license": "MIT", + "dependencies": { + "find-up": "^4.1.0", + "read-pkg": "^5.2.0", + "type-fest": "^0.8.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/read-pkg-up/node_modules/find-up": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "dev": true, + "license": "MIT", + "dependencies": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/read-pkg-up/node_modules/locate-path": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "dev": true, + "license": "MIT", + "dependencies": { + "p-locate": "^4.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/read-pkg-up/node_modules/p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "dev": true, + "license": "MIT", + "dependencies": { + "p-try": "^2.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/read-pkg-up/node_modules/p-locate": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "dev": true, + "license": "MIT", + "dependencies": { + "p-limit": "^2.2.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/read-pkg-up/node_modules/type-fest": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz", + "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==", + "dev": true, + "license": "(MIT OR CC0-1.0)", + "engines": { + "node": ">=8" + } + }, + "node_modules/read-pkg/node_modules/hosted-git-info": { + "version": "2.8.9", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.9.tgz", + "integrity": "sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==", + "dev": true, + "license": "ISC" + }, + "node_modules/read-pkg/node_modules/normalize-package-data": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz", + "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "hosted-git-info": "^2.1.4", + "resolve": "^1.10.0", + "semver": "2 || 3 || 4 || 5", + "validate-npm-package-license": "^3.0.1" + } + }, + "node_modules/read-pkg/node_modules/semver": { + "version": "5.7.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", + "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver" + } + }, + "node_modules/read-pkg/node_modules/type-fest": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.6.0.tgz", + "integrity": "sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg==", + "dev": true, + "license": "(MIT OR CC0-1.0)", + "engines": { + "node": ">=8" + } + }, "node_modules/readdirp": { "version": "3.6.0", "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", @@ -4634,6 +5326,20 @@ "node": ">=8.10.0" } }, + "node_modules/redent": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/redent/-/redent-3.0.0.tgz", + "integrity": "sha512-6tDA8g98We0zd0GvVeMT9arEOnTw9qM03L9cJXaCjrip1OO764RDBLBfrB4cwzNGDj5OA5ioymC9GkizgWJDUg==", + "dev": true, + "license": "MIT", + "dependencies": { + "indent-string": "^4.0.0", + "strip-indent": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/resolve": { "version": "1.22.12", "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.12.tgz", @@ -5074,6 +5780,42 @@ "node": ">=0.10.0" } }, + "node_modules/spdx-correct": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.2.0.tgz", + "integrity": "sha512-kN9dJbvnySHULIluDHy32WHRUu3Og7B9sbY7tsFLctQkIqnMh3hErYgdMjTYuqmcXX+lK5T1lnUt3G7zNswmZA==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "spdx-expression-parse": "^3.0.0", + "spdx-license-ids": "^3.0.0" + } + }, + "node_modules/spdx-exceptions": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.5.0.tgz", + "integrity": "sha512-PiU42r+xO4UbUS1buo3LPJkjlO7430Xn5SVAhdpzzsPHsjbYVflnnFdATgabnLude+Cqu25p6N+g2lw/PFsa4w==", + "dev": true, + "license": "CC-BY-3.0" + }, + "node_modules/spdx-expression-parse": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz", + "integrity": "sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "spdx-exceptions": "^2.1.0", + "spdx-license-ids": "^3.0.0" + } + }, + "node_modules/spdx-license-ids": { + "version": "3.0.23", + "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.23.tgz", + "integrity": "sha512-CWLcCCH7VLu13TgOH+r8p1O/Znwhqv/dbb6lqWy67G+pT1kHmeD/+V36AVb/vq8QMIQwVShJ6Ssl5FPh0fuSdw==", + "dev": true, + "license": "CC0-1.0" + }, "node_modules/stackback": { "version": "0.0.2", "resolved": "https://registry.npmjs.org/stackback/-/stackback-0.0.2.tgz", @@ -5180,6 +5922,19 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/strip-indent": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-3.0.0.tgz", + "integrity": "sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "min-indent": "^1.0.0" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/strip-json-comments": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", @@ -5252,6 +6007,20 @@ "node": ">=8" } }, + "node_modules/supports-hyperlinks": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/supports-hyperlinks/-/supports-hyperlinks-2.3.0.tgz", + "integrity": "sha512-RpsAZlpWcDwOPQA22aCH4J0t7L8JmAvsCxfOSEwm7cQs3LshN36QaTkwd70DnBOXDWGssw2eUoc8CaRWT0XunA==", + "dev": true, + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0", + "supports-color": "^7.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", @@ -5443,6 +6212,16 @@ "node": ">=0.6" } }, + "node_modules/trim-newlines": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/trim-newlines/-/trim-newlines-3.0.1.tgz", + "integrity": "sha512-c1PTsA3tYrIsLGkJkzHF+w9F2EyxfXGo4UyJc4pFL++FMjnq0HJS69T3M7d//gKrFKwy429bouPescbjecU+Zw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, "node_modules/ts-api-utils": { "version": "1.4.3", "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-1.4.3.tgz", @@ -5463,6 +6242,28 @@ "dev": true, "license": "Apache-2.0" }, + "node_modules/tsd": { + "version": "0.31.2", + "resolved": "https://registry.npmjs.org/tsd/-/tsd-0.31.2.tgz", + "integrity": "sha512-VplBAQwvYrHzVihtzXiUVXu5bGcr7uH1juQZ1lmKgkuGNGT+FechUCqmx9/zk7wibcqR2xaNEwCkDyKh+VVZnQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@tsd/typescript": "~5.4.3", + "eslint-formatter-pretty": "^4.1.0", + "globby": "^11.0.1", + "jest-diff": "^29.0.3", + "meow": "^9.0.0", + "path-exists": "^4.0.0", + "read-pkg-up": "^7.0.0" + }, + "bin": { + "tsd": "dist/cli.js" + }, + "engines": { + "node": ">=14.16" + } + }, "node_modules/tsx": { "version": "4.22.3", "resolved": "https://registry.npmjs.org/tsx/-/tsx-4.22.3.tgz", @@ -6058,6 +6859,17 @@ "node": ">= 0.4.0" } }, + "node_modules/validate-npm-package-license": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz", + "integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "spdx-correct": "^3.0.0", + "spdx-expression-parse": "^3.0.0" + } + }, "node_modules/vary": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", @@ -6326,6 +7138,13 @@ "dev": true, "license": "ISC" }, + "node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true, + "license": "ISC" + }, "node_modules/yaml": { "version": "2.9.0", "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.9.0.tgz", @@ -6342,6 +7161,16 @@ "url": "https://github.com/sponsors/eemeli" } }, + "node_modules/yargs-parser": { + "version": "20.2.9", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.9.tgz", + "integrity": "sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=10" + } + }, "node_modules/yocto-queue": { "version": "0.1.0", "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", @@ -6372,6 +7201,16 @@ "peerDependencies": { "zod": "^3.25.28 || ^4" } + }, + "packages/modelparams": { + "version": "0.0.0", + "license": "MIT", + "devDependencies": { + "tsd": "^0.31.0" + }, + "engines": { + "node": ">=18" + } } } } diff --git a/package.json b/package.json index ecc107b..282ef6c 100644 --- a/package.json +++ b/package.json @@ -5,6 +5,9 @@ "type": "module", "private": true, "license": "MIT", + "workspaces": [ + "packages/*" + ], "repository": { "type": "git", "url": "git+https://github.com/mnfst/modelparams.dev.git" diff --git a/packages/modelparams/LICENSE b/packages/modelparams/LICENSE new file mode 100644 index 0000000..ca8c3f8 --- /dev/null +++ b/packages/modelparams/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2026 modelparams.dev contributors + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/packages/modelparams/README.md b/packages/modelparams/README.md new file mode 100644 index 0000000..78a299c --- /dev/null +++ b/packages/modelparams/README.md @@ -0,0 +1,134 @@ +# modelparams + +> **Typed LLM model parameters for TypeScript.** Generated from the open [modelparams.dev](https://modelparams.dev) catalog. + +```bash +npm install modelparams +``` + +Stop guessing which knobs each model accepts. Get autocomplete on every parameter, compile-time errors on typos and unsupported settings, and the catalog's defaults at runtime — for every provider in one tiny zero-dependency package. + +## Why + +You're calling `claude-opus-4-7` with `frequency_penalty` set. TypeScript doesn't tell you the param doesn't exist. The provider silently ignores it. Your evals drift. Multiply by every model in your router. + +`modelparams` makes the catalog of supported parameters a first-class TypeScript citizen, the same way `tokenlens` does for context windows and pricing. + +## Usage + +### Per-model parameter typing — the headline feature + +```ts +import type { ParamsOf } from "modelparams"; +import Anthropic from "@anthropic-ai/sdk"; + +const params: ParamsOf<"anthropic/claude-opus-4-7"> = { + max_tokens: 8192, + temperature: 0.7, + "thinking.type": "enabled", + "thinking.budget_tokens": 4096, + // frequency_penalty: 0.5, // ❌ TYPE ERROR — Anthropic doesn't expose this knob +}; + +await new Anthropic().messages.create({ + model: "claude-opus-4-7", + messages: [...], + ...params, +}); +``` + +Autocomplete on every key. Autocomplete on every enum value. A compile error on the typo before it ships. + +### Defaults at runtime + +```ts +import { getDefaults } from "modelparams"; + +const defaults = getDefaults("anthropic/claude-haiku-4-5-20251001"); +// { max_tokens: 4096, temperature: 1, top_p: 1, top_k: 0, "thinking.type": "disabled", ... } + +const params = { ...defaults, temperature: 0.2 }; +``` + +### Model picker UI + +```ts +import { listModels, getModel } from "modelparams"; + +for (const id of listModels({ provider: "anthropic" })) { + const m = getModel(id); + m.params.filter((p) => p.group === "sampling").forEach((p) => renderSlider(p)); +} +``` + +### Discover what a model supports + +```ts +import { getParam } from "modelparams"; + +const thinking = getParam("anthropic/claude-opus-4-7", "thinking.type"); +if (thinking?.type === "enum") { + console.log(thinking.values); // ["disabled", "enabled"] +} +``` + +## API + +### Types + +| Type | Description | +| -------------------- | ------------------------------------------------------------------------- | +| `ParamsOf` | Optional parameters for model `Id`. The headline type. | +| `StrictParamsOf` | Same shape, every field required. | +| `ModelId` | Union of all `"provider/model"` ids (including `-subscription` variants). | +| `Provider` | Union of provider slugs (`"anthropic"`, `"openai"`, …). | +| `ParamsById` | Mapped type: `{ [Id in ModelId]: ParamsByIdMap[Id] }`. | +| `CatalogEntry` | The full catalog object for one model. | + +### Functions + +| Function | Description | +| -------------------------- | ----------------------------------------------------------- | +| `getModel(id)` | The full catalog entry for a model id. | +| `getDefaults(id)` | The catalog-declared defaults. | +| `getParam(id, path)` | A single parameter's definition (range, enum values, etc.). | +| `listModels({ provider })` | List model ids, optionally filtered by provider. | +| `listAllModels()` | The full `CATALOG` array. | + +### Constants + +| Constant | Description | +| ----------- | -------------------------------------------------- | +| `MODEL_IDS` | Frozen tuple of every model id (drives `ModelId`). | +| `PROVIDERS` | Frozen tuple of provider slugs. | +| `CATALOG` | Frozen array of every catalog entry. | +| `BY_ID` | Frozen `Record` lookup. | +| `DEFAULTS` | Frozen per-model defaults. | + +### Subpath imports (tree-shaking) + +```ts +import { MODEL_IDS } from "modelparams/model-ids"; // types-only consumers +import { DEFAULTS } from "modelparams/defaults"; // just defaults +import { CATALOG } from "modelparams/data"; // full runtime catalog +``` + +## How it's built + +- Source of truth: the YAML catalog at [github.com/mnfst/modelparams.dev/tree/main/models](https://github.com/mnfst/modelparams.dev/tree/main/models). +- A codegen script reads the catalog through the same Zod schema the website uses and emits four `.ts` files (`model-ids`, `params-by-id`, `defaults`, `data`). +- Every catalog change on `main` auto-publishes a new version. Removed params bump major; everything else is patch. Provenance is signed via npm OIDC. + +## Versioning + +| Catalog change | npm bump | +| -------------------------------------------------------------- | --------- | +| Parameter removed from a still-existing model | **major** | +| Anything else (new model, new param, range or default changed) | **patch** | +| No semantic change | skipped | + +Pin `^x.y.z` to get non-breaking updates as new models and parameters land. + +## License + +MIT diff --git a/packages/modelparams/package.json b/packages/modelparams/package.json new file mode 100644 index 0000000..fceaaab --- /dev/null +++ b/packages/modelparams/package.json @@ -0,0 +1,76 @@ +{ + "name": "modelparams", + "version": "0.0.0", + "description": "TypeScript types and runtime data for LLM model parameters. Generated from the modelparams.dev open catalog.", + "keywords": [ + "llm", + "ai", + "openai", + "anthropic", + "claude", + "gpt", + "gemini", + "model-parameters", + "types", + "typescript", + "catalog" + ], + "license": "MIT", + "author": "modelparams.dev contributors", + "homepage": "https://modelparams.dev", + "repository": { + "type": "git", + "url": "git+https://github.com/mnfst/modelparams.dev.git", + "directory": "packages/modelparams" + }, + "bugs": { + "url": "https://github.com/mnfst/modelparams.dev/issues" + }, + "type": "module", + "sideEffects": false, + "main": "./dist/index.js", + "types": "./dist/index.d.ts", + "exports": { + ".": { + "types": "./dist/index.d.ts", + "import": "./dist/index.js" + }, + "./data": { + "types": "./dist/generated/data.d.ts", + "import": "./dist/generated/data.js" + }, + "./defaults": { + "types": "./dist/generated/defaults.d.ts", + "import": "./dist/generated/defaults.js" + }, + "./model-ids": { + "types": "./dist/generated/model-ids.d.ts", + "import": "./dist/generated/model-ids.js" + }, + "./package.json": "./package.json" + }, + "files": [ + "dist", + "README.md", + "LICENSE" + ], + "engines": { + "node": ">=18" + }, + "scripts": { + "codegen": "tsx scripts/codegen.ts", + "prebuild": "npm run codegen", + "build": "tsc -p tsconfig.build.json", + "typecheck": "tsc --noEmit", + "test": "vitest run", + "pretest:types": "npm run build", + "test:types": "tsd", + "prepublishOnly": "npm run build && npm run test && npm run test:types" + }, + "devDependencies": { + "tsd": "^0.31.0" + }, + "tsd": { + "directory": "test-d" + } +} diff --git a/packages/modelparams/scripts/codegen.ts b/packages/modelparams/scripts/codegen.ts new file mode 100644 index 0000000..3ae2ca9 --- /dev/null +++ b/packages/modelparams/scripts/codegen.ts @@ -0,0 +1,134 @@ +import fs from "node:fs/promises"; +import path from "node:path"; +import { fileURLToPath } from "node:url"; +import { loadAllModels } from "../../../src/data/load.js"; +import { authSuffix, modelId, type Model, type Parameter } from "../../../src/schema/model.js"; + +const here = path.dirname(fileURLToPath(import.meta.url)); +const OUT_DIR = path.resolve(here, "..", "src", "generated"); + +const HEADER = + "// AUTO-GENERATED by packages/modelparams/scripts/codegen.ts. Do not edit by hand.\n" + + "// Source of truth: the YAML catalog under /models in modelparams.dev.\n\n"; + +function tsType(p: Parameter): string { + switch (p.type) { + case "boolean": + return "boolean"; + case "integer": + case "number": + return "number"; + case "string": + return "string"; + case "enum": + return p.values.map((v) => JSON.stringify(v)).join(" | "); + } +} + +function quoteKey(k: string): string { + return /^[A-Za-z_$][\w$]*$/.test(k) ? k : JSON.stringify(k); +} + +function emitParamsByIdEntry(m: Model): string { + const id = modelId(m); + const fields = m.params.map((p) => ` ${quoteKey(p.path)}: ${tsType(p)};`).join("\n"); + return ` ${JSON.stringify(id)}: {\n${fields}\n };`; +} + +function emitDefaultsEntry(m: Model): string { + const id = modelId(m); + const entries = m.params + .filter((p) => p.default !== undefined) + .map((p) => ` ${quoteKey(p.path)}: ${JSON.stringify(p.default)},`) + .join("\n"); + return entries.length > 0 + ? ` ${JSON.stringify(id)}: {\n${entries}\n },` + : ` ${JSON.stringify(id)}: {},`; +} + +async function main(): Promise { + const { models, issues } = await loadAllModels(); + + if (issues.length > 0) { + console.error(`Catalog has ${issues.length} validation issue(s); refusing to codegen:`); + for (const issue of issues) { + console.error(` ${issue.file}: ${issue.message}`); + } + process.exit(1); + } + + await fs.mkdir(OUT_DIR, { recursive: true }); + + const ids = models.map(modelId); + const providers = [...new Set(models.map((m) => m.provider))].sort(); + + // 1. model-ids.ts — ModelId union + Provider union + await fs.writeFile( + path.join(OUT_DIR, "model-ids.ts"), + HEADER + + `export const MODEL_IDS = ${JSON.stringify(ids, null, 2)} as const;\n\n` + + `export type ModelId = (typeof MODEL_IDS)[number];\n\n` + + `export const PROVIDERS = ${JSON.stringify(providers, null, 2)} as const;\n\n` + + `export type Provider = (typeof PROVIDERS)[number];\n`, + ); + + // 2. params-by-id.ts — full parameter shape per model id (the typing payload) + await fs.writeFile( + path.join(OUT_DIR, "params-by-id.ts"), + HEADER + + `/**\n` + + ` * Full parameter shape for each model id. The headline \`ParamsOf\` type in\n` + + ` * \`../types\` is \`Partial\` so consumers can set only the\n` + + ` * parameters they want to override.\n` + + ` */\n` + + `export type ParamsById = {\n${models.map(emitParamsByIdEntry).join("\n")}\n};\n`, + ); + + // 3. defaults.ts — per-model defaults from the catalog + await fs.writeFile( + path.join(OUT_DIR, "defaults.ts"), + HEADER + + `import type { ModelId } from "./model-ids.js";\n` + + `import type { ParamsById } from "./params-by-id.js";\n\n` + + `export const DEFAULTS = {\n${models.map(emitDefaultsEntry).join("\n")}\n} as const satisfies { [K in ModelId]: Partial };\n`, + ); + + // 4. data.ts — runtime catalog (full Model objects + BY_ID lookup) + await fs.writeFile( + path.join(OUT_DIR, "data.ts"), + HEADER + + `import type { ModelId } from "./model-ids.js";\n\n` + + `export const CATALOG = ${JSON.stringify(models, null, 2)} as const;\n\n` + + `export type CatalogEntry = (typeof CATALOG)[number];\n\n` + + `function authSuffix(authType: CatalogEntry["authType"]): "" | "-subscription" {\n` + + ` return authType === "api_key" ? "" : "-subscription";\n` + + `}\n\n` + + `export const BY_ID: Readonly> = Object.freeze(\n` + + ` Object.fromEntries(\n` + + ` CATALOG.map((m) => [\`\${m.provider}/\${m.model}\${authSuffix(m.authType)}\`, m]),\n` + + ` ),\n` + + `) as Readonly>;\n`, + ); + + // 5. index.ts — barrel for the generated dir + await fs.writeFile( + path.join(OUT_DIR, "index.ts"), + HEADER + + `export * from "./model-ids.js";\n` + + `export * from "./params-by-id.js";\n` + + `export * from "./defaults.js";\n` + + `export * from "./data.js";\n`, + ); + + // Reference authSuffix so its `import` isn't tree-shaken from the type-checker's view. + void authSuffix; + + console.log( + `codegen: wrote 5 files for ${models.length} models across ${providers.length} providers → ${path.relative(process.cwd(), OUT_DIR)}/`, + ); +} + +main().catch((err) => { + console.error("codegen crashed:", err); + process.exit(1); +}); diff --git a/packages/modelparams/scripts/compute-version.ts b/packages/modelparams/scripts/compute-version.ts new file mode 100644 index 0000000..c114357 --- /dev/null +++ b/packages/modelparams/scripts/compute-version.ts @@ -0,0 +1,83 @@ +import fs from "node:fs"; +import path from "node:path"; +import { fileURLToPath } from "node:url"; +import { loadAllModels } from "../../../src/data/load.js"; +import { loadModelsAtRef, refExists } from "../../../src/data/git-baseline.js"; +import { findRemovedParams } from "../../../src/data/removals.js"; +import { canonicalCatalog, decideBump, bumpVersion } from "./lib/version.js"; + +const here = path.dirname(fileURLToPath(import.meta.url)); +const PKG_DIR = path.resolve(here, ".."); + +function resolveBaseRef(): string | null { + const candidates = [ + process.env.BASE_REF, + process.env.GITHUB_BASE_REF ? `origin/${process.env.GITHUB_BASE_REF}` : undefined, + "HEAD~1", + "origin/main", + "main", + ]; + for (const ref of candidates) { + if (ref && refExists(ref)) return ref; + } + return null; +} + +function readPackageVersion(): string { + const pkg = JSON.parse(fs.readFileSync(path.join(PKG_DIR, "package.json"), "utf8")) as { + version: string; + }; + return pkg.version; +} + +function emit(name: string, value: string): void { + const target = process.env.GITHUB_OUTPUT; + const line = `${name}=${value}\n`; + if (target) { + fs.appendFileSync(target, line); + } + process.stdout.write(line); +} + +async function main(): Promise { + const { models: current, issues } = await loadAllModels(); + if (issues.length > 0) { + console.error(`Catalog has ${issues.length} validation issue(s); aborting:`); + for (const i of issues) console.error(` ${i.file}: ${i.message}`); + process.exit(1); + } + + const baseRef = resolveBaseRef(); + if (!baseRef) { + const next = bumpVersion(readPackageVersion(), "patch"); + console.error("No base ref available — treating as patch release."); + emit("level", "patch"); + emit("next", next); + return; + } + + const base = await loadModelsAtRef(baseRef); + const removals = findRemovedParams(base, current); + const level = decideBump({ + baseCanon: canonicalCatalog(base), + currentCanon: canonicalCatalog(current), + hasRemovals: removals.length > 0, + }); + + if (level === null) { + console.error(`No semantic catalog changes vs ${baseRef} — skipping publish.`); + emit("level", ""); + emit("next", ""); + return; + } + + const next = bumpVersion(readPackageVersion(), level); + console.error(`Catalog change vs ${baseRef}: bump ${level} → ${next}`); + emit("level", level); + emit("next", next); +} + +main().catch((err) => { + console.error("compute-version crashed:", err); + process.exit(1); +}); diff --git a/packages/modelparams/scripts/lib/version.ts b/packages/modelparams/scripts/lib/version.ts new file mode 100644 index 0000000..cf4b1b9 --- /dev/null +++ b/packages/modelparams/scripts/lib/version.ts @@ -0,0 +1,53 @@ +import { modelId, type Model } from "../../../../src/schema/model.js"; + +export type BumpLevel = "major" | "patch"; + +/** + * Canonicalize a catalog for value-equality comparison. We sort params by path + * and drop nothing — any meaningful catalog edit (added/removed param, changed + * range, new default, edited description) flips the canonical string. + */ +export function canonicalCatalog(models: Model[]): string { + const sorted = [...models] + .map((m) => ({ + id: modelId(m), + provider: m.provider, + model: m.model, + authType: m.authType, + params: [...m.params].sort((a, b) => a.path.localeCompare(b.path)), + })) + .sort((a, b) => a.id.localeCompare(b.id)); + return JSON.stringify(sorted); +} + +/** + * Decide whether a catalog change warrants a semver bump. + * + * - Any removed parameter (on a still-existing model) → major. + * - Any other catalog change → patch. + * - No semantic catalog change → null (skip publish). + * + * Adding/removing a whole model is *not* a major change here — that policy + * matches `findRemovedParams`, which intentionally does not flag whole-model + * removals (consumers' configured-knob compatibility is the harm we guard + * against, and dropping a whole model removes the model itself, not a knob). + */ +export function decideBump(input: { + baseCanon: string; + currentCanon: string; + hasRemovals: boolean; +}): BumpLevel | null { + if (input.hasRemovals) return "major"; + if (input.baseCanon === input.currentCanon) return null; + return "patch"; +} + +export function bumpVersion(version: string, level: BumpLevel): string { + const m = /^(\d+)\.(\d+)\.(\d+)$/.exec(version); + if (!m) throw new Error(`unexpected version "${version}"`); + const major = Number(m[1]); + const minor = Number(m[2]); + const patch = Number(m[3]); + if (level === "major") return `${major + 1}.0.0`; + return `${major}.${minor}.${patch + 1}`; +} diff --git a/packages/modelparams/src/generated/data.ts b/packages/modelparams/src/generated/data.ts new file mode 100644 index 0000000..18c6753 --- /dev/null +++ b/packages/modelparams/src/generated/data.ts @@ -0,0 +1,13877 @@ +// AUTO-GENERATED by packages/modelparams/scripts/codegen.ts. Do not edit by hand. +// Source of truth: the YAML catalog under /models in modelparams.dev. + +import type { ModelId } from "./model-ids.js"; + +export const CATALOG = [ + { + "provider": "alibaba", + "authType": "api_key", + "model": "qwen-flash", + "params": [ + { + "path": "max_tokens", + "label": "Max tokens", + "description": "Maximum number of output tokens the model may generate.", + "group": "generation_length", + "type": "integer", + "range": { + "min": 1 + } + }, + { + "path": "temperature", + "label": "Temperature", + "description": "Controls randomness. Lower values make outputs more focused; higher values make them more varied.", + "group": "sampling", + "type": "number", + "range": { + "min": 0, + "max": 2, + "step": 0.1 + } + }, + { + "path": "top_p", + "label": "Top P", + "description": "Controls nucleus sampling by limiting generation to tokens within the selected cumulative probability.", + "group": "sampling", + "type": "number", + "range": { + "min": 0, + "max": 1, + "step": 0.01 + } + }, + { + "path": "extra_body.top_k", + "label": "Top K", + "description": "Limits generation to the selected number of highest-probability tokens.", + "group": "sampling", + "type": "integer", + "default": 20, + "range": { + "min": 1 + } + }, + { + "path": "extra_body.chat_template_kwargs.enable_thinking", + "label": "Enable thinking", + "description": "Controls Qwen3 thinking mode when using OpenAI-compatible clients that pass provider-specific extra body fields.", + "group": "reasoning", + "type": "boolean", + "default": true + } + ] + }, + { + "provider": "alibaba", + "authType": "api_key", + "model": "qwen-plus", + "params": [ + { + "path": "max_tokens", + "label": "Max tokens", + "description": "Maximum number of output tokens the model may generate.", + "group": "generation_length", + "type": "integer", + "range": { + "min": 1 + } + }, + { + "path": "temperature", + "label": "Temperature", + "description": "Controls randomness. Lower values make outputs more focused; higher values make them more varied.", + "group": "sampling", + "type": "number", + "range": { + "min": 0, + "max": 2, + "step": 0.1 + } + }, + { + "path": "top_p", + "label": "Top P", + "description": "Controls nucleus sampling by limiting generation to tokens within the selected cumulative probability.", + "group": "sampling", + "type": "number", + "range": { + "min": 0, + "max": 1, + "step": 0.01 + } + }, + { + "path": "extra_body.top_k", + "label": "Top K", + "description": "Limits generation to the selected number of highest-probability tokens.", + "group": "sampling", + "type": "integer", + "default": 20, + "range": { + "min": 1 + } + }, + { + "path": "extra_body.chat_template_kwargs.enable_thinking", + "label": "Enable thinking", + "description": "Controls Qwen3 thinking mode when using OpenAI-compatible clients that pass provider-specific extra body fields.", + "group": "reasoning", + "type": "boolean", + "default": true + } + ] + }, + { + "provider": "alibaba", + "authType": "api_key", + "model": "qwen3-coder-flash", + "params": [ + { + "path": "max_tokens", + "label": "Max tokens", + "description": "Maximum number of output tokens the model may generate.", + "group": "generation_length", + "type": "integer", + "range": { + "min": 1 + } + }, + { + "path": "temperature", + "label": "Temperature", + "description": "Controls randomness. Lower values make outputs more focused; higher values make them more varied.", + "group": "sampling", + "type": "number", + "range": { + "min": 0, + "max": 2, + "step": 0.1 + } + }, + { + "path": "top_p", + "label": "Top P", + "description": "Controls nucleus sampling by limiting generation to tokens within the selected cumulative probability.", + "group": "sampling", + "type": "number", + "range": { + "min": 0, + "max": 1, + "step": 0.01 + } + }, + { + "path": "extra_body.top_k", + "label": "Top K", + "description": "Limits generation to the selected number of highest-probability tokens.", + "group": "sampling", + "type": "integer", + "default": 20, + "range": { + "min": 1 + } + } + ] + }, + { + "provider": "alibaba", + "authType": "api_key", + "model": "qwen3-coder-plus", + "params": [ + { + "path": "max_tokens", + "label": "Max tokens", + "description": "Maximum number of output tokens the model may generate.", + "group": "generation_length", + "type": "integer", + "range": { + "min": 1 + } + }, + { + "path": "temperature", + "label": "Temperature", + "description": "Controls randomness. Lower values make outputs more focused; higher values make them more varied.", + "group": "sampling", + "type": "number", + "range": { + "min": 0, + "max": 2, + "step": 0.1 + } + }, + { + "path": "top_p", + "label": "Top P", + "description": "Controls nucleus sampling by limiting generation to tokens within the selected cumulative probability.", + "group": "sampling", + "type": "number", + "range": { + "min": 0, + "max": 1, + "step": 0.01 + } + }, + { + "path": "extra_body.top_k", + "label": "Top K", + "description": "Limits generation to the selected number of highest-probability tokens.", + "group": "sampling", + "type": "integer", + "default": 20, + "range": { + "min": 1 + } + } + ] + }, + { + "provider": "alibaba", + "authType": "api_key", + "model": "qwen3-max", + "params": [ + { + "path": "max_tokens", + "label": "Max tokens", + "description": "Maximum number of output tokens the model may generate.", + "group": "generation_length", + "type": "integer", + "range": { + "min": 1 + } + }, + { + "path": "temperature", + "label": "Temperature", + "description": "Controls randomness. Lower values make outputs more focused; higher values make them more varied.", + "group": "sampling", + "type": "number", + "range": { + "min": 0, + "max": 2, + "step": 0.1 + } + }, + { + "path": "top_p", + "label": "Top P", + "description": "Controls nucleus sampling by limiting generation to tokens within the selected cumulative probability.", + "group": "sampling", + "type": "number", + "range": { + "min": 0, + "max": 1, + "step": 0.01 + } + }, + { + "path": "extra_body.top_k", + "label": "Top K", + "description": "Limits generation to the selected number of highest-probability tokens.", + "group": "sampling", + "type": "integer", + "default": 20, + "range": { + "min": 1 + } + }, + { + "path": "extra_body.chat_template_kwargs.enable_thinking", + "label": "Enable thinking", + "description": "Controls Qwen3 thinking mode when using OpenAI-compatible clients that pass provider-specific extra body fields.", + "group": "reasoning", + "type": "boolean", + "default": false + } + ] + }, + { + "provider": "alibaba", + "authType": "api_key", + "model": "qwen3.5", + "params": [ + { + "path": "max_tokens", + "label": "Max tokens", + "description": "Maximum number of output tokens the model may generate.", + "group": "generation_length", + "type": "integer", + "range": { + "min": 1 + } + }, + { + "path": "temperature", + "label": "Temperature", + "description": "Controls randomness. Lower values make outputs more focused; higher values make them more varied.", + "group": "sampling", + "type": "number", + "range": { + "min": 0, + "max": 2, + "step": 0.1 + } + }, + { + "path": "top_p", + "label": "Top P", + "description": "Controls nucleus sampling by limiting generation to tokens within the selected cumulative probability.", + "group": "sampling", + "type": "number", + "range": { + "min": 0, + "max": 1, + "step": 0.01 + } + }, + { + "path": "extra_body.top_k", + "label": "Top K", + "description": "Limits generation to the selected number of highest-probability tokens.", + "group": "sampling", + "type": "integer", + "default": 20, + "range": { + "min": 1 + } + }, + { + "path": "extra_body.chat_template_kwargs.enable_thinking", + "label": "Enable thinking", + "description": "Controls Qwen3 thinking mode when using OpenAI-compatible clients that pass provider-specific extra body fields.", + "group": "reasoning", + "type": "boolean", + "default": true + } + ] + }, + { + "provider": "alibaba", + "authType": "api_key", + "model": "qwen3.5-flash", + "params": [ + { + "path": "max_tokens", + "label": "Max tokens", + "description": "Maximum number of output tokens the model may generate.", + "group": "generation_length", + "type": "integer", + "range": { + "min": 1 + } + }, + { + "path": "temperature", + "label": "Temperature", + "description": "Controls randomness. Lower values make outputs more focused; higher values make them more varied.", + "group": "sampling", + "type": "number", + "range": { + "min": 0, + "max": 2, + "step": 0.1 + } + }, + { + "path": "top_p", + "label": "Top P", + "description": "Controls nucleus sampling by limiting generation to tokens within the selected cumulative probability.", + "group": "sampling", + "type": "number", + "range": { + "min": 0, + "max": 1, + "step": 0.01 + } + }, + { + "path": "extra_body.top_k", + "label": "Top K", + "description": "Limits generation to the selected number of highest-probability tokens.", + "group": "sampling", + "type": "integer", + "default": 20, + "range": { + "min": 1 + } + }, + { + "path": "extra_body.chat_template_kwargs.enable_thinking", + "label": "Enable thinking", + "description": "Controls Qwen3 thinking mode when using OpenAI-compatible clients that pass provider-specific extra body fields.", + "group": "reasoning", + "type": "boolean", + "default": true + } + ] + }, + { + "provider": "alibaba", + "authType": "api_key", + "model": "qwq-plus", + "params": [ + { + "path": "max_tokens", + "label": "Max tokens", + "description": "Maximum number of output tokens the model may generate.", + "group": "generation_length", + "type": "integer", + "range": { + "min": 1 + } + }, + { + "path": "temperature", + "label": "Temperature", + "description": "Controls randomness. Lower values make outputs more focused; higher values make them more varied.", + "group": "sampling", + "type": "number", + "range": { + "min": 0, + "max": 2, + "step": 0.1 + } + }, + { + "path": "top_p", + "label": "Top P", + "description": "Controls nucleus sampling by limiting generation to tokens within the selected cumulative probability.", + "group": "sampling", + "type": "number", + "range": { + "min": 0, + "max": 1, + "step": 0.01 + } + }, + { + "path": "extra_body.top_k", + "label": "Top K", + "description": "Limits generation to the selected number of highest-probability tokens.", + "group": "sampling", + "type": "integer", + "default": 20, + "range": { + "min": 1 + } + } + ] + }, + { + "provider": "anthropic", + "authType": "api_key", + "model": "claude-3-5-haiku-20241022", + "params": [ + { + "path": "max_tokens", + "label": "Max tokens", + "description": "Maximum number of output tokens the model may generate.", + "group": "generation_length", + "type": "integer", + "default": 4096, + "range": { + "min": 1 + } + }, + { + "path": "temperature", + "label": "Temperature", + "description": "Controls randomness. Lower values make outputs more focused; higher values make them more varied.", + "group": "sampling", + "applicability": { + "except": { + "thinking.type": [ + "adaptive", + "enabled" + ] + } + }, + "type": "number", + "default": 1, + "range": { + "min": 0, + "max": 1, + "step": 0.1 + } + }, + { + "path": "top_p", + "label": "Top P", + "description": "Controls nucleus sampling by limiting generation to tokens whose cumulative probability reaches this value.", + "group": "sampling", + "applicability": { + "except": [ + { + "thinking.type": [ + "adaptive", + "enabled" + ] + }, + { + "temperature": { + "not": 1 + } + } + ] + }, + "type": "number", + "default": 1, + "range": { + "min": 0, + "max": 1, + "step": 0.01 + } + }, + { + "path": "top_k", + "label": "Top K", + "description": "Limits token sampling to the top K most likely next tokens.", + "group": "sampling", + "applicability": { + "except": { + "thinking.type": [ + "adaptive", + "enabled" + ] + } + }, + "type": "integer", + "default": 0, + "range": { + "min": 0 + } + } + ] + }, + { + "provider": "anthropic", + "authType": "api_key", + "model": "claude-3-5-haiku-latest", + "params": [ + { + "path": "max_tokens", + "label": "Max tokens", + "description": "Maximum number of output tokens the model may generate.", + "group": "generation_length", + "type": "integer", + "default": 4096, + "range": { + "min": 1 + } + }, + { + "path": "temperature", + "label": "Temperature", + "description": "Controls randomness. Lower values make outputs more focused; higher values make them more varied.", + "group": "sampling", + "applicability": { + "except": { + "thinking.type": [ + "adaptive", + "enabled" + ] + } + }, + "type": "number", + "default": 1, + "range": { + "min": 0, + "max": 1, + "step": 0.1 + } + }, + { + "path": "top_p", + "label": "Top P", + "description": "Controls nucleus sampling by limiting generation to tokens whose cumulative probability reaches this value.", + "group": "sampling", + "applicability": { + "except": [ + { + "thinking.type": [ + "adaptive", + "enabled" + ] + }, + { + "temperature": { + "not": 1 + } + } + ] + }, + "type": "number", + "default": 1, + "range": { + "min": 0, + "max": 1, + "step": 0.01 + } + }, + { + "path": "top_k", + "label": "Top K", + "description": "Limits token sampling to the top K most likely next tokens.", + "group": "sampling", + "applicability": { + "except": { + "thinking.type": [ + "adaptive", + "enabled" + ] + } + }, + "type": "integer", + "default": 0, + "range": { + "min": 0 + } + } + ] + }, + { + "provider": "anthropic", + "authType": "api_key", + "model": "claude-3-5-sonnet-20241022", + "params": [ + { + "path": "max_tokens", + "label": "Max tokens", + "description": "Maximum number of output tokens the model may generate.", + "group": "generation_length", + "type": "integer", + "default": 4096, + "range": { + "min": 1 + } + }, + { + "path": "temperature", + "label": "Temperature", + "description": "Controls randomness. Lower values make outputs more focused; higher values make them more varied.", + "group": "sampling", + "applicability": { + "except": { + "thinking.type": [ + "adaptive", + "enabled" + ] + } + }, + "type": "number", + "default": 1, + "range": { + "min": 0, + "max": 1, + "step": 0.1 + } + }, + { + "path": "top_p", + "label": "Top P", + "description": "Controls nucleus sampling by limiting generation to tokens whose cumulative probability reaches this value.", + "group": "sampling", + "applicability": { + "except": [ + { + "thinking.type": [ + "adaptive", + "enabled" + ] + }, + { + "temperature": { + "not": 1 + } + } + ] + }, + "type": "number", + "default": 1, + "range": { + "min": 0, + "max": 1, + "step": 0.01 + } + }, + { + "path": "top_k", + "label": "Top K", + "description": "Limits token sampling to the top K most likely next tokens.", + "group": "sampling", + "applicability": { + "except": { + "thinking.type": [ + "adaptive", + "enabled" + ] + } + }, + "type": "integer", + "default": 0, + "range": { + "min": 0 + } + } + ] + }, + { + "provider": "anthropic", + "authType": "api_key", + "model": "claude-3-5-sonnet-latest", + "params": [ + { + "path": "max_tokens", + "label": "Max tokens", + "description": "Maximum number of output tokens the model may generate.", + "group": "generation_length", + "type": "integer", + "default": 4096, + "range": { + "min": 1 + } + }, + { + "path": "temperature", + "label": "Temperature", + "description": "Controls randomness. Lower values make outputs more focused; higher values make them more varied.", + "group": "sampling", + "applicability": { + "except": { + "thinking.type": [ + "adaptive", + "enabled" + ] + } + }, + "type": "number", + "default": 1, + "range": { + "min": 0, + "max": 1, + "step": 0.1 + } + }, + { + "path": "top_p", + "label": "Top P", + "description": "Controls nucleus sampling by limiting generation to tokens whose cumulative probability reaches this value.", + "group": "sampling", + "applicability": { + "except": [ + { + "thinking.type": [ + "adaptive", + "enabled" + ] + }, + { + "temperature": { + "not": 1 + } + } + ] + }, + "type": "number", + "default": 1, + "range": { + "min": 0, + "max": 1, + "step": 0.01 + } + }, + { + "path": "top_k", + "label": "Top K", + "description": "Limits token sampling to the top K most likely next tokens.", + "group": "sampling", + "applicability": { + "except": { + "thinking.type": [ + "adaptive", + "enabled" + ] + } + }, + "type": "integer", + "default": 0, + "range": { + "min": 0 + } + } + ] + }, + { + "provider": "anthropic", + "authType": "api_key", + "model": "claude-3-7-sonnet-20250219", + "params": [ + { + "path": "max_tokens", + "label": "Max tokens", + "description": "Maximum number of output tokens the model may generate.", + "group": "generation_length", + "type": "integer", + "default": 4096, + "range": { + "min": 1 + } + }, + { + "path": "temperature", + "label": "Temperature", + "description": "Controls randomness. Lower values make outputs more focused; higher values make them more varied.", + "group": "sampling", + "applicability": { + "except": { + "thinking.type": [ + "adaptive", + "enabled" + ] + } + }, + "type": "number", + "default": 1, + "range": { + "min": 0, + "max": 1, + "step": 0.1 + } + }, + { + "path": "top_p", + "label": "Top P", + "description": "Controls nucleus sampling by limiting generation to tokens whose cumulative probability reaches this value.", + "group": "sampling", + "applicability": { + "except": [ + { + "thinking.type": [ + "adaptive", + "enabled" + ] + }, + { + "temperature": { + "not": 1 + } + } + ] + }, + "type": "number", + "default": 1, + "range": { + "min": 0, + "max": 1, + "step": 0.01 + } + }, + { + "path": "top_k", + "label": "Top K", + "description": "Limits token sampling to the top K most likely next tokens.", + "group": "sampling", + "applicability": { + "except": { + "thinking.type": [ + "adaptive", + "enabled" + ] + } + }, + "type": "integer", + "default": 0, + "range": { + "min": 0 + } + }, + { + "path": "thinking.type", + "label": "Thinking mode", + "description": "Controls the Anthropic thinking mode values supported by this model.", + "group": "reasoning", + "type": "enum", + "default": "disabled", + "values": [ + "disabled", + "enabled" + ] + }, + { + "path": "thinking.budget_tokens", + "label": "Budget tokens", + "description": "Maximum token budget Anthropic may use for extended thinking before producing the final answer.", + "group": "reasoning", + "applicability": { + "only": { + "thinking.type": "enabled" + } + }, + "type": "integer", + "default": 4096, + "range": { + "min": 1024 + } + } + ] + }, + { + "provider": "anthropic", + "authType": "api_key", + "model": "claude-3-7-sonnet-latest", + "params": [ + { + "path": "max_tokens", + "label": "Max tokens", + "description": "Maximum number of output tokens the model may generate.", + "group": "generation_length", + "type": "integer", + "default": 4096, + "range": { + "min": 1 + } + }, + { + "path": "temperature", + "label": "Temperature", + "description": "Controls randomness. Lower values make outputs more focused; higher values make them more varied.", + "group": "sampling", + "applicability": { + "except": { + "thinking.type": [ + "adaptive", + "enabled" + ] + } + }, + "type": "number", + "default": 1, + "range": { + "min": 0, + "max": 1, + "step": 0.1 + } + }, + { + "path": "top_p", + "label": "Top P", + "description": "Controls nucleus sampling by limiting generation to tokens whose cumulative probability reaches this value.", + "group": "sampling", + "applicability": { + "except": [ + { + "thinking.type": [ + "adaptive", + "enabled" + ] + }, + { + "temperature": { + "not": 1 + } + } + ] + }, + "type": "number", + "default": 1, + "range": { + "min": 0, + "max": 1, + "step": 0.01 + } + }, + { + "path": "top_k", + "label": "Top K", + "description": "Limits token sampling to the top K most likely next tokens.", + "group": "sampling", + "applicability": { + "except": { + "thinking.type": [ + "adaptive", + "enabled" + ] + } + }, + "type": "integer", + "default": 0, + "range": { + "min": 0 + } + }, + { + "path": "thinking.type", + "label": "Thinking mode", + "description": "Controls the Anthropic thinking mode values supported by this model.", + "group": "reasoning", + "type": "enum", + "default": "disabled", + "values": [ + "disabled", + "enabled" + ] + }, + { + "path": "thinking.budget_tokens", + "label": "Budget tokens", + "description": "Maximum token budget Anthropic may use for extended thinking before producing the final answer.", + "group": "reasoning", + "applicability": { + "only": { + "thinking.type": "enabled" + } + }, + "type": "integer", + "default": 4096, + "range": { + "min": 1024 + } + } + ] + }, + { + "provider": "anthropic", + "authType": "api_key", + "model": "claude-3-opus-20240229", + "params": [ + { + "path": "max_tokens", + "label": "Max tokens", + "description": "Maximum number of output tokens the model may generate.", + "group": "generation_length", + "type": "integer", + "default": 4096, + "range": { + "min": 1 + } + }, + { + "path": "temperature", + "label": "Temperature", + "description": "Controls randomness. Lower values make outputs more focused; higher values make them more varied.", + "group": "sampling", + "applicability": { + "except": { + "thinking.type": [ + "adaptive", + "enabled" + ] + } + }, + "type": "number", + "default": 1, + "range": { + "min": 0, + "max": 1, + "step": 0.1 + } + }, + { + "path": "top_p", + "label": "Top P", + "description": "Controls nucleus sampling by limiting generation to tokens whose cumulative probability reaches this value.", + "group": "sampling", + "applicability": { + "except": [ + { + "thinking.type": [ + "adaptive", + "enabled" + ] + }, + { + "temperature": { + "not": 1 + } + } + ] + }, + "type": "number", + "default": 1, + "range": { + "min": 0, + "max": 1, + "step": 0.01 + } + }, + { + "path": "top_k", + "label": "Top K", + "description": "Limits token sampling to the top K most likely next tokens.", + "group": "sampling", + "applicability": { + "except": { + "thinking.type": [ + "adaptive", + "enabled" + ] + } + }, + "type": "integer", + "default": 0, + "range": { + "min": 0 + } + } + ] + }, + { + "provider": "anthropic", + "authType": "api_key", + "model": "claude-3-opus-latest", + "params": [ + { + "path": "max_tokens", + "label": "Max tokens", + "description": "Maximum number of output tokens the model may generate.", + "group": "generation_length", + "type": "integer", + "default": 4096, + "range": { + "min": 1 + } + }, + { + "path": "temperature", + "label": "Temperature", + "description": "Controls randomness. Lower values make outputs more focused; higher values make them more varied.", + "group": "sampling", + "applicability": { + "except": { + "thinking.type": [ + "adaptive", + "enabled" + ] + } + }, + "type": "number", + "default": 1, + "range": { + "min": 0, + "max": 1, + "step": 0.1 + } + }, + { + "path": "top_p", + "label": "Top P", + "description": "Controls nucleus sampling by limiting generation to tokens whose cumulative probability reaches this value.", + "group": "sampling", + "applicability": { + "except": [ + { + "thinking.type": [ + "adaptive", + "enabled" + ] + }, + { + "temperature": { + "not": 1 + } + } + ] + }, + "type": "number", + "default": 1, + "range": { + "min": 0, + "max": 1, + "step": 0.01 + } + }, + { + "path": "top_k", + "label": "Top K", + "description": "Limits token sampling to the top K most likely next tokens.", + "group": "sampling", + "applicability": { + "except": { + "thinking.type": [ + "adaptive", + "enabled" + ] + } + }, + "type": "integer", + "default": 0, + "range": { + "min": 0 + } + } + ] + }, + { + "provider": "anthropic", + "authType": "api_key", + "model": "claude-haiku-4", + "params": [ + { + "path": "max_tokens", + "label": "Max tokens", + "description": "Maximum number of output tokens the model may generate.", + "group": "generation_length", + "type": "integer", + "default": 4096, + "range": { + "min": 1 + } + }, + { + "path": "temperature", + "label": "Temperature", + "description": "Controls randomness. Lower values make outputs more focused; higher values make them more varied.", + "group": "sampling", + "applicability": { + "except": { + "thinking.type": [ + "adaptive", + "enabled" + ] + } + }, + "type": "number", + "default": 1, + "range": { + "min": 0, + "max": 1, + "step": 0.1 + } + }, + { + "path": "top_p", + "label": "Top P", + "description": "Controls nucleus sampling by limiting generation to tokens whose cumulative probability reaches this value.", + "group": "sampling", + "applicability": { + "except": [ + { + "thinking.type": [ + "adaptive", + "enabled" + ] + }, + { + "temperature": { + "not": 1 + } + } + ] + }, + "type": "number", + "default": 1, + "range": { + "min": 0, + "max": 1, + "step": 0.01 + } + }, + { + "path": "top_k", + "label": "Top K", + "description": "Limits token sampling to the top K most likely next tokens.", + "group": "sampling", + "applicability": { + "except": { + "thinking.type": [ + "adaptive", + "enabled" + ] + } + }, + "type": "integer", + "default": 0, + "range": { + "min": 0 + } + }, + { + "path": "thinking.type", + "label": "Thinking mode", + "description": "Controls the Anthropic thinking mode values supported by this model.", + "group": "reasoning", + "type": "enum", + "default": "disabled", + "values": [ + "disabled", + "enabled" + ] + }, + { + "path": "thinking.budget_tokens", + "label": "Budget tokens", + "description": "Maximum token budget Anthropic may use for extended thinking before producing the final answer.", + "group": "reasoning", + "applicability": { + "only": { + "thinking.type": "enabled" + } + }, + "type": "integer", + "default": 4096, + "range": { + "min": 1024 + } + } + ] + }, + { + "provider": "anthropic", + "authType": "api_key", + "model": "claude-haiku-4-5", + "params": [ + { + "path": "max_tokens", + "label": "Max tokens", + "description": "Maximum number of output tokens the model may generate.", + "group": "generation_length", + "type": "integer", + "default": 4096, + "range": { + "min": 1 + } + }, + { + "path": "temperature", + "label": "Temperature", + "description": "Controls randomness. Lower values make outputs more focused; higher values make them more varied.", + "group": "sampling", + "applicability": { + "except": { + "thinking.type": [ + "adaptive", + "enabled" + ] + } + }, + "type": "number", + "default": 1, + "range": { + "min": 0, + "max": 1, + "step": 0.1 + } + }, + { + "path": "top_p", + "label": "Top P", + "description": "Controls nucleus sampling by limiting generation to tokens whose cumulative probability reaches this value.", + "group": "sampling", + "applicability": { + "except": [ + { + "thinking.type": [ + "adaptive", + "enabled" + ] + }, + { + "temperature": { + "not": 1 + } + } + ] + }, + "type": "number", + "default": 1, + "range": { + "min": 0, + "max": 1, + "step": 0.01 + } + }, + { + "path": "top_k", + "label": "Top K", + "description": "Limits token sampling to the top K most likely next tokens.", + "group": "sampling", + "applicability": { + "except": { + "thinking.type": [ + "adaptive", + "enabled" + ] + } + }, + "type": "integer", + "default": 0, + "range": { + "min": 0 + } + }, + { + "path": "thinking.type", + "label": "Thinking mode", + "description": "Controls the Anthropic thinking mode values supported by this model.", + "group": "reasoning", + "type": "enum", + "default": "disabled", + "values": [ + "disabled", + "enabled" + ] + }, + { + "path": "thinking.budget_tokens", + "label": "Budget tokens", + "description": "Maximum token budget Anthropic may use for extended thinking before producing the final answer.", + "group": "reasoning", + "applicability": { + "only": { + "thinking.type": "enabled" + } + }, + "type": "integer", + "default": 4096, + "range": { + "min": 1024 + } + } + ] + }, + { + "provider": "anthropic", + "authType": "api_key", + "model": "claude-haiku-4-5-20251001", + "params": [ + { + "path": "max_tokens", + "label": "Max tokens", + "description": "Maximum number of output tokens the model may generate.", + "group": "generation_length", + "type": "integer", + "default": 4096, + "range": { + "min": 1 + } + }, + { + "path": "temperature", + "label": "Temperature", + "description": "Controls randomness. Lower values make outputs more focused; higher values make them more varied.", + "group": "sampling", + "applicability": { + "except": [ + { + "thinking.type": [ + "enabled" + ] + }, + { + "top_p": { + "not": null + } + } + ] + }, + "type": "number", + "default": 1, + "range": { + "min": 0, + "max": 1, + "step": 0.1 + } + }, + { + "path": "top_p", + "label": "Top P", + "description": "Controls nucleus sampling by limiting generation to tokens whose cumulative probability reaches this value.", + "group": "sampling", + "applicability": { + "except": [ + { + "thinking.type": [ + "enabled" + ] + }, + { + "temperature": { + "not": null + } + } + ] + }, + "type": "number", + "default": 1, + "range": { + "min": 0, + "max": 1, + "step": 0.01 + } + }, + { + "path": "top_k", + "label": "Top K", + "description": "Limits token sampling to the top K most likely next tokens.", + "group": "sampling", + "applicability": { + "except": { + "thinking.type": [ + "enabled" + ] + } + }, + "type": "integer", + "default": 0, + "range": { + "min": 0 + } + }, + { + "path": "thinking.type", + "label": "Thinking mode", + "description": "Controls the Anthropic thinking mode values supported by this model.", + "group": "reasoning", + "type": "enum", + "default": "disabled", + "values": [ + "disabled", + "enabled" + ] + }, + { + "path": "thinking.budget_tokens", + "label": "Budget tokens", + "description": "Maximum token budget Anthropic may use for extended thinking before producing the final answer.", + "group": "reasoning", + "applicability": { + "only": { + "thinking.type": "enabled" + } + }, + "type": "integer", + "default": 4096, + "range": { + "min": 1024 + } + } + ] + }, + { + "provider": "anthropic", + "authType": "subscription", + "model": "claude-haiku-4-5-20251001", + "params": [ + { + "path": "max_tokens", + "label": "Max tokens", + "description": "Maximum number of output tokens the model may generate.", + "group": "generation_length", + "type": "integer", + "default": 4096, + "range": { + "min": 1 + } + }, + { + "path": "temperature", + "label": "Temperature", + "description": "Controls randomness. Lower values make outputs more focused; higher values make them more varied.", + "group": "sampling", + "applicability": { + "except": [ + { + "thinking.type": [ + "enabled" + ] + }, + { + "top_p": { + "not": null + } + } + ] + }, + "type": "number", + "default": 1, + "range": { + "min": 0, + "max": 1, + "step": 0.1 + } + }, + { + "path": "top_p", + "label": "Top P", + "description": "Controls nucleus sampling by limiting generation to tokens whose cumulative probability reaches this value.", + "group": "sampling", + "applicability": { + "except": [ + { + "thinking.type": [ + "enabled" + ] + }, + { + "temperature": { + "not": null + } + } + ] + }, + "type": "number", + "default": 1, + "range": { + "min": 0, + "max": 1, + "step": 0.01 + } + }, + { + "path": "top_k", + "label": "Top K", + "description": "Limits token sampling to the top K most likely next tokens.", + "group": "sampling", + "applicability": { + "except": { + "thinking.type": [ + "enabled" + ] + } + }, + "type": "integer", + "default": 0, + "range": { + "min": 0 + } + }, + { + "path": "thinking.type", + "label": "Thinking mode", + "description": "Controls the Anthropic thinking mode values supported by this model.", + "group": "reasoning", + "type": "enum", + "default": "disabled", + "values": [ + "disabled", + "enabled" + ] + }, + { + "path": "thinking.budget_tokens", + "label": "Budget tokens", + "description": "Maximum token budget Anthropic may use for extended thinking before producing the final answer.", + "group": "reasoning", + "applicability": { + "only": { + "thinking.type": "enabled" + } + }, + "type": "integer", + "default": 4096, + "range": { + "min": 1024 + } + } + ] + }, + { + "provider": "anthropic", + "authType": "subscription", + "model": "claude-haiku-4-5", + "params": [ + { + "path": "max_tokens", + "label": "Max tokens", + "description": "Maximum number of output tokens the model may generate.", + "group": "generation_length", + "type": "integer", + "default": 4096, + "range": { + "min": 1 + } + }, + { + "path": "temperature", + "label": "Temperature", + "description": "Controls randomness. Lower values make outputs more focused; higher values make them more varied.", + "group": "sampling", + "applicability": { + "except": { + "thinking.type": [ + "adaptive", + "enabled" + ] + } + }, + "type": "number", + "default": 1, + "range": { + "min": 0, + "max": 1, + "step": 0.1 + } + }, + { + "path": "top_p", + "label": "Top P", + "description": "Controls nucleus sampling by limiting generation to tokens whose cumulative probability reaches this value.", + "group": "sampling", + "applicability": { + "except": [ + { + "thinking.type": [ + "adaptive", + "enabled" + ] + }, + { + "temperature": { + "not": 1 + } + } + ] + }, + "type": "number", + "default": 1, + "range": { + "min": 0, + "max": 1, + "step": 0.01 + } + }, + { + "path": "top_k", + "label": "Top K", + "description": "Limits token sampling to the top K most likely next tokens.", + "group": "sampling", + "applicability": { + "except": { + "thinking.type": [ + "adaptive", + "enabled" + ] + } + }, + "type": "integer", + "default": 0, + "range": { + "min": 0 + } + }, + { + "path": "thinking.type", + "label": "Thinking mode", + "description": "Controls the Anthropic thinking mode values supported by this model.", + "group": "reasoning", + "type": "enum", + "default": "disabled", + "values": [ + "disabled", + "enabled" + ] + }, + { + "path": "thinking.budget_tokens", + "label": "Budget tokens", + "description": "Maximum token budget Anthropic may use for extended thinking before producing the final answer.", + "group": "reasoning", + "applicability": { + "only": { + "thinking.type": "enabled" + } + }, + "type": "integer", + "default": 4096, + "range": { + "min": 1024 + } + } + ] + }, + { + "provider": "anthropic", + "authType": "subscription", + "model": "claude-haiku-4", + "params": [ + { + "path": "max_tokens", + "label": "Max tokens", + "description": "Maximum number of output tokens the model may generate.", + "group": "generation_length", + "type": "integer", + "default": 4096, + "range": { + "min": 1 + } + }, + { + "path": "temperature", + "label": "Temperature", + "description": "Controls randomness. Lower values make outputs more focused; higher values make them more varied.", + "group": "sampling", + "applicability": { + "except": { + "thinking.type": [ + "adaptive", + "enabled" + ] + } + }, + "type": "number", + "default": 1, + "range": { + "min": 0, + "max": 1, + "step": 0.1 + } + }, + { + "path": "top_p", + "label": "Top P", + "description": "Controls nucleus sampling by limiting generation to tokens whose cumulative probability reaches this value.", + "group": "sampling", + "applicability": { + "except": [ + { + "thinking.type": [ + "adaptive", + "enabled" + ] + }, + { + "temperature": { + "not": 1 + } + } + ] + }, + "type": "number", + "default": 1, + "range": { + "min": 0, + "max": 1, + "step": 0.01 + } + }, + { + "path": "top_k", + "label": "Top K", + "description": "Limits token sampling to the top K most likely next tokens.", + "group": "sampling", + "applicability": { + "except": { + "thinking.type": [ + "adaptive", + "enabled" + ] + } + }, + "type": "integer", + "default": 0, + "range": { + "min": 0 + } + }, + { + "path": "thinking.type", + "label": "Thinking mode", + "description": "Controls the Anthropic thinking mode values supported by this model.", + "group": "reasoning", + "type": "enum", + "default": "disabled", + "values": [ + "disabled", + "enabled" + ] + }, + { + "path": "thinking.budget_tokens", + "label": "Budget tokens", + "description": "Maximum token budget Anthropic may use for extended thinking before producing the final answer.", + "group": "reasoning", + "applicability": { + "only": { + "thinking.type": "enabled" + } + }, + "type": "integer", + "default": 4096, + "range": { + "min": 1024 + } + } + ] + }, + { + "provider": "anthropic", + "authType": "api_key", + "model": "claude-opus-4-1-20250805", + "params": [ + { + "path": "max_tokens", + "label": "Max tokens", + "description": "Maximum number of output tokens the model may generate.", + "group": "generation_length", + "type": "integer", + "default": 4096, + "range": { + "min": 1 + } + }, + { + "path": "temperature", + "label": "Temperature", + "description": "Controls randomness. Lower values make outputs more focused; higher values make them more varied.", + "group": "sampling", + "applicability": { + "except": [ + { + "thinking.type": [ + "enabled" + ] + }, + { + "top_p": { + "not": null + } + } + ] + }, + "type": "number", + "default": 1, + "range": { + "min": 0, + "max": 1, + "step": 0.1 + } + }, + { + "path": "top_p", + "label": "Top P", + "description": "Controls nucleus sampling by limiting generation to tokens whose cumulative probability reaches this value.", + "group": "sampling", + "applicability": { + "except": [ + { + "thinking.type": [ + "enabled" + ] + }, + { + "temperature": { + "not": null + } + } + ] + }, + "type": "number", + "default": 1, + "range": { + "min": 0, + "max": 1, + "step": 0.01 + } + }, + { + "path": "top_k", + "label": "Top K", + "description": "Limits token sampling to the top K most likely next tokens.", + "group": "sampling", + "applicability": { + "except": { + "thinking.type": [ + "enabled" + ] + } + }, + "type": "integer", + "default": 0, + "range": { + "min": 0 + } + }, + { + "path": "thinking.type", + "label": "Thinking mode", + "description": "Controls the Anthropic thinking mode values supported by this model.", + "group": "reasoning", + "type": "enum", + "default": "disabled", + "values": [ + "disabled", + "enabled" + ] + }, + { + "path": "thinking.budget_tokens", + "label": "Budget tokens", + "description": "Maximum token budget Anthropic may use for extended thinking before producing the final answer.", + "group": "reasoning", + "applicability": { + "only": { + "thinking.type": "enabled" + } + }, + "type": "integer", + "default": 4096, + "range": { + "min": 1024 + } + }, + { + "path": "thinking.display", + "label": "Thinking display", + "description": "Controls whether Anthropic returns summarized or omitted thinking content.", + "group": "reasoning", + "applicability": { + "only": { + "thinking.type": [ + "enabled" + ] + } + }, + "type": "enum", + "default": "summarized", + "values": [ + "summarized", + "omitted" + ] + } + ] + }, + { + "provider": "anthropic", + "authType": "subscription", + "model": "claude-opus-4-1-20250805", + "params": [ + { + "path": "max_tokens", + "label": "Max tokens", + "description": "Maximum number of output tokens the model may generate.", + "group": "generation_length", + "type": "integer", + "default": 4096, + "range": { + "min": 1 + } + }, + { + "path": "temperature", + "label": "Temperature", + "description": "Controls randomness. Lower values make outputs more focused; higher values make them more varied.", + "group": "sampling", + "applicability": { + "except": [ + { + "thinking.type": [ + "enabled" + ] + }, + { + "top_p": { + "not": null + } + } + ] + }, + "type": "number", + "default": 1, + "range": { + "min": 0, + "max": 1, + "step": 0.1 + } + }, + { + "path": "top_p", + "label": "Top P", + "description": "Controls nucleus sampling by limiting generation to tokens whose cumulative probability reaches this value.", + "group": "sampling", + "applicability": { + "except": [ + { + "thinking.type": [ + "enabled" + ] + }, + { + "temperature": { + "not": null + } + } + ] + }, + "type": "number", + "default": 1, + "range": { + "min": 0, + "max": 1, + "step": 0.01 + } + }, + { + "path": "top_k", + "label": "Top K", + "description": "Limits token sampling to the top K most likely next tokens.", + "group": "sampling", + "applicability": { + "except": { + "thinking.type": [ + "enabled" + ] + } + }, + "type": "integer", + "default": 0, + "range": { + "min": 0 + } + }, + { + "path": "thinking.type", + "label": "Thinking mode", + "description": "Controls the Anthropic thinking mode values supported by this model.", + "group": "reasoning", + "type": "enum", + "default": "disabled", + "values": [ + "disabled", + "enabled" + ] + }, + { + "path": "thinking.budget_tokens", + "label": "Budget tokens", + "description": "Maximum token budget Anthropic may use for extended thinking before producing the final answer.", + "group": "reasoning", + "applicability": { + "only": { + "thinking.type": "enabled" + } + }, + "type": "integer", + "default": 4096, + "range": { + "min": 1024 + } + }, + { + "path": "thinking.display", + "label": "Thinking display", + "description": "Controls whether Anthropic returns summarized or omitted thinking content.", + "group": "reasoning", + "applicability": { + "only": { + "thinking.type": [ + "enabled" + ] + } + }, + "type": "enum", + "default": "summarized", + "values": [ + "summarized", + "omitted" + ] + } + ] + }, + { + "provider": "anthropic", + "authType": "api_key", + "model": "claude-opus-4-20250514", + "params": [ + { + "path": "max_tokens", + "label": "Max tokens", + "description": "Maximum number of output tokens the model may generate.", + "group": "generation_length", + "type": "integer", + "default": 4096, + "range": { + "min": 1 + } + }, + { + "path": "temperature", + "label": "Temperature", + "description": "Controls randomness. Lower values make outputs more focused; higher values make them more varied.", + "group": "sampling", + "applicability": { + "except": [ + { + "thinking.type": [ + "enabled" + ] + } + ] + }, + "type": "number", + "default": 1, + "range": { + "min": 0, + "max": 1, + "step": 0.1 + } + }, + { + "path": "top_p", + "label": "Top P", + "description": "Controls nucleus sampling by limiting generation to tokens whose cumulative probability reaches this value.", + "group": "sampling", + "applicability": { + "except": [ + { + "thinking.type": [ + "enabled" + ] + } + ] + }, + "type": "number", + "default": 1, + "range": { + "min": 0, + "max": 1, + "step": 0.01 + } + }, + { + "path": "top_k", + "label": "Top K", + "description": "Limits token sampling to the top K most likely next tokens.", + "group": "sampling", + "applicability": { + "except": { + "thinking.type": [ + "enabled" + ] + } + }, + "type": "integer", + "default": 0, + "range": { + "min": 0 + } + }, + { + "path": "thinking.type", + "label": "Thinking mode", + "description": "Controls the Anthropic thinking mode values supported by this model.", + "group": "reasoning", + "type": "enum", + "default": "disabled", + "values": [ + "disabled", + "enabled" + ] + }, + { + "path": "thinking.budget_tokens", + "label": "Budget tokens", + "description": "Maximum token budget Anthropic may use for extended thinking before producing the final answer.", + "group": "reasoning", + "applicability": { + "only": { + "thinking.type": "enabled" + } + }, + "type": "integer", + "default": 4096, + "range": { + "min": 1024 + } + }, + { + "path": "thinking.display", + "label": "Thinking display", + "description": "Controls whether Anthropic returns summarized or omitted thinking content.", + "group": "reasoning", + "applicability": { + "only": { + "thinking.type": [ + "enabled" + ] + } + }, + "type": "enum", + "default": "summarized", + "values": [ + "summarized", + "omitted" + ] + } + ] + }, + { + "provider": "anthropic", + "authType": "subscription", + "model": "claude-opus-4-20250514", + "params": [ + { + "path": "max_tokens", + "label": "Max tokens", + "description": "Maximum number of output tokens the model may generate.", + "group": "generation_length", + "type": "integer", + "default": 4096, + "range": { + "min": 1 + } + }, + { + "path": "temperature", + "label": "Temperature", + "description": "Controls randomness. Lower values make outputs more focused; higher values make them more varied.", + "group": "sampling", + "applicability": { + "except": [ + { + "thinking.type": [ + "enabled" + ] + } + ] + }, + "type": "number", + "default": 1, + "range": { + "min": 0, + "max": 1, + "step": 0.1 + } + }, + { + "path": "top_p", + "label": "Top P", + "description": "Controls nucleus sampling by limiting generation to tokens whose cumulative probability reaches this value.", + "group": "sampling", + "applicability": { + "except": [ + { + "thinking.type": [ + "enabled" + ] + } + ] + }, + "type": "number", + "default": 1, + "range": { + "min": 0, + "max": 1, + "step": 0.01 + } + }, + { + "path": "top_k", + "label": "Top K", + "description": "Limits token sampling to the top K most likely next tokens.", + "group": "sampling", + "applicability": { + "except": { + "thinking.type": [ + "enabled" + ] + } + }, + "type": "integer", + "default": 0, + "range": { + "min": 0 + } + }, + { + "path": "thinking.type", + "label": "Thinking mode", + "description": "Controls the Anthropic thinking mode values supported by this model.", + "group": "reasoning", + "type": "enum", + "default": "disabled", + "values": [ + "disabled", + "enabled" + ] + }, + { + "path": "thinking.budget_tokens", + "label": "Budget tokens", + "description": "Maximum token budget Anthropic may use for extended thinking before producing the final answer.", + "group": "reasoning", + "applicability": { + "only": { + "thinking.type": "enabled" + } + }, + "type": "integer", + "default": 4096, + "range": { + "min": 1024 + } + }, + { + "path": "thinking.display", + "label": "Thinking display", + "description": "Controls whether Anthropic returns summarized or omitted thinking content.", + "group": "reasoning", + "applicability": { + "only": { + "thinking.type": [ + "enabled" + ] + } + }, + "type": "enum", + "default": "summarized", + "values": [ + "summarized", + "omitted" + ] + } + ] + }, + { + "provider": "anthropic", + "authType": "api_key", + "model": "claude-opus-4-5-20251101", + "params": [ + { + "path": "max_tokens", + "label": "Max tokens", + "description": "Maximum number of output tokens the model may generate.", + "group": "generation_length", + "type": "integer", + "default": 4096, + "range": { + "min": 1 + } + }, + { + "path": "temperature", + "label": "Temperature", + "description": "Controls randomness. Lower values make outputs more focused; higher values make them more varied.", + "group": "sampling", + "applicability": { + "except": [ + { + "thinking.type": [ + "enabled" + ] + }, + { + "top_p": { + "not": null + } + } + ] + }, + "type": "number", + "default": 1, + "range": { + "min": 0, + "max": 1, + "step": 0.1 + } + }, + { + "path": "top_p", + "label": "Top P", + "description": "Controls nucleus sampling by limiting generation to tokens whose cumulative probability reaches this value.", + "group": "sampling", + "applicability": { + "except": [ + { + "thinking.type": [ + "enabled" + ] + }, + { + "temperature": { + "not": null + } + } + ] + }, + "type": "number", + "default": 1, + "range": { + "min": 0, + "max": 1, + "step": 0.01 + } + }, + { + "path": "top_k", + "label": "Top K", + "description": "Limits token sampling to the top K most likely next tokens.", + "group": "sampling", + "applicability": { + "except": { + "thinking.type": [ + "enabled" + ] + } + }, + "type": "integer", + "default": 0, + "range": { + "min": 0 + } + }, + { + "path": "thinking.type", + "label": "Thinking mode", + "description": "Controls the Anthropic thinking mode values supported by this model.", + "group": "reasoning", + "type": "enum", + "default": "disabled", + "values": [ + "disabled", + "enabled" + ] + }, + { + "path": "thinking.budget_tokens", + "label": "Budget tokens", + "description": "Maximum token budget Anthropic may use for extended thinking before producing the final answer.", + "group": "reasoning", + "applicability": { + "only": { + "thinking.type": "enabled" + } + }, + "type": "integer", + "default": 4096, + "range": { + "min": 1024 + } + }, + { + "path": "thinking.display", + "label": "Thinking display", + "description": "Controls whether Anthropic returns summarized or omitted thinking content.", + "group": "reasoning", + "applicability": { + "only": { + "thinking.type": [ + "enabled" + ] + } + }, + "type": "enum", + "default": "summarized", + "values": [ + "summarized", + "omitted" + ] + }, + { + "path": "output_config.effort", + "label": "Effort", + "description": "Controls Anthropic response thoroughness and token spend.", + "group": "reasoning", + "type": "enum", + "default": "high", + "values": [ + "low", + "medium", + "high" + ] + } + ] + }, + { + "provider": "anthropic", + "authType": "subscription", + "model": "claude-opus-4-5-20251101", + "params": [ + { + "path": "max_tokens", + "label": "Max tokens", + "description": "Maximum number of output tokens the model may generate.", + "group": "generation_length", + "type": "integer", + "default": 4096, + "range": { + "min": 1 + } + }, + { + "path": "temperature", + "label": "Temperature", + "description": "Controls randomness. Lower values make outputs more focused; higher values make them more varied.", + "group": "sampling", + "applicability": { + "except": [ + { + "thinking.type": [ + "enabled" + ] + }, + { + "top_p": { + "not": null + } + } + ] + }, + "type": "number", + "default": 1, + "range": { + "min": 0, + "max": 1, + "step": 0.1 + } + }, + { + "path": "top_p", + "label": "Top P", + "description": "Controls nucleus sampling by limiting generation to tokens whose cumulative probability reaches this value.", + "group": "sampling", + "applicability": { + "except": [ + { + "thinking.type": [ + "enabled" + ] + }, + { + "temperature": { + "not": null + } + } + ] + }, + "type": "number", + "default": 1, + "range": { + "min": 0, + "max": 1, + "step": 0.01 + } + }, + { + "path": "top_k", + "label": "Top K", + "description": "Limits token sampling to the top K most likely next tokens.", + "group": "sampling", + "applicability": { + "except": { + "thinking.type": [ + "enabled" + ] + } + }, + "type": "integer", + "default": 0, + "range": { + "min": 0 + } + }, + { + "path": "thinking.type", + "label": "Thinking mode", + "description": "Controls the Anthropic thinking mode values supported by this model.", + "group": "reasoning", + "type": "enum", + "default": "disabled", + "values": [ + "disabled", + "enabled" + ] + }, + { + "path": "thinking.budget_tokens", + "label": "Budget tokens", + "description": "Maximum token budget Anthropic may use for extended thinking before producing the final answer.", + "group": "reasoning", + "applicability": { + "only": { + "thinking.type": "enabled" + } + }, + "type": "integer", + "default": 4096, + "range": { + "min": 1024 + } + }, + { + "path": "thinking.display", + "label": "Thinking display", + "description": "Controls whether Anthropic returns summarized or omitted thinking content.", + "group": "reasoning", + "applicability": { + "only": { + "thinking.type": [ + "enabled" + ] + } + }, + "type": "enum", + "default": "summarized", + "values": [ + "summarized", + "omitted" + ] + }, + { + "path": "output_config.effort", + "label": "Effort", + "description": "Controls Anthropic response thoroughness and token spend.", + "group": "reasoning", + "type": "enum", + "default": "high", + "values": [ + "low", + "medium", + "high" + ] + } + ] + }, + { + "provider": "anthropic", + "authType": "api_key", + "model": "claude-opus-4-6", + "params": [ + { + "path": "max_tokens", + "label": "Max tokens", + "description": "Maximum number of output tokens the model may generate.", + "group": "generation_length", + "type": "integer", + "default": 4096, + "range": { + "min": 1 + } + }, + { + "path": "temperature", + "label": "Temperature", + "description": "Controls randomness. Lower values make outputs more focused; higher values make them more varied.", + "group": "sampling", + "applicability": { + "except": [ + { + "thinking.type": [ + "enabled", + "adaptive" + ] + }, + { + "top_p": { + "not": null + } + } + ] + }, + "type": "number", + "default": 1, + "range": { + "min": 0, + "max": 1, + "step": 0.1 + } + }, + { + "path": "top_p", + "label": "Top P", + "description": "Controls nucleus sampling by limiting generation to tokens whose cumulative probability reaches this value.", + "group": "sampling", + "applicability": { + "except": [ + { + "thinking.type": [ + "enabled", + "adaptive" + ] + }, + { + "temperature": { + "not": null + } + } + ] + }, + "type": "number", + "default": 1, + "range": { + "min": 0, + "max": 1, + "step": 0.01 + } + }, + { + "path": "top_k", + "label": "Top K", + "description": "Limits token sampling to the top K most likely next tokens.", + "group": "sampling", + "applicability": { + "except": { + "thinking.type": [ + "enabled", + "adaptive" + ] + } + }, + "type": "integer", + "default": 0, + "range": { + "min": 0 + } + }, + { + "path": "thinking.type", + "label": "Thinking mode", + "description": "Controls the Anthropic thinking mode values supported by this model.", + "group": "reasoning", + "type": "enum", + "default": "disabled", + "values": [ + "disabled", + "adaptive", + "enabled" + ] + }, + { + "path": "thinking.budget_tokens", + "label": "Budget tokens", + "description": "Maximum token budget Anthropic may use for extended thinking before producing the final answer.", + "group": "reasoning", + "applicability": { + "only": { + "thinking.type": "enabled" + } + }, + "type": "integer", + "default": 4096, + "range": { + "min": 1024 + } + }, + { + "path": "thinking.display", + "label": "Thinking display", + "description": "Controls whether Anthropic returns summarized or omitted thinking content.", + "group": "reasoning", + "applicability": { + "only": { + "thinking.type": [ + "adaptive", + "enabled" + ] + } + }, + "type": "enum", + "default": "summarized", + "values": [ + "summarized", + "omitted" + ] + }, + { + "path": "output_config.effort", + "label": "Effort", + "description": "Controls Anthropic response thoroughness and token spend.", + "group": "reasoning", + "type": "enum", + "default": "high", + "values": [ + "low", + "medium", + "high", + "max" + ] + } + ] + }, + { + "provider": "anthropic", + "authType": "subscription", + "model": "claude-opus-4-6", + "params": [ + { + "path": "max_tokens", + "label": "Max tokens", + "description": "Maximum number of output tokens the model may generate.", + "group": "generation_length", + "type": "integer", + "default": 4096, + "range": { + "min": 1 + } + }, + { + "path": "temperature", + "label": "Temperature", + "description": "Controls randomness. Lower values make outputs more focused; higher values make them more varied.", + "group": "sampling", + "applicability": { + "except": [ + { + "thinking.type": [ + "enabled", + "adaptive" + ] + }, + { + "top_p": { + "not": null + } + } + ] + }, + "type": "number", + "default": 1, + "range": { + "min": 0, + "max": 1, + "step": 0.1 + } + }, + { + "path": "top_p", + "label": "Top P", + "description": "Controls nucleus sampling by limiting generation to tokens whose cumulative probability reaches this value.", + "group": "sampling", + "applicability": { + "except": [ + { + "thinking.type": [ + "enabled", + "adaptive" + ] + }, + { + "temperature": { + "not": null + } + } + ] + }, + "type": "number", + "default": 1, + "range": { + "min": 0, + "max": 1, + "step": 0.01 + } + }, + { + "path": "top_k", + "label": "Top K", + "description": "Limits token sampling to the top K most likely next tokens.", + "group": "sampling", + "applicability": { + "except": { + "thinking.type": [ + "enabled", + "adaptive" + ] + } + }, + "type": "integer", + "default": 0, + "range": { + "min": 0 + } + }, + { + "path": "thinking.type", + "label": "Thinking mode", + "description": "Controls the Anthropic thinking mode values supported by this model.", + "group": "reasoning", + "type": "enum", + "default": "disabled", + "values": [ + "disabled", + "adaptive", + "enabled" + ] + }, + { + "path": "thinking.budget_tokens", + "label": "Budget tokens", + "description": "Maximum token budget Anthropic may use for extended thinking before producing the final answer.", + "group": "reasoning", + "applicability": { + "only": { + "thinking.type": "enabled" + } + }, + "type": "integer", + "default": 4096, + "range": { + "min": 1024 + } + }, + { + "path": "thinking.display", + "label": "Thinking display", + "description": "Controls whether Anthropic returns summarized or omitted thinking content.", + "group": "reasoning", + "applicability": { + "only": { + "thinking.type": [ + "adaptive", + "enabled" + ] + } + }, + "type": "enum", + "default": "summarized", + "values": [ + "summarized", + "omitted" + ] + }, + { + "path": "output_config.effort", + "label": "Effort", + "description": "Controls Anthropic response thoroughness and token spend.", + "group": "reasoning", + "type": "enum", + "default": "high", + "values": [ + "low", + "medium", + "high", + "max" + ] + } + ] + }, + { + "provider": "anthropic", + "authType": "api_key", + "model": "claude-opus-4-7", + "params": [ + { + "path": "max_tokens", + "label": "Max tokens", + "description": "Maximum number of output tokens the model may generate.", + "group": "generation_length", + "type": "integer", + "default": 4096, + "range": { + "min": 1 + } + }, + { + "path": "thinking.type", + "label": "Thinking mode", + "description": "Controls the Anthropic thinking mode values supported by this model.", + "group": "reasoning", + "type": "enum", + "default": "disabled", + "values": [ + "disabled", + "adaptive" + ] + }, + { + "path": "thinking.display", + "label": "Thinking display", + "description": "Controls whether Anthropic returns summarized or omitted thinking content.", + "group": "reasoning", + "applicability": { + "only": { + "thinking.type": [ + "adaptive" + ] + } + }, + "type": "enum", + "default": "omitted", + "values": [ + "summarized", + "omitted" + ] + }, + { + "path": "output_config.effort", + "label": "Effort", + "description": "Controls Anthropic response thoroughness and token spend.", + "group": "reasoning", + "type": "enum", + "default": "high", + "values": [ + "low", + "medium", + "high", + "xhigh", + "max" + ] + } + ] + }, + { + "provider": "anthropic", + "authType": "subscription", + "model": "claude-opus-4-7", + "params": [ + { + "path": "max_tokens", + "label": "Max tokens", + "description": "Maximum number of output tokens the model may generate.", + "group": "generation_length", + "type": "integer", + "default": 4096, + "range": { + "min": 1 + } + }, + { + "path": "thinking.type", + "label": "Thinking mode", + "description": "Controls the Anthropic thinking mode values supported by this model.", + "group": "reasoning", + "type": "enum", + "default": "disabled", + "values": [ + "disabled", + "adaptive" + ] + }, + { + "path": "thinking.display", + "label": "Thinking display", + "description": "Controls whether Anthropic returns summarized or omitted thinking content.", + "group": "reasoning", + "applicability": { + "only": { + "thinking.type": [ + "adaptive" + ] + } + }, + "type": "enum", + "default": "omitted", + "values": [ + "summarized", + "omitted" + ] + }, + { + "path": "output_config.effort", + "label": "Effort", + "description": "Controls Anthropic response thoroughness and token spend.", + "group": "reasoning", + "type": "enum", + "default": "high", + "values": [ + "low", + "medium", + "high", + "xhigh", + "max" + ] + } + ] + }, + { + "provider": "anthropic", + "authType": "api_key", + "model": "claude-opus-4-8", + "params": [ + { + "path": "max_tokens", + "label": "Max tokens", + "description": "Maximum number of output tokens the model may generate.", + "group": "generation_length", + "type": "integer", + "default": 4096, + "range": { + "min": 1 + } + }, + { + "path": "thinking.type", + "label": "Thinking mode", + "description": "Controls the Anthropic thinking mode values supported by this model.", + "group": "reasoning", + "type": "enum", + "default": "disabled", + "values": [ + "disabled", + "adaptive" + ] + }, + { + "path": "thinking.display", + "label": "Thinking display", + "description": "Controls whether Anthropic returns summarized or omitted thinking content.", + "group": "reasoning", + "applicability": { + "only": { + "thinking.type": [ + "adaptive" + ] + } + }, + "type": "enum", + "default": "omitted", + "values": [ + "summarized", + "omitted" + ] + }, + { + "path": "output_config.effort", + "label": "Effort", + "description": "Controls Anthropic response thoroughness and token spend.", + "group": "reasoning", + "type": "enum", + "default": "high", + "values": [ + "low", + "medium", + "high", + "xhigh", + "max" + ] + } + ] + }, + { + "provider": "anthropic", + "authType": "subscription", + "model": "claude-opus-4-8", + "params": [ + { + "path": "max_tokens", + "label": "Max tokens", + "description": "Maximum number of output tokens the model may generate.", + "group": "generation_length", + "type": "integer", + "default": 4096, + "range": { + "min": 1 + } + }, + { + "path": "thinking.type", + "label": "Thinking mode", + "description": "Controls the Anthropic thinking mode values supported by this model.", + "group": "reasoning", + "type": "enum", + "default": "disabled", + "values": [ + "disabled", + "adaptive" + ] + }, + { + "path": "thinking.display", + "label": "Thinking display", + "description": "Controls whether Anthropic returns summarized or omitted thinking content.", + "group": "reasoning", + "applicability": { + "only": { + "thinking.type": [ + "adaptive" + ] + } + }, + "type": "enum", + "default": "omitted", + "values": [ + "summarized", + "omitted" + ] + }, + { + "path": "output_config.effort", + "label": "Effort", + "description": "Controls Anthropic response thoroughness and token spend.", + "group": "reasoning", + "type": "enum", + "default": "high", + "values": [ + "low", + "medium", + "high", + "xhigh", + "max" + ] + } + ] + }, + { + "provider": "anthropic", + "authType": "subscription", + "model": "claude-opus-4", + "params": [ + { + "path": "max_tokens", + "label": "Max tokens", + "description": "Maximum number of output tokens the model may generate.", + "group": "generation_length", + "type": "integer", + "default": 4096, + "range": { + "min": 1 + } + }, + { + "path": "temperature", + "label": "Temperature", + "description": "Controls randomness. Lower values make outputs more focused; higher values make them more varied.", + "group": "sampling", + "applicability": { + "except": { + "thinking.type": [ + "adaptive", + "enabled" + ] + } + }, + "type": "number", + "default": 1, + "range": { + "min": 0, + "max": 1, + "step": 0.1 + } + }, + { + "path": "top_p", + "label": "Top P", + "description": "Controls nucleus sampling by limiting generation to tokens whose cumulative probability reaches this value.", + "group": "sampling", + "applicability": { + "except": [ + { + "thinking.type": [ + "adaptive", + "enabled" + ] + }, + { + "temperature": { + "not": 1 + } + } + ] + }, + "type": "number", + "default": 1, + "range": { + "min": 0, + "max": 1, + "step": 0.01 + } + }, + { + "path": "top_k", + "label": "Top K", + "description": "Limits token sampling to the top K most likely next tokens.", + "group": "sampling", + "applicability": { + "except": { + "thinking.type": [ + "adaptive", + "enabled" + ] + } + }, + "type": "integer", + "default": 0, + "range": { + "min": 0 + } + }, + { + "path": "thinking.type", + "label": "Thinking mode", + "description": "Controls the Anthropic thinking mode values supported by this model.", + "group": "reasoning", + "type": "enum", + "default": "disabled", + "values": [ + "disabled", + "adaptive", + "enabled" + ] + }, + { + "path": "thinking.budget_tokens", + "label": "Budget tokens", + "description": "Maximum token budget Anthropic may use for extended thinking before producing the final answer.", + "group": "reasoning", + "applicability": { + "only": { + "thinking.type": "enabled" + } + }, + "type": "integer", + "default": 4096, + "range": { + "min": 1024 + } + } + ] + }, + { + "provider": "anthropic", + "authType": "api_key", + "model": "claude-sonnet-4-20250514", + "params": [ + { + "path": "max_tokens", + "label": "Max tokens", + "description": "Maximum number of output tokens the model may generate.", + "group": "generation_length", + "type": "integer", + "default": 4096, + "range": { + "min": 1 + } + }, + { + "path": "temperature", + "label": "Temperature", + "description": "Controls randomness. Lower values make outputs more focused; higher values make them more varied.", + "group": "sampling", + "applicability": { + "except": [ + { + "thinking.type": [ + "enabled" + ] + } + ] + }, + "type": "number", + "default": 1, + "range": { + "min": 0, + "max": 1, + "step": 0.1 + } + }, + { + "path": "top_p", + "label": "Top P", + "description": "Controls nucleus sampling by limiting generation to tokens whose cumulative probability reaches this value.", + "group": "sampling", + "applicability": { + "except": [ + { + "thinking.type": [ + "enabled" + ] + } + ] + }, + "type": "number", + "default": 1, + "range": { + "min": 0, + "max": 1, + "step": 0.01 + } + }, + { + "path": "top_k", + "label": "Top K", + "description": "Limits token sampling to the top K most likely next tokens.", + "group": "sampling", + "applicability": { + "except": { + "thinking.type": [ + "enabled" + ] + } + }, + "type": "integer", + "default": 0, + "range": { + "min": 0 + } + }, + { + "path": "thinking.type", + "label": "Thinking mode", + "description": "Controls the Anthropic thinking mode values supported by this model.", + "group": "reasoning", + "type": "enum", + "default": "disabled", + "values": [ + "disabled", + "enabled" + ] + }, + { + "path": "thinking.budget_tokens", + "label": "Budget tokens", + "description": "Maximum token budget Anthropic may use for extended thinking before producing the final answer.", + "group": "reasoning", + "applicability": { + "only": { + "thinking.type": "enabled" + } + }, + "type": "integer", + "default": 4096, + "range": { + "min": 1024 + } + }, + { + "path": "thinking.display", + "label": "Thinking display", + "description": "Controls whether Anthropic returns summarized or omitted thinking content.", + "group": "reasoning", + "applicability": { + "only": { + "thinking.type": [ + "enabled" + ] + } + }, + "type": "enum", + "default": "summarized", + "values": [ + "summarized", + "omitted" + ] + } + ] + }, + { + "provider": "anthropic", + "authType": "subscription", + "model": "claude-sonnet-4-20250514", + "params": [ + { + "path": "max_tokens", + "label": "Max tokens", + "description": "Maximum number of output tokens the model may generate.", + "group": "generation_length", + "type": "integer", + "default": 4096, + "range": { + "min": 1 + } + }, + { + "path": "temperature", + "label": "Temperature", + "description": "Controls randomness. Lower values make outputs more focused; higher values make them more varied.", + "group": "sampling", + "applicability": { + "except": [ + { + "thinking.type": [ + "enabled" + ] + } + ] + }, + "type": "number", + "default": 1, + "range": { + "min": 0, + "max": 1, + "step": 0.1 + } + }, + { + "path": "top_p", + "label": "Top P", + "description": "Controls nucleus sampling by limiting generation to tokens whose cumulative probability reaches this value.", + "group": "sampling", + "applicability": { + "except": [ + { + "thinking.type": [ + "enabled" + ] + } + ] + }, + "type": "number", + "default": 1, + "range": { + "min": 0, + "max": 1, + "step": 0.01 + } + }, + { + "path": "top_k", + "label": "Top K", + "description": "Limits token sampling to the top K most likely next tokens.", + "group": "sampling", + "applicability": { + "except": { + "thinking.type": [ + "enabled" + ] + } + }, + "type": "integer", + "default": 0, + "range": { + "min": 0 + } + }, + { + "path": "thinking.type", + "label": "Thinking mode", + "description": "Controls the Anthropic thinking mode values supported by this model.", + "group": "reasoning", + "type": "enum", + "default": "disabled", + "values": [ + "disabled", + "enabled" + ] + }, + { + "path": "thinking.budget_tokens", + "label": "Budget tokens", + "description": "Maximum token budget Anthropic may use for extended thinking before producing the final answer.", + "group": "reasoning", + "applicability": { + "only": { + "thinking.type": "enabled" + } + }, + "type": "integer", + "default": 4096, + "range": { + "min": 1024 + } + }, + { + "path": "thinking.display", + "label": "Thinking display", + "description": "Controls whether Anthropic returns summarized or omitted thinking content.", + "group": "reasoning", + "applicability": { + "only": { + "thinking.type": [ + "enabled" + ] + } + }, + "type": "enum", + "default": "summarized", + "values": [ + "summarized", + "omitted" + ] + } + ] + }, + { + "provider": "anthropic", + "authType": "api_key", + "model": "claude-sonnet-4-5", + "params": [ + { + "path": "max_tokens", + "label": "Max tokens", + "description": "Maximum number of output tokens the model may generate.", + "group": "generation_length", + "type": "integer", + "default": 4096, + "range": { + "min": 1 + } + }, + { + "path": "temperature", + "label": "Temperature", + "description": "Controls randomness. Lower values make outputs more focused; higher values make them more varied.", + "group": "sampling", + "applicability": { + "except": { + "thinking.type": [ + "adaptive", + "enabled" + ] + } + }, + "type": "number", + "default": 1, + "range": { + "min": 0, + "max": 1, + "step": 0.1 + } + }, + { + "path": "top_p", + "label": "Top P", + "description": "Controls nucleus sampling by limiting generation to tokens whose cumulative probability reaches this value.", + "group": "sampling", + "applicability": { + "except": [ + { + "thinking.type": [ + "adaptive", + "enabled" + ] + }, + { + "temperature": { + "not": 1 + } + } + ] + }, + "type": "number", + "default": 1, + "range": { + "min": 0, + "max": 1, + "step": 0.01 + } + }, + { + "path": "top_k", + "label": "Top K", + "description": "Limits token sampling to the top K most likely next tokens.", + "group": "sampling", + "applicability": { + "except": { + "thinking.type": [ + "adaptive", + "enabled" + ] + } + }, + "type": "integer", + "default": 0, + "range": { + "min": 0 + } + }, + { + "path": "thinking.type", + "label": "Thinking mode", + "description": "Controls the Anthropic thinking mode values supported by this model.", + "group": "reasoning", + "type": "enum", + "default": "disabled", + "values": [ + "disabled", + "adaptive", + "enabled" + ] + }, + { + "path": "thinking.budget_tokens", + "label": "Budget tokens", + "description": "Maximum token budget Anthropic may use for extended thinking before producing the final answer.", + "group": "reasoning", + "applicability": { + "only": { + "thinking.type": "enabled" + } + }, + "type": "integer", + "default": 4096, + "range": { + "min": 1024 + } + } + ] + }, + { + "provider": "anthropic", + "authType": "api_key", + "model": "claude-sonnet-4-5-20250929", + "params": [ + { + "path": "max_tokens", + "label": "Max tokens", + "description": "Maximum number of output tokens the model may generate.", + "group": "generation_length", + "type": "integer", + "default": 4096, + "range": { + "min": 1 + } + }, + { + "path": "temperature", + "label": "Temperature", + "description": "Controls randomness. Lower values make outputs more focused; higher values make them more varied.", + "group": "sampling", + "applicability": { + "except": [ + { + "thinking.type": [ + "enabled" + ] + }, + { + "top_p": { + "not": null + } + } + ] + }, + "type": "number", + "default": 1, + "range": { + "min": 0, + "max": 1, + "step": 0.1 + } + }, + { + "path": "top_p", + "label": "Top P", + "description": "Controls nucleus sampling by limiting generation to tokens whose cumulative probability reaches this value.", + "group": "sampling", + "applicability": { + "except": [ + { + "thinking.type": [ + "enabled" + ] + }, + { + "temperature": { + "not": null + } + } + ] + }, + "type": "number", + "default": 1, + "range": { + "min": 0, + "max": 1, + "step": 0.01 + } + }, + { + "path": "top_k", + "label": "Top K", + "description": "Limits token sampling to the top K most likely next tokens.", + "group": "sampling", + "applicability": { + "except": { + "thinking.type": [ + "enabled" + ] + } + }, + "type": "integer", + "default": 0, + "range": { + "min": 0 + } + }, + { + "path": "thinking.type", + "label": "Thinking mode", + "description": "Controls the Anthropic thinking mode values supported by this model.", + "group": "reasoning", + "type": "enum", + "default": "disabled", + "values": [ + "disabled", + "enabled" + ] + }, + { + "path": "thinking.budget_tokens", + "label": "Budget tokens", + "description": "Maximum token budget Anthropic may use for extended thinking before producing the final answer.", + "group": "reasoning", + "applicability": { + "only": { + "thinking.type": "enabled" + } + }, + "type": "integer", + "default": 4096, + "range": { + "min": 1024 + } + } + ] + }, + { + "provider": "anthropic", + "authType": "subscription", + "model": "claude-sonnet-4-5-20250929", + "params": [ + { + "path": "max_tokens", + "label": "Max tokens", + "description": "Maximum number of output tokens the model may generate.", + "group": "generation_length", + "type": "integer", + "default": 4096, + "range": { + "min": 1 + } + }, + { + "path": "temperature", + "label": "Temperature", + "description": "Controls randomness. Lower values make outputs more focused; higher values make them more varied.", + "group": "sampling", + "applicability": { + "except": [ + { + "thinking.type": [ + "enabled" + ] + }, + { + "top_p": { + "not": null + } + } + ] + }, + "type": "number", + "default": 1, + "range": { + "min": 0, + "max": 1, + "step": 0.1 + } + }, + { + "path": "top_p", + "label": "Top P", + "description": "Controls nucleus sampling by limiting generation to tokens whose cumulative probability reaches this value.", + "group": "sampling", + "applicability": { + "except": [ + { + "thinking.type": [ + "enabled" + ] + }, + { + "temperature": { + "not": null + } + } + ] + }, + "type": "number", + "default": 1, + "range": { + "min": 0, + "max": 1, + "step": 0.01 + } + }, + { + "path": "top_k", + "label": "Top K", + "description": "Limits token sampling to the top K most likely next tokens.", + "group": "sampling", + "applicability": { + "except": { + "thinking.type": [ + "enabled" + ] + } + }, + "type": "integer", + "default": 0, + "range": { + "min": 0 + } + }, + { + "path": "thinking.type", + "label": "Thinking mode", + "description": "Controls the Anthropic thinking mode values supported by this model.", + "group": "reasoning", + "type": "enum", + "default": "disabled", + "values": [ + "disabled", + "enabled" + ] + }, + { + "path": "thinking.budget_tokens", + "label": "Budget tokens", + "description": "Maximum token budget Anthropic may use for extended thinking before producing the final answer.", + "group": "reasoning", + "applicability": { + "only": { + "thinking.type": "enabled" + } + }, + "type": "integer", + "default": 4096, + "range": { + "min": 1024 + } + } + ] + }, + { + "provider": "anthropic", + "authType": "subscription", + "model": "claude-sonnet-4-5", + "params": [ + { + "path": "max_tokens", + "label": "Max tokens", + "description": "Maximum number of output tokens the model may generate.", + "group": "generation_length", + "type": "integer", + "default": 4096, + "range": { + "min": 1 + } + }, + { + "path": "temperature", + "label": "Temperature", + "description": "Controls randomness. Lower values make outputs more focused; higher values make them more varied.", + "group": "sampling", + "applicability": { + "except": { + "thinking.type": [ + "adaptive", + "enabled" + ] + } + }, + "type": "number", + "default": 1, + "range": { + "min": 0, + "max": 1, + "step": 0.1 + } + }, + { + "path": "top_p", + "label": "Top P", + "description": "Controls nucleus sampling by limiting generation to tokens whose cumulative probability reaches this value.", + "group": "sampling", + "applicability": { + "except": [ + { + "thinking.type": [ + "adaptive", + "enabled" + ] + }, + { + "temperature": { + "not": 1 + } + } + ] + }, + "type": "number", + "default": 1, + "range": { + "min": 0, + "max": 1, + "step": 0.01 + } + }, + { + "path": "top_k", + "label": "Top K", + "description": "Limits token sampling to the top K most likely next tokens.", + "group": "sampling", + "applicability": { + "except": { + "thinking.type": [ + "adaptive", + "enabled" + ] + } + }, + "type": "integer", + "default": 0, + "range": { + "min": 0 + } + }, + { + "path": "thinking.type", + "label": "Thinking mode", + "description": "Controls the Anthropic thinking mode values supported by this model.", + "group": "reasoning", + "type": "enum", + "default": "disabled", + "values": [ + "disabled", + "adaptive", + "enabled" + ] + }, + { + "path": "thinking.budget_tokens", + "label": "Budget tokens", + "description": "Maximum token budget Anthropic may use for extended thinking before producing the final answer.", + "group": "reasoning", + "applicability": { + "only": { + "thinking.type": "enabled" + } + }, + "type": "integer", + "default": 4096, + "range": { + "min": 1024 + } + } + ] + }, + { + "provider": "anthropic", + "authType": "api_key", + "model": "claude-sonnet-4-6", + "params": [ + { + "path": "max_tokens", + "label": "Max tokens", + "description": "Maximum number of output tokens the model may generate.", + "group": "generation_length", + "type": "integer", + "default": 4096, + "range": { + "min": 1 + } + }, + { + "path": "temperature", + "label": "Temperature", + "description": "Controls randomness. Lower values make outputs more focused; higher values make them more varied.", + "group": "sampling", + "applicability": { + "except": [ + { + "thinking.type": [ + "enabled", + "adaptive" + ] + }, + { + "top_p": { + "not": null + } + } + ] + }, + "type": "number", + "default": 1, + "range": { + "min": 0, + "max": 1, + "step": 0.1 + } + }, + { + "path": "top_p", + "label": "Top P", + "description": "Controls nucleus sampling by limiting generation to tokens whose cumulative probability reaches this value.", + "group": "sampling", + "applicability": { + "except": [ + { + "thinking.type": [ + "enabled", + "adaptive" + ] + }, + { + "temperature": { + "not": null + } + } + ] + }, + "type": "number", + "default": 1, + "range": { + "min": 0, + "max": 1, + "step": 0.01 + } + }, + { + "path": "top_k", + "label": "Top K", + "description": "Limits token sampling to the top K most likely next tokens.", + "group": "sampling", + "applicability": { + "except": { + "thinking.type": [ + "enabled", + "adaptive" + ] + } + }, + "type": "integer", + "default": 0, + "range": { + "min": 0 + } + }, + { + "path": "thinking.type", + "label": "Thinking mode", + "description": "Controls the Anthropic thinking mode values supported by this model.", + "group": "reasoning", + "type": "enum", + "default": "disabled", + "values": [ + "disabled", + "adaptive", + "enabled" + ] + }, + { + "path": "thinking.budget_tokens", + "label": "Budget tokens", + "description": "Maximum token budget Anthropic may use for extended thinking before producing the final answer.", + "group": "reasoning", + "applicability": { + "only": { + "thinking.type": "enabled" + } + }, + "type": "integer", + "default": 4096, + "range": { + "min": 1024 + } + }, + { + "path": "thinking.display", + "label": "Thinking display", + "description": "Controls whether Anthropic returns summarized or omitted thinking content.", + "group": "reasoning", + "applicability": { + "only": { + "thinking.type": [ + "adaptive", + "enabled" + ] + } + }, + "type": "enum", + "default": "summarized", + "values": [ + "summarized", + "omitted" + ] + }, + { + "path": "output_config.effort", + "label": "Effort", + "description": "Controls Anthropic response thoroughness and token spend.", + "group": "reasoning", + "type": "enum", + "default": "high", + "values": [ + "low", + "medium", + "high", + "max" + ] + } + ] + }, + { + "provider": "anthropic", + "authType": "subscription", + "model": "claude-sonnet-4-6", + "params": [ + { + "path": "max_tokens", + "label": "Max tokens", + "description": "Maximum number of output tokens the model may generate.", + "group": "generation_length", + "type": "integer", + "default": 4096, + "range": { + "min": 1 + } + }, + { + "path": "temperature", + "label": "Temperature", + "description": "Controls randomness. Lower values make outputs more focused; higher values make them more varied.", + "group": "sampling", + "applicability": { + "except": [ + { + "thinking.type": [ + "enabled", + "adaptive" + ] + }, + { + "top_p": { + "not": null + } + } + ] + }, + "type": "number", + "default": 1, + "range": { + "min": 0, + "max": 1, + "step": 0.1 + } + }, + { + "path": "top_p", + "label": "Top P", + "description": "Controls nucleus sampling by limiting generation to tokens whose cumulative probability reaches this value.", + "group": "sampling", + "applicability": { + "except": [ + { + "thinking.type": [ + "enabled", + "adaptive" + ] + }, + { + "temperature": { + "not": null + } + } + ] + }, + "type": "number", + "default": 1, + "range": { + "min": 0, + "max": 1, + "step": 0.01 + } + }, + { + "path": "top_k", + "label": "Top K", + "description": "Limits token sampling to the top K most likely next tokens.", + "group": "sampling", + "applicability": { + "except": { + "thinking.type": [ + "enabled", + "adaptive" + ] + } + }, + "type": "integer", + "default": 0, + "range": { + "min": 0 + } + }, + { + "path": "thinking.type", + "label": "Thinking mode", + "description": "Controls the Anthropic thinking mode values supported by this model.", + "group": "reasoning", + "type": "enum", + "default": "disabled", + "values": [ + "disabled", + "adaptive", + "enabled" + ] + }, + { + "path": "thinking.budget_tokens", + "label": "Budget tokens", + "description": "Maximum token budget Anthropic may use for extended thinking before producing the final answer.", + "group": "reasoning", + "applicability": { + "only": { + "thinking.type": "enabled" + } + }, + "type": "integer", + "default": 4096, + "range": { + "min": 1024 + } + }, + { + "path": "thinking.display", + "label": "Thinking display", + "description": "Controls whether Anthropic returns summarized or omitted thinking content.", + "group": "reasoning", + "applicability": { + "only": { + "thinking.type": [ + "adaptive", + "enabled" + ] + } + }, + "type": "enum", + "default": "summarized", + "values": [ + "summarized", + "omitted" + ] + }, + { + "path": "output_config.effort", + "label": "Effort", + "description": "Controls Anthropic response thoroughness and token spend.", + "group": "reasoning", + "type": "enum", + "default": "high", + "values": [ + "low", + "medium", + "high", + "max" + ] + } + ] + }, + { + "provider": "anthropic", + "authType": "subscription", + "model": "claude-sonnet-4", + "params": [ + { + "path": "max_tokens", + "label": "Max tokens", + "description": "Maximum number of output tokens the model may generate.", + "group": "generation_length", + "type": "integer", + "default": 4096, + "range": { + "min": 1 + } + }, + { + "path": "temperature", + "label": "Temperature", + "description": "Controls randomness. Lower values make outputs more focused; higher values make them more varied.", + "group": "sampling", + "applicability": { + "except": { + "thinking.type": [ + "adaptive", + "enabled" + ] + } + }, + "type": "number", + "default": 1, + "range": { + "min": 0, + "max": 1, + "step": 0.1 + } + }, + { + "path": "top_p", + "label": "Top P", + "description": "Controls nucleus sampling by limiting generation to tokens whose cumulative probability reaches this value.", + "group": "sampling", + "applicability": { + "except": [ + { + "thinking.type": [ + "adaptive", + "enabled" + ] + }, + { + "temperature": { + "not": 1 + } + } + ] + }, + "type": "number", + "default": 1, + "range": { + "min": 0, + "max": 1, + "step": 0.01 + } + }, + { + "path": "top_k", + "label": "Top K", + "description": "Limits token sampling to the top K most likely next tokens.", + "group": "sampling", + "applicability": { + "except": { + "thinking.type": [ + "adaptive", + "enabled" + ] + } + }, + "type": "integer", + "default": 0, + "range": { + "min": 0 + } + }, + { + "path": "thinking.type", + "label": "Thinking mode", + "description": "Controls the Anthropic thinking mode values supported by this model.", + "group": "reasoning", + "type": "enum", + "default": "disabled", + "values": [ + "disabled", + "adaptive", + "enabled" + ] + }, + { + "path": "thinking.budget_tokens", + "label": "Budget tokens", + "description": "Maximum token budget Anthropic may use for extended thinking before producing the final answer.", + "group": "reasoning", + "applicability": { + "only": { + "thinking.type": "enabled" + } + }, + "type": "integer", + "default": 4096, + "range": { + "min": 1024 + } + } + ] + }, + { + "provider": "cohere", + "authType": "api_key", + "model": "command-a-03-2025", + "params": [ + { + "path": "max_tokens", + "label": "Max tokens", + "description": "Maximum number of output tokens the model may generate.", + "group": "generation_length", + "type": "integer", + "range": { + "min": 1 + } + }, + { + "path": "stop_sequences", + "label": "Stop sequences", + "description": "Stops generation when one of these sequences is detected; up to five are allowed.", + "group": "generation_length", + "type": "string" + }, + { + "path": "temperature", + "label": "Temperature", + "description": "Controls randomness. Lower values make outputs more focused; higher values make them more varied.", + "group": "sampling", + "type": "number", + "default": 0.3, + "range": { + "min": 0, + "step": 0.1 + } + }, + { + "path": "p", + "label": "Top P", + "description": "Controls nucleus sampling by limiting generation to tokens within the selected cumulative probability.", + "group": "sampling", + "type": "number", + "default": 0.75, + "range": { + "min": 0.01, + "max": 0.99, + "step": 0.01 + } + }, + { + "path": "k", + "label": "Top K", + "description": "Limits sampling to the K most likely tokens; 0 disables top-k sampling.", + "group": "sampling", + "type": "integer", + "default": 0, + "range": { + "min": 0, + "max": 500 + } + }, + { + "path": "frequency_penalty", + "label": "Frequency penalty", + "description": "Penalizes tokens proportional to how often they have already appeared to reduce repetition.", + "group": "sampling", + "type": "number", + "default": 0, + "range": { + "min": 0, + "max": 1, + "step": 0.1 + } + }, + { + "path": "presence_penalty", + "label": "Presence penalty", + "description": "Penalizes tokens that have already appeared to encourage a wider variety of content.", + "group": "sampling", + "type": "number", + "default": 0, + "range": { + "min": 0, + "max": 1, + "step": 0.1 + } + }, + { + "path": "seed", + "label": "Seed", + "description": "Seed used for best-effort deterministic sampling when reproducible outputs are desired.", + "group": "sampling", + "type": "integer" + }, + { + "path": "response_format.type", + "label": "Response format", + "description": "Controls whether the model returns normal text or JSON object output.", + "group": "output_format", + "type": "enum", + "default": "text", + "values": [ + "text", + "json_object" + ] + }, + { + "path": "logprobs", + "label": "Log probabilities", + "description": "Controls whether the response includes log probabilities for the generated tokens.", + "group": "observability", + "type": "boolean", + "default": false + }, + { + "path": "tool_choice", + "label": "Tool choice", + "description": "Forces the model to either call a tool or skip tool calls for this request.", + "group": "tooling", + "type": "enum", + "values": [ + "REQUIRED", + "NONE" + ] + }, + { + "path": "safety_mode", + "label": "Safety mode", + "description": "Controls Cohere's built-in safety instructions applied to the generation.", + "group": "provider_metadata", + "type": "enum", + "default": "CONTEXTUAL", + "values": [ + "CONTEXTUAL", + "STRICT" + ] + } + ] + }, + { + "provider": "cohere", + "authType": "api_key", + "model": "command-a-plus-05-2026", + "params": [ + { + "path": "max_tokens", + "label": "Max tokens", + "description": "Maximum number of output tokens the model may generate.", + "group": "generation_length", + "type": "integer", + "range": { + "min": 1 + } + }, + { + "path": "stop_sequences", + "label": "Stop sequences", + "description": "Stops generation when one of these sequences is detected; up to five are allowed.", + "group": "generation_length", + "type": "string" + }, + { + "path": "temperature", + "label": "Temperature", + "description": "Controls randomness. Lower values make outputs more focused; higher values make them more varied.", + "group": "sampling", + "type": "number", + "default": 0.3, + "range": { + "min": 0, + "step": 0.1 + } + }, + { + "path": "p", + "label": "Top P", + "description": "Controls nucleus sampling by limiting generation to tokens within the selected cumulative probability.", + "group": "sampling", + "type": "number", + "default": 0.75, + "range": { + "min": 0.01, + "max": 0.99, + "step": 0.01 + } + }, + { + "path": "k", + "label": "Top K", + "description": "Limits sampling to the K most likely tokens; 0 disables top-k sampling.", + "group": "sampling", + "type": "integer", + "default": 0, + "range": { + "min": 0, + "max": 500 + } + }, + { + "path": "frequency_penalty", + "label": "Frequency penalty", + "description": "Penalizes tokens proportional to how often they have already appeared to reduce repetition.", + "group": "sampling", + "type": "number", + "default": 0, + "range": { + "min": 0, + "max": 1, + "step": 0.1 + } + }, + { + "path": "presence_penalty", + "label": "Presence penalty", + "description": "Penalizes tokens that have already appeared to encourage a wider variety of content.", + "group": "sampling", + "type": "number", + "default": 0, + "range": { + "min": 0, + "max": 1, + "step": 0.1 + } + }, + { + "path": "seed", + "label": "Seed", + "description": "Seed used for best-effort deterministic sampling when reproducible outputs are desired.", + "group": "sampling", + "type": "integer" + }, + { + "path": "response_format.type", + "label": "Response format", + "description": "Controls whether the model returns normal text or JSON object output.", + "group": "output_format", + "type": "enum", + "default": "text", + "values": [ + "text", + "json_object" + ] + }, + { + "path": "logprobs", + "label": "Log probabilities", + "description": "Controls whether the response includes log probabilities for the generated tokens.", + "group": "observability", + "type": "boolean", + "default": false + }, + { + "path": "tool_choice", + "label": "Tool choice", + "description": "Forces the model to either call a tool or skip tool calls for this request.", + "group": "tooling", + "type": "enum", + "values": [ + "REQUIRED", + "NONE" + ] + }, + { + "path": "safety_mode", + "label": "Safety mode", + "description": "Controls Cohere's built-in safety instructions applied to the generation.", + "group": "provider_metadata", + "type": "enum", + "default": "CONTEXTUAL", + "values": [ + "CONTEXTUAL", + "STRICT" + ] + } + ] + }, + { + "provider": "cohere", + "authType": "api_key", + "model": "command-a-reasoning-08-2025", + "params": [ + { + "path": "max_tokens", + "label": "Max tokens", + "description": "Maximum number of output tokens the model may generate.", + "group": "generation_length", + "type": "integer", + "range": { + "min": 1 + } + }, + { + "path": "stop_sequences", + "label": "Stop sequences", + "description": "Stops generation when one of these sequences is detected; up to five are allowed.", + "group": "generation_length", + "type": "string" + }, + { + "path": "temperature", + "label": "Temperature", + "description": "Controls randomness. Lower values make outputs more focused; higher values make them more varied.", + "group": "sampling", + "type": "number", + "default": 0.3, + "range": { + "min": 0, + "step": 0.1 + } + }, + { + "path": "p", + "label": "Top P", + "description": "Controls nucleus sampling by limiting generation to tokens within the selected cumulative probability.", + "group": "sampling", + "type": "number", + "default": 0.75, + "range": { + "min": 0.01, + "max": 0.99, + "step": 0.01 + } + }, + { + "path": "k", + "label": "Top K", + "description": "Limits sampling to the K most likely tokens; 0 disables top-k sampling.", + "group": "sampling", + "type": "integer", + "default": 0, + "range": { + "min": 0, + "max": 500 + } + }, + { + "path": "frequency_penalty", + "label": "Frequency penalty", + "description": "Penalizes tokens proportional to how often they have already appeared to reduce repetition.", + "group": "sampling", + "type": "number", + "default": 0, + "range": { + "min": 0, + "max": 1, + "step": 0.1 + } + }, + { + "path": "presence_penalty", + "label": "Presence penalty", + "description": "Penalizes tokens that have already appeared to encourage a wider variety of content.", + "group": "sampling", + "type": "number", + "default": 0, + "range": { + "min": 0, + "max": 1, + "step": 0.1 + } + }, + { + "path": "seed", + "label": "Seed", + "description": "Seed used for best-effort deterministic sampling when reproducible outputs are desired.", + "group": "sampling", + "type": "integer" + }, + { + "path": "thinking.type", + "label": "Thinking mode", + "description": "Controls whether the model reasons step by step before producing its final answer.", + "group": "reasoning", + "type": "enum", + "default": "disabled", + "values": [ + "enabled", + "disabled" + ] + }, + { + "path": "thinking.token_budget", + "label": "Thinking token budget", + "description": "Maximum number of tokens the model may spend on reasoning before answering.", + "group": "reasoning", + "applicability": { + "only": { + "thinking.type": "enabled" + } + }, + "type": "integer", + "range": { + "min": 1 + } + }, + { + "path": "response_format.type", + "label": "Response format", + "description": "Controls whether the model returns normal text or JSON object output.", + "group": "output_format", + "type": "enum", + "default": "text", + "values": [ + "text", + "json_object" + ] + }, + { + "path": "logprobs", + "label": "Log probabilities", + "description": "Controls whether the response includes log probabilities for the generated tokens.", + "group": "observability", + "type": "boolean", + "default": false + }, + { + "path": "tool_choice", + "label": "Tool choice", + "description": "Forces the model to either call a tool or skip tool calls for this request.", + "group": "tooling", + "type": "enum", + "values": [ + "REQUIRED", + "NONE" + ] + }, + { + "path": "safety_mode", + "label": "Safety mode", + "description": "Controls Cohere's built-in safety instructions applied to the generation.", + "group": "provider_metadata", + "type": "enum", + "default": "CONTEXTUAL", + "values": [ + "CONTEXTUAL", + "STRICT" + ] + } + ] + }, + { + "provider": "cohere", + "authType": "api_key", + "model": "command-a-translate-08-2025", + "params": [ + { + "path": "max_tokens", + "label": "Max tokens", + "description": "Maximum number of output tokens the model may generate.", + "group": "generation_length", + "type": "integer", + "range": { + "min": 1 + } + }, + { + "path": "stop_sequences", + "label": "Stop sequences", + "description": "Stops generation when one of these sequences is detected; up to five are allowed.", + "group": "generation_length", + "type": "string" + }, + { + "path": "temperature", + "label": "Temperature", + "description": "Controls randomness. Lower values make outputs more focused; higher values make them more varied.", + "group": "sampling", + "type": "number", + "default": 0.3, + "range": { + "min": 0, + "step": 0.1 + } + }, + { + "path": "p", + "label": "Top P", + "description": "Controls nucleus sampling by limiting generation to tokens within the selected cumulative probability.", + "group": "sampling", + "type": "number", + "default": 0.75, + "range": { + "min": 0.01, + "max": 0.99, + "step": 0.01 + } + }, + { + "path": "k", + "label": "Top K", + "description": "Limits sampling to the K most likely tokens; 0 disables top-k sampling.", + "group": "sampling", + "type": "integer", + "default": 0, + "range": { + "min": 0, + "max": 500 + } + }, + { + "path": "frequency_penalty", + "label": "Frequency penalty", + "description": "Penalizes tokens proportional to how often they have already appeared to reduce repetition.", + "group": "sampling", + "type": "number", + "default": 0, + "range": { + "min": 0, + "max": 1, + "step": 0.1 + } + }, + { + "path": "presence_penalty", + "label": "Presence penalty", + "description": "Penalizes tokens that have already appeared to encourage a wider variety of content.", + "group": "sampling", + "type": "number", + "default": 0, + "range": { + "min": 0, + "max": 1, + "step": 0.1 + } + }, + { + "path": "seed", + "label": "Seed", + "description": "Seed used for best-effort deterministic sampling when reproducible outputs are desired.", + "group": "sampling", + "type": "integer" + }, + { + "path": "response_format.type", + "label": "Response format", + "description": "Controls whether the model returns normal text or JSON object output.", + "group": "output_format", + "type": "enum", + "default": "text", + "values": [ + "text", + "json_object" + ] + }, + { + "path": "logprobs", + "label": "Log probabilities", + "description": "Controls whether the response includes log probabilities for the generated tokens.", + "group": "observability", + "type": "boolean", + "default": false + }, + { + "path": "tool_choice", + "label": "Tool choice", + "description": "Forces the model to either call a tool or skip tool calls for this request.", + "group": "tooling", + "type": "enum", + "values": [ + "REQUIRED", + "NONE" + ] + }, + { + "path": "safety_mode", + "label": "Safety mode", + "description": "Controls Cohere's built-in safety instructions applied to the generation.", + "group": "provider_metadata", + "type": "enum", + "default": "CONTEXTUAL", + "values": [ + "CONTEXTUAL", + "STRICT" + ] + } + ] + }, + { + "provider": "cohere", + "authType": "api_key", + "model": "command-a-vision-07-2025", + "params": [ + { + "path": "max_tokens", + "label": "Max tokens", + "description": "Maximum number of output tokens the model may generate.", + "group": "generation_length", + "type": "integer", + "range": { + "min": 1 + } + }, + { + "path": "stop_sequences", + "label": "Stop sequences", + "description": "Stops generation when one of these sequences is detected; up to five are allowed.", + "group": "generation_length", + "type": "string" + }, + { + "path": "temperature", + "label": "Temperature", + "description": "Controls randomness. Lower values make outputs more focused; higher values make them more varied.", + "group": "sampling", + "type": "number", + "default": 0.3, + "range": { + "min": 0, + "step": 0.1 + } + }, + { + "path": "p", + "label": "Top P", + "description": "Controls nucleus sampling by limiting generation to tokens within the selected cumulative probability.", + "group": "sampling", + "type": "number", + "default": 0.75, + "range": { + "min": 0.01, + "max": 0.99, + "step": 0.01 + } + }, + { + "path": "k", + "label": "Top K", + "description": "Limits sampling to the K most likely tokens; 0 disables top-k sampling.", + "group": "sampling", + "type": "integer", + "default": 0, + "range": { + "min": 0, + "max": 500 + } + }, + { + "path": "frequency_penalty", + "label": "Frequency penalty", + "description": "Penalizes tokens proportional to how often they have already appeared to reduce repetition.", + "group": "sampling", + "type": "number", + "default": 0, + "range": { + "min": 0, + "max": 1, + "step": 0.1 + } + }, + { + "path": "presence_penalty", + "label": "Presence penalty", + "description": "Penalizes tokens that have already appeared to encourage a wider variety of content.", + "group": "sampling", + "type": "number", + "default": 0, + "range": { + "min": 0, + "max": 1, + "step": 0.1 + } + }, + { + "path": "seed", + "label": "Seed", + "description": "Seed used for best-effort deterministic sampling when reproducible outputs are desired.", + "group": "sampling", + "type": "integer" + }, + { + "path": "response_format.type", + "label": "Response format", + "description": "Controls whether the model returns normal text or JSON object output.", + "group": "output_format", + "type": "enum", + "default": "text", + "values": [ + "text", + "json_object" + ] + }, + { + "path": "logprobs", + "label": "Log probabilities", + "description": "Controls whether the response includes log probabilities for the generated tokens.", + "group": "observability", + "type": "boolean", + "default": false + }, + { + "path": "tool_choice", + "label": "Tool choice", + "description": "Forces the model to either call a tool or skip tool calls for this request.", + "group": "tooling", + "type": "enum", + "values": [ + "REQUIRED", + "NONE" + ] + }, + { + "path": "safety_mode", + "label": "Safety mode", + "description": "Controls Cohere's built-in safety instructions applied to the generation.", + "group": "provider_metadata", + "type": "enum", + "default": "CONTEXTUAL", + "values": [ + "CONTEXTUAL", + "STRICT" + ] + } + ] + }, + { + "provider": "cohere", + "authType": "api_key", + "model": "command-r-08-2024", + "params": [ + { + "path": "max_tokens", + "label": "Max tokens", + "description": "Maximum number of output tokens the model may generate.", + "group": "generation_length", + "type": "integer", + "range": { + "min": 1 + } + }, + { + "path": "stop_sequences", + "label": "Stop sequences", + "description": "Stops generation when one of these sequences is detected; up to five are allowed.", + "group": "generation_length", + "type": "string" + }, + { + "path": "temperature", + "label": "Temperature", + "description": "Controls randomness. Lower values make outputs more focused; higher values make them more varied.", + "group": "sampling", + "type": "number", + "default": 0.3, + "range": { + "min": 0, + "step": 0.1 + } + }, + { + "path": "p", + "label": "Top P", + "description": "Controls nucleus sampling by limiting generation to tokens within the selected cumulative probability.", + "group": "sampling", + "type": "number", + "default": 0.75, + "range": { + "min": 0.01, + "max": 0.99, + "step": 0.01 + } + }, + { + "path": "k", + "label": "Top K", + "description": "Limits sampling to the K most likely tokens; 0 disables top-k sampling.", + "group": "sampling", + "type": "integer", + "default": 0, + "range": { + "min": 0, + "max": 500 + } + }, + { + "path": "frequency_penalty", + "label": "Frequency penalty", + "description": "Penalizes tokens proportional to how often they have already appeared to reduce repetition.", + "group": "sampling", + "type": "number", + "default": 0, + "range": { + "min": 0, + "max": 1, + "step": 0.1 + } + }, + { + "path": "presence_penalty", + "label": "Presence penalty", + "description": "Penalizes tokens that have already appeared to encourage a wider variety of content.", + "group": "sampling", + "type": "number", + "default": 0, + "range": { + "min": 0, + "max": 1, + "step": 0.1 + } + }, + { + "path": "seed", + "label": "Seed", + "description": "Seed used for best-effort deterministic sampling when reproducible outputs are desired.", + "group": "sampling", + "type": "integer" + }, + { + "path": "response_format.type", + "label": "Response format", + "description": "Controls whether the model returns normal text or JSON object output.", + "group": "output_format", + "type": "enum", + "default": "text", + "values": [ + "text", + "json_object" + ] + }, + { + "path": "logprobs", + "label": "Log probabilities", + "description": "Controls whether the response includes log probabilities for the generated tokens.", + "group": "observability", + "type": "boolean", + "default": false + }, + { + "path": "safety_mode", + "label": "Safety mode", + "description": "Controls Cohere's built-in safety instructions applied to the generation.", + "group": "provider_metadata", + "type": "enum", + "default": "CONTEXTUAL", + "values": [ + "CONTEXTUAL", + "STRICT", + "OFF" + ] + } + ] + }, + { + "provider": "cohere", + "authType": "api_key", + "model": "command-r-plus-08-2024", + "params": [ + { + "path": "max_tokens", + "label": "Max tokens", + "description": "Maximum number of output tokens the model may generate.", + "group": "generation_length", + "type": "integer", + "range": { + "min": 1 + } + }, + { + "path": "stop_sequences", + "label": "Stop sequences", + "description": "Stops generation when one of these sequences is detected; up to five are allowed.", + "group": "generation_length", + "type": "string" + }, + { + "path": "temperature", + "label": "Temperature", + "description": "Controls randomness. Lower values make outputs more focused; higher values make them more varied.", + "group": "sampling", + "type": "number", + "default": 0.3, + "range": { + "min": 0, + "step": 0.1 + } + }, + { + "path": "p", + "label": "Top P", + "description": "Controls nucleus sampling by limiting generation to tokens within the selected cumulative probability.", + "group": "sampling", + "type": "number", + "default": 0.75, + "range": { + "min": 0.01, + "max": 0.99, + "step": 0.01 + } + }, + { + "path": "k", + "label": "Top K", + "description": "Limits sampling to the K most likely tokens; 0 disables top-k sampling.", + "group": "sampling", + "type": "integer", + "default": 0, + "range": { + "min": 0, + "max": 500 + } + }, + { + "path": "frequency_penalty", + "label": "Frequency penalty", + "description": "Penalizes tokens proportional to how often they have already appeared to reduce repetition.", + "group": "sampling", + "type": "number", + "default": 0, + "range": { + "min": 0, + "max": 1, + "step": 0.1 + } + }, + { + "path": "presence_penalty", + "label": "Presence penalty", + "description": "Penalizes tokens that have already appeared to encourage a wider variety of content.", + "group": "sampling", + "type": "number", + "default": 0, + "range": { + "min": 0, + "max": 1, + "step": 0.1 + } + }, + { + "path": "seed", + "label": "Seed", + "description": "Seed used for best-effort deterministic sampling when reproducible outputs are desired.", + "group": "sampling", + "type": "integer" + }, + { + "path": "response_format.type", + "label": "Response format", + "description": "Controls whether the model returns normal text or JSON object output.", + "group": "output_format", + "type": "enum", + "default": "text", + "values": [ + "text", + "json_object" + ] + }, + { + "path": "logprobs", + "label": "Log probabilities", + "description": "Controls whether the response includes log probabilities for the generated tokens.", + "group": "observability", + "type": "boolean", + "default": false + }, + { + "path": "safety_mode", + "label": "Safety mode", + "description": "Controls Cohere's built-in safety instructions applied to the generation.", + "group": "provider_metadata", + "type": "enum", + "default": "CONTEXTUAL", + "values": [ + "CONTEXTUAL", + "STRICT", + "OFF" + ] + } + ] + }, + { + "provider": "cohere", + "authType": "api_key", + "model": "command-r7b-12-2024", + "params": [ + { + "path": "max_tokens", + "label": "Max tokens", + "description": "Maximum number of output tokens the model may generate.", + "group": "generation_length", + "type": "integer", + "range": { + "min": 1 + } + }, + { + "path": "stop_sequences", + "label": "Stop sequences", + "description": "Stops generation when one of these sequences is detected; up to five are allowed.", + "group": "generation_length", + "type": "string" + }, + { + "path": "temperature", + "label": "Temperature", + "description": "Controls randomness. Lower values make outputs more focused; higher values make them more varied.", + "group": "sampling", + "type": "number", + "default": 0.3, + "range": { + "min": 0, + "step": 0.1 + } + }, + { + "path": "p", + "label": "Top P", + "description": "Controls nucleus sampling by limiting generation to tokens within the selected cumulative probability.", + "group": "sampling", + "type": "number", + "default": 0.75, + "range": { + "min": 0.01, + "max": 0.99, + "step": 0.01 + } + }, + { + "path": "k", + "label": "Top K", + "description": "Limits sampling to the K most likely tokens; 0 disables top-k sampling.", + "group": "sampling", + "type": "integer", + "default": 0, + "range": { + "min": 0, + "max": 500 + } + }, + { + "path": "frequency_penalty", + "label": "Frequency penalty", + "description": "Penalizes tokens proportional to how often they have already appeared to reduce repetition.", + "group": "sampling", + "type": "number", + "default": 0, + "range": { + "min": 0, + "max": 1, + "step": 0.1 + } + }, + { + "path": "presence_penalty", + "label": "Presence penalty", + "description": "Penalizes tokens that have already appeared to encourage a wider variety of content.", + "group": "sampling", + "type": "number", + "default": 0, + "range": { + "min": 0, + "max": 1, + "step": 0.1 + } + }, + { + "path": "seed", + "label": "Seed", + "description": "Seed used for best-effort deterministic sampling when reproducible outputs are desired.", + "group": "sampling", + "type": "integer" + }, + { + "path": "response_format.type", + "label": "Response format", + "description": "Controls whether the model returns normal text or JSON object output.", + "group": "output_format", + "type": "enum", + "default": "text", + "values": [ + "text", + "json_object" + ] + }, + { + "path": "logprobs", + "label": "Log probabilities", + "description": "Controls whether the response includes log probabilities for the generated tokens.", + "group": "observability", + "type": "boolean", + "default": false + }, + { + "path": "tool_choice", + "label": "Tool choice", + "description": "Forces the model to either call a tool or skip tool calls for this request.", + "group": "tooling", + "type": "enum", + "values": [ + "REQUIRED", + "NONE" + ] + }, + { + "path": "safety_mode", + "label": "Safety mode", + "description": "Controls Cohere's built-in safety instructions applied to the generation.", + "group": "provider_metadata", + "type": "enum", + "default": "CONTEXTUAL", + "values": [ + "CONTEXTUAL", + "STRICT" + ] + } + ] + }, + { + "provider": "deepseek", + "authType": "api_key", + "model": "deepseek-chat", + "params": [ + { + "path": "max_tokens", + "label": "Max tokens", + "description": "Maximum number of output tokens the model may generate.", + "group": "generation_length", + "type": "integer", + "default": 4096, + "range": { + "min": 1 + } + }, + { + "path": "temperature", + "label": "Temperature", + "description": "Controls randomness. In DeepSeek thinking mode this parameter is accepted for compatibility but has no effect.", + "group": "sampling", + "applicability": { + "except": { + "thinking.type": [ + "enabled" + ] + } + }, + "type": "number", + "default": 1, + "range": { + "min": 0, + "max": 2, + "step": 0.1 + } + }, + { + "path": "top_p", + "label": "Top P", + "description": "Controls nucleus sampling. In DeepSeek thinking mode this parameter is accepted for compatibility but has no effect.", + "group": "sampling", + "applicability": { + "except": { + "thinking.type": [ + "enabled" + ] + } + }, + "type": "number", + "default": 1, + "range": { + "min": 0, + "max": 1, + "step": 0.01 + } + }, + { + "path": "thinking.type", + "label": "Thinking mode", + "description": "Controls whether DeepSeek uses thinking mode before producing the final answer.", + "group": "reasoning", + "type": "enum", + "default": "disabled", + "values": [ + "disabled", + "enabled" + ] + } + ] + }, + { + "provider": "deepseek", + "authType": "api_key", + "model": "deepseek-reasoner", + "params": [ + { + "path": "max_tokens", + "label": "Max tokens", + "description": "Maximum number of output tokens the model may generate.", + "group": "generation_length", + "type": "integer", + "default": 4096, + "range": { + "min": 1 + } + }, + { + "path": "temperature", + "label": "Temperature", + "description": "Controls randomness. In DeepSeek thinking mode this parameter is accepted for compatibility but has no effect.", + "group": "sampling", + "applicability": { + "except": { + "thinking.type": [ + "enabled" + ] + } + }, + "type": "number", + "default": 1, + "range": { + "min": 0, + "max": 2, + "step": 0.1 + } + }, + { + "path": "top_p", + "label": "Top P", + "description": "Controls nucleus sampling. In DeepSeek thinking mode this parameter is accepted for compatibility but has no effect.", + "group": "sampling", + "applicability": { + "except": { + "thinking.type": [ + "enabled" + ] + } + }, + "type": "number", + "default": 1, + "range": { + "min": 0, + "max": 1, + "step": 0.01 + } + }, + { + "path": "thinking.type", + "label": "Thinking mode", + "description": "Controls whether DeepSeek uses thinking mode before producing the final answer.", + "group": "reasoning", + "type": "enum", + "default": "enabled", + "values": [ + "enabled", + "disabled" + ] + }, + { + "path": "reasoning_effort", + "label": "Reasoning effort", + "description": "Controls DeepSeek thinking effort when thinking mode is enabled.", + "group": "reasoning", + "applicability": { + "only": { + "thinking.type": "enabled" + } + }, + "type": "enum", + "default": "high", + "values": [ + "high", + "max" + ] + } + ] + }, + { + "provider": "deepseek", + "authType": "api_key", + "model": "deepseek-v4-flash", + "params": [ + { + "path": "max_tokens", + "label": "Max tokens", + "description": "Maximum number of output tokens the model may generate.", + "group": "generation_length", + "type": "integer", + "default": 4096, + "range": { + "min": 1 + } + }, + { + "path": "temperature", + "label": "Temperature", + "description": "Controls randomness. In DeepSeek thinking mode this parameter is accepted for compatibility but has no effect.", + "group": "sampling", + "applicability": { + "except": { + "thinking.type": [ + "enabled" + ] + } + }, + "type": "number", + "default": 1, + "range": { + "min": 0, + "max": 2, + "step": 0.1 + } + }, + { + "path": "top_p", + "label": "Top P", + "description": "Controls nucleus sampling. In DeepSeek thinking mode this parameter is accepted for compatibility but has no effect.", + "group": "sampling", + "applicability": { + "except": { + "thinking.type": [ + "enabled" + ] + } + }, + "type": "number", + "default": 1, + "range": { + "min": 0, + "max": 1, + "step": 0.01 + } + }, + { + "path": "thinking.type", + "label": "Thinking mode", + "description": "Controls whether DeepSeek uses thinking mode before producing the final answer.", + "group": "reasoning", + "type": "enum", + "default": "enabled", + "values": [ + "enabled", + "disabled" + ] + }, + { + "path": "reasoning_effort", + "label": "Reasoning effort", + "description": "Controls DeepSeek thinking effort when thinking mode is enabled.", + "group": "reasoning", + "applicability": { + "only": { + "thinking.type": "enabled" + } + }, + "type": "enum", + "default": "high", + "values": [ + "high", + "max" + ] + } + ] + }, + { + "provider": "deepseek", + "authType": "api_key", + "model": "deepseek-v4-pro", + "params": [ + { + "path": "max_tokens", + "label": "Max tokens", + "description": "Maximum number of output tokens the model may generate.", + "group": "generation_length", + "type": "integer", + "default": 4096, + "range": { + "min": 1 + } + }, + { + "path": "temperature", + "label": "Temperature", + "description": "Controls randomness. In DeepSeek thinking mode this parameter is accepted for compatibility but has no effect.", + "group": "sampling", + "applicability": { + "except": { + "thinking.type": [ + "enabled" + ] + } + }, + "type": "number", + "default": 1, + "range": { + "min": 0, + "max": 2, + "step": 0.1 + } + }, + { + "path": "top_p", + "label": "Top P", + "description": "Controls nucleus sampling. In DeepSeek thinking mode this parameter is accepted for compatibility but has no effect.", + "group": "sampling", + "applicability": { + "except": { + "thinking.type": [ + "enabled" + ] + } + }, + "type": "number", + "default": 1, + "range": { + "min": 0, + "max": 1, + "step": 0.01 + } + }, + { + "path": "thinking.type", + "label": "Thinking mode", + "description": "Controls whether DeepSeek uses thinking mode before producing the final answer.", + "group": "reasoning", + "type": "enum", + "default": "enabled", + "values": [ + "enabled", + "disabled" + ] + }, + { + "path": "reasoning_effort", + "label": "Reasoning effort", + "description": "Controls DeepSeek thinking effort when thinking mode is enabled.", + "group": "reasoning", + "applicability": { + "only": { + "thinking.type": "enabled" + } + }, + "type": "enum", + "default": "high", + "values": [ + "high", + "max" + ] + } + ] + }, + { + "provider": "google", + "authType": "api_key", + "model": "gemini-2.5-flash", + "params": [ + { + "path": "generationConfig.maxOutputTokens", + "label": "Max output tokens", + "description": "Maximum number of tokens to include in a response candidate.", + "group": "generation_length", + "type": "integer", + "range": { + "min": 1, + "max": 65536 + } + }, + { + "path": "generationConfig.temperature", + "label": "Temperature", + "description": "Controls randomness. Lower values make outputs more focused; higher values make them more varied.", + "group": "sampling", + "type": "number", + "default": 1, + "range": { + "min": 0, + "max": 2, + "step": 0.1 + } + }, + { + "path": "generationConfig.topP", + "label": "Top P", + "description": "Controls nucleus sampling by limiting generation to tokens within the selected cumulative probability.", + "group": "sampling", + "type": "number", + "default": 0.95, + "range": { + "min": 0, + "max": 1, + "step": 0.01 + } + }, + { + "path": "generationConfig.topK", + "label": "Top K", + "description": "Limits token sampling to the top K most likely next tokens.", + "group": "sampling", + "type": "integer", + "default": 64, + "range": { + "min": 0 + } + }, + { + "path": "generationConfig.seed", + "label": "Seed", + "description": "Optional seed used for decoding when reproducible sampling is desired.", + "group": "sampling", + "type": "integer" + }, + { + "path": "generationConfig.thinkingConfig.thinkingBudget", + "label": "Thinking budget", + "description": "Number of thinking tokens Gemini should use; 0 disables thinking and -1 uses dynamic thinking.", + "group": "reasoning", + "type": "integer", + "default": -1, + "range": { + "min": -1, + "max": 24576 + } + }, + { + "path": "generationConfig.thinkingConfig.includeThoughts", + "label": "Include thoughts", + "description": "Controls whether Gemini returns available thought summaries in the response parts.", + "group": "reasoning", + "type": "boolean", + "default": false + }, + { + "path": "generationConfig.responseMimeType", + "label": "Response MIME type", + "description": "MIME type for generated text candidates.", + "group": "output_format", + "type": "enum", + "default": "text/plain", + "values": [ + "text/plain", + "application/json" + ] + } + ] + }, + { + "provider": "google", + "authType": "api_key", + "model": "gemini-2.5-flash-lite", + "params": [ + { + "path": "generationConfig.maxOutputTokens", + "label": "Max output tokens", + "description": "Maximum number of tokens to include in a response candidate.", + "group": "generation_length", + "type": "integer", + "range": { + "min": 1, + "max": 65536 + } + }, + { + "path": "generationConfig.temperature", + "label": "Temperature", + "description": "Controls randomness. Lower values make outputs more focused; higher values make them more varied.", + "group": "sampling", + "type": "number", + "default": 1, + "range": { + "min": 0, + "max": 2, + "step": 0.1 + } + }, + { + "path": "generationConfig.topP", + "label": "Top P", + "description": "Controls nucleus sampling by limiting generation to tokens within the selected cumulative probability.", + "group": "sampling", + "type": "number", + "default": 0.95, + "range": { + "min": 0, + "max": 1, + "step": 0.01 + } + }, + { + "path": "generationConfig.topK", + "label": "Top K", + "description": "Limits token sampling to the top K most likely next tokens.", + "group": "sampling", + "type": "integer", + "default": 64, + "range": { + "min": 0 + } + }, + { + "path": "generationConfig.seed", + "label": "Seed", + "description": "Optional seed used for decoding when reproducible sampling is desired.", + "group": "sampling", + "type": "integer" + }, + { + "path": "generationConfig.thinkingConfig.thinkingBudget", + "label": "Thinking budget", + "description": "Number of thinking tokens Gemini should use; -1 uses dynamic thinking, 0 disables thinking, and fixed budgets start at 512 tokens.", + "group": "reasoning", + "type": "integer", + "default": 0 + }, + { + "path": "generationConfig.thinkingConfig.includeThoughts", + "label": "Include thoughts", + "description": "Controls whether Gemini returns available thought summaries in the response parts.", + "group": "reasoning", + "type": "boolean", + "default": false + }, + { + "path": "generationConfig.responseMimeType", + "label": "Response MIME type", + "description": "MIME type for generated text candidates.", + "group": "output_format", + "type": "enum", + "default": "text/plain", + "values": [ + "text/plain", + "application/json" + ] + } + ] + }, + { + "provider": "google", + "authType": "subscription", + "model": "gemini-2.5-flash-lite", + "params": [ + { + "path": "generationConfig.maxOutputTokens", + "label": "Max output tokens", + "description": "Maximum number of tokens to include in a response candidate.", + "group": "generation_length", + "type": "integer", + "range": { + "min": 1, + "max": 65536 + } + }, + { + "path": "generationConfig.temperature", + "label": "Temperature", + "description": "Controls randomness. Lower values make outputs more focused; higher values make them more varied.", + "group": "sampling", + "type": "number", + "default": 1, + "range": { + "min": 0, + "max": 2, + "step": 0.1 + } + }, + { + "path": "generationConfig.topP", + "label": "Top P", + "description": "Controls nucleus sampling by limiting generation to tokens within the selected cumulative probability.", + "group": "sampling", + "type": "number", + "default": 0.95, + "range": { + "min": 0, + "max": 1, + "step": 0.01 + } + }, + { + "path": "generationConfig.topK", + "label": "Top K", + "description": "Limits token sampling to the top K most likely next tokens.", + "group": "sampling", + "type": "integer", + "default": 64, + "range": { + "min": 0 + } + }, + { + "path": "generationConfig.seed", + "label": "Seed", + "description": "Optional seed used for decoding when reproducible sampling is desired.", + "group": "sampling", + "type": "integer" + }, + { + "path": "generationConfig.thinkingConfig.thinkingBudget", + "label": "Thinking budget", + "description": "Number of thinking tokens Gemini should use; -1 uses dynamic thinking, 0 disables thinking, and fixed budgets start at 512 tokens.", + "group": "reasoning", + "type": "integer", + "default": 0 + }, + { + "path": "generationConfig.thinkingConfig.includeThoughts", + "label": "Include thoughts", + "description": "Controls whether Gemini returns available thought summaries in the response parts.", + "group": "reasoning", + "type": "boolean", + "default": false + }, + { + "path": "generationConfig.responseMimeType", + "label": "Response MIME type", + "description": "MIME type for generated text candidates.", + "group": "output_format", + "type": "enum", + "default": "text/plain", + "values": [ + "text/plain", + "application/json" + ] + } + ] + }, + { + "provider": "google", + "authType": "subscription", + "model": "gemini-2.5-flash", + "params": [ + { + "path": "generationConfig.maxOutputTokens", + "label": "Max output tokens", + "description": "Maximum number of tokens to include in a response candidate.", + "group": "generation_length", + "type": "integer", + "range": { + "min": 1, + "max": 65536 + } + }, + { + "path": "generationConfig.temperature", + "label": "Temperature", + "description": "Controls randomness. Lower values make outputs more focused; higher values make them more varied.", + "group": "sampling", + "type": "number", + "default": 1, + "range": { + "min": 0, + "max": 2, + "step": 0.1 + } + }, + { + "path": "generationConfig.topP", + "label": "Top P", + "description": "Controls nucleus sampling by limiting generation to tokens within the selected cumulative probability.", + "group": "sampling", + "type": "number", + "default": 0.95, + "range": { + "min": 0, + "max": 1, + "step": 0.01 + } + }, + { + "path": "generationConfig.topK", + "label": "Top K", + "description": "Limits token sampling to the top K most likely next tokens.", + "group": "sampling", + "type": "integer", + "default": 64, + "range": { + "min": 0 + } + }, + { + "path": "generationConfig.seed", + "label": "Seed", + "description": "Optional seed used for decoding when reproducible sampling is desired.", + "group": "sampling", + "type": "integer" + }, + { + "path": "generationConfig.thinkingConfig.thinkingBudget", + "label": "Thinking budget", + "description": "Number of thinking tokens Gemini should use; 0 disables thinking and -1 uses dynamic thinking.", + "group": "reasoning", + "type": "integer", + "default": -1, + "range": { + "min": -1, + "max": 24576 + } + }, + { + "path": "generationConfig.thinkingConfig.includeThoughts", + "label": "Include thoughts", + "description": "Controls whether Gemini returns available thought summaries in the response parts.", + "group": "reasoning", + "type": "boolean", + "default": false + }, + { + "path": "generationConfig.responseMimeType", + "label": "Response MIME type", + "description": "MIME type for generated text candidates.", + "group": "output_format", + "type": "enum", + "default": "text/plain", + "values": [ + "text/plain", + "application/json" + ] + } + ] + }, + { + "provider": "google", + "authType": "api_key", + "model": "gemini-2.5-pro", + "params": [ + { + "path": "generationConfig.maxOutputTokens", + "label": "Max output tokens", + "description": "Maximum number of tokens to include in a response candidate.", + "group": "generation_length", + "type": "integer", + "range": { + "min": 1, + "max": 65536 + } + }, + { + "path": "generationConfig.temperature", + "label": "Temperature", + "description": "Controls randomness. Lower values make outputs more focused; higher values make them more varied.", + "group": "sampling", + "type": "number", + "default": 1, + "range": { + "min": 0, + "max": 2, + "step": 0.1 + } + }, + { + "path": "generationConfig.topP", + "label": "Top P", + "description": "Controls nucleus sampling by limiting generation to tokens within the selected cumulative probability.", + "group": "sampling", + "type": "number", + "default": 0.95, + "range": { + "min": 0, + "max": 1, + "step": 0.01 + } + }, + { + "path": "generationConfig.topK", + "label": "Top K", + "description": "Limits token sampling to the top K most likely next tokens.", + "group": "sampling", + "type": "integer", + "default": 64, + "range": { + "min": 0 + } + }, + { + "path": "generationConfig.seed", + "label": "Seed", + "description": "Optional seed used for decoding when reproducible sampling is desired.", + "group": "sampling", + "type": "integer" + }, + { + "path": "generationConfig.thinkingConfig.thinkingBudget", + "label": "Thinking budget", + "description": "Maximum number of thinking tokens Gemini should use before producing the final answer.", + "group": "reasoning", + "type": "integer", + "range": { + "min": 128, + "max": 32768 + } + }, + { + "path": "generationConfig.thinkingConfig.includeThoughts", + "label": "Include thoughts", + "description": "Controls whether Gemini returns available thought summaries in the response parts.", + "group": "reasoning", + "type": "boolean", + "default": false + }, + { + "path": "generationConfig.responseMimeType", + "label": "Response MIME type", + "description": "MIME type for generated text candidates.", + "group": "output_format", + "type": "enum", + "default": "text/plain", + "values": [ + "text/plain", + "application/json" + ] + } + ] + }, + { + "provider": "google", + "authType": "subscription", + "model": "gemini-2.5-pro", + "params": [ + { + "path": "generationConfig.maxOutputTokens", + "label": "Max output tokens", + "description": "Maximum number of tokens to include in a response candidate.", + "group": "generation_length", + "type": "integer", + "range": { + "min": 1, + "max": 65536 + } + }, + { + "path": "generationConfig.temperature", + "label": "Temperature", + "description": "Controls randomness. Lower values make outputs more focused; higher values make them more varied.", + "group": "sampling", + "type": "number", + "default": 1, + "range": { + "min": 0, + "max": 2, + "step": 0.1 + } + }, + { + "path": "generationConfig.topP", + "label": "Top P", + "description": "Controls nucleus sampling by limiting generation to tokens within the selected cumulative probability.", + "group": "sampling", + "type": "number", + "default": 0.95, + "range": { + "min": 0, + "max": 1, + "step": 0.01 + } + }, + { + "path": "generationConfig.topK", + "label": "Top K", + "description": "Limits token sampling to the top K most likely next tokens.", + "group": "sampling", + "type": "integer", + "default": 64, + "range": { + "min": 0 + } + }, + { + "path": "generationConfig.seed", + "label": "Seed", + "description": "Optional seed used for decoding when reproducible sampling is desired.", + "group": "sampling", + "type": "integer" + }, + { + "path": "generationConfig.thinkingConfig.thinkingBudget", + "label": "Thinking budget", + "description": "Maximum number of thinking tokens Gemini should use before producing the final answer.", + "group": "reasoning", + "type": "integer", + "range": { + "min": 128, + "max": 32768 + } + }, + { + "path": "generationConfig.thinkingConfig.includeThoughts", + "label": "Include thoughts", + "description": "Controls whether Gemini returns available thought summaries in the response parts.", + "group": "reasoning", + "type": "boolean", + "default": false + }, + { + "path": "generationConfig.responseMimeType", + "label": "Response MIME type", + "description": "MIME type for generated text candidates.", + "group": "output_format", + "type": "enum", + "default": "text/plain", + "values": [ + "text/plain", + "application/json" + ] + } + ] + }, + { + "provider": "google", + "authType": "subscription", + "model": "gemini-3-flash-preview", + "params": [ + { + "path": "generationConfig.maxOutputTokens", + "label": "Max output tokens", + "description": "Maximum number of tokens to include in a response candidate.", + "group": "generation_length", + "type": "integer", + "range": { + "min": 1, + "max": 65536 + } + }, + { + "path": "generationConfig.temperature", + "label": "Temperature", + "description": "Controls randomness. Lower values make outputs more focused; higher values make them more varied.", + "group": "sampling", + "type": "number", + "default": 1, + "range": { + "min": 0, + "max": 2, + "step": 0.1 + } + }, + { + "path": "generationConfig.topP", + "label": "Top P", + "description": "Controls nucleus sampling by limiting generation to tokens within the selected cumulative probability.", + "group": "sampling", + "type": "number", + "default": 0.95, + "range": { + "min": 0, + "max": 1, + "step": 0.01 + } + }, + { + "path": "generationConfig.topK", + "label": "Top K", + "description": "Limits token sampling to the top K most likely next tokens.", + "group": "sampling", + "type": "integer", + "default": 64, + "range": { + "min": 0 + } + }, + { + "path": "generationConfig.seed", + "label": "Seed", + "description": "Optional seed used for decoding when reproducible sampling is desired.", + "group": "sampling", + "type": "integer" + }, + { + "path": "generationConfig.thinkingConfig.thinkingLevel", + "label": "Thinking level", + "description": "Controls Gemini 3 Flash reasoning effort.", + "group": "reasoning", + "type": "enum", + "default": "high", + "values": [ + "minimal", + "low", + "medium", + "high" + ] + }, + { + "path": "generationConfig.thinkingConfig.includeThoughts", + "label": "Include thoughts", + "description": "Controls whether Gemini returns available thought summaries in the response parts.", + "group": "reasoning", + "type": "boolean", + "default": false + }, + { + "path": "generationConfig.responseMimeType", + "label": "Response MIME type", + "description": "MIME type for generated text candidates.", + "group": "output_format", + "type": "enum", + "default": "text/plain", + "values": [ + "text/plain", + "application/json" + ] + } + ] + }, + { + "provider": "google", + "authType": "subscription", + "model": "gemini-3.1-flash-lite-preview", + "params": [ + { + "path": "generationConfig.maxOutputTokens", + "label": "Max output tokens", + "description": "Maximum number of tokens to include in a response candidate.", + "group": "generation_length", + "type": "integer", + "range": { + "min": 1, + "max": 65536 + } + }, + { + "path": "generationConfig.temperature", + "label": "Temperature", + "description": "Controls randomness. Lower values make outputs more focused; higher values make them more varied.", + "group": "sampling", + "type": "number", + "default": 1, + "range": { + "min": 0, + "max": 2, + "step": 0.1 + } + }, + { + "path": "generationConfig.topP", + "label": "Top P", + "description": "Controls nucleus sampling by limiting generation to tokens within the selected cumulative probability.", + "group": "sampling", + "type": "number", + "default": 0.95, + "range": { + "min": 0, + "max": 1, + "step": 0.01 + } + }, + { + "path": "generationConfig.topK", + "label": "Top K", + "description": "Limits token sampling to the top K most likely next tokens.", + "group": "sampling", + "type": "integer", + "default": 64, + "range": { + "min": 0 + } + }, + { + "path": "generationConfig.seed", + "label": "Seed", + "description": "Optional seed used for decoding when reproducible sampling is desired.", + "group": "sampling", + "type": "integer" + }, + { + "path": "generationConfig.thinkingConfig.thinkingLevel", + "label": "Thinking level", + "description": "Controls Gemini 3.1 Flash-Lite reasoning effort.", + "group": "reasoning", + "type": "enum", + "default": "high", + "values": [ + "minimal", + "low", + "medium", + "high" + ] + }, + { + "path": "generationConfig.thinkingConfig.includeThoughts", + "label": "Include thoughts", + "description": "Controls whether Gemini returns available thought summaries in the response parts.", + "group": "reasoning", + "type": "boolean", + "default": false + }, + { + "path": "generationConfig.responseMimeType", + "label": "Response MIME type", + "description": "MIME type for generated text candidates.", + "group": "output_format", + "type": "enum", + "default": "text/plain", + "values": [ + "text/plain", + "application/json" + ] + } + ] + }, + { + "provider": "google", + "authType": "subscription", + "model": "gemini-3.1-flash-lite", + "params": [ + { + "path": "generationConfig.maxOutputTokens", + "label": "Max output tokens", + "description": "Maximum number of tokens to include in a response candidate.", + "group": "generation_length", + "type": "integer", + "range": { + "min": 1, + "max": 65536 + } + }, + { + "path": "generationConfig.temperature", + "label": "Temperature", + "description": "Controls randomness. Lower values make outputs more focused; higher values make them more varied.", + "group": "sampling", + "type": "number", + "default": 1, + "range": { + "min": 0, + "max": 2, + "step": 0.1 + } + }, + { + "path": "generationConfig.topP", + "label": "Top P", + "description": "Controls nucleus sampling by limiting generation to tokens within the selected cumulative probability.", + "group": "sampling", + "type": "number", + "default": 0.95, + "range": { + "min": 0, + "max": 1, + "step": 0.01 + } + }, + { + "path": "generationConfig.topK", + "label": "Top K", + "description": "Limits token sampling to the top K most likely next tokens.", + "group": "sampling", + "type": "integer", + "default": 64, + "range": { + "min": 0 + } + }, + { + "path": "generationConfig.seed", + "label": "Seed", + "description": "Optional seed used for decoding when reproducible sampling is desired.", + "group": "sampling", + "type": "integer" + }, + { + "path": "generationConfig.thinkingConfig.thinkingLevel", + "label": "Thinking level", + "description": "Controls Gemini 3.1 Flash-Lite reasoning effort.", + "group": "reasoning", + "type": "enum", + "default": "high", + "values": [ + "minimal", + "low", + "medium", + "high" + ] + }, + { + "path": "generationConfig.thinkingConfig.includeThoughts", + "label": "Include thoughts", + "description": "Controls whether Gemini returns available thought summaries in the response parts.", + "group": "reasoning", + "type": "boolean", + "default": false + }, + { + "path": "generationConfig.responseMimeType", + "label": "Response MIME type", + "description": "MIME type for generated text candidates.", + "group": "output_format", + "type": "enum", + "default": "text/plain", + "values": [ + "text/plain", + "application/json" + ] + } + ] + }, + { + "provider": "google", + "authType": "subscription", + "model": "gemini-3.1-pro-preview", + "params": [ + { + "path": "generationConfig.maxOutputTokens", + "label": "Max output tokens", + "description": "Maximum number of tokens to include in a response candidate.", + "group": "generation_length", + "type": "integer", + "range": { + "min": 1, + "max": 65536 + } + }, + { + "path": "generationConfig.temperature", + "label": "Temperature", + "description": "Controls randomness. Lower values make outputs more focused; higher values make them more varied.", + "group": "sampling", + "type": "number", + "default": 1, + "range": { + "min": 0, + "max": 2, + "step": 0.1 + } + }, + { + "path": "generationConfig.topP", + "label": "Top P", + "description": "Controls nucleus sampling by limiting generation to tokens within the selected cumulative probability.", + "group": "sampling", + "type": "number", + "default": 0.95, + "range": { + "min": 0, + "max": 1, + "step": 0.01 + } + }, + { + "path": "generationConfig.topK", + "label": "Top K", + "description": "Limits token sampling to the top K most likely next tokens.", + "group": "sampling", + "type": "integer", + "default": 64, + "range": { + "min": 0 + } + }, + { + "path": "generationConfig.seed", + "label": "Seed", + "description": "Optional seed used for decoding when reproducible sampling is desired.", + "group": "sampling", + "type": "integer" + }, + { + "path": "generationConfig.thinkingConfig.thinkingLevel", + "label": "Thinking level", + "description": "Controls Gemini 3 Pro reasoning effort.", + "group": "reasoning", + "type": "enum", + "default": "high", + "values": [ + "low", + "high" + ] + }, + { + "path": "generationConfig.thinkingConfig.includeThoughts", + "label": "Include thoughts", + "description": "Controls whether Gemini returns available thought summaries in the response parts.", + "group": "reasoning", + "type": "boolean", + "default": false + }, + { + "path": "generationConfig.responseMimeType", + "label": "Response MIME type", + "description": "MIME type for generated text candidates.", + "group": "output_format", + "type": "enum", + "default": "text/plain", + "values": [ + "text/plain", + "application/json" + ] + } + ] + }, + { + "provider": "google", + "authType": "api_key", + "model": "gemini-3.5-flash", + "params": [ + { + "path": "generationConfig.maxOutputTokens", + "label": "Max output tokens", + "description": "Maximum number of tokens to include in a response candidate.", + "group": "generation_length", + "type": "integer", + "range": { + "min": 1, + "max": 65536 + } + }, + { + "path": "generationConfig.temperature", + "label": "Temperature", + "description": "Controls randomness. Lower values make outputs more focused; higher values make them more varied.", + "group": "sampling", + "type": "number", + "default": 1, + "range": { + "min": 0, + "max": 2, + "step": 0.1 + } + }, + { + "path": "generationConfig.topP", + "label": "Top P", + "description": "Controls nucleus sampling by limiting generation to tokens within the selected cumulative probability.", + "group": "sampling", + "type": "number", + "default": 0.95, + "range": { + "min": 0, + "max": 1, + "step": 0.01 + } + }, + { + "path": "generationConfig.topK", + "label": "Top K", + "description": "Limits token sampling to the top K most likely next tokens.", + "group": "sampling", + "type": "integer", + "default": 64, + "range": { + "min": 0 + } + }, + { + "path": "generationConfig.seed", + "label": "Seed", + "description": "Optional seed used for decoding when reproducible sampling is desired.", + "group": "sampling", + "type": "integer" + }, + { + "path": "generationConfig.thinkingConfig.thinkingLevel", + "label": "Thinking level", + "description": "Controls Gemini 3.5 Flash reasoning effort.", + "group": "reasoning", + "type": "enum", + "default": "medium", + "values": [ + "minimal", + "low", + "medium", + "high" + ] + }, + { + "path": "generationConfig.thinkingConfig.includeThoughts", + "label": "Include thoughts", + "description": "Controls whether Gemini returns available thought summaries in the response parts.", + "group": "reasoning", + "type": "boolean", + "default": false + }, + { + "path": "generationConfig.responseMimeType", + "label": "Response MIME type", + "description": "MIME type for generated text candidates.", + "group": "output_format", + "type": "enum", + "default": "text/plain", + "values": [ + "text/plain", + "application/json" + ] + } + ] + }, + { + "provider": "meta", + "authType": "api_key", + "model": "Llama-3.3-70B-Instruct", + "params": [ + { + "path": "max_completion_tokens", + "label": "Max tokens", + "description": "Maximum number of output tokens the model may generate.", + "group": "generation_length", + "type": "integer", + "range": { + "min": 1 + } + }, + { + "path": "temperature", + "label": "Temperature", + "description": "Controls randomness. Lower values make outputs more focused; higher values make them more varied.", + "group": "sampling", + "type": "number" + }, + { + "path": "top_p", + "label": "Top P", + "description": "Controls nucleus sampling by limiting generation to tokens within the selected cumulative probability.", + "group": "sampling", + "type": "number" + }, + { + "path": "top_k", + "label": "Top K", + "description": "Limits generation to the selected number of highest-probability tokens.", + "group": "sampling", + "type": "integer" + }, + { + "path": "repetition_penalty", + "label": "Repetition penalty", + "description": "Penalizes tokens that have already appeared to reduce repetition in the output.", + "group": "sampling", + "type": "number" + }, + { + "path": "response_format.type", + "label": "Response format", + "description": "Controls whether the model returns normal text or a schema-constrained JSON object.", + "group": "output_format", + "type": "enum", + "default": "text", + "values": [ + "text", + "json_schema" + ] + }, + { + "path": "tool_choice", + "label": "Tool choice", + "description": "Controls whether the model may call tools, must call one, or skips tool calls.", + "group": "tooling", + "type": "enum", + "values": [ + "auto", + "none", + "required" + ] + } + ] + }, + { + "provider": "meta", + "authType": "api_key", + "model": "Llama-3.3-8B-Instruct", + "params": [ + { + "path": "max_completion_tokens", + "label": "Max tokens", + "description": "Maximum number of output tokens the model may generate.", + "group": "generation_length", + "type": "integer", + "range": { + "min": 1 + } + }, + { + "path": "temperature", + "label": "Temperature", + "description": "Controls randomness. Lower values make outputs more focused; higher values make them more varied.", + "group": "sampling", + "type": "number" + }, + { + "path": "top_p", + "label": "Top P", + "description": "Controls nucleus sampling by limiting generation to tokens within the selected cumulative probability.", + "group": "sampling", + "type": "number" + }, + { + "path": "top_k", + "label": "Top K", + "description": "Limits generation to the selected number of highest-probability tokens.", + "group": "sampling", + "type": "integer" + }, + { + "path": "repetition_penalty", + "label": "Repetition penalty", + "description": "Penalizes tokens that have already appeared to reduce repetition in the output.", + "group": "sampling", + "type": "number" + }, + { + "path": "response_format.type", + "label": "Response format", + "description": "Controls whether the model returns normal text or a schema-constrained JSON object.", + "group": "output_format", + "type": "enum", + "default": "text", + "values": [ + "text", + "json_schema" + ] + }, + { + "path": "tool_choice", + "label": "Tool choice", + "description": "Controls whether the model may call tools, must call one, or skips tool calls.", + "group": "tooling", + "type": "enum", + "values": [ + "auto", + "none", + "required" + ] + } + ] + }, + { + "provider": "meta", + "authType": "api_key", + "model": "Llama-4-Maverick-17B-128E-Instruct-FP8", + "params": [ + { + "path": "max_completion_tokens", + "label": "Max tokens", + "description": "Maximum number of output tokens the model may generate.", + "group": "generation_length", + "type": "integer", + "range": { + "min": 1 + } + }, + { + "path": "temperature", + "label": "Temperature", + "description": "Controls randomness. Lower values make outputs more focused; higher values make them more varied.", + "group": "sampling", + "type": "number" + }, + { + "path": "top_p", + "label": "Top P", + "description": "Controls nucleus sampling by limiting generation to tokens within the selected cumulative probability.", + "group": "sampling", + "type": "number" + }, + { + "path": "top_k", + "label": "Top K", + "description": "Limits generation to the selected number of highest-probability tokens.", + "group": "sampling", + "type": "integer" + }, + { + "path": "repetition_penalty", + "label": "Repetition penalty", + "description": "Penalizes tokens that have already appeared to reduce repetition in the output.", + "group": "sampling", + "type": "number" + }, + { + "path": "response_format.type", + "label": "Response format", + "description": "Controls whether the model returns normal text or a schema-constrained JSON object.", + "group": "output_format", + "type": "enum", + "default": "text", + "values": [ + "text", + "json_schema" + ] + }, + { + "path": "tool_choice", + "label": "Tool choice", + "description": "Controls whether the model may call tools, must call one, or skips tool calls.", + "group": "tooling", + "type": "enum", + "values": [ + "auto", + "none", + "required" + ] + } + ] + }, + { + "provider": "meta", + "authType": "api_key", + "model": "Llama-4-Scout-17B-16E-Instruct-FP8", + "params": [ + { + "path": "max_completion_tokens", + "label": "Max tokens", + "description": "Maximum number of output tokens the model may generate.", + "group": "generation_length", + "type": "integer", + "range": { + "min": 1 + } + }, + { + "path": "temperature", + "label": "Temperature", + "description": "Controls randomness. Lower values make outputs more focused; higher values make them more varied.", + "group": "sampling", + "type": "number" + }, + { + "path": "top_p", + "label": "Top P", + "description": "Controls nucleus sampling by limiting generation to tokens within the selected cumulative probability.", + "group": "sampling", + "type": "number" + }, + { + "path": "top_k", + "label": "Top K", + "description": "Limits generation to the selected number of highest-probability tokens.", + "group": "sampling", + "type": "integer" + }, + { + "path": "repetition_penalty", + "label": "Repetition penalty", + "description": "Penalizes tokens that have already appeared to reduce repetition in the output.", + "group": "sampling", + "type": "number" + }, + { + "path": "response_format.type", + "label": "Response format", + "description": "Controls whether the model returns normal text or a schema-constrained JSON object.", + "group": "output_format", + "type": "enum", + "default": "text", + "values": [ + "text", + "json_schema" + ] + }, + { + "path": "tool_choice", + "label": "Tool choice", + "description": "Controls whether the model may call tools, must call one, or skips tool calls.", + "group": "tooling", + "type": "enum", + "values": [ + "auto", + "none", + "required" + ] + } + ] + }, + { + "provider": "minimax", + "authType": "api_key", + "model": "minimax-m2", + "params": [ + { + "path": "max_completion_tokens", + "label": "Max completion tokens", + "description": "Maximum number of tokens to generate in the completion.", + "group": "generation_length", + "type": "integer", + "range": { + "min": 1 + } + }, + { + "path": "temperature", + "label": "Temperature", + "description": "Controls randomness. Lower values make outputs more focused; higher values make them more varied. Values must be greater than 0 and at most 1.", + "group": "sampling", + "type": "number", + "default": 1, + "range": { + "min": 0.01, + "max": 1, + "step": 0.01 + } + }, + { + "path": "top_p", + "label": "Top P", + "description": "Controls nucleus sampling by limiting generation to tokens within the selected cumulative probability.", + "group": "sampling", + "type": "number", + "default": 0.95, + "range": { + "min": 0.01, + "max": 1, + "step": 0.01 + } + }, + { + "path": "reasoning_split", + "label": "Split reasoning", + "description": "Returns the model's reasoning in a separate reasoning_details field instead of inline with the response.", + "group": "reasoning", + "type": "boolean", + "default": false + } + ] + }, + { + "provider": "minimax", + "authType": "subscription", + "model": "MiniMax-M2", + "params": [ + { + "path": "max_tokens", + "label": "Max tokens", + "description": "Maximum number of tokens to generate in the response.", + "group": "generation_length", + "type": "integer", + "range": { + "min": 1 + } + }, + { + "path": "temperature", + "label": "Temperature", + "description": "Controls randomness. Lower values make outputs more focused; higher values make them more varied. Values must be greater than 0 and at most 1.", + "group": "sampling", + "type": "number", + "default": 1, + "range": { + "min": 0.01, + "max": 1, + "step": 0.01 + } + }, + { + "path": "top_p", + "label": "Top P", + "description": "Controls nucleus sampling by limiting generation to tokens within the selected cumulative probability.", + "group": "sampling", + "type": "number", + "default": 0.95, + "range": { + "min": 0.01, + "max": 1, + "step": 0.01 + } + } + ] + }, + { + "provider": "minimax", + "authType": "api_key", + "model": "minimax-m2.1", + "params": [ + { + "path": "max_completion_tokens", + "label": "Max completion tokens", + "description": "Maximum number of tokens to generate in the completion.", + "group": "generation_length", + "type": "integer", + "range": { + "min": 1 + } + }, + { + "path": "temperature", + "label": "Temperature", + "description": "Controls randomness. Lower values make outputs more focused; higher values make them more varied. Values must be greater than 0 and at most 1.", + "group": "sampling", + "type": "number", + "default": 1, + "range": { + "min": 0.01, + "max": 1, + "step": 0.01 + } + }, + { + "path": "top_p", + "label": "Top P", + "description": "Controls nucleus sampling by limiting generation to tokens within the selected cumulative probability.", + "group": "sampling", + "type": "number", + "default": 0.95, + "range": { + "min": 0.01, + "max": 1, + "step": 0.01 + } + }, + { + "path": "reasoning_split", + "label": "Split reasoning", + "description": "Returns the model's reasoning in a separate reasoning_details field instead of inline with the response.", + "group": "reasoning", + "type": "boolean", + "default": false + } + ] + }, + { + "provider": "minimax", + "authType": "api_key", + "model": "minimax-m2.1-highspeed", + "params": [ + { + "path": "max_completion_tokens", + "label": "Max completion tokens", + "description": "Maximum number of tokens to generate in the completion.", + "group": "generation_length", + "type": "integer", + "range": { + "min": 1 + } + }, + { + "path": "temperature", + "label": "Temperature", + "description": "Controls randomness. Lower values make outputs more focused; higher values make them more varied. Values must be greater than 0 and at most 1.", + "group": "sampling", + "type": "number", + "default": 1, + "range": { + "min": 0.01, + "max": 1, + "step": 0.01 + } + }, + { + "path": "top_p", + "label": "Top P", + "description": "Controls nucleus sampling by limiting generation to tokens within the selected cumulative probability.", + "group": "sampling", + "type": "number", + "default": 0.95, + "range": { + "min": 0.01, + "max": 1, + "step": 0.01 + } + }, + { + "path": "reasoning_split", + "label": "Split reasoning", + "description": "Returns the model's reasoning in a separate reasoning_details field instead of inline with the response.", + "group": "reasoning", + "type": "boolean", + "default": false + } + ] + }, + { + "provider": "minimax", + "authType": "subscription", + "model": "MiniMax-M2.1-highspeed", + "params": [ + { + "path": "max_tokens", + "label": "Max tokens", + "description": "Maximum number of tokens to generate in the response.", + "group": "generation_length", + "type": "integer", + "range": { + "min": 1 + } + }, + { + "path": "temperature", + "label": "Temperature", + "description": "Controls randomness. Lower values make outputs more focused; higher values make them more varied. Values must be greater than 0 and at most 1.", + "group": "sampling", + "type": "number", + "default": 1, + "range": { + "min": 0.01, + "max": 1, + "step": 0.01 + } + }, + { + "path": "top_p", + "label": "Top P", + "description": "Controls nucleus sampling by limiting generation to tokens within the selected cumulative probability.", + "group": "sampling", + "type": "number", + "default": 0.95, + "range": { + "min": 0.01, + "max": 1, + "step": 0.01 + } + } + ] + }, + { + "provider": "minimax", + "authType": "subscription", + "model": "MiniMax-M2.1", + "params": [ + { + "path": "max_tokens", + "label": "Max tokens", + "description": "Maximum number of tokens to generate in the response.", + "group": "generation_length", + "type": "integer", + "range": { + "min": 1 + } + }, + { + "path": "temperature", + "label": "Temperature", + "description": "Controls randomness. Lower values make outputs more focused; higher values make them more varied. Values must be greater than 0 and at most 1.", + "group": "sampling", + "type": "number", + "default": 1, + "range": { + "min": 0.01, + "max": 1, + "step": 0.01 + } + }, + { + "path": "top_p", + "label": "Top P", + "description": "Controls nucleus sampling by limiting generation to tokens within the selected cumulative probability.", + "group": "sampling", + "type": "number", + "default": 0.95, + "range": { + "min": 0.01, + "max": 1, + "step": 0.01 + } + } + ] + }, + { + "provider": "minimax", + "authType": "api_key", + "model": "minimax-m2.5", + "params": [ + { + "path": "max_completion_tokens", + "label": "Max completion tokens", + "description": "Maximum number of tokens to generate in the completion.", + "group": "generation_length", + "type": "integer", + "range": { + "min": 1 + } + }, + { + "path": "temperature", + "label": "Temperature", + "description": "Controls randomness. Lower values make outputs more focused; higher values make them more varied. Values must be greater than 0 and at most 1.", + "group": "sampling", + "type": "number", + "default": 1, + "range": { + "min": 0.01, + "max": 1, + "step": 0.01 + } + }, + { + "path": "top_p", + "label": "Top P", + "description": "Controls nucleus sampling by limiting generation to tokens within the selected cumulative probability.", + "group": "sampling", + "type": "number", + "default": 0.95, + "range": { + "min": 0.01, + "max": 1, + "step": 0.01 + } + }, + { + "path": "reasoning_split", + "label": "Split reasoning", + "description": "Returns the model's reasoning in a separate reasoning_details field instead of inline with the response.", + "group": "reasoning", + "type": "boolean", + "default": false + } + ] + }, + { + "provider": "minimax", + "authType": "api_key", + "model": "minimax-m2.5-highspeed", + "params": [ + { + "path": "max_completion_tokens", + "label": "Max completion tokens", + "description": "Maximum number of tokens to generate in the completion.", + "group": "generation_length", + "type": "integer", + "range": { + "min": 1 + } + }, + { + "path": "temperature", + "label": "Temperature", + "description": "Controls randomness. Lower values make outputs more focused; higher values make them more varied. Values must be greater than 0 and at most 1.", + "group": "sampling", + "type": "number", + "default": 1, + "range": { + "min": 0.01, + "max": 1, + "step": 0.01 + } + }, + { + "path": "top_p", + "label": "Top P", + "description": "Controls nucleus sampling by limiting generation to tokens within the selected cumulative probability.", + "group": "sampling", + "type": "number", + "default": 0.95, + "range": { + "min": 0.01, + "max": 1, + "step": 0.01 + } + }, + { + "path": "reasoning_split", + "label": "Split reasoning", + "description": "Returns the model's reasoning in a separate reasoning_details field instead of inline with the response.", + "group": "reasoning", + "type": "boolean", + "default": false + } + ] + }, + { + "provider": "minimax", + "authType": "subscription", + "model": "MiniMax-M2.5-highspeed", + "params": [ + { + "path": "max_tokens", + "label": "Max tokens", + "description": "Maximum number of tokens to generate in the response.", + "group": "generation_length", + "type": "integer", + "range": { + "min": 1 + } + }, + { + "path": "temperature", + "label": "Temperature", + "description": "Controls randomness. Lower values make outputs more focused; higher values make them more varied. Values must be greater than 0 and at most 1.", + "group": "sampling", + "type": "number", + "default": 1, + "range": { + "min": 0.01, + "max": 1, + "step": 0.01 + } + }, + { + "path": "top_p", + "label": "Top P", + "description": "Controls nucleus sampling by limiting generation to tokens within the selected cumulative probability.", + "group": "sampling", + "type": "number", + "default": 0.95, + "range": { + "min": 0.01, + "max": 1, + "step": 0.01 + } + } + ] + }, + { + "provider": "minimax", + "authType": "subscription", + "model": "MiniMax-M2.5", + "params": [ + { + "path": "max_tokens", + "label": "Max tokens", + "description": "Maximum number of tokens to generate in the response.", + "group": "generation_length", + "type": "integer", + "range": { + "min": 1 + } + }, + { + "path": "temperature", + "label": "Temperature", + "description": "Controls randomness. Lower values make outputs more focused; higher values make them more varied. Values must be greater than 0 and at most 1.", + "group": "sampling", + "type": "number", + "default": 1, + "range": { + "min": 0.01, + "max": 1, + "step": 0.01 + } + }, + { + "path": "top_p", + "label": "Top P", + "description": "Controls nucleus sampling by limiting generation to tokens within the selected cumulative probability.", + "group": "sampling", + "type": "number", + "default": 0.95, + "range": { + "min": 0.01, + "max": 1, + "step": 0.01 + } + } + ] + }, + { + "provider": "minimax", + "authType": "api_key", + "model": "minimax-m2.7", + "params": [ + { + "path": "max_completion_tokens", + "label": "Max completion tokens", + "description": "Maximum number of tokens to generate in the completion.", + "group": "generation_length", + "type": "integer", + "range": { + "min": 1 + } + }, + { + "path": "temperature", + "label": "Temperature", + "description": "Controls randomness. Lower values make outputs more focused; higher values make them more varied. Values must be greater than 0 and at most 1.", + "group": "sampling", + "type": "number", + "default": 1, + "range": { + "min": 0.01, + "max": 1, + "step": 0.01 + } + }, + { + "path": "top_p", + "label": "Top P", + "description": "Controls nucleus sampling by limiting generation to tokens within the selected cumulative probability.", + "group": "sampling", + "type": "number", + "default": 0.95, + "range": { + "min": 0.01, + "max": 1, + "step": 0.01 + } + }, + { + "path": "reasoning_split", + "label": "Split reasoning", + "description": "Returns the model's reasoning in a separate reasoning_details field instead of inline with the response.", + "group": "reasoning", + "type": "boolean", + "default": false + } + ] + }, + { + "provider": "minimax", + "authType": "api_key", + "model": "minimax-m2.7-highspeed", + "params": [ + { + "path": "max_completion_tokens", + "label": "Max completion tokens", + "description": "Maximum number of tokens to generate in the completion.", + "group": "generation_length", + "type": "integer", + "range": { + "min": 1 + } + }, + { + "path": "temperature", + "label": "Temperature", + "description": "Controls randomness. Lower values make outputs more focused; higher values make them more varied. Values must be greater than 0 and at most 1.", + "group": "sampling", + "type": "number", + "default": 1, + "range": { + "min": 0.01, + "max": 1, + "step": 0.01 + } + }, + { + "path": "top_p", + "label": "Top P", + "description": "Controls nucleus sampling by limiting generation to tokens within the selected cumulative probability.", + "group": "sampling", + "type": "number", + "default": 0.95, + "range": { + "min": 0.01, + "max": 1, + "step": 0.01 + } + }, + { + "path": "reasoning_split", + "label": "Split reasoning", + "description": "Returns the model's reasoning in a separate reasoning_details field instead of inline with the response.", + "group": "reasoning", + "type": "boolean", + "default": false + } + ] + }, + { + "provider": "minimax", + "authType": "subscription", + "model": "MiniMax-M2.7-highspeed", + "params": [ + { + "path": "max_tokens", + "label": "Max tokens", + "description": "Maximum number of tokens to generate in the response.", + "group": "generation_length", + "type": "integer", + "range": { + "min": 1 + } + }, + { + "path": "temperature", + "label": "Temperature", + "description": "Controls randomness. Lower values make outputs more focused; higher values make them more varied. Values must be greater than 0 and at most 1.", + "group": "sampling", + "type": "number", + "default": 1, + "range": { + "min": 0.01, + "max": 1, + "step": 0.01 + } + }, + { + "path": "top_p", + "label": "Top P", + "description": "Controls nucleus sampling by limiting generation to tokens within the selected cumulative probability.", + "group": "sampling", + "type": "number", + "default": 0.95, + "range": { + "min": 0.01, + "max": 1, + "step": 0.01 + } + } + ] + }, + { + "provider": "minimax", + "authType": "subscription", + "model": "MiniMax-M2.7", + "params": [ + { + "path": "max_tokens", + "label": "Max tokens", + "description": "Maximum number of tokens to generate in the response.", + "group": "generation_length", + "type": "integer", + "range": { + "min": 1 + } + }, + { + "path": "temperature", + "label": "Temperature", + "description": "Controls randomness. Lower values make outputs more focused; higher values make them more varied. Values must be greater than 0 and at most 1.", + "group": "sampling", + "type": "number", + "default": 1, + "range": { + "min": 0.01, + "max": 1, + "step": 0.01 + } + }, + { + "path": "top_p", + "label": "Top P", + "description": "Controls nucleus sampling by limiting generation to tokens within the selected cumulative probability.", + "group": "sampling", + "type": "number", + "default": 0.95, + "range": { + "min": 0.01, + "max": 1, + "step": 0.01 + } + } + ] + }, + { + "provider": "minimax", + "authType": "api_key", + "model": "minimax-m3", + "params": [ + { + "path": "max_completion_tokens", + "label": "Max completion tokens", + "description": "Maximum number of tokens to generate in the completion.", + "group": "generation_length", + "type": "integer", + "range": { + "min": 1 + } + }, + { + "path": "temperature", + "label": "Temperature", + "description": "Controls randomness. Lower values make outputs more focused; higher values make them more varied. Values must be greater than 0 and at most 1.", + "group": "sampling", + "type": "number", + "default": 1, + "range": { + "min": 0.01, + "max": 1, + "step": 0.01 + } + }, + { + "path": "top_p", + "label": "Top P", + "description": "Controls nucleus sampling by limiting generation to tokens within the selected cumulative probability.", + "group": "sampling", + "type": "number", + "default": 0.95, + "range": { + "min": 0.01, + "max": 1, + "step": 0.01 + } + }, + { + "path": "reasoning_split", + "label": "Split reasoning", + "description": "Returns the model's reasoning in a separate reasoning_details field instead of inline with the response.", + "group": "reasoning", + "type": "boolean", + "default": false + } + ] + }, + { + "provider": "minimax", + "authType": "subscription", + "model": "MiniMax-M3", + "params": [ + { + "path": "max_tokens", + "label": "Max tokens", + "description": "Maximum number of tokens to generate in the response.", + "group": "generation_length", + "type": "integer", + "range": { + "min": 1 + } + }, + { + "path": "temperature", + "label": "Temperature", + "description": "Controls randomness. Lower values make outputs more focused; higher values make them more varied. Values must be greater than 0 and at most 1.", + "group": "sampling", + "type": "number", + "default": 1, + "range": { + "min": 0.01, + "max": 1, + "step": 0.01 + } + }, + { + "path": "top_p", + "label": "Top P", + "description": "Controls nucleus sampling by limiting generation to tokens within the selected cumulative probability.", + "group": "sampling", + "type": "number", + "default": 0.95, + "range": { + "min": 0.01, + "max": 1, + "step": 0.01 + } + } + ] + }, + { + "provider": "mistral", + "authType": "api_key", + "model": "codestral-latest", + "params": [ + { + "path": "max_tokens", + "label": "Max tokens", + "description": "Maximum number of tokens to generate in the completion.", + "group": "generation_length", + "type": "integer", + "range": { + "min": 1 + } + }, + { + "path": "stop", + "label": "Stop sequence", + "description": "Stops generation when this string is detected.", + "group": "generation_length", + "type": "string" + }, + { + "path": "temperature", + "label": "Temperature", + "description": "Controls randomness. Lower values make outputs more focused; higher values make them more varied.", + "group": "sampling", + "type": "number", + "range": { + "min": 0, + "max": 1.5, + "step": 0.1 + } + }, + { + "path": "top_p", + "label": "Top P", + "description": "Controls nucleus sampling by limiting generation to tokens within the selected cumulative probability.", + "group": "sampling", + "type": "number", + "default": 1, + "range": { + "min": 0, + "max": 1, + "step": 0.01 + } + }, + { + "path": "random_seed", + "label": "Random seed", + "description": "Seed used for deterministic sampling when reproducible outputs are desired.", + "group": "sampling", + "type": "integer", + "range": { + "min": 0 + } + }, + { + "path": "presence_penalty", + "label": "Presence penalty", + "description": "Penalizes repeated words or phrases to encourage a wider variety of generated content.", + "group": "sampling", + "type": "number", + "default": 0, + "range": { + "min": -2, + "max": 2, + "step": 0.1 + } + }, + { + "path": "frequency_penalty", + "label": "Frequency penalty", + "description": "Penalizes words based on how often they already appear in the generated text.", + "group": "sampling", + "type": "number", + "default": 0, + "range": { + "min": -2, + "max": 2, + "step": 0.1 + } + }, + { + "path": "response_format.type", + "label": "Response format", + "description": "Controls whether the model returns normal text or JSON mode output.", + "group": "output_format", + "type": "enum", + "default": "text", + "values": [ + "text", + "json_object" + ] + }, + { + "path": "safe_prompt", + "label": "Safe prompt", + "description": "Controls whether Mistral injects its safety prompt before the conversation.", + "group": "provider_metadata", + "type": "boolean", + "default": false + } + ] + }, + { + "provider": "mistral", + "authType": "api_key", + "model": "devstral-2512", + "params": [ + { + "path": "max_tokens", + "label": "Max tokens", + "description": "Maximum number of tokens to generate in the completion.", + "group": "generation_length", + "type": "integer", + "range": { + "min": 1 + } + }, + { + "path": "stop", + "label": "Stop sequence", + "description": "Stops generation when this string is detected.", + "group": "generation_length", + "type": "string" + }, + { + "path": "temperature", + "label": "Temperature", + "description": "Controls randomness. Lower values make outputs more focused; higher values make them more varied.", + "group": "sampling", + "type": "number", + "range": { + "min": 0, + "max": 1.5, + "step": 0.1 + } + }, + { + "path": "top_p", + "label": "Top P", + "description": "Controls nucleus sampling by limiting generation to tokens within the selected cumulative probability.", + "group": "sampling", + "type": "number", + "default": 1, + "range": { + "min": 0, + "max": 1, + "step": 0.01 + } + }, + { + "path": "random_seed", + "label": "Random seed", + "description": "Seed used for deterministic sampling when reproducible outputs are desired.", + "group": "sampling", + "type": "integer", + "range": { + "min": 0 + } + }, + { + "path": "presence_penalty", + "label": "Presence penalty", + "description": "Penalizes repeated words or phrases to encourage a wider variety of generated content.", + "group": "sampling", + "type": "number", + "default": 0, + "range": { + "min": -2, + "max": 2, + "step": 0.1 + } + }, + { + "path": "frequency_penalty", + "label": "Frequency penalty", + "description": "Penalizes words based on how often they already appear in the generated text.", + "group": "sampling", + "type": "number", + "default": 0, + "range": { + "min": -2, + "max": 2, + "step": 0.1 + } + }, + { + "path": "response_format.type", + "label": "Response format", + "description": "Controls whether the model returns normal text or JSON mode output.", + "group": "output_format", + "type": "enum", + "default": "text", + "values": [ + "text", + "json_object" + ] + }, + { + "path": "safe_prompt", + "label": "Safe prompt", + "description": "Controls whether Mistral injects its safety prompt before the conversation.", + "group": "provider_metadata", + "type": "boolean", + "default": false + } + ] + }, + { + "provider": "mistral", + "authType": "api_key", + "model": "devstral-latest", + "params": [ + { + "path": "max_tokens", + "label": "Max tokens", + "description": "Maximum number of tokens to generate in the completion.", + "group": "generation_length", + "type": "integer", + "range": { + "min": 1 + } + }, + { + "path": "stop", + "label": "Stop sequence", + "description": "Stops generation when this string is detected.", + "group": "generation_length", + "type": "string" + }, + { + "path": "temperature", + "label": "Temperature", + "description": "Controls randomness. Lower values make outputs more focused; higher values make them more varied.", + "group": "sampling", + "type": "number", + "range": { + "min": 0, + "max": 1.5, + "step": 0.1 + } + }, + { + "path": "top_p", + "label": "Top P", + "description": "Controls nucleus sampling by limiting generation to tokens within the selected cumulative probability.", + "group": "sampling", + "type": "number", + "default": 1, + "range": { + "min": 0, + "max": 1, + "step": 0.01 + } + }, + { + "path": "random_seed", + "label": "Random seed", + "description": "Seed used for deterministic sampling when reproducible outputs are desired.", + "group": "sampling", + "type": "integer", + "range": { + "min": 0 + } + }, + { + "path": "presence_penalty", + "label": "Presence penalty", + "description": "Penalizes repeated words or phrases to encourage a wider variety of generated content.", + "group": "sampling", + "type": "number", + "default": 0, + "range": { + "min": -2, + "max": 2, + "step": 0.1 + } + }, + { + "path": "frequency_penalty", + "label": "Frequency penalty", + "description": "Penalizes words based on how often they already appear in the generated text.", + "group": "sampling", + "type": "number", + "default": 0, + "range": { + "min": -2, + "max": 2, + "step": 0.1 + } + }, + { + "path": "response_format.type", + "label": "Response format", + "description": "Controls whether the model returns normal text or JSON mode output.", + "group": "output_format", + "type": "enum", + "default": "text", + "values": [ + "text", + "json_object" + ] + }, + { + "path": "safe_prompt", + "label": "Safe prompt", + "description": "Controls whether Mistral injects its safety prompt before the conversation.", + "group": "provider_metadata", + "type": "boolean", + "default": false + } + ] + }, + { + "provider": "mistral", + "authType": "api_key", + "model": "magistral-medium-latest", + "params": [ + { + "path": "max_tokens", + "label": "Max tokens", + "description": "Maximum number of tokens to generate in the completion.", + "group": "generation_length", + "type": "integer", + "range": { + "min": 1 + } + }, + { + "path": "stop", + "label": "Stop sequence", + "description": "Stops generation when this string is detected.", + "group": "generation_length", + "type": "string" + }, + { + "path": "temperature", + "label": "Temperature", + "description": "Controls randomness. Lower values make outputs more focused; higher values make them more varied.", + "group": "sampling", + "type": "number", + "range": { + "min": 0, + "max": 1.5, + "step": 0.1 + } + }, + { + "path": "top_p", + "label": "Top P", + "description": "Controls nucleus sampling by limiting generation to tokens within the selected cumulative probability.", + "group": "sampling", + "type": "number", + "default": 1, + "range": { + "min": 0, + "max": 1, + "step": 0.01 + } + }, + { + "path": "random_seed", + "label": "Random seed", + "description": "Seed used for deterministic sampling when reproducible outputs are desired.", + "group": "sampling", + "type": "integer", + "range": { + "min": 0 + } + }, + { + "path": "presence_penalty", + "label": "Presence penalty", + "description": "Penalizes repeated words or phrases to encourage a wider variety of generated content.", + "group": "sampling", + "type": "number", + "default": 0, + "range": { + "min": -2, + "max": 2, + "step": 0.1 + } + }, + { + "path": "frequency_penalty", + "label": "Frequency penalty", + "description": "Penalizes words based on how often they already appear in the generated text.", + "group": "sampling", + "type": "number", + "default": 0, + "range": { + "min": -2, + "max": 2, + "step": 0.1 + } + }, + { + "path": "prompt_mode", + "label": "Prompt mode", + "description": "Enables Mistral's reasoning system prompt; leave unset to disable the default reasoning behavior.", + "group": "reasoning", + "type": "enum", + "values": [ + "reasoning" + ] + }, + { + "path": "response_format.type", + "label": "Response format", + "description": "Controls whether the model returns normal text or JSON mode output.", + "group": "output_format", + "type": "enum", + "default": "text", + "values": [ + "text", + "json_object" + ] + }, + { + "path": "safe_prompt", + "label": "Safe prompt", + "description": "Controls whether Mistral injects its safety prompt before the conversation.", + "group": "provider_metadata", + "type": "boolean", + "default": false + } + ] + }, + { + "provider": "mistral", + "authType": "api_key", + "model": "magistral-small-latest", + "params": [ + { + "path": "max_tokens", + "label": "Max tokens", + "description": "Maximum number of tokens to generate in the completion.", + "group": "generation_length", + "type": "integer", + "range": { + "min": 1 + } + }, + { + "path": "stop", + "label": "Stop sequence", + "description": "Stops generation when this string is detected.", + "group": "generation_length", + "type": "string" + }, + { + "path": "temperature", + "label": "Temperature", + "description": "Controls randomness. Lower values make outputs more focused; higher values make them more varied.", + "group": "sampling", + "type": "number", + "range": { + "min": 0, + "max": 1.5, + "step": 0.1 + } + }, + { + "path": "top_p", + "label": "Top P", + "description": "Controls nucleus sampling by limiting generation to tokens within the selected cumulative probability.", + "group": "sampling", + "type": "number", + "default": 1, + "range": { + "min": 0, + "max": 1, + "step": 0.01 + } + }, + { + "path": "random_seed", + "label": "Random seed", + "description": "Seed used for deterministic sampling when reproducible outputs are desired.", + "group": "sampling", + "type": "integer", + "range": { + "min": 0 + } + }, + { + "path": "presence_penalty", + "label": "Presence penalty", + "description": "Penalizes repeated words or phrases to encourage a wider variety of generated content.", + "group": "sampling", + "type": "number", + "default": 0, + "range": { + "min": -2, + "max": 2, + "step": 0.1 + } + }, + { + "path": "frequency_penalty", + "label": "Frequency penalty", + "description": "Penalizes words based on how often they already appear in the generated text.", + "group": "sampling", + "type": "number", + "default": 0, + "range": { + "min": -2, + "max": 2, + "step": 0.1 + } + }, + { + "path": "prompt_mode", + "label": "Prompt mode", + "description": "Enables Mistral's reasoning system prompt; leave unset to disable the default reasoning behavior.", + "group": "reasoning", + "type": "enum", + "values": [ + "reasoning" + ] + }, + { + "path": "response_format.type", + "label": "Response format", + "description": "Controls whether the model returns normal text or JSON mode output.", + "group": "output_format", + "type": "enum", + "default": "text", + "values": [ + "text", + "json_object" + ] + }, + { + "path": "safe_prompt", + "label": "Safe prompt", + "description": "Controls whether Mistral injects its safety prompt before the conversation.", + "group": "provider_metadata", + "type": "boolean", + "default": false + } + ] + }, + { + "provider": "mistral", + "authType": "api_key", + "model": "ministral-14b-latest", + "params": [ + { + "path": "max_tokens", + "label": "Max tokens", + "description": "Maximum number of tokens to generate in the completion.", + "group": "generation_length", + "type": "integer", + "range": { + "min": 1 + } + }, + { + "path": "stop", + "label": "Stop sequence", + "description": "Stops generation when this string is detected.", + "group": "generation_length", + "type": "string" + }, + { + "path": "temperature", + "label": "Temperature", + "description": "Controls randomness. Lower values make outputs more focused; higher values make them more varied.", + "group": "sampling", + "type": "number", + "range": { + "min": 0, + "max": 1.5, + "step": 0.1 + } + }, + { + "path": "top_p", + "label": "Top P", + "description": "Controls nucleus sampling by limiting generation to tokens within the selected cumulative probability.", + "group": "sampling", + "type": "number", + "default": 1, + "range": { + "min": 0, + "max": 1, + "step": 0.01 + } + }, + { + "path": "random_seed", + "label": "Random seed", + "description": "Seed used for deterministic sampling when reproducible outputs are desired.", + "group": "sampling", + "type": "integer", + "range": { + "min": 0 + } + }, + { + "path": "presence_penalty", + "label": "Presence penalty", + "description": "Penalizes repeated words or phrases to encourage a wider variety of generated content.", + "group": "sampling", + "type": "number", + "default": 0, + "range": { + "min": -2, + "max": 2, + "step": 0.1 + } + }, + { + "path": "frequency_penalty", + "label": "Frequency penalty", + "description": "Penalizes words based on how often they already appear in the generated text.", + "group": "sampling", + "type": "number", + "default": 0, + "range": { + "min": -2, + "max": 2, + "step": 0.1 + } + }, + { + "path": "response_format.type", + "label": "Response format", + "description": "Controls whether the model returns normal text or JSON mode output.", + "group": "output_format", + "type": "enum", + "default": "text", + "values": [ + "text", + "json_object" + ] + }, + { + "path": "safe_prompt", + "label": "Safe prompt", + "description": "Controls whether Mistral injects its safety prompt before the conversation.", + "group": "provider_metadata", + "type": "boolean", + "default": false + } + ] + }, + { + "provider": "mistral", + "authType": "api_key", + "model": "ministral-3b-latest", + "params": [ + { + "path": "max_tokens", + "label": "Max tokens", + "description": "Maximum number of tokens to generate in the completion.", + "group": "generation_length", + "type": "integer", + "range": { + "min": 1 + } + }, + { + "path": "stop", + "label": "Stop sequence", + "description": "Stops generation when this string is detected.", + "group": "generation_length", + "type": "string" + }, + { + "path": "temperature", + "label": "Temperature", + "description": "Controls randomness. Lower values make outputs more focused; higher values make them more varied.", + "group": "sampling", + "type": "number", + "range": { + "min": 0, + "max": 1.5, + "step": 0.1 + } + }, + { + "path": "top_p", + "label": "Top P", + "description": "Controls nucleus sampling by limiting generation to tokens within the selected cumulative probability.", + "group": "sampling", + "type": "number", + "default": 1, + "range": { + "min": 0, + "max": 1, + "step": 0.01 + } + }, + { + "path": "random_seed", + "label": "Random seed", + "description": "Seed used for deterministic sampling when reproducible outputs are desired.", + "group": "sampling", + "type": "integer", + "range": { + "min": 0 + } + }, + { + "path": "presence_penalty", + "label": "Presence penalty", + "description": "Penalizes repeated words or phrases to encourage a wider variety of generated content.", + "group": "sampling", + "type": "number", + "default": 0, + "range": { + "min": -2, + "max": 2, + "step": 0.1 + } + }, + { + "path": "frequency_penalty", + "label": "Frequency penalty", + "description": "Penalizes words based on how often they already appear in the generated text.", + "group": "sampling", + "type": "number", + "default": 0, + "range": { + "min": -2, + "max": 2, + "step": 0.1 + } + }, + { + "path": "response_format.type", + "label": "Response format", + "description": "Controls whether the model returns normal text or JSON mode output.", + "group": "output_format", + "type": "enum", + "default": "text", + "values": [ + "text", + "json_object" + ] + }, + { + "path": "safe_prompt", + "label": "Safe prompt", + "description": "Controls whether Mistral injects its safety prompt before the conversation.", + "group": "provider_metadata", + "type": "boolean", + "default": false + } + ] + }, + { + "provider": "mistral", + "authType": "api_key", + "model": "ministral-8b-latest", + "params": [ + { + "path": "max_tokens", + "label": "Max tokens", + "description": "Maximum number of tokens to generate in the completion.", + "group": "generation_length", + "type": "integer", + "range": { + "min": 1 + } + }, + { + "path": "stop", + "label": "Stop sequence", + "description": "Stops generation when this string is detected.", + "group": "generation_length", + "type": "string" + }, + { + "path": "temperature", + "label": "Temperature", + "description": "Controls randomness. Lower values make outputs more focused; higher values make them more varied.", + "group": "sampling", + "type": "number", + "range": { + "min": 0, + "max": 1.5, + "step": 0.1 + } + }, + { + "path": "top_p", + "label": "Top P", + "description": "Controls nucleus sampling by limiting generation to tokens within the selected cumulative probability.", + "group": "sampling", + "type": "number", + "default": 1, + "range": { + "min": 0, + "max": 1, + "step": 0.01 + } + }, + { + "path": "random_seed", + "label": "Random seed", + "description": "Seed used for deterministic sampling when reproducible outputs are desired.", + "group": "sampling", + "type": "integer", + "range": { + "min": 0 + } + }, + { + "path": "presence_penalty", + "label": "Presence penalty", + "description": "Penalizes repeated words or phrases to encourage a wider variety of generated content.", + "group": "sampling", + "type": "number", + "default": 0, + "range": { + "min": -2, + "max": 2, + "step": 0.1 + } + }, + { + "path": "frequency_penalty", + "label": "Frequency penalty", + "description": "Penalizes words based on how often they already appear in the generated text.", + "group": "sampling", + "type": "number", + "default": 0, + "range": { + "min": -2, + "max": 2, + "step": 0.1 + } + }, + { + "path": "response_format.type", + "label": "Response format", + "description": "Controls whether the model returns normal text or JSON mode output.", + "group": "output_format", + "type": "enum", + "default": "text", + "values": [ + "text", + "json_object" + ] + }, + { + "path": "safe_prompt", + "label": "Safe prompt", + "description": "Controls whether Mistral injects its safety prompt before the conversation.", + "group": "provider_metadata", + "type": "boolean", + "default": false + } + ] + }, + { + "provider": "mistral", + "authType": "api_key", + "model": "mistral-large-latest", + "params": [ + { + "path": "max_tokens", + "label": "Max tokens", + "description": "Maximum number of tokens to generate in the completion.", + "group": "generation_length", + "type": "integer", + "range": { + "min": 1 + } + }, + { + "path": "stop", + "label": "Stop sequence", + "description": "Stops generation when this string is detected.", + "group": "generation_length", + "type": "string" + }, + { + "path": "temperature", + "label": "Temperature", + "description": "Controls randomness. Lower values make outputs more focused; higher values make them more varied.", + "group": "sampling", + "type": "number", + "range": { + "min": 0, + "max": 1.5, + "step": 0.1 + } + }, + { + "path": "top_p", + "label": "Top P", + "description": "Controls nucleus sampling by limiting generation to tokens within the selected cumulative probability.", + "group": "sampling", + "type": "number", + "default": 1, + "range": { + "min": 0, + "max": 1, + "step": 0.01 + } + }, + { + "path": "random_seed", + "label": "Random seed", + "description": "Seed used for deterministic sampling when reproducible outputs are desired.", + "group": "sampling", + "type": "integer", + "range": { + "min": 0 + } + }, + { + "path": "presence_penalty", + "label": "Presence penalty", + "description": "Penalizes repeated words or phrases to encourage a wider variety of generated content.", + "group": "sampling", + "type": "number", + "default": 0, + "range": { + "min": -2, + "max": 2, + "step": 0.1 + } + }, + { + "path": "frequency_penalty", + "label": "Frequency penalty", + "description": "Penalizes words based on how often they already appear in the generated text.", + "group": "sampling", + "type": "number", + "default": 0, + "range": { + "min": -2, + "max": 2, + "step": 0.1 + } + }, + { + "path": "response_format.type", + "label": "Response format", + "description": "Controls whether the model returns normal text or JSON mode output.", + "group": "output_format", + "type": "enum", + "default": "text", + "values": [ + "text", + "json_object" + ] + }, + { + "path": "safe_prompt", + "label": "Safe prompt", + "description": "Controls whether Mistral injects its safety prompt before the conversation.", + "group": "provider_metadata", + "type": "boolean", + "default": false + } + ] + }, + { + "provider": "mistral", + "authType": "api_key", + "model": "mistral-medium-3.5", + "params": [ + { + "path": "max_tokens", + "label": "Max tokens", + "description": "Maximum number of tokens to generate in the completion.", + "group": "generation_length", + "type": "integer", + "range": { + "min": 1 + } + }, + { + "path": "stop", + "label": "Stop sequence", + "description": "Stops generation when this string is detected.", + "group": "generation_length", + "type": "string" + }, + { + "path": "temperature", + "label": "Temperature", + "description": "Controls randomness. Lower values make outputs more focused; higher values make them more varied.", + "group": "sampling", + "type": "number", + "range": { + "min": 0, + "max": 1.5, + "step": 0.1 + } + }, + { + "path": "top_p", + "label": "Top P", + "description": "Controls nucleus sampling by limiting generation to tokens within the selected cumulative probability.", + "group": "sampling", + "type": "number", + "default": 1, + "range": { + "min": 0, + "max": 1, + "step": 0.01 + } + }, + { + "path": "random_seed", + "label": "Random seed", + "description": "Seed used for deterministic sampling when reproducible outputs are desired.", + "group": "sampling", + "type": "integer", + "range": { + "min": 0 + } + }, + { + "path": "presence_penalty", + "label": "Presence penalty", + "description": "Penalizes repeated words or phrases to encourage a wider variety of generated content.", + "group": "sampling", + "type": "number", + "default": 0, + "range": { + "min": -2, + "max": 2, + "step": 0.1 + } + }, + { + "path": "frequency_penalty", + "label": "Frequency penalty", + "description": "Penalizes words based on how often they already appear in the generated text.", + "group": "sampling", + "type": "number", + "default": 0, + "range": { + "min": -2, + "max": 2, + "step": 0.1 + } + }, + { + "path": "response_format.type", + "label": "Response format", + "description": "Controls whether the model returns normal text or JSON mode output.", + "group": "output_format", + "type": "enum", + "default": "text", + "values": [ + "text", + "json_object" + ] + }, + { + "path": "safe_prompt", + "label": "Safe prompt", + "description": "Controls whether Mistral injects its safety prompt before the conversation.", + "group": "provider_metadata", + "type": "boolean", + "default": false + } + ] + }, + { + "provider": "mistral", + "authType": "api_key", + "model": "mistral-medium-latest", + "params": [ + { + "path": "max_tokens", + "label": "Max tokens", + "description": "Maximum number of tokens to generate in the completion.", + "group": "generation_length", + "type": "integer", + "range": { + "min": 1 + } + }, + { + "path": "stop", + "label": "Stop sequence", + "description": "Stops generation when this string is detected.", + "group": "generation_length", + "type": "string" + }, + { + "path": "temperature", + "label": "Temperature", + "description": "Controls randomness. Lower values make outputs more focused; higher values make them more varied.", + "group": "sampling", + "type": "number", + "range": { + "min": 0, + "max": 1.5, + "step": 0.1 + } + }, + { + "path": "top_p", + "label": "Top P", + "description": "Controls nucleus sampling by limiting generation to tokens within the selected cumulative probability.", + "group": "sampling", + "type": "number", + "default": 1, + "range": { + "min": 0, + "max": 1, + "step": 0.01 + } + }, + { + "path": "random_seed", + "label": "Random seed", + "description": "Seed used for deterministic sampling when reproducible outputs are desired.", + "group": "sampling", + "type": "integer", + "range": { + "min": 0 + } + }, + { + "path": "presence_penalty", + "label": "Presence penalty", + "description": "Penalizes repeated words or phrases to encourage a wider variety of generated content.", + "group": "sampling", + "type": "number", + "default": 0, + "range": { + "min": -2, + "max": 2, + "step": 0.1 + } + }, + { + "path": "frequency_penalty", + "label": "Frequency penalty", + "description": "Penalizes words based on how often they already appear in the generated text.", + "group": "sampling", + "type": "number", + "default": 0, + "range": { + "min": -2, + "max": 2, + "step": 0.1 + } + }, + { + "path": "response_format.type", + "label": "Response format", + "description": "Controls whether the model returns normal text or JSON mode output.", + "group": "output_format", + "type": "enum", + "default": "text", + "values": [ + "text", + "json_object" + ] + }, + { + "path": "safe_prompt", + "label": "Safe prompt", + "description": "Controls whether Mistral injects its safety prompt before the conversation.", + "group": "provider_metadata", + "type": "boolean", + "default": false + } + ] + }, + { + "provider": "mistral", + "authType": "api_key", + "model": "mistral-small-latest", + "params": [ + { + "path": "max_tokens", + "label": "Max tokens", + "description": "Maximum number of tokens to generate in the completion.", + "group": "generation_length", + "type": "integer", + "range": { + "min": 1 + } + }, + { + "path": "stop", + "label": "Stop sequence", + "description": "Stops generation when this string is detected.", + "group": "generation_length", + "type": "string" + }, + { + "path": "temperature", + "label": "Temperature", + "description": "Controls randomness. Lower values make outputs more focused; higher values make them more varied.", + "group": "sampling", + "type": "number", + "range": { + "min": 0, + "max": 1.5, + "step": 0.1 + } + }, + { + "path": "top_p", + "label": "Top P", + "description": "Controls nucleus sampling by limiting generation to tokens within the selected cumulative probability.", + "group": "sampling", + "type": "number", + "default": 1, + "range": { + "min": 0, + "max": 1, + "step": 0.01 + } + }, + { + "path": "random_seed", + "label": "Random seed", + "description": "Seed used for deterministic sampling when reproducible outputs are desired.", + "group": "sampling", + "type": "integer", + "range": { + "min": 0 + } + }, + { + "path": "presence_penalty", + "label": "Presence penalty", + "description": "Penalizes repeated words or phrases to encourage a wider variety of generated content.", + "group": "sampling", + "type": "number", + "default": 0, + "range": { + "min": -2, + "max": 2, + "step": 0.1 + } + }, + { + "path": "frequency_penalty", + "label": "Frequency penalty", + "description": "Penalizes words based on how often they already appear in the generated text.", + "group": "sampling", + "type": "number", + "default": 0, + "range": { + "min": -2, + "max": 2, + "step": 0.1 + } + }, + { + "path": "response_format.type", + "label": "Response format", + "description": "Controls whether the model returns normal text or JSON mode output.", + "group": "output_format", + "type": "enum", + "default": "text", + "values": [ + "text", + "json_object" + ] + }, + { + "path": "safe_prompt", + "label": "Safe prompt", + "description": "Controls whether Mistral injects its safety prompt before the conversation.", + "group": "provider_metadata", + "type": "boolean", + "default": false + } + ] + }, + { + "provider": "mistral", + "authType": "api_key", + "model": "open-mistral-nemo", + "params": [ + { + "path": "max_tokens", + "label": "Max tokens", + "description": "Maximum number of tokens to generate in the completion.", + "group": "generation_length", + "type": "integer", + "range": { + "min": 1 + } + }, + { + "path": "stop", + "label": "Stop sequence", + "description": "Stops generation when this string is detected.", + "group": "generation_length", + "type": "string" + }, + { + "path": "temperature", + "label": "Temperature", + "description": "Controls randomness. Lower values make outputs more focused; higher values make them more varied.", + "group": "sampling", + "type": "number", + "range": { + "min": 0, + "max": 1.5, + "step": 0.1 + } + }, + { + "path": "top_p", + "label": "Top P", + "description": "Controls nucleus sampling by limiting generation to tokens within the selected cumulative probability.", + "group": "sampling", + "type": "number", + "default": 1, + "range": { + "min": 0, + "max": 1, + "step": 0.01 + } + }, + { + "path": "random_seed", + "label": "Random seed", + "description": "Seed used for deterministic sampling when reproducible outputs are desired.", + "group": "sampling", + "type": "integer", + "range": { + "min": 0 + } + }, + { + "path": "presence_penalty", + "label": "Presence penalty", + "description": "Penalizes repeated words or phrases to encourage a wider variety of generated content.", + "group": "sampling", + "type": "number", + "default": 0, + "range": { + "min": -2, + "max": 2, + "step": 0.1 + } + }, + { + "path": "frequency_penalty", + "label": "Frequency penalty", + "description": "Penalizes words based on how often they already appear in the generated text.", + "group": "sampling", + "type": "number", + "default": 0, + "range": { + "min": -2, + "max": 2, + "step": 0.1 + } + }, + { + "path": "response_format.type", + "label": "Response format", + "description": "Controls whether the model returns normal text or JSON mode output.", + "group": "output_format", + "type": "enum", + "default": "text", + "values": [ + "text", + "json_object" + ] + }, + { + "path": "safe_prompt", + "label": "Safe prompt", + "description": "Controls whether Mistral injects its safety prompt before the conversation.", + "group": "provider_metadata", + "type": "boolean", + "default": false + } + ] + }, + { + "provider": "moonshot", + "authType": "api_key", + "model": "kimi-k2.5", + "params": [ + { + "path": "max_completion_tokens", + "label": "Max tokens", + "description": "Maximum number of tokens to generate in the chat completion.", + "group": "generation_length", + "type": "integer", + "range": { + "min": 1 + } + }, + { + "path": "thinking.type", + "label": "Thinking mode", + "description": "Controls whether Kimi reasons step by step before answering, or responds directly when set to disabled.", + "group": "reasoning", + "type": "enum", + "values": [ + "enabled", + "disabled" + ] + }, + { + "path": "response_format.type", + "label": "Response format", + "description": "Forces the response into plain text or a JSON object.", + "group": "output_format", + "type": "enum", + "default": "text", + "values": [ + "text", + "json_object" + ] + } + ] + }, + { + "provider": "moonshot", + "authType": "api_key", + "model": "kimi-k2.6", + "params": [ + { + "path": "max_completion_tokens", + "label": "Max tokens", + "description": "Maximum number of tokens to generate in the chat completion.", + "group": "generation_length", + "type": "integer", + "range": { + "min": 1 + } + }, + { + "path": "thinking.type", + "label": "Thinking mode", + "description": "Controls whether Kimi reasons step by step before answering. Thinking is enabled by default; set disabled to respond directly.", + "group": "reasoning", + "type": "enum", + "default": "enabled", + "values": [ + "enabled", + "disabled" + ] + }, + { + "path": "response_format.type", + "label": "Response format", + "description": "Forces the response into plain text or a JSON object.", + "group": "output_format", + "type": "enum", + "default": "text", + "values": [ + "text", + "json_object" + ] + } + ] + }, + { + "provider": "moonshot", + "authType": "api_key", + "model": "moonshot-v1-128k", + "params": [ + { + "path": "max_completion_tokens", + "label": "Max tokens", + "description": "Maximum number of tokens to generate in the chat completion.", + "group": "generation_length", + "type": "integer", + "range": { + "min": 1 + } + }, + { + "path": "temperature", + "label": "Temperature", + "description": "Controls randomness. Lower values make outputs more focused; higher values make them more varied.", + "group": "sampling", + "type": "number", + "default": 0.3, + "range": { + "min": 0, + "max": 1, + "step": 0.1 + } + }, + { + "path": "top_p", + "label": "Top P", + "description": "Controls nucleus sampling by limiting generation to tokens within the selected cumulative probability.", + "group": "sampling", + "type": "number", + "default": 1, + "range": { + "min": 0, + "max": 1, + "step": 0.01 + } + }, + { + "path": "n", + "label": "Number of completions", + "description": "How many chat completion choices to generate for the request.", + "group": "generation_length", + "type": "integer", + "default": 1, + "range": { + "min": 1, + "max": 5 + } + }, + { + "path": "presence_penalty", + "label": "Presence penalty", + "description": "Penalizes tokens that have already appeared, encouraging the model to talk about new topics.", + "group": "sampling", + "type": "number", + "default": 0, + "range": { + "min": -2, + "max": 2, + "step": 0.1 + } + }, + { + "path": "frequency_penalty", + "label": "Frequency penalty", + "description": "Penalizes tokens by how often they have appeared, reducing verbatim repetition.", + "group": "sampling", + "type": "number", + "default": 0, + "range": { + "min": -2, + "max": 2, + "step": 0.1 + } + }, + { + "path": "response_format.type", + "label": "Response format", + "description": "Forces the response into plain text or a JSON object.", + "group": "output_format", + "type": "enum", + "default": "text", + "values": [ + "text", + "json_object" + ] + } + ] + }, + { + "provider": "moonshot", + "authType": "api_key", + "model": "moonshot-v1-32k", + "params": [ + { + "path": "max_completion_tokens", + "label": "Max tokens", + "description": "Maximum number of tokens to generate in the chat completion.", + "group": "generation_length", + "type": "integer", + "range": { + "min": 1 + } + }, + { + "path": "temperature", + "label": "Temperature", + "description": "Controls randomness. Lower values make outputs more focused; higher values make them more varied.", + "group": "sampling", + "type": "number", + "default": 0.3, + "range": { + "min": 0, + "max": 1, + "step": 0.1 + } + }, + { + "path": "top_p", + "label": "Top P", + "description": "Controls nucleus sampling by limiting generation to tokens within the selected cumulative probability.", + "group": "sampling", + "type": "number", + "default": 1, + "range": { + "min": 0, + "max": 1, + "step": 0.01 + } + }, + { + "path": "n", + "label": "Number of completions", + "description": "How many chat completion choices to generate for the request.", + "group": "generation_length", + "type": "integer", + "default": 1, + "range": { + "min": 1, + "max": 5 + } + }, + { + "path": "presence_penalty", + "label": "Presence penalty", + "description": "Penalizes tokens that have already appeared, encouraging the model to talk about new topics.", + "group": "sampling", + "type": "number", + "default": 0, + "range": { + "min": -2, + "max": 2, + "step": 0.1 + } + }, + { + "path": "frequency_penalty", + "label": "Frequency penalty", + "description": "Penalizes tokens by how often they have appeared, reducing verbatim repetition.", + "group": "sampling", + "type": "number", + "default": 0, + "range": { + "min": -2, + "max": 2, + "step": 0.1 + } + }, + { + "path": "response_format.type", + "label": "Response format", + "description": "Forces the response into plain text or a JSON object.", + "group": "output_format", + "type": "enum", + "default": "text", + "values": [ + "text", + "json_object" + ] + } + ] + }, + { + "provider": "moonshot", + "authType": "api_key", + "model": "moonshot-v1-8k", + "params": [ + { + "path": "max_completion_tokens", + "label": "Max tokens", + "description": "Maximum number of tokens to generate in the chat completion.", + "group": "generation_length", + "type": "integer", + "range": { + "min": 1 + } + }, + { + "path": "temperature", + "label": "Temperature", + "description": "Controls randomness. Lower values make outputs more focused; higher values make them more varied.", + "group": "sampling", + "type": "number", + "default": 0.3, + "range": { + "min": 0, + "max": 1, + "step": 0.1 + } + }, + { + "path": "top_p", + "label": "Top P", + "description": "Controls nucleus sampling by limiting generation to tokens within the selected cumulative probability.", + "group": "sampling", + "type": "number", + "default": 1, + "range": { + "min": 0, + "max": 1, + "step": 0.01 + } + }, + { + "path": "n", + "label": "Number of completions", + "description": "How many chat completion choices to generate for the request.", + "group": "generation_length", + "type": "integer", + "default": 1, + "range": { + "min": 1, + "max": 5 + } + }, + { + "path": "presence_penalty", + "label": "Presence penalty", + "description": "Penalizes tokens that have already appeared, encouraging the model to talk about new topics.", + "group": "sampling", + "type": "number", + "default": 0, + "range": { + "min": -2, + "max": 2, + "step": 0.1 + } + }, + { + "path": "frequency_penalty", + "label": "Frequency penalty", + "description": "Penalizes tokens by how often they have appeared, reducing verbatim repetition.", + "group": "sampling", + "type": "number", + "default": 0, + "range": { + "min": -2, + "max": 2, + "step": 0.1 + } + }, + { + "path": "response_format.type", + "label": "Response format", + "description": "Forces the response into plain text or a JSON object.", + "group": "output_format", + "type": "enum", + "default": "text", + "values": [ + "text", + "json_object" + ] + } + ] + }, + { + "provider": "openai", + "authType": "api_key", + "model": "chatgpt-4o-latest", + "params": [ + { + "path": "max_tokens", + "label": "Max tokens", + "description": "Maximum number of output tokens the model may generate.", + "group": "generation_length", + "type": "integer", + "default": 4096, + "range": { + "min": 1 + } + }, + { + "path": "temperature", + "label": "Temperature", + "description": "Controls randomness. Lower values make outputs more focused; higher values make them more varied.", + "group": "sampling", + "type": "number", + "default": 1, + "range": { + "min": 0, + "max": 2, + "step": 0.1 + } + }, + { + "path": "top_p", + "label": "Top P", + "description": "Controls nucleus sampling by limiting generation to tokens whose cumulative probability reaches this value.", + "group": "sampling", + "type": "number", + "default": 1, + "range": { + "min": 0, + "max": 1, + "step": 0.01 + } + } + ] + }, + { + "provider": "openai", + "authType": "api_key", + "model": "gpt-3.5-turbo", + "params": [ + { + "path": "max_tokens", + "label": "Max tokens", + "description": "Maximum number of output tokens the model may generate.", + "group": "generation_length", + "type": "integer", + "default": 4096, + "range": { + "min": 1 + } + }, + { + "path": "temperature", + "label": "Temperature", + "description": "Controls randomness. Lower values make outputs more focused; higher values make them more varied.", + "group": "sampling", + "type": "number", + "default": 1, + "range": { + "min": 0, + "max": 2, + "step": 0.1 + } + }, + { + "path": "top_p", + "label": "Top P", + "description": "Controls nucleus sampling by limiting generation to tokens whose cumulative probability reaches this value.", + "group": "sampling", + "type": "number", + "default": 1, + "range": { + "min": 0, + "max": 1, + "step": 0.01 + } + } + ] + }, + { + "provider": "openai", + "authType": "api_key", + "model": "gpt-4-turbo", + "params": [ + { + "path": "max_tokens", + "label": "Max tokens", + "description": "Maximum number of output tokens the model may generate.", + "group": "generation_length", + "type": "integer", + "default": 4096, + "range": { + "min": 1 + } + }, + { + "path": "temperature", + "label": "Temperature", + "description": "Controls randomness. Lower values make outputs more focused; higher values make them more varied.", + "group": "sampling", + "type": "number", + "default": 1, + "range": { + "min": 0, + "max": 2, + "step": 0.1 + } + }, + { + "path": "top_p", + "label": "Top P", + "description": "Controls nucleus sampling by limiting generation to tokens whose cumulative probability reaches this value.", + "group": "sampling", + "type": "number", + "default": 1, + "range": { + "min": 0, + "max": 1, + "step": 0.01 + } + } + ] + }, + { + "provider": "openai", + "authType": "api_key", + "model": "gpt-4-turbo-2024-04-09", + "params": [ + { + "path": "max_tokens", + "label": "Max tokens", + "description": "Maximum number of output tokens the model may generate.", + "group": "generation_length", + "type": "integer", + "default": 4096, + "range": { + "min": 1 + } + }, + { + "path": "temperature", + "label": "Temperature", + "description": "Controls randomness. Lower values make outputs more focused; higher values make them more varied.", + "group": "sampling", + "type": "number", + "default": 1, + "range": { + "min": 0, + "max": 2, + "step": 0.1 + } + }, + { + "path": "top_p", + "label": "Top P", + "description": "Controls nucleus sampling by limiting generation to tokens whose cumulative probability reaches this value.", + "group": "sampling", + "type": "number", + "default": 1, + "range": { + "min": 0, + "max": 1, + "step": 0.01 + } + } + ] + }, + { + "provider": "openai", + "authType": "api_key", + "model": "gpt-4.1", + "params": [ + { + "path": "max_tokens", + "label": "Max tokens", + "description": "Maximum number of output tokens the model may generate.", + "group": "generation_length", + "type": "integer", + "default": 4096, + "range": { + "min": 1 + } + }, + { + "path": "temperature", + "label": "Temperature", + "description": "Controls randomness. Lower values make outputs more focused; higher values make them more varied.", + "group": "sampling", + "type": "number", + "default": 1, + "range": { + "min": 0, + "max": 2, + "step": 0.1 + } + }, + { + "path": "top_p", + "label": "Top P", + "description": "Controls nucleus sampling by limiting generation to tokens whose cumulative probability reaches this value.", + "group": "sampling", + "type": "number", + "default": 1, + "range": { + "min": 0, + "max": 1, + "step": 0.01 + } + } + ] + }, + { + "provider": "openai", + "authType": "api_key", + "model": "gpt-4.1-mini", + "params": [ + { + "path": "max_tokens", + "label": "Max tokens", + "description": "Maximum number of output tokens the model may generate.", + "group": "generation_length", + "type": "integer", + "default": 4096, + "range": { + "min": 1 + } + }, + { + "path": "temperature", + "label": "Temperature", + "description": "Controls randomness. Lower values make outputs more focused; higher values make them more varied.", + "group": "sampling", + "type": "number", + "default": 1, + "range": { + "min": 0, + "max": 2, + "step": 0.1 + } + }, + { + "path": "top_p", + "label": "Top P", + "description": "Controls nucleus sampling by limiting generation to tokens whose cumulative probability reaches this value.", + "group": "sampling", + "type": "number", + "default": 1, + "range": { + "min": 0, + "max": 1, + "step": 0.01 + } + } + ] + }, + { + "provider": "openai", + "authType": "api_key", + "model": "gpt-4.1-nano", + "params": [ + { + "path": "max_tokens", + "label": "Max tokens", + "description": "Maximum number of output tokens the model may generate.", + "group": "generation_length", + "type": "integer", + "default": 4096, + "range": { + "min": 1 + } + }, + { + "path": "temperature", + "label": "Temperature", + "description": "Controls randomness. Lower values make outputs more focused; higher values make them more varied.", + "group": "sampling", + "type": "number", + "default": 1, + "range": { + "min": 0, + "max": 2, + "step": 0.1 + } + }, + { + "path": "top_p", + "label": "Top P", + "description": "Controls nucleus sampling by limiting generation to tokens whose cumulative probability reaches this value.", + "group": "sampling", + "type": "number", + "default": 1, + "range": { + "min": 0, + "max": 1, + "step": 0.01 + } + } + ] + }, + { + "provider": "openai", + "authType": "api_key", + "model": "gpt-4o", + "params": [ + { + "path": "max_tokens", + "label": "Max tokens", + "description": "Maximum number of output tokens the model may generate.", + "group": "generation_length", + "type": "integer", + "default": 4096, + "range": { + "min": 1 + } + }, + { + "path": "temperature", + "label": "Temperature", + "description": "Controls randomness. Lower values make outputs more focused; higher values make them more varied.", + "group": "sampling", + "type": "number", + "default": 1, + "range": { + "min": 0, + "max": 2, + "step": 0.1 + } + }, + { + "path": "top_p", + "label": "Top P", + "description": "Controls nucleus sampling by limiting generation to tokens whose cumulative probability reaches this value.", + "group": "sampling", + "type": "number", + "default": 1, + "range": { + "min": 0, + "max": 1, + "step": 0.01 + } + } + ] + }, + { + "provider": "openai", + "authType": "api_key", + "model": "gpt-4o-2024-11-20", + "params": [ + { + "path": "max_tokens", + "label": "Max tokens", + "description": "Maximum number of output tokens the model may generate.", + "group": "generation_length", + "type": "integer", + "default": 4096, + "range": { + "min": 1 + } + }, + { + "path": "temperature", + "label": "Temperature", + "description": "Controls randomness. Lower values make outputs more focused; higher values make them more varied.", + "group": "sampling", + "type": "number", + "default": 1, + "range": { + "min": 0, + "max": 2, + "step": 0.1 + } + }, + { + "path": "top_p", + "label": "Top P", + "description": "Controls nucleus sampling by limiting generation to tokens whose cumulative probability reaches this value.", + "group": "sampling", + "type": "number", + "default": 1, + "range": { + "min": 0, + "max": 1, + "step": 0.01 + } + } + ] + }, + { + "provider": "openai", + "authType": "api_key", + "model": "gpt-4o-mini", + "params": [ + { + "path": "max_tokens", + "label": "Max tokens", + "description": "Maximum number of output tokens the model may generate.", + "group": "generation_length", + "type": "integer", + "default": 4096, + "range": { + "min": 1 + } + }, + { + "path": "temperature", + "label": "Temperature", + "description": "Controls randomness. Lower values make outputs more focused; higher values make them more varied.", + "group": "sampling", + "type": "number", + "default": 1, + "range": { + "min": 0, + "max": 2, + "step": 0.1 + } + }, + { + "path": "top_p", + "label": "Top P", + "description": "Controls nucleus sampling by limiting generation to tokens whose cumulative probability reaches this value.", + "group": "sampling", + "type": "number", + "default": 1, + "range": { + "min": 0, + "max": 1, + "step": 0.01 + } + } + ] + }, + { + "provider": "openai", + "authType": "api_key", + "model": "gpt-5", + "params": [ + { + "path": "max_completion_tokens", + "label": "Max tokens", + "description": "Maximum number of output tokens the model may generate.", + "group": "generation_length", + "type": "integer", + "default": 4096, + "range": { + "min": 16 + } + }, + { + "path": "reasoning_effort", + "label": "Reasoning effort", + "description": "Controls how much reasoning the model should perform before producing an answer.", + "group": "reasoning", + "type": "enum", + "default": "medium", + "values": [ + "minimal", + "low", + "medium", + "high" + ] + } + ] + }, + { + "provider": "openai", + "authType": "api_key", + "model": "gpt-5-chat-latest", + "params": [ + { + "path": "max_completion_tokens", + "label": "Max tokens", + "description": "Maximum number of output tokens the model may generate.", + "group": "generation_length", + "type": "integer", + "default": 4096, + "range": { + "min": 16 + } + } + ] + }, + { + "provider": "openai", + "authType": "api_key", + "model": "gpt-5-mini", + "params": [ + { + "path": "max_completion_tokens", + "label": "Max tokens", + "description": "Maximum number of output tokens the model may generate.", + "group": "generation_length", + "type": "integer", + "default": 4096, + "range": { + "min": 16 + } + }, + { + "path": "reasoning_effort", + "label": "Reasoning effort", + "description": "Controls how much reasoning the model should perform before producing an answer.", + "group": "reasoning", + "type": "enum", + "default": "medium", + "values": [ + "minimal", + "low", + "medium", + "high" + ] + } + ] + }, + { + "provider": "openai", + "authType": "api_key", + "model": "gpt-5-nano", + "params": [ + { + "path": "max_completion_tokens", + "label": "Max tokens", + "description": "Maximum number of output tokens the model may generate.", + "group": "generation_length", + "type": "integer", + "default": 4096, + "range": { + "min": 16 + } + }, + { + "path": "reasoning_effort", + "label": "Reasoning effort", + "description": "Controls how much reasoning the model should perform before producing an answer.", + "group": "reasoning", + "type": "enum", + "default": "medium", + "values": [ + "minimal", + "low", + "medium", + "high" + ] + } + ] + }, + { + "provider": "openai", + "authType": "api_key", + "model": "gpt-5.1", + "params": [ + { + "path": "max_completion_tokens", + "label": "Max tokens", + "description": "Maximum number of output tokens the model may generate.", + "group": "generation_length", + "type": "integer", + "default": 4096, + "range": { + "min": 16 + } + }, + { + "path": "reasoning_effort", + "label": "Reasoning effort", + "description": "Controls how much reasoning the model should perform before producing an answer.", + "group": "reasoning", + "type": "enum", + "default": "none", + "values": [ + "none", + "low", + "medium", + "high" + ] + } + ] + }, + { + "provider": "openai", + "authType": "subscription", + "model": "gpt-5.1-codex-max", + "params": [ + { + "path": "reasoning.effort", + "label": "Reasoning effort", + "description": "Controls how much reasoning the model should perform before producing an answer.", + "group": "reasoning", + "type": "enum", + "default": "medium", + "values": [ + "minimal", + "low", + "medium", + "high", + "xhigh" + ] + }, + { + "path": "reasoning.summary", + "label": "Reasoning summary", + "description": "Controls the level of reasoning summary returned with the response.", + "group": "reasoning", + "type": "enum", + "default": "auto", + "values": [ + "auto", + "concise", + "detailed", + "none" + ] + }, + { + "path": "text.verbosity", + "label": "Verbosity", + "description": "Controls how concise or detailed the model's final text response should be.", + "group": "output_format", + "type": "enum", + "default": "medium", + "values": [ + "low", + "medium", + "high" + ] + } + ] + }, + { + "provider": "openai", + "authType": "subscription", + "model": "gpt-5.1-codex", + "params": [ + { + "path": "reasoning.effort", + "label": "Reasoning effort", + "description": "Controls how much reasoning the model should perform before producing an answer.", + "group": "reasoning", + "type": "enum", + "default": "medium", + "values": [ + "minimal", + "low", + "medium", + "high" + ] + }, + { + "path": "reasoning.summary", + "label": "Reasoning summary", + "description": "Controls the level of reasoning summary returned with the response.", + "group": "reasoning", + "type": "enum", + "default": "auto", + "values": [ + "auto", + "concise", + "detailed", + "none" + ] + }, + { + "path": "text.verbosity", + "label": "Verbosity", + "description": "Controls how concise or detailed the model's final text response should be.", + "group": "output_format", + "type": "enum", + "default": "medium", + "values": [ + "low", + "medium", + "high" + ] + } + ] + }, + { + "provider": "openai", + "authType": "api_key", + "model": "gpt-5.2", + "params": [ + { + "path": "max_completion_tokens", + "label": "Max tokens", + "description": "Maximum number of output tokens the model may generate.", + "group": "generation_length", + "type": "integer", + "default": 4096, + "range": { + "min": 16 + } + }, + { + "path": "reasoning_effort", + "label": "Reasoning effort", + "description": "Controls how much reasoning the model should perform before producing an answer.", + "group": "reasoning", + "type": "enum", + "default": "medium", + "values": [ + "none", + "low", + "medium", + "high", + "xhigh" + ] + } + ] + }, + { + "provider": "openai", + "authType": "subscription", + "model": "gpt-5.2-codex", + "params": [ + { + "path": "reasoning.effort", + "label": "Reasoning effort", + "description": "Controls how much reasoning the model should perform before producing an answer.", + "group": "reasoning", + "type": "enum", + "default": "medium", + "values": [ + "minimal", + "low", + "medium", + "high", + "xhigh" + ] + }, + { + "path": "reasoning.summary", + "label": "Reasoning summary", + "description": "Controls the level of reasoning summary returned with the response.", + "group": "reasoning", + "type": "enum", + "default": "auto", + "values": [ + "auto", + "concise", + "detailed", + "none" + ] + }, + { + "path": "text.verbosity", + "label": "Verbosity", + "description": "Controls how concise or detailed the model's final text response should be.", + "group": "output_format", + "type": "enum", + "default": "medium", + "values": [ + "low", + "medium", + "high" + ] + } + ] + }, + { + "provider": "openai", + "authType": "subscription", + "model": "gpt-5.2", + "params": [ + { + "path": "reasoning.effort", + "label": "Reasoning effort", + "description": "Controls how much reasoning the model should perform before producing an answer.", + "group": "reasoning", + "type": "enum", + "default": "medium", + "values": [ + "minimal", + "low", + "medium", + "high", + "xhigh" + ] + }, + { + "path": "reasoning.summary", + "label": "Reasoning summary", + "description": "Controls the level of reasoning summary returned with the response.", + "group": "reasoning", + "type": "enum", + "default": "auto", + "values": [ + "auto", + "concise", + "detailed", + "none" + ] + }, + { + "path": "text.verbosity", + "label": "Verbosity", + "description": "Controls how concise or detailed the model's final text response should be.", + "group": "output_format", + "type": "enum", + "default": "medium", + "values": [ + "low", + "medium", + "high" + ] + } + ] + }, + { + "provider": "openai", + "authType": "api_key", + "model": "gpt-5.3-codex", + "params": [ + { + "path": "max_completion_tokens", + "label": "Max tokens", + "description": "Maximum number of output tokens the model may generate.", + "group": "generation_length", + "type": "integer", + "default": 4096, + "range": { + "min": 16 + } + }, + { + "path": "reasoning_effort", + "label": "Reasoning effort", + "description": "Controls how much reasoning the model should perform before producing an answer.", + "group": "reasoning", + "type": "enum", + "default": "medium", + "values": [ + "low", + "medium", + "high", + "xhigh" + ] + } + ] + }, + { + "provider": "openai", + "authType": "subscription", + "model": "gpt-5.3-codex-spark", + "params": [ + { + "path": "reasoning.effort", + "label": "Reasoning effort", + "description": "Controls how much reasoning the model should perform before producing an answer.", + "group": "reasoning", + "type": "enum", + "default": "medium", + "values": [ + "minimal", + "low", + "medium", + "high", + "xhigh" + ] + }, + { + "path": "reasoning.summary", + "label": "Reasoning summary", + "description": "Controls the level of reasoning summary returned with the response.", + "group": "reasoning", + "type": "enum", + "default": "auto", + "values": [ + "auto", + "concise", + "detailed", + "none" + ] + }, + { + "path": "text.verbosity", + "label": "Verbosity", + "description": "Controls how concise or detailed the model's final text response should be.", + "group": "output_format", + "type": "enum", + "default": "medium", + "values": [ + "low", + "medium", + "high" + ] + } + ] + }, + { + "provider": "openai", + "authType": "subscription", + "model": "gpt-5.3-codex", + "params": [ + { + "path": "reasoning.effort", + "label": "Reasoning effort", + "description": "Controls how much reasoning the model should perform before producing an answer.", + "group": "reasoning", + "type": "enum", + "default": "medium", + "values": [ + "minimal", + "low", + "medium", + "high", + "xhigh" + ] + }, + { + "path": "reasoning.summary", + "label": "Reasoning summary", + "description": "Controls the level of reasoning summary returned with the response.", + "group": "reasoning", + "type": "enum", + "default": "auto", + "values": [ + "auto", + "concise", + "detailed", + "none" + ] + }, + { + "path": "text.verbosity", + "label": "Verbosity", + "description": "Controls how concise or detailed the model's final text response should be.", + "group": "output_format", + "type": "enum", + "default": "medium", + "values": [ + "low", + "medium", + "high" + ] + } + ] + }, + { + "provider": "openai", + "authType": "api_key", + "model": "gpt-5.4", + "params": [ + { + "path": "max_completion_tokens", + "label": "Max tokens", + "description": "Maximum number of output tokens the model may generate.", + "group": "generation_length", + "type": "integer", + "default": 4096, + "range": { + "min": 16 + } + }, + { + "path": "reasoning_effort", + "label": "Reasoning effort", + "description": "Controls how much reasoning the model should perform before producing an answer.", + "group": "reasoning", + "type": "enum", + "default": "medium", + "values": [ + "none", + "low", + "medium", + "high", + "xhigh" + ] + } + ] + }, + { + "provider": "openai", + "authType": "api_key", + "model": "gpt-5.4-mini", + "params": [ + { + "path": "max_completion_tokens", + "label": "Max tokens", + "description": "Maximum number of output tokens the model may generate.", + "group": "generation_length", + "type": "integer", + "default": 4096, + "range": { + "min": 16 + } + }, + { + "path": "reasoning_effort", + "label": "Reasoning effort", + "description": "Controls how much reasoning the model should perform before producing an answer.", + "group": "reasoning", + "type": "enum", + "default": "medium", + "values": [ + "none", + "low", + "medium", + "high", + "xhigh" + ] + } + ] + }, + { + "provider": "openai", + "authType": "subscription", + "model": "gpt-5.4-mini", + "params": [ + { + "path": "reasoning.effort", + "label": "Reasoning effort", + "description": "Controls how much reasoning the model should perform before producing an answer.", + "group": "reasoning", + "type": "enum", + "default": "medium", + "values": [ + "minimal", + "low", + "medium", + "high", + "xhigh" + ] + }, + { + "path": "reasoning.summary", + "label": "Reasoning summary", + "description": "Controls the level of reasoning summary returned with the response.", + "group": "reasoning", + "type": "enum", + "default": "auto", + "values": [ + "auto", + "concise", + "detailed", + "none" + ] + }, + { + "path": "text.verbosity", + "label": "Verbosity", + "description": "Controls how concise or detailed the model's final text response should be.", + "group": "output_format", + "type": "enum", + "default": "medium", + "values": [ + "low", + "medium", + "high" + ] + } + ] + }, + { + "provider": "openai", + "authType": "api_key", + "model": "gpt-5.4-nano", + "params": [ + { + "path": "max_completion_tokens", + "label": "Max tokens", + "description": "Maximum number of output tokens the model may generate.", + "group": "generation_length", + "type": "integer", + "default": 4096, + "range": { + "min": 16 + } + }, + { + "path": "reasoning_effort", + "label": "Reasoning effort", + "description": "Controls how much reasoning the model should perform before producing an answer.", + "group": "reasoning", + "type": "enum", + "default": "medium", + "values": [ + "none", + "low", + "medium", + "high", + "xhigh" + ] + } + ] + }, + { + "provider": "openai", + "authType": "api_key", + "model": "gpt-5.4-pro", + "params": [ + { + "path": "max_completion_tokens", + "label": "Max tokens", + "description": "Maximum number of output tokens the model may generate.", + "group": "generation_length", + "type": "integer", + "default": 4096, + "range": { + "min": 16 + } + }, + { + "path": "reasoning_effort", + "label": "Reasoning effort", + "description": "Controls how much reasoning the model should perform before producing an answer.", + "group": "reasoning", + "type": "enum", + "default": "medium", + "values": [ + "medium", + "high", + "xhigh" + ] + } + ] + }, + { + "provider": "openai", + "authType": "subscription", + "model": "gpt-5.4-pro", + "params": [ + { + "path": "reasoning.effort", + "label": "Reasoning effort", + "description": "Controls how much reasoning the model should perform before producing an answer.", + "group": "reasoning", + "type": "enum", + "default": "medium", + "values": [ + "medium", + "high", + "xhigh" + ] + }, + { + "path": "reasoning.summary", + "label": "Reasoning summary", + "description": "Controls the level of reasoning summary returned with the response.", + "group": "reasoning", + "type": "enum", + "default": "auto", + "values": [ + "auto", + "concise", + "detailed", + "none" + ] + }, + { + "path": "text.verbosity", + "label": "Verbosity", + "description": "Controls how concise or detailed the model's final text response should be.", + "group": "output_format", + "type": "enum", + "default": "medium", + "values": [ + "low", + "medium", + "high" + ] + } + ] + }, + { + "provider": "openai", + "authType": "subscription", + "model": "gpt-5.4", + "params": [ + { + "path": "reasoning.effort", + "label": "Reasoning effort", + "description": "Controls how much reasoning the model should perform before producing an answer.", + "group": "reasoning", + "type": "enum", + "default": "medium", + "values": [ + "minimal", + "low", + "medium", + "high", + "xhigh" + ] + }, + { + "path": "reasoning.summary", + "label": "Reasoning summary", + "description": "Controls the level of reasoning summary returned with the response.", + "group": "reasoning", + "type": "enum", + "default": "auto", + "values": [ + "auto", + "concise", + "detailed", + "none" + ] + }, + { + "path": "text.verbosity", + "label": "Verbosity", + "description": "Controls how concise or detailed the model's final text response should be.", + "group": "output_format", + "type": "enum", + "default": "medium", + "values": [ + "low", + "medium", + "high" + ] + } + ] + }, + { + "provider": "openai", + "authType": "api_key", + "model": "gpt-5.5", + "params": [ + { + "path": "max_completion_tokens", + "label": "Max tokens", + "description": "Maximum number of output tokens the model may generate.", + "group": "generation_length", + "type": "integer", + "default": 4096, + "range": { + "min": 16 + } + }, + { + "path": "reasoning_effort", + "label": "Reasoning effort", + "description": "Controls how much reasoning the model should perform before producing an answer.", + "group": "reasoning", + "type": "enum", + "default": "medium", + "values": [ + "none", + "low", + "medium", + "high", + "xhigh" + ] + } + ] + }, + { + "provider": "openai", + "authType": "api_key", + "model": "gpt-5.5-pro", + "params": [ + { + "path": "max_completion_tokens", + "label": "Max tokens", + "description": "Maximum number of output tokens the model may generate.", + "group": "generation_length", + "type": "integer", + "default": 4096, + "range": { + "min": 16 + } + }, + { + "path": "reasoning_effort", + "label": "Reasoning effort", + "description": "Controls how much reasoning the model should perform before producing an answer.", + "group": "reasoning", + "type": "enum", + "default": "medium", + "values": [ + "medium", + "high", + "xhigh" + ] + } + ] + }, + { + "provider": "openai", + "authType": "subscription", + "model": "gpt-5.5-pro", + "params": [ + { + "path": "reasoning.effort", + "label": "Reasoning effort", + "description": "Controls how much reasoning the model should perform before producing an answer.", + "group": "reasoning", + "type": "enum", + "default": "medium", + "values": [ + "medium", + "high", + "xhigh" + ] + }, + { + "path": "reasoning.summary", + "label": "Reasoning summary", + "description": "Controls the level of reasoning summary returned with the response.", + "group": "reasoning", + "type": "enum", + "default": "auto", + "values": [ + "auto", + "concise", + "detailed", + "none" + ] + }, + { + "path": "text.verbosity", + "label": "Verbosity", + "description": "Controls how concise or detailed the model's final text response should be.", + "group": "output_format", + "type": "enum", + "default": "medium", + "values": [ + "low", + "medium", + "high" + ] + } + ] + }, + { + "provider": "openai", + "authType": "subscription", + "model": "gpt-5.5", + "params": [ + { + "path": "reasoning.effort", + "label": "Reasoning effort", + "description": "Controls how much reasoning the model should perform before producing an answer.", + "group": "reasoning", + "type": "enum", + "default": "medium", + "values": [ + "minimal", + "low", + "medium", + "high", + "xhigh" + ] + }, + { + "path": "reasoning.summary", + "label": "Reasoning summary", + "description": "Controls the level of reasoning summary returned with the response.", + "group": "reasoning", + "type": "enum", + "default": "auto", + "values": [ + "auto", + "concise", + "detailed", + "none" + ] + }, + { + "path": "text.verbosity", + "label": "Verbosity", + "description": "Controls how concise or detailed the model's final text response should be.", + "group": "output_format", + "type": "enum", + "default": "medium", + "values": [ + "low", + "medium", + "high" + ] + } + ] + }, + { + "provider": "openai", + "authType": "api_key", + "model": "o1", + "params": [ + { + "path": "max_completion_tokens", + "label": "Max tokens", + "description": "Maximum number of output tokens the model may generate.", + "group": "generation_length", + "type": "integer", + "default": 4096, + "range": { + "min": 16 + } + }, + { + "path": "reasoning_effort", + "label": "Reasoning effort", + "description": "Controls how much reasoning the model should perform before producing an answer.", + "group": "reasoning", + "type": "enum", + "default": "medium", + "values": [ + "low", + "medium", + "high", + "xhigh" + ] + } + ] + }, + { + "provider": "openai", + "authType": "api_key", + "model": "o1-mini", + "params": [ + { + "path": "max_tokens", + "label": "Max tokens", + "description": "Maximum number of output tokens the model may generate.", + "group": "generation_length", + "type": "integer", + "default": 4096, + "range": { + "min": 1 + } + }, + { + "path": "reasoning_effort", + "label": "Reasoning effort", + "description": "Controls how much reasoning the model should perform before producing an answer.", + "group": "reasoning", + "type": "enum", + "default": "medium", + "values": [ + "minimal", + "low", + "medium", + "high" + ] + } + ] + }, + { + "provider": "openai", + "authType": "api_key", + "model": "o1-preview", + "params": [ + { + "path": "max_tokens", + "label": "Max tokens", + "description": "Maximum number of output tokens the model may generate.", + "group": "generation_length", + "type": "integer", + "default": 4096, + "range": { + "min": 1 + } + }, + { + "path": "reasoning_effort", + "label": "Reasoning effort", + "description": "Controls how much reasoning the model should perform before producing an answer.", + "group": "reasoning", + "type": "enum", + "default": "medium", + "values": [ + "minimal", + "low", + "medium", + "high" + ] + } + ] + }, + { + "provider": "openai", + "authType": "api_key", + "model": "o3", + "params": [ + { + "path": "max_completion_tokens", + "label": "Max tokens", + "description": "Maximum number of output tokens the model may generate.", + "group": "generation_length", + "type": "integer", + "default": 4096, + "range": { + "min": 16 + } + }, + { + "path": "reasoning_effort", + "label": "Reasoning effort", + "description": "Controls how much reasoning the model should perform before producing an answer.", + "group": "reasoning", + "type": "enum", + "default": "medium", + "values": [ + "low", + "medium", + "high", + "xhigh" + ] + } + ] + }, + { + "provider": "openai", + "authType": "api_key", + "model": "o3-mini", + "params": [ + { + "path": "max_completion_tokens", + "label": "Max tokens", + "description": "Maximum number of output tokens the model may generate.", + "group": "generation_length", + "type": "integer", + "default": 4096, + "range": { + "min": 16 + } + }, + { + "path": "reasoning_effort", + "label": "Reasoning effort", + "description": "Controls how much reasoning the model should perform before producing an answer.", + "group": "reasoning", + "type": "enum", + "default": "medium", + "values": [ + "low", + "medium", + "high", + "xhigh" + ] + } + ] + }, + { + "provider": "openai", + "authType": "api_key", + "model": "o3-pro", + "params": [ + { + "path": "max_completion_tokens", + "label": "Max tokens", + "description": "Maximum number of output tokens the model may generate.", + "group": "generation_length", + "type": "integer", + "default": 4096, + "range": { + "min": 16 + } + }, + { + "path": "reasoning_effort", + "label": "Reasoning effort", + "description": "Controls how much reasoning the model should perform before producing an answer.", + "group": "reasoning", + "type": "enum", + "default": "medium", + "values": [ + "low", + "medium", + "high", + "xhigh" + ] + } + ] + }, + { + "provider": "openai", + "authType": "api_key", + "model": "o4-mini", + "params": [ + { + "path": "max_completion_tokens", + "label": "Max tokens", + "description": "Maximum number of output tokens the model may generate.", + "group": "generation_length", + "type": "integer", + "default": 4096, + "range": { + "min": 16 + } + }, + { + "path": "reasoning_effort", + "label": "Reasoning effort", + "description": "Controls how much reasoning the model should perform before producing an answer.", + "group": "reasoning", + "type": "enum", + "default": "medium", + "values": [ + "low", + "medium", + "high", + "xhigh" + ] + } + ] + }, + { + "provider": "perplexity", + "authType": "api_key", + "model": "sonar", + "params": [ + { + "path": "max_tokens", + "label": "Max tokens", + "description": "Maximum number of output tokens the model may generate.", + "group": "generation_length", + "type": "integer", + "range": { + "min": 1, + "max": 128000 + } + }, + { + "path": "temperature", + "label": "Temperature", + "description": "Controls randomness. Lower values make outputs more focused; higher values make them more varied.", + "group": "sampling", + "type": "number", + "range": { + "min": 0, + "max": 2, + "step": 0.1 + } + }, + { + "path": "top_p", + "label": "Top P", + "description": "Controls nucleus sampling by limiting generation to tokens within the selected cumulative probability.", + "group": "sampling", + "type": "number", + "range": { + "min": 0, + "max": 1, + "step": 0.01 + } + }, + { + "path": "search_mode", + "label": "Search mode", + "description": "Selects the corpus the model searches when grounding its answer.", + "group": "provider_metadata", + "type": "enum", + "values": [ + "web", + "academic", + "sec" + ] + }, + { + "path": "search_recency_filter", + "label": "Search recency filter", + "description": "Restricts web search results to a recent time window.", + "group": "provider_metadata", + "type": "enum", + "values": [ + "hour", + "day", + "week", + "month", + "year" + ] + }, + { + "path": "search_domain_filter", + "label": "Search domain filter", + "description": "Limits search to, or excludes, specific domains.", + "group": "provider_metadata", + "type": "string" + }, + { + "path": "search_after_date_filter", + "label": "Search after date", + "description": "Restricts search results to content published after this date (MM/DD/YYYY).", + "group": "provider_metadata", + "type": "string" + }, + { + "path": "search_before_date_filter", + "label": "Search before date", + "description": "Restricts search results to content published before this date (MM/DD/YYYY).", + "group": "provider_metadata", + "type": "string" + }, + { + "path": "web_search_options.search_context_size", + "label": "Search context size", + "description": "Controls how much web search context is retrieved before generating the answer.", + "group": "provider_metadata", + "type": "enum", + "default": "low", + "values": [ + "low", + "medium", + "high" + ] + }, + { + "path": "return_images", + "label": "Return images", + "description": "Controls whether the response may include related images from the search.", + "group": "provider_metadata", + "type": "boolean", + "default": false + }, + { + "path": "return_related_questions", + "label": "Return related questions", + "description": "Controls whether the response includes suggested follow-up questions.", + "group": "provider_metadata", + "type": "boolean", + "default": false + }, + { + "path": "disable_search", + "label": "Disable search", + "description": "Turns off web search so the model answers from its own knowledge only.", + "group": "provider_metadata", + "type": "boolean", + "default": false + } + ] + }, + { + "provider": "perplexity", + "authType": "api_key", + "model": "sonar-deep-research", + "params": [ + { + "path": "max_tokens", + "label": "Max tokens", + "description": "Maximum number of output tokens the model may generate.", + "group": "generation_length", + "type": "integer", + "range": { + "min": 1, + "max": 128000 + } + }, + { + "path": "temperature", + "label": "Temperature", + "description": "Controls randomness. Lower values make outputs more focused; higher values make them more varied.", + "group": "sampling", + "type": "number", + "range": { + "min": 0, + "max": 2, + "step": 0.1 + } + }, + { + "path": "top_p", + "label": "Top P", + "description": "Controls nucleus sampling by limiting generation to tokens within the selected cumulative probability.", + "group": "sampling", + "type": "number", + "range": { + "min": 0, + "max": 1, + "step": 0.01 + } + }, + { + "path": "reasoning_effort", + "label": "Reasoning effort", + "description": "Controls how much reasoning and searching the model performs before producing the report.", + "group": "reasoning", + "type": "enum", + "values": [ + "minimal", + "low", + "medium", + "high" + ] + }, + { + "path": "search_mode", + "label": "Search mode", + "description": "Selects the corpus the model searches when grounding its answer.", + "group": "provider_metadata", + "type": "enum", + "values": [ + "web", + "academic", + "sec" + ] + }, + { + "path": "search_recency_filter", + "label": "Search recency filter", + "description": "Restricts web search results to a recent time window.", + "group": "provider_metadata", + "type": "enum", + "values": [ + "hour", + "day", + "week", + "month", + "year" + ] + }, + { + "path": "search_domain_filter", + "label": "Search domain filter", + "description": "Limits search to, or excludes, specific domains.", + "group": "provider_metadata", + "type": "string" + }, + { + "path": "search_after_date_filter", + "label": "Search after date", + "description": "Restricts search results to content published after this date (MM/DD/YYYY).", + "group": "provider_metadata", + "type": "string" + }, + { + "path": "search_before_date_filter", + "label": "Search before date", + "description": "Restricts search results to content published before this date (MM/DD/YYYY).", + "group": "provider_metadata", + "type": "string" + }, + { + "path": "web_search_options.search_context_size", + "label": "Search context size", + "description": "Controls how much web search context is retrieved before generating the answer.", + "group": "provider_metadata", + "type": "enum", + "default": "low", + "values": [ + "low", + "medium", + "high" + ] + }, + { + "path": "return_images", + "label": "Return images", + "description": "Controls whether the response may include related images from the search.", + "group": "provider_metadata", + "type": "boolean", + "default": false + }, + { + "path": "return_related_questions", + "label": "Return related questions", + "description": "Controls whether the response includes suggested follow-up questions.", + "group": "provider_metadata", + "type": "boolean", + "default": false + } + ] + }, + { + "provider": "perplexity", + "authType": "api_key", + "model": "sonar-pro", + "params": [ + { + "path": "max_tokens", + "label": "Max tokens", + "description": "Maximum number of output tokens the model may generate.", + "group": "generation_length", + "type": "integer", + "range": { + "min": 1, + "max": 128000 + } + }, + { + "path": "temperature", + "label": "Temperature", + "description": "Controls randomness. Lower values make outputs more focused; higher values make them more varied.", + "group": "sampling", + "type": "number", + "range": { + "min": 0, + "max": 2, + "step": 0.1 + } + }, + { + "path": "top_p", + "label": "Top P", + "description": "Controls nucleus sampling by limiting generation to tokens within the selected cumulative probability.", + "group": "sampling", + "type": "number", + "range": { + "min": 0, + "max": 1, + "step": 0.01 + } + }, + { + "path": "search_mode", + "label": "Search mode", + "description": "Selects the corpus the model searches when grounding its answer.", + "group": "provider_metadata", + "type": "enum", + "values": [ + "web", + "academic", + "sec" + ] + }, + { + "path": "search_recency_filter", + "label": "Search recency filter", + "description": "Restricts web search results to a recent time window.", + "group": "provider_metadata", + "type": "enum", + "values": [ + "hour", + "day", + "week", + "month", + "year" + ] + }, + { + "path": "search_domain_filter", + "label": "Search domain filter", + "description": "Limits search to, or excludes, specific domains.", + "group": "provider_metadata", + "type": "string" + }, + { + "path": "search_after_date_filter", + "label": "Search after date", + "description": "Restricts search results to content published after this date (MM/DD/YYYY).", + "group": "provider_metadata", + "type": "string" + }, + { + "path": "search_before_date_filter", + "label": "Search before date", + "description": "Restricts search results to content published before this date (MM/DD/YYYY).", + "group": "provider_metadata", + "type": "string" + }, + { + "path": "web_search_options.search_context_size", + "label": "Search context size", + "description": "Controls how much web search context is retrieved before generating the answer.", + "group": "provider_metadata", + "type": "enum", + "default": "low", + "values": [ + "low", + "medium", + "high" + ] + }, + { + "path": "return_images", + "label": "Return images", + "description": "Controls whether the response may include related images from the search.", + "group": "provider_metadata", + "type": "boolean", + "default": false + }, + { + "path": "return_related_questions", + "label": "Return related questions", + "description": "Controls whether the response includes suggested follow-up questions.", + "group": "provider_metadata", + "type": "boolean", + "default": false + }, + { + "path": "disable_search", + "label": "Disable search", + "description": "Turns off web search so the model answers from its own knowledge only.", + "group": "provider_metadata", + "type": "boolean", + "default": false + } + ] + }, + { + "provider": "perplexity", + "authType": "api_key", + "model": "sonar-reasoning-pro", + "params": [ + { + "path": "max_tokens", + "label": "Max tokens", + "description": "Maximum number of output tokens the model may generate.", + "group": "generation_length", + "type": "integer", + "range": { + "min": 1, + "max": 128000 + } + }, + { + "path": "temperature", + "label": "Temperature", + "description": "Controls randomness. Lower values make outputs more focused; higher values make them more varied.", + "group": "sampling", + "type": "number", + "range": { + "min": 0, + "max": 2, + "step": 0.1 + } + }, + { + "path": "top_p", + "label": "Top P", + "description": "Controls nucleus sampling by limiting generation to tokens within the selected cumulative probability.", + "group": "sampling", + "type": "number", + "range": { + "min": 0, + "max": 1, + "step": 0.01 + } + }, + { + "path": "search_mode", + "label": "Search mode", + "description": "Selects the corpus the model searches when grounding its answer.", + "group": "provider_metadata", + "type": "enum", + "values": [ + "web", + "academic", + "sec" + ] + }, + { + "path": "search_recency_filter", + "label": "Search recency filter", + "description": "Restricts web search results to a recent time window.", + "group": "provider_metadata", + "type": "enum", + "values": [ + "hour", + "day", + "week", + "month", + "year" + ] + }, + { + "path": "search_domain_filter", + "label": "Search domain filter", + "description": "Limits search to, or excludes, specific domains.", + "group": "provider_metadata", + "type": "string" + }, + { + "path": "search_after_date_filter", + "label": "Search after date", + "description": "Restricts search results to content published after this date (MM/DD/YYYY).", + "group": "provider_metadata", + "type": "string" + }, + { + "path": "search_before_date_filter", + "label": "Search before date", + "description": "Restricts search results to content published before this date (MM/DD/YYYY).", + "group": "provider_metadata", + "type": "string" + }, + { + "path": "web_search_options.search_context_size", + "label": "Search context size", + "description": "Controls how much web search context is retrieved before generating the answer.", + "group": "provider_metadata", + "type": "enum", + "default": "low", + "values": [ + "low", + "medium", + "high" + ] + }, + { + "path": "return_images", + "label": "Return images", + "description": "Controls whether the response may include related images from the search.", + "group": "provider_metadata", + "type": "boolean", + "default": false + }, + { + "path": "return_related_questions", + "label": "Return related questions", + "description": "Controls whether the response includes suggested follow-up questions.", + "group": "provider_metadata", + "type": "boolean", + "default": false + }, + { + "path": "disable_search", + "label": "Disable search", + "description": "Turns off web search so the model answers from its own knowledge only.", + "group": "provider_metadata", + "type": "boolean", + "default": false + } + ] + }, + { + "provider": "xai", + "authType": "api_key", + "model": "grok-4.20-0309-non-reasoning", + "params": [ + { + "path": "max_completion_tokens", + "label": "Max completion tokens", + "description": "Upper bound for visible output tokens generated in the chat completion.", + "group": "generation_length", + "type": "integer", + "range": { + "min": 1 + } + }, + { + "path": "temperature", + "label": "Temperature", + "description": "Controls randomness. Lower values make outputs more focused; higher values make them more varied.", + "group": "sampling", + "type": "number", + "default": 1, + "range": { + "min": 0, + "max": 2, + "step": 0.1 + } + }, + { + "path": "top_p", + "label": "Top P", + "description": "Controls nucleus sampling by limiting generation to tokens within the selected cumulative probability.", + "group": "sampling", + "type": "number", + "default": 1, + "range": { + "min": 0, + "max": 1, + "step": 0.01 + } + }, + { + "path": "seed", + "label": "Seed", + "description": "Optional seed used for decoding when reproducible sampling is desired.", + "group": "sampling", + "type": "integer" + }, + { + "path": "stop", + "label": "Stop sequence", + "description": "Stops generation when this sequence is produced. xAI accepts up to four stop sequences.", + "group": "generation_length", + "type": "string" + }, + { + "path": "response_format.type", + "label": "Response format", + "description": "Controls whether the model returns text, JSON mode output, or structured JSON schema output.", + "group": "output_format", + "type": "enum", + "default": "text", + "values": [ + "text", + "json_object", + "json_schema" + ] + } + ] + }, + { + "provider": "xai", + "authType": "api_key", + "model": "grok-4.20-0309-reasoning", + "params": [ + { + "path": "max_completion_tokens", + "label": "Max completion tokens", + "description": "Upper bound for visible output tokens generated in the chat completion.", + "group": "generation_length", + "type": "integer", + "range": { + "min": 1 + } + }, + { + "path": "temperature", + "label": "Temperature", + "description": "Controls randomness. Lower values make outputs more focused; higher values make them more varied.", + "group": "sampling", + "type": "number", + "default": 1, + "range": { + "min": 0, + "max": 2, + "step": 0.1 + } + }, + { + "path": "top_p", + "label": "Top P", + "description": "Controls nucleus sampling by limiting generation to tokens within the selected cumulative probability.", + "group": "sampling", + "type": "number", + "default": 1, + "range": { + "min": 0, + "max": 1, + "step": 0.01 + } + }, + { + "path": "seed", + "label": "Seed", + "description": "Optional seed used for decoding when reproducible sampling is desired.", + "group": "sampling", + "type": "integer" + }, + { + "path": "response_format.type", + "label": "Response format", + "description": "Controls whether the model returns text, JSON mode output, or structured JSON schema output.", + "group": "output_format", + "type": "enum", + "default": "text", + "values": [ + "text", + "json_object", + "json_schema" + ] + } + ] + }, + { + "provider": "xai", + "authType": "api_key", + "model": "grok-4.20-multi-agent-0309", + "params": [ + { + "path": "max_output_tokens", + "label": "Max output tokens", + "description": "Upper bound for output tokens generated in the Responses API response.", + "group": "generation_length", + "type": "integer", + "range": { + "min": 1 + } + }, + { + "path": "temperature", + "label": "Temperature", + "description": "Controls randomness. Lower values make outputs more focused; higher values make them more varied.", + "group": "sampling", + "type": "number", + "default": 0.7, + "range": { + "min": 0, + "max": 2, + "step": 0.1 + } + }, + { + "path": "top_p", + "label": "Top P", + "description": "Controls nucleus sampling by limiting generation to tokens within the selected cumulative probability.", + "group": "sampling", + "type": "number", + "default": 0.95, + "range": { + "min": 0, + "max": 1, + "step": 0.01 + } + }, + { + "path": "reasoning.effort", + "label": "Reasoning effort", + "description": "Controls whether the Responses API request uses the 4-agent or 16-agent multi-agent setup.", + "group": "reasoning", + "type": "enum", + "values": [ + "low", + "medium", + "high", + "xhigh" + ] + }, + { + "path": "text.format.type", + "label": "Text format", + "description": "Controls whether the Responses API returns free-form text, JSON mode output, or structured JSON schema output.", + "group": "output_format", + "type": "enum", + "default": "text", + "values": [ + "text", + "json_object", + "json_schema" + ] + } + ] + }, + { + "provider": "xai", + "authType": "api_key", + "model": "grok-4.3", + "params": [ + { + "path": "max_completion_tokens", + "label": "Max completion tokens", + "description": "Upper bound for visible output tokens generated in the chat completion.", + "group": "generation_length", + "type": "integer", + "range": { + "min": 1 + } + }, + { + "path": "temperature", + "label": "Temperature", + "description": "Controls randomness. Lower values make outputs more focused; higher values make them more varied.", + "group": "sampling", + "type": "number", + "default": 1, + "range": { + "min": 0, + "max": 2, + "step": 0.1 + } + }, + { + "path": "top_p", + "label": "Top P", + "description": "Controls nucleus sampling by limiting generation to tokens within the selected cumulative probability.", + "group": "sampling", + "type": "number", + "default": 1, + "range": { + "min": 0, + "max": 1, + "step": 0.01 + } + }, + { + "path": "seed", + "label": "Seed", + "description": "Optional seed used for decoding when reproducible sampling is desired.", + "group": "sampling", + "type": "integer" + }, + { + "path": "reasoning_effort", + "label": "Reasoning effort", + "description": "Controls how much reasoning Grok performs before responding. Set to none for non-reasoning requests.", + "group": "reasoning", + "type": "enum", + "default": "low", + "values": [ + "none", + "low", + "medium", + "high" + ] + }, + { + "path": "response_format.type", + "label": "Response format", + "description": "Controls whether the model returns text, JSON mode output, or structured JSON schema output.", + "group": "output_format", + "type": "enum", + "default": "text", + "values": [ + "text", + "json_object", + "json_schema" + ] + } + ] + }, + { + "provider": "xai", + "authType": "api_key", + "model": "grok-build-0.1", + "params": [ + { + "path": "max_completion_tokens", + "label": "Max completion tokens", + "description": "Upper bound for visible output tokens generated in the chat completion.", + "group": "generation_length", + "type": "integer", + "range": { + "min": 1 + } + }, + { + "path": "temperature", + "label": "Temperature", + "description": "Controls randomness. Lower values make outputs more focused; higher values make them more varied.", + "group": "sampling", + "type": "number", + "default": 1, + "range": { + "min": 0, + "max": 2, + "step": 0.1 + } + }, + { + "path": "top_p", + "label": "Top P", + "description": "Controls nucleus sampling by limiting generation to tokens within the selected cumulative probability.", + "group": "sampling", + "type": "number", + "default": 1, + "range": { + "min": 0, + "max": 1, + "step": 0.01 + } + }, + { + "path": "seed", + "label": "Seed", + "description": "Optional seed used for decoding when reproducible sampling is desired.", + "group": "sampling", + "type": "integer" + }, + { + "path": "response_format.type", + "label": "Response format", + "description": "Controls whether the model returns text, JSON mode output, or structured JSON schema output.", + "group": "output_format", + "type": "enum", + "default": "text", + "values": [ + "text", + "json_object", + "json_schema" + ] + } + ] + }, + { + "provider": "z-ai", + "authType": "api_key", + "model": "glm-4.5", + "params": [ + { + "path": "max_tokens", + "label": "Max tokens", + "description": "Maximum number of tokens to generate in the response.", + "group": "generation_length", + "type": "integer", + "range": { + "min": 1 + } + }, + { + "path": "temperature", + "label": "Temperature", + "description": "Controls randomness. Lower values make outputs more focused; higher values make them more varied.", + "group": "sampling", + "applicability": { + "except": { + "do_sample": false + } + }, + "type": "number", + "default": 0.6, + "range": { + "min": 0, + "max": 1, + "step": 0.1 + } + }, + { + "path": "top_p", + "label": "Top P", + "description": "Controls nucleus sampling by limiting generation to tokens within the selected cumulative probability.", + "group": "sampling", + "applicability": { + "except": { + "do_sample": false + } + }, + "type": "number", + "default": 0.95, + "range": { + "min": 0.01, + "max": 1, + "step": 0.01 + } + }, + { + "path": "do_sample", + "label": "Do sample", + "description": "When false, the model uses greedy decoding and ignores temperature and top_p.", + "group": "sampling", + "type": "boolean", + "default": true + }, + { + "path": "thinking.type", + "label": "Thinking mode", + "description": "Toggles the model's extended reasoning before it produces the final answer.", + "group": "reasoning", + "type": "enum", + "default": "enabled", + "values": [ + "enabled", + "disabled" + ] + }, + { + "path": "response_format.type", + "label": "Response format", + "description": "Forces the response into plain text or a JSON object.", + "group": "output_format", + "type": "enum", + "default": "text", + "values": [ + "text", + "json_object" + ] + } + ] + }, + { + "provider": "z-ai", + "authType": "api_key", + "model": "glm-4.5-air", + "params": [ + { + "path": "max_tokens", + "label": "Max tokens", + "description": "Maximum number of tokens to generate in the response.", + "group": "generation_length", + "type": "integer", + "range": { + "min": 1 + } + }, + { + "path": "temperature", + "label": "Temperature", + "description": "Controls randomness. Lower values make outputs more focused; higher values make them more varied.", + "group": "sampling", + "applicability": { + "except": { + "do_sample": false + } + }, + "type": "number", + "default": 0.6, + "range": { + "min": 0, + "max": 1, + "step": 0.1 + } + }, + { + "path": "top_p", + "label": "Top P", + "description": "Controls nucleus sampling by limiting generation to tokens within the selected cumulative probability.", + "group": "sampling", + "applicability": { + "except": { + "do_sample": false + } + }, + "type": "number", + "default": 0.95, + "range": { + "min": 0.01, + "max": 1, + "step": 0.01 + } + }, + { + "path": "do_sample", + "label": "Do sample", + "description": "When false, the model uses greedy decoding and ignores temperature and top_p.", + "group": "sampling", + "type": "boolean", + "default": true + }, + { + "path": "thinking.type", + "label": "Thinking mode", + "description": "Toggles the model's extended reasoning before it produces the final answer.", + "group": "reasoning", + "type": "enum", + "default": "enabled", + "values": [ + "enabled", + "disabled" + ] + }, + { + "path": "response_format.type", + "label": "Response format", + "description": "Forces the response into plain text or a JSON object.", + "group": "output_format", + "type": "enum", + "default": "text", + "values": [ + "text", + "json_object" + ] + } + ] + }, + { + "provider": "z-ai", + "authType": "subscription", + "model": "glm-4.5-air", + "params": [ + { + "path": "max_tokens", + "label": "Max tokens", + "description": "Maximum number of tokens to generate in the response.", + "group": "generation_length", + "type": "integer", + "range": { + "min": 1 + } + }, + { + "path": "temperature", + "label": "Temperature", + "description": "Controls randomness. Lower values make outputs more focused; higher values make them more varied.", + "group": "sampling", + "applicability": { + "except": { + "do_sample": false + } + }, + "type": "number", + "default": 0.6, + "range": { + "min": 0, + "max": 1, + "step": 0.1 + } + }, + { + "path": "top_p", + "label": "Top P", + "description": "Controls nucleus sampling by limiting generation to tokens within the selected cumulative probability.", + "group": "sampling", + "applicability": { + "except": { + "do_sample": false + } + }, + "type": "number", + "default": 0.95, + "range": { + "min": 0.01, + "max": 1, + "step": 0.01 + } + }, + { + "path": "do_sample", + "label": "Do sample", + "description": "When false, the model uses greedy decoding and ignores temperature and top_p.", + "group": "sampling", + "type": "boolean", + "default": true + }, + { + "path": "thinking.type", + "label": "Thinking mode", + "description": "Toggles the model's extended reasoning before it produces the final answer.", + "group": "reasoning", + "type": "enum", + "default": "enabled", + "values": [ + "enabled", + "disabled" + ] + }, + { + "path": "response_format.type", + "label": "Response format", + "description": "Forces the response into plain text or a JSON object.", + "group": "output_format", + "type": "enum", + "default": "text", + "values": [ + "text", + "json_object" + ] + } + ] + }, + { + "provider": "z-ai", + "authType": "api_key", + "model": "glm-4.5-airx", + "params": [ + { + "path": "max_tokens", + "label": "Max tokens", + "description": "Maximum number of tokens to generate in the response.", + "group": "generation_length", + "type": "integer", + "range": { + "min": 1 + } + }, + { + "path": "temperature", + "label": "Temperature", + "description": "Controls randomness. Lower values make outputs more focused; higher values make them more varied.", + "group": "sampling", + "applicability": { + "except": { + "do_sample": false + } + }, + "type": "number", + "default": 0.6, + "range": { + "min": 0, + "max": 1, + "step": 0.1 + } + }, + { + "path": "top_p", + "label": "Top P", + "description": "Controls nucleus sampling by limiting generation to tokens within the selected cumulative probability.", + "group": "sampling", + "applicability": { + "except": { + "do_sample": false + } + }, + "type": "number", + "default": 0.95, + "range": { + "min": 0.01, + "max": 1, + "step": 0.01 + } + }, + { + "path": "do_sample", + "label": "Do sample", + "description": "When false, the model uses greedy decoding and ignores temperature and top_p.", + "group": "sampling", + "type": "boolean", + "default": true + }, + { + "path": "thinking.type", + "label": "Thinking mode", + "description": "Toggles the model's extended reasoning before it produces the final answer.", + "group": "reasoning", + "type": "enum", + "default": "enabled", + "values": [ + "enabled", + "disabled" + ] + }, + { + "path": "response_format.type", + "label": "Response format", + "description": "Forces the response into plain text or a JSON object.", + "group": "output_format", + "type": "enum", + "default": "text", + "values": [ + "text", + "json_object" + ] + } + ] + }, + { + "provider": "z-ai", + "authType": "api_key", + "model": "glm-4.5-flash", + "params": [ + { + "path": "max_tokens", + "label": "Max tokens", + "description": "Maximum number of tokens to generate in the response.", + "group": "generation_length", + "type": "integer", + "range": { + "min": 1 + } + }, + { + "path": "temperature", + "label": "Temperature", + "description": "Controls randomness. Lower values make outputs more focused; higher values make them more varied.", + "group": "sampling", + "applicability": { + "except": { + "do_sample": false + } + }, + "type": "number", + "default": 0.6, + "range": { + "min": 0, + "max": 1, + "step": 0.1 + } + }, + { + "path": "top_p", + "label": "Top P", + "description": "Controls nucleus sampling by limiting generation to tokens within the selected cumulative probability.", + "group": "sampling", + "applicability": { + "except": { + "do_sample": false + } + }, + "type": "number", + "default": 0.95, + "range": { + "min": 0.01, + "max": 1, + "step": 0.01 + } + }, + { + "path": "do_sample", + "label": "Do sample", + "description": "When false, the model uses greedy decoding and ignores temperature and top_p.", + "group": "sampling", + "type": "boolean", + "default": true + }, + { + "path": "thinking.type", + "label": "Thinking mode", + "description": "Toggles the model's extended reasoning before it produces the final answer.", + "group": "reasoning", + "type": "enum", + "default": "enabled", + "values": [ + "enabled", + "disabled" + ] + }, + { + "path": "response_format.type", + "label": "Response format", + "description": "Forces the response into plain text or a JSON object.", + "group": "output_format", + "type": "enum", + "default": "text", + "values": [ + "text", + "json_object" + ] + } + ] + }, + { + "provider": "z-ai", + "authType": "subscription", + "model": "glm-4.5", + "params": [ + { + "path": "max_tokens", + "label": "Max tokens", + "description": "Maximum number of tokens to generate in the response.", + "group": "generation_length", + "type": "integer", + "range": { + "min": 1 + } + }, + { + "path": "temperature", + "label": "Temperature", + "description": "Controls randomness. Lower values make outputs more focused; higher values make them more varied.", + "group": "sampling", + "applicability": { + "except": { + "do_sample": false + } + }, + "type": "number", + "default": 0.6, + "range": { + "min": 0, + "max": 1, + "step": 0.1 + } + }, + { + "path": "top_p", + "label": "Top P", + "description": "Controls nucleus sampling by limiting generation to tokens within the selected cumulative probability.", + "group": "sampling", + "applicability": { + "except": { + "do_sample": false + } + }, + "type": "number", + "default": 0.95, + "range": { + "min": 0.01, + "max": 1, + "step": 0.01 + } + }, + { + "path": "do_sample", + "label": "Do sample", + "description": "When false, the model uses greedy decoding and ignores temperature and top_p.", + "group": "sampling", + "type": "boolean", + "default": true + }, + { + "path": "thinking.type", + "label": "Thinking mode", + "description": "Toggles the model's extended reasoning before it produces the final answer.", + "group": "reasoning", + "type": "enum", + "default": "enabled", + "values": [ + "enabled", + "disabled" + ] + }, + { + "path": "response_format.type", + "label": "Response format", + "description": "Forces the response into plain text or a JSON object.", + "group": "output_format", + "type": "enum", + "default": "text", + "values": [ + "text", + "json_object" + ] + } + ] + }, + { + "provider": "z-ai", + "authType": "api_key", + "model": "glm-4.5-x", + "params": [ + { + "path": "max_tokens", + "label": "Max tokens", + "description": "Maximum number of tokens to generate in the response.", + "group": "generation_length", + "type": "integer", + "range": { + "min": 1 + } + }, + { + "path": "temperature", + "label": "Temperature", + "description": "Controls randomness. Lower values make outputs more focused; higher values make them more varied.", + "group": "sampling", + "applicability": { + "except": { + "do_sample": false + } + }, + "type": "number", + "default": 0.6, + "range": { + "min": 0, + "max": 1, + "step": 0.1 + } + }, + { + "path": "top_p", + "label": "Top P", + "description": "Controls nucleus sampling by limiting generation to tokens within the selected cumulative probability.", + "group": "sampling", + "applicability": { + "except": { + "do_sample": false + } + }, + "type": "number", + "default": 0.95, + "range": { + "min": 0.01, + "max": 1, + "step": 0.01 + } + }, + { + "path": "do_sample", + "label": "Do sample", + "description": "When false, the model uses greedy decoding and ignores temperature and top_p.", + "group": "sampling", + "type": "boolean", + "default": true + }, + { + "path": "thinking.type", + "label": "Thinking mode", + "description": "Toggles the model's extended reasoning before it produces the final answer.", + "group": "reasoning", + "type": "enum", + "default": "enabled", + "values": [ + "enabled", + "disabled" + ] + }, + { + "path": "response_format.type", + "label": "Response format", + "description": "Forces the response into plain text or a JSON object.", + "group": "output_format", + "type": "enum", + "default": "text", + "values": [ + "text", + "json_object" + ] + } + ] + }, + { + "provider": "z-ai", + "authType": "api_key", + "model": "glm-4.6", + "params": [ + { + "path": "max_tokens", + "label": "Max tokens", + "description": "Maximum number of tokens to generate in the response.", + "group": "generation_length", + "type": "integer", + "range": { + "min": 1 + } + }, + { + "path": "temperature", + "label": "Temperature", + "description": "Controls randomness. Lower values make outputs more focused; higher values make them more varied.", + "group": "sampling", + "applicability": { + "except": { + "do_sample": false + } + }, + "type": "number", + "default": 1, + "range": { + "min": 0, + "max": 1, + "step": 0.1 + } + }, + { + "path": "top_p", + "label": "Top P", + "description": "Controls nucleus sampling by limiting generation to tokens within the selected cumulative probability.", + "group": "sampling", + "applicability": { + "except": { + "do_sample": false + } + }, + "type": "number", + "default": 0.95, + "range": { + "min": 0.01, + "max": 1, + "step": 0.01 + } + }, + { + "path": "do_sample", + "label": "Do sample", + "description": "When false, the model uses greedy decoding and ignores temperature and top_p.", + "group": "sampling", + "type": "boolean", + "default": true + }, + { + "path": "thinking.type", + "label": "Thinking mode", + "description": "Toggles the model's extended reasoning before it produces the final answer.", + "group": "reasoning", + "type": "enum", + "default": "enabled", + "values": [ + "enabled", + "disabled" + ] + }, + { + "path": "response_format.type", + "label": "Response format", + "description": "Forces the response into plain text or a JSON object.", + "group": "output_format", + "type": "enum", + "default": "text", + "values": [ + "text", + "json_object" + ] + } + ] + }, + { + "provider": "z-ai", + "authType": "subscription", + "model": "glm-4.6", + "params": [ + { + "path": "max_tokens", + "label": "Max tokens", + "description": "Maximum number of tokens to generate in the response.", + "group": "generation_length", + "type": "integer", + "range": { + "min": 1 + } + }, + { + "path": "temperature", + "label": "Temperature", + "description": "Controls randomness. Lower values make outputs more focused; higher values make them more varied.", + "group": "sampling", + "applicability": { + "except": { + "do_sample": false + } + }, + "type": "number", + "default": 1, + "range": { + "min": 0, + "max": 1, + "step": 0.1 + } + }, + { + "path": "top_p", + "label": "Top P", + "description": "Controls nucleus sampling by limiting generation to tokens within the selected cumulative probability.", + "group": "sampling", + "applicability": { + "except": { + "do_sample": false + } + }, + "type": "number", + "default": 0.95, + "range": { + "min": 0.01, + "max": 1, + "step": 0.01 + } + }, + { + "path": "do_sample", + "label": "Do sample", + "description": "When false, the model uses greedy decoding and ignores temperature and top_p.", + "group": "sampling", + "type": "boolean", + "default": true + }, + { + "path": "thinking.type", + "label": "Thinking mode", + "description": "Toggles the model's extended reasoning before it produces the final answer.", + "group": "reasoning", + "type": "enum", + "default": "enabled", + "values": [ + "enabled", + "disabled" + ] + }, + { + "path": "response_format.type", + "label": "Response format", + "description": "Forces the response into plain text or a JSON object.", + "group": "output_format", + "type": "enum", + "default": "text", + "values": [ + "text", + "json_object" + ] + } + ] + }, + { + "provider": "z-ai", + "authType": "api_key", + "model": "glm-4.7", + "params": [ + { + "path": "max_tokens", + "label": "Max tokens", + "description": "Maximum number of tokens to generate in the response.", + "group": "generation_length", + "type": "integer", + "range": { + "min": 1 + } + }, + { + "path": "temperature", + "label": "Temperature", + "description": "Controls randomness. Lower values make outputs more focused; higher values make them more varied.", + "group": "sampling", + "applicability": { + "except": { + "do_sample": false + } + }, + "type": "number", + "default": 1, + "range": { + "min": 0, + "max": 1, + "step": 0.1 + } + }, + { + "path": "top_p", + "label": "Top P", + "description": "Controls nucleus sampling by limiting generation to tokens within the selected cumulative probability.", + "group": "sampling", + "applicability": { + "except": { + "do_sample": false + } + }, + "type": "number", + "default": 0.95, + "range": { + "min": 0.01, + "max": 1, + "step": 0.01 + } + }, + { + "path": "do_sample", + "label": "Do sample", + "description": "When false, the model uses greedy decoding and ignores temperature and top_p.", + "group": "sampling", + "type": "boolean", + "default": true + }, + { + "path": "thinking.type", + "label": "Thinking mode", + "description": "Toggles the model's extended reasoning before it produces the final answer.", + "group": "reasoning", + "type": "enum", + "default": "enabled", + "values": [ + "enabled", + "disabled" + ] + }, + { + "path": "response_format.type", + "label": "Response format", + "description": "Forces the response into plain text or a JSON object.", + "group": "output_format", + "type": "enum", + "default": "text", + "values": [ + "text", + "json_object" + ] + } + ] + }, + { + "provider": "z-ai", + "authType": "api_key", + "model": "glm-4.7-flash", + "params": [ + { + "path": "max_tokens", + "label": "Max tokens", + "description": "Maximum number of tokens to generate in the response.", + "group": "generation_length", + "type": "integer", + "range": { + "min": 1 + } + }, + { + "path": "temperature", + "label": "Temperature", + "description": "Controls randomness. Lower values make outputs more focused; higher values make them more varied.", + "group": "sampling", + "applicability": { + "except": { + "do_sample": false + } + }, + "type": "number", + "default": 1, + "range": { + "min": 0, + "max": 1, + "step": 0.1 + } + }, + { + "path": "top_p", + "label": "Top P", + "description": "Controls nucleus sampling by limiting generation to tokens within the selected cumulative probability.", + "group": "sampling", + "applicability": { + "except": { + "do_sample": false + } + }, + "type": "number", + "default": 0.95, + "range": { + "min": 0.01, + "max": 1, + "step": 0.01 + } + }, + { + "path": "do_sample", + "label": "Do sample", + "description": "When false, the model uses greedy decoding and ignores temperature and top_p.", + "group": "sampling", + "type": "boolean", + "default": true + }, + { + "path": "thinking.type", + "label": "Thinking mode", + "description": "Toggles the model's extended reasoning before it produces the final answer.", + "group": "reasoning", + "type": "enum", + "default": "enabled", + "values": [ + "enabled", + "disabled" + ] + }, + { + "path": "response_format.type", + "label": "Response format", + "description": "Forces the response into plain text or a JSON object.", + "group": "output_format", + "type": "enum", + "default": "text", + "values": [ + "text", + "json_object" + ] + } + ] + }, + { + "provider": "z-ai", + "authType": "api_key", + "model": "glm-4.7-flashx", + "params": [ + { + "path": "max_tokens", + "label": "Max tokens", + "description": "Maximum number of tokens to generate in the response.", + "group": "generation_length", + "type": "integer", + "range": { + "min": 1 + } + }, + { + "path": "temperature", + "label": "Temperature", + "description": "Controls randomness. Lower values make outputs more focused; higher values make them more varied.", + "group": "sampling", + "applicability": { + "except": { + "do_sample": false + } + }, + "type": "number", + "default": 1, + "range": { + "min": 0, + "max": 1, + "step": 0.1 + } + }, + { + "path": "top_p", + "label": "Top P", + "description": "Controls nucleus sampling by limiting generation to tokens within the selected cumulative probability.", + "group": "sampling", + "applicability": { + "except": { + "do_sample": false + } + }, + "type": "number", + "default": 0.95, + "range": { + "min": 0.01, + "max": 1, + "step": 0.01 + } + }, + { + "path": "do_sample", + "label": "Do sample", + "description": "When false, the model uses greedy decoding and ignores temperature and top_p.", + "group": "sampling", + "type": "boolean", + "default": true + }, + { + "path": "thinking.type", + "label": "Thinking mode", + "description": "Toggles the model's extended reasoning before it produces the final answer.", + "group": "reasoning", + "type": "enum", + "default": "enabled", + "values": [ + "enabled", + "disabled" + ] + }, + { + "path": "response_format.type", + "label": "Response format", + "description": "Forces the response into plain text or a JSON object.", + "group": "output_format", + "type": "enum", + "default": "text", + "values": [ + "text", + "json_object" + ] + } + ] + }, + { + "provider": "z-ai", + "authType": "subscription", + "model": "glm-4.7", + "params": [ + { + "path": "max_tokens", + "label": "Max tokens", + "description": "Maximum number of tokens to generate in the response.", + "group": "generation_length", + "type": "integer", + "range": { + "min": 1 + } + }, + { + "path": "temperature", + "label": "Temperature", + "description": "Controls randomness. Lower values make outputs more focused; higher values make them more varied.", + "group": "sampling", + "applicability": { + "except": { + "do_sample": false + } + }, + "type": "number", + "default": 1, + "range": { + "min": 0, + "max": 1, + "step": 0.1 + } + }, + { + "path": "top_p", + "label": "Top P", + "description": "Controls nucleus sampling by limiting generation to tokens within the selected cumulative probability.", + "group": "sampling", + "applicability": { + "except": { + "do_sample": false + } + }, + "type": "number", + "default": 0.95, + "range": { + "min": 0.01, + "max": 1, + "step": 0.01 + } + }, + { + "path": "do_sample", + "label": "Do sample", + "description": "When false, the model uses greedy decoding and ignores temperature and top_p.", + "group": "sampling", + "type": "boolean", + "default": true + }, + { + "path": "thinking.type", + "label": "Thinking mode", + "description": "Toggles the model's extended reasoning before it produces the final answer.", + "group": "reasoning", + "type": "enum", + "default": "enabled", + "values": [ + "enabled", + "disabled" + ] + }, + { + "path": "response_format.type", + "label": "Response format", + "description": "Forces the response into plain text or a JSON object.", + "group": "output_format", + "type": "enum", + "default": "text", + "values": [ + "text", + "json_object" + ] + } + ] + }, + { + "provider": "z-ai", + "authType": "api_key", + "model": "glm-5", + "params": [ + { + "path": "max_tokens", + "label": "Max tokens", + "description": "Maximum number of tokens to generate in the response.", + "group": "generation_length", + "type": "integer", + "range": { + "min": 1 + } + }, + { + "path": "temperature", + "label": "Temperature", + "description": "Controls randomness. Lower values make outputs more focused; higher values make them more varied.", + "group": "sampling", + "applicability": { + "except": { + "do_sample": false + } + }, + "type": "number", + "default": 1, + "range": { + "min": 0, + "max": 1, + "step": 0.1 + } + }, + { + "path": "top_p", + "label": "Top P", + "description": "Controls nucleus sampling by limiting generation to tokens within the selected cumulative probability.", + "group": "sampling", + "applicability": { + "except": { + "do_sample": false + } + }, + "type": "number", + "default": 0.95, + "range": { + "min": 0.01, + "max": 1, + "step": 0.01 + } + }, + { + "path": "do_sample", + "label": "Do sample", + "description": "When false, the model uses greedy decoding and ignores temperature and top_p.", + "group": "sampling", + "type": "boolean", + "default": true + }, + { + "path": "thinking.type", + "label": "Thinking mode", + "description": "Toggles the model's extended reasoning before it produces the final answer.", + "group": "reasoning", + "type": "enum", + "default": "enabled", + "values": [ + "enabled", + "disabled" + ] + }, + { + "path": "response_format.type", + "label": "Response format", + "description": "Forces the response into plain text or a JSON object.", + "group": "output_format", + "type": "enum", + "default": "text", + "values": [ + "text", + "json_object" + ] + } + ] + }, + { + "provider": "z-ai", + "authType": "subscription", + "model": "glm-5", + "params": [ + { + "path": "max_tokens", + "label": "Max tokens", + "description": "Maximum number of tokens to generate in the response.", + "group": "generation_length", + "type": "integer", + "range": { + "min": 1 + } + }, + { + "path": "temperature", + "label": "Temperature", + "description": "Controls randomness. Lower values make outputs more focused; higher values make them more varied.", + "group": "sampling", + "applicability": { + "except": { + "do_sample": false + } + }, + "type": "number", + "default": 1, + "range": { + "min": 0, + "max": 1, + "step": 0.1 + } + }, + { + "path": "top_p", + "label": "Top P", + "description": "Controls nucleus sampling by limiting generation to tokens within the selected cumulative probability.", + "group": "sampling", + "applicability": { + "except": { + "do_sample": false + } + }, + "type": "number", + "default": 0.95, + "range": { + "min": 0.01, + "max": 1, + "step": 0.01 + } + }, + { + "path": "do_sample", + "label": "Do sample", + "description": "When false, the model uses greedy decoding and ignores temperature and top_p.", + "group": "sampling", + "type": "boolean", + "default": true + }, + { + "path": "thinking.type", + "label": "Thinking mode", + "description": "Toggles the model's extended reasoning before it produces the final answer.", + "group": "reasoning", + "type": "enum", + "default": "enabled", + "values": [ + "enabled", + "disabled" + ] + }, + { + "path": "response_format.type", + "label": "Response format", + "description": "Forces the response into plain text or a JSON object.", + "group": "output_format", + "type": "enum", + "default": "text", + "values": [ + "text", + "json_object" + ] + } + ] + }, + { + "provider": "z-ai", + "authType": "api_key", + "model": "glm-5-turbo", + "params": [ + { + "path": "max_tokens", + "label": "Max tokens", + "description": "Maximum number of tokens to generate in the response.", + "group": "generation_length", + "type": "integer", + "range": { + "min": 1 + } + }, + { + "path": "temperature", + "label": "Temperature", + "description": "Controls randomness. Lower values make outputs more focused; higher values make them more varied.", + "group": "sampling", + "applicability": { + "except": { + "do_sample": false + } + }, + "type": "number", + "default": 1, + "range": { + "min": 0, + "max": 1, + "step": 0.1 + } + }, + { + "path": "top_p", + "label": "Top P", + "description": "Controls nucleus sampling by limiting generation to tokens within the selected cumulative probability.", + "group": "sampling", + "applicability": { + "except": { + "do_sample": false + } + }, + "type": "number", + "default": 0.95, + "range": { + "min": 0.01, + "max": 1, + "step": 0.01 + } + }, + { + "path": "do_sample", + "label": "Do sample", + "description": "When false, the model uses greedy decoding and ignores temperature and top_p.", + "group": "sampling", + "type": "boolean", + "default": true + }, + { + "path": "thinking.type", + "label": "Thinking mode", + "description": "Toggles the model's extended reasoning before it produces the final answer.", + "group": "reasoning", + "type": "enum", + "default": "enabled", + "values": [ + "enabled", + "disabled" + ] + }, + { + "path": "response_format.type", + "label": "Response format", + "description": "Forces the response into plain text or a JSON object.", + "group": "output_format", + "type": "enum", + "default": "text", + "values": [ + "text", + "json_object" + ] + } + ] + }, + { + "provider": "z-ai", + "authType": "subscription", + "model": "glm-5-turbo", + "params": [ + { + "path": "max_tokens", + "label": "Max tokens", + "description": "Maximum number of tokens to generate in the response.", + "group": "generation_length", + "type": "integer", + "range": { + "min": 1 + } + }, + { + "path": "temperature", + "label": "Temperature", + "description": "Controls randomness. Lower values make outputs more focused; higher values make them more varied.", + "group": "sampling", + "applicability": { + "except": { + "do_sample": false + } + }, + "type": "number", + "default": 1, + "range": { + "min": 0, + "max": 1, + "step": 0.1 + } + }, + { + "path": "top_p", + "label": "Top P", + "description": "Controls nucleus sampling by limiting generation to tokens within the selected cumulative probability.", + "group": "sampling", + "applicability": { + "except": { + "do_sample": false + } + }, + "type": "number", + "default": 0.95, + "range": { + "min": 0.01, + "max": 1, + "step": 0.01 + } + }, + { + "path": "do_sample", + "label": "Do sample", + "description": "When false, the model uses greedy decoding and ignores temperature and top_p.", + "group": "sampling", + "type": "boolean", + "default": true + }, + { + "path": "thinking.type", + "label": "Thinking mode", + "description": "Toggles the model's extended reasoning before it produces the final answer.", + "group": "reasoning", + "type": "enum", + "default": "enabled", + "values": [ + "enabled", + "disabled" + ] + }, + { + "path": "response_format.type", + "label": "Response format", + "description": "Forces the response into plain text or a JSON object.", + "group": "output_format", + "type": "enum", + "default": "text", + "values": [ + "text", + "json_object" + ] + } + ] + }, + { + "provider": "z-ai", + "authType": "api_key", + "model": "glm-5.1", + "params": [ + { + "path": "max_tokens", + "label": "Max tokens", + "description": "Maximum number of tokens to generate in the response.", + "group": "generation_length", + "type": "integer", + "range": { + "min": 1 + } + }, + { + "path": "temperature", + "label": "Temperature", + "description": "Controls randomness. Lower values make outputs more focused; higher values make them more varied.", + "group": "sampling", + "applicability": { + "except": { + "do_sample": false + } + }, + "type": "number", + "default": 1, + "range": { + "min": 0, + "max": 1, + "step": 0.1 + } + }, + { + "path": "top_p", + "label": "Top P", + "description": "Controls nucleus sampling by limiting generation to tokens within the selected cumulative probability.", + "group": "sampling", + "applicability": { + "except": { + "do_sample": false + } + }, + "type": "number", + "default": 0.95, + "range": { + "min": 0.01, + "max": 1, + "step": 0.01 + } + }, + { + "path": "do_sample", + "label": "Do sample", + "description": "When false, the model uses greedy decoding and ignores temperature and top_p.", + "group": "sampling", + "type": "boolean", + "default": true + }, + { + "path": "thinking.type", + "label": "Thinking mode", + "description": "Toggles the model's extended reasoning before it produces the final answer.", + "group": "reasoning", + "type": "enum", + "default": "enabled", + "values": [ + "enabled", + "disabled" + ] + }, + { + "path": "response_format.type", + "label": "Response format", + "description": "Forces the response into plain text or a JSON object.", + "group": "output_format", + "type": "enum", + "default": "text", + "values": [ + "text", + "json_object" + ] + } + ] + }, + { + "provider": "z-ai", + "authType": "subscription", + "model": "glm-5.1", + "params": [ + { + "path": "max_tokens", + "label": "Max tokens", + "description": "Maximum number of tokens to generate in the response.", + "group": "generation_length", + "type": "integer", + "range": { + "min": 1 + } + }, + { + "path": "temperature", + "label": "Temperature", + "description": "Controls randomness. Lower values make outputs more focused; higher values make them more varied.", + "group": "sampling", + "applicability": { + "except": { + "do_sample": false + } + }, + "type": "number", + "default": 1, + "range": { + "min": 0, + "max": 1, + "step": 0.1 + } + }, + { + "path": "top_p", + "label": "Top P", + "description": "Controls nucleus sampling by limiting generation to tokens within the selected cumulative probability.", + "group": "sampling", + "applicability": { + "except": { + "do_sample": false + } + }, + "type": "number", + "default": 0.95, + "range": { + "min": 0.01, + "max": 1, + "step": 0.01 + } + }, + { + "path": "do_sample", + "label": "Do sample", + "description": "When false, the model uses greedy decoding and ignores temperature and top_p.", + "group": "sampling", + "type": "boolean", + "default": true + }, + { + "path": "thinking.type", + "label": "Thinking mode", + "description": "Toggles the model's extended reasoning before it produces the final answer.", + "group": "reasoning", + "type": "enum", + "default": "enabled", + "values": [ + "enabled", + "disabled" + ] + }, + { + "path": "response_format.type", + "label": "Response format", + "description": "Forces the response into plain text or a JSON object.", + "group": "output_format", + "type": "enum", + "default": "text", + "values": [ + "text", + "json_object" + ] + } + ] + } +] as const; + +export type CatalogEntry = (typeof CATALOG)[number]; + +function authSuffix(authType: CatalogEntry["authType"]): "" | "-subscription" { + return authType === "api_key" ? "" : "-subscription"; +} + +export const BY_ID: Readonly> = Object.freeze( + Object.fromEntries( + CATALOG.map((m) => [`${m.provider}/${m.model}${authSuffix(m.authType)}`, m]), + ), +) as Readonly>; diff --git a/packages/modelparams/src/generated/defaults.ts b/packages/modelparams/src/generated/defaults.ts new file mode 100644 index 0000000..a03ce9c --- /dev/null +++ b/packages/modelparams/src/generated/defaults.ts @@ -0,0 +1,1089 @@ +// AUTO-GENERATED by packages/modelparams/scripts/codegen.ts. Do not edit by hand. +// Source of truth: the YAML catalog under /models in modelparams.dev. + +import type { ModelId } from "./model-ids.js"; +import type { ParamsById } from "./params-by-id.js"; + +export const DEFAULTS = { + "alibaba/qwen-flash": { + "extra_body.top_k": 20, + "extra_body.chat_template_kwargs.enable_thinking": true, + }, + "alibaba/qwen-plus": { + "extra_body.top_k": 20, + "extra_body.chat_template_kwargs.enable_thinking": true, + }, + "alibaba/qwen3-coder-flash": { + "extra_body.top_k": 20, + }, + "alibaba/qwen3-coder-plus": { + "extra_body.top_k": 20, + }, + "alibaba/qwen3-max": { + "extra_body.top_k": 20, + "extra_body.chat_template_kwargs.enable_thinking": false, + }, + "alibaba/qwen3.5": { + "extra_body.top_k": 20, + "extra_body.chat_template_kwargs.enable_thinking": true, + }, + "alibaba/qwen3.5-flash": { + "extra_body.top_k": 20, + "extra_body.chat_template_kwargs.enable_thinking": true, + }, + "alibaba/qwq-plus": { + "extra_body.top_k": 20, + }, + "anthropic/claude-3-5-haiku-20241022": { + max_tokens: 4096, + temperature: 1, + top_p: 1, + top_k: 0, + }, + "anthropic/claude-3-5-haiku-latest": { + max_tokens: 4096, + temperature: 1, + top_p: 1, + top_k: 0, + }, + "anthropic/claude-3-5-sonnet-20241022": { + max_tokens: 4096, + temperature: 1, + top_p: 1, + top_k: 0, + }, + "anthropic/claude-3-5-sonnet-latest": { + max_tokens: 4096, + temperature: 1, + top_p: 1, + top_k: 0, + }, + "anthropic/claude-3-7-sonnet-20250219": { + max_tokens: 4096, + temperature: 1, + top_p: 1, + top_k: 0, + "thinking.type": "disabled", + "thinking.budget_tokens": 4096, + }, + "anthropic/claude-3-7-sonnet-latest": { + max_tokens: 4096, + temperature: 1, + top_p: 1, + top_k: 0, + "thinking.type": "disabled", + "thinking.budget_tokens": 4096, + }, + "anthropic/claude-3-opus-20240229": { + max_tokens: 4096, + temperature: 1, + top_p: 1, + top_k: 0, + }, + "anthropic/claude-3-opus-latest": { + max_tokens: 4096, + temperature: 1, + top_p: 1, + top_k: 0, + }, + "anthropic/claude-haiku-4": { + max_tokens: 4096, + temperature: 1, + top_p: 1, + top_k: 0, + "thinking.type": "disabled", + "thinking.budget_tokens": 4096, + }, + "anthropic/claude-haiku-4-5": { + max_tokens: 4096, + temperature: 1, + top_p: 1, + top_k: 0, + "thinking.type": "disabled", + "thinking.budget_tokens": 4096, + }, + "anthropic/claude-haiku-4-5-20251001": { + max_tokens: 4096, + temperature: 1, + top_p: 1, + top_k: 0, + "thinking.type": "disabled", + "thinking.budget_tokens": 4096, + }, + "anthropic/claude-haiku-4-5-20251001-subscription": { + max_tokens: 4096, + temperature: 1, + top_p: 1, + top_k: 0, + "thinking.type": "disabled", + "thinking.budget_tokens": 4096, + }, + "anthropic/claude-haiku-4-5-subscription": { + max_tokens: 4096, + temperature: 1, + top_p: 1, + top_k: 0, + "thinking.type": "disabled", + "thinking.budget_tokens": 4096, + }, + "anthropic/claude-haiku-4-subscription": { + max_tokens: 4096, + temperature: 1, + top_p: 1, + top_k: 0, + "thinking.type": "disabled", + "thinking.budget_tokens": 4096, + }, + "anthropic/claude-opus-4-1-20250805": { + max_tokens: 4096, + temperature: 1, + top_p: 1, + top_k: 0, + "thinking.type": "disabled", + "thinking.budget_tokens": 4096, + "thinking.display": "summarized", + }, + "anthropic/claude-opus-4-1-20250805-subscription": { + max_tokens: 4096, + temperature: 1, + top_p: 1, + top_k: 0, + "thinking.type": "disabled", + "thinking.budget_tokens": 4096, + "thinking.display": "summarized", + }, + "anthropic/claude-opus-4-20250514": { + max_tokens: 4096, + temperature: 1, + top_p: 1, + top_k: 0, + "thinking.type": "disabled", + "thinking.budget_tokens": 4096, + "thinking.display": "summarized", + }, + "anthropic/claude-opus-4-20250514-subscription": { + max_tokens: 4096, + temperature: 1, + top_p: 1, + top_k: 0, + "thinking.type": "disabled", + "thinking.budget_tokens": 4096, + "thinking.display": "summarized", + }, + "anthropic/claude-opus-4-5-20251101": { + max_tokens: 4096, + temperature: 1, + top_p: 1, + top_k: 0, + "thinking.type": "disabled", + "thinking.budget_tokens": 4096, + "thinking.display": "summarized", + "output_config.effort": "high", + }, + "anthropic/claude-opus-4-5-20251101-subscription": { + max_tokens: 4096, + temperature: 1, + top_p: 1, + top_k: 0, + "thinking.type": "disabled", + "thinking.budget_tokens": 4096, + "thinking.display": "summarized", + "output_config.effort": "high", + }, + "anthropic/claude-opus-4-6": { + max_tokens: 4096, + temperature: 1, + top_p: 1, + top_k: 0, + "thinking.type": "disabled", + "thinking.budget_tokens": 4096, + "thinking.display": "summarized", + "output_config.effort": "high", + }, + "anthropic/claude-opus-4-6-subscription": { + max_tokens: 4096, + temperature: 1, + top_p: 1, + top_k: 0, + "thinking.type": "disabled", + "thinking.budget_tokens": 4096, + "thinking.display": "summarized", + "output_config.effort": "high", + }, + "anthropic/claude-opus-4-7": { + max_tokens: 4096, + "thinking.type": "disabled", + "thinking.display": "omitted", + "output_config.effort": "high", + }, + "anthropic/claude-opus-4-7-subscription": { + max_tokens: 4096, + "thinking.type": "disabled", + "thinking.display": "omitted", + "output_config.effort": "high", + }, + "anthropic/claude-opus-4-8": { + max_tokens: 4096, + "thinking.type": "disabled", + "thinking.display": "omitted", + "output_config.effort": "high", + }, + "anthropic/claude-opus-4-8-subscription": { + max_tokens: 4096, + "thinking.type": "disabled", + "thinking.display": "omitted", + "output_config.effort": "high", + }, + "anthropic/claude-opus-4-subscription": { + max_tokens: 4096, + temperature: 1, + top_p: 1, + top_k: 0, + "thinking.type": "disabled", + "thinking.budget_tokens": 4096, + }, + "anthropic/claude-sonnet-4-20250514": { + max_tokens: 4096, + temperature: 1, + top_p: 1, + top_k: 0, + "thinking.type": "disabled", + "thinking.budget_tokens": 4096, + "thinking.display": "summarized", + }, + "anthropic/claude-sonnet-4-20250514-subscription": { + max_tokens: 4096, + temperature: 1, + top_p: 1, + top_k: 0, + "thinking.type": "disabled", + "thinking.budget_tokens": 4096, + "thinking.display": "summarized", + }, + "anthropic/claude-sonnet-4-5": { + max_tokens: 4096, + temperature: 1, + top_p: 1, + top_k: 0, + "thinking.type": "disabled", + "thinking.budget_tokens": 4096, + }, + "anthropic/claude-sonnet-4-5-20250929": { + max_tokens: 4096, + temperature: 1, + top_p: 1, + top_k: 0, + "thinking.type": "disabled", + "thinking.budget_tokens": 4096, + }, + "anthropic/claude-sonnet-4-5-20250929-subscription": { + max_tokens: 4096, + temperature: 1, + top_p: 1, + top_k: 0, + "thinking.type": "disabled", + "thinking.budget_tokens": 4096, + }, + "anthropic/claude-sonnet-4-5-subscription": { + max_tokens: 4096, + temperature: 1, + top_p: 1, + top_k: 0, + "thinking.type": "disabled", + "thinking.budget_tokens": 4096, + }, + "anthropic/claude-sonnet-4-6": { + max_tokens: 4096, + temperature: 1, + top_p: 1, + top_k: 0, + "thinking.type": "disabled", + "thinking.budget_tokens": 4096, + "thinking.display": "summarized", + "output_config.effort": "high", + }, + "anthropic/claude-sonnet-4-6-subscription": { + max_tokens: 4096, + temperature: 1, + top_p: 1, + top_k: 0, + "thinking.type": "disabled", + "thinking.budget_tokens": 4096, + "thinking.display": "summarized", + "output_config.effort": "high", + }, + "anthropic/claude-sonnet-4-subscription": { + max_tokens: 4096, + temperature: 1, + top_p: 1, + top_k: 0, + "thinking.type": "disabled", + "thinking.budget_tokens": 4096, + }, + "cohere/command-a-03-2025": { + temperature: 0.3, + p: 0.75, + k: 0, + frequency_penalty: 0, + presence_penalty: 0, + "response_format.type": "text", + logprobs: false, + safety_mode: "CONTEXTUAL", + }, + "cohere/command-a-plus-05-2026": { + temperature: 0.3, + p: 0.75, + k: 0, + frequency_penalty: 0, + presence_penalty: 0, + "response_format.type": "text", + logprobs: false, + safety_mode: "CONTEXTUAL", + }, + "cohere/command-a-reasoning-08-2025": { + temperature: 0.3, + p: 0.75, + k: 0, + frequency_penalty: 0, + presence_penalty: 0, + "thinking.type": "disabled", + "response_format.type": "text", + logprobs: false, + safety_mode: "CONTEXTUAL", + }, + "cohere/command-a-translate-08-2025": { + temperature: 0.3, + p: 0.75, + k: 0, + frequency_penalty: 0, + presence_penalty: 0, + "response_format.type": "text", + logprobs: false, + safety_mode: "CONTEXTUAL", + }, + "cohere/command-a-vision-07-2025": { + temperature: 0.3, + p: 0.75, + k: 0, + frequency_penalty: 0, + presence_penalty: 0, + "response_format.type": "text", + logprobs: false, + safety_mode: "CONTEXTUAL", + }, + "cohere/command-r-08-2024": { + temperature: 0.3, + p: 0.75, + k: 0, + frequency_penalty: 0, + presence_penalty: 0, + "response_format.type": "text", + logprobs: false, + safety_mode: "CONTEXTUAL", + }, + "cohere/command-r-plus-08-2024": { + temperature: 0.3, + p: 0.75, + k: 0, + frequency_penalty: 0, + presence_penalty: 0, + "response_format.type": "text", + logprobs: false, + safety_mode: "CONTEXTUAL", + }, + "cohere/command-r7b-12-2024": { + temperature: 0.3, + p: 0.75, + k: 0, + frequency_penalty: 0, + presence_penalty: 0, + "response_format.type": "text", + logprobs: false, + safety_mode: "CONTEXTUAL", + }, + "deepseek/deepseek-chat": { + max_tokens: 4096, + temperature: 1, + top_p: 1, + "thinking.type": "disabled", + }, + "deepseek/deepseek-reasoner": { + max_tokens: 4096, + temperature: 1, + top_p: 1, + "thinking.type": "enabled", + reasoning_effort: "high", + }, + "deepseek/deepseek-v4-flash": { + max_tokens: 4096, + temperature: 1, + top_p: 1, + "thinking.type": "enabled", + reasoning_effort: "high", + }, + "deepseek/deepseek-v4-pro": { + max_tokens: 4096, + temperature: 1, + top_p: 1, + "thinking.type": "enabled", + reasoning_effort: "high", + }, + "google/gemini-2.5-flash": { + "generationConfig.temperature": 1, + "generationConfig.topP": 0.95, + "generationConfig.topK": 64, + "generationConfig.thinkingConfig.thinkingBudget": -1, + "generationConfig.thinkingConfig.includeThoughts": false, + "generationConfig.responseMimeType": "text/plain", + }, + "google/gemini-2.5-flash-lite": { + "generationConfig.temperature": 1, + "generationConfig.topP": 0.95, + "generationConfig.topK": 64, + "generationConfig.thinkingConfig.thinkingBudget": 0, + "generationConfig.thinkingConfig.includeThoughts": false, + "generationConfig.responseMimeType": "text/plain", + }, + "google/gemini-2.5-flash-lite-subscription": { + "generationConfig.temperature": 1, + "generationConfig.topP": 0.95, + "generationConfig.topK": 64, + "generationConfig.thinkingConfig.thinkingBudget": 0, + "generationConfig.thinkingConfig.includeThoughts": false, + "generationConfig.responseMimeType": "text/plain", + }, + "google/gemini-2.5-flash-subscription": { + "generationConfig.temperature": 1, + "generationConfig.topP": 0.95, + "generationConfig.topK": 64, + "generationConfig.thinkingConfig.thinkingBudget": -1, + "generationConfig.thinkingConfig.includeThoughts": false, + "generationConfig.responseMimeType": "text/plain", + }, + "google/gemini-2.5-pro": { + "generationConfig.temperature": 1, + "generationConfig.topP": 0.95, + "generationConfig.topK": 64, + "generationConfig.thinkingConfig.includeThoughts": false, + "generationConfig.responseMimeType": "text/plain", + }, + "google/gemini-2.5-pro-subscription": { + "generationConfig.temperature": 1, + "generationConfig.topP": 0.95, + "generationConfig.topK": 64, + "generationConfig.thinkingConfig.includeThoughts": false, + "generationConfig.responseMimeType": "text/plain", + }, + "google/gemini-3-flash-preview-subscription": { + "generationConfig.temperature": 1, + "generationConfig.topP": 0.95, + "generationConfig.topK": 64, + "generationConfig.thinkingConfig.thinkingLevel": "high", + "generationConfig.thinkingConfig.includeThoughts": false, + "generationConfig.responseMimeType": "text/plain", + }, + "google/gemini-3.1-flash-lite-preview-subscription": { + "generationConfig.temperature": 1, + "generationConfig.topP": 0.95, + "generationConfig.topK": 64, + "generationConfig.thinkingConfig.thinkingLevel": "high", + "generationConfig.thinkingConfig.includeThoughts": false, + "generationConfig.responseMimeType": "text/plain", + }, + "google/gemini-3.1-flash-lite-subscription": { + "generationConfig.temperature": 1, + "generationConfig.topP": 0.95, + "generationConfig.topK": 64, + "generationConfig.thinkingConfig.thinkingLevel": "high", + "generationConfig.thinkingConfig.includeThoughts": false, + "generationConfig.responseMimeType": "text/plain", + }, + "google/gemini-3.1-pro-preview-subscription": { + "generationConfig.temperature": 1, + "generationConfig.topP": 0.95, + "generationConfig.topK": 64, + "generationConfig.thinkingConfig.thinkingLevel": "high", + "generationConfig.thinkingConfig.includeThoughts": false, + "generationConfig.responseMimeType": "text/plain", + }, + "google/gemini-3.5-flash": { + "generationConfig.temperature": 1, + "generationConfig.topP": 0.95, + "generationConfig.topK": 64, + "generationConfig.thinkingConfig.thinkingLevel": "medium", + "generationConfig.thinkingConfig.includeThoughts": false, + "generationConfig.responseMimeType": "text/plain", + }, + "meta/Llama-3.3-70B-Instruct": { + "response_format.type": "text", + }, + "meta/Llama-3.3-8B-Instruct": { + "response_format.type": "text", + }, + "meta/Llama-4-Maverick-17B-128E-Instruct-FP8": { + "response_format.type": "text", + }, + "meta/Llama-4-Scout-17B-16E-Instruct-FP8": { + "response_format.type": "text", + }, + "minimax/minimax-m2": { + temperature: 1, + top_p: 0.95, + reasoning_split: false, + }, + "minimax/MiniMax-M2-subscription": { + temperature: 1, + top_p: 0.95, + }, + "minimax/minimax-m2.1": { + temperature: 1, + top_p: 0.95, + reasoning_split: false, + }, + "minimax/minimax-m2.1-highspeed": { + temperature: 1, + top_p: 0.95, + reasoning_split: false, + }, + "minimax/MiniMax-M2.1-highspeed-subscription": { + temperature: 1, + top_p: 0.95, + }, + "minimax/MiniMax-M2.1-subscription": { + temperature: 1, + top_p: 0.95, + }, + "minimax/minimax-m2.5": { + temperature: 1, + top_p: 0.95, + reasoning_split: false, + }, + "minimax/minimax-m2.5-highspeed": { + temperature: 1, + top_p: 0.95, + reasoning_split: false, + }, + "minimax/MiniMax-M2.5-highspeed-subscription": { + temperature: 1, + top_p: 0.95, + }, + "minimax/MiniMax-M2.5-subscription": { + temperature: 1, + top_p: 0.95, + }, + "minimax/minimax-m2.7": { + temperature: 1, + top_p: 0.95, + reasoning_split: false, + }, + "minimax/minimax-m2.7-highspeed": { + temperature: 1, + top_p: 0.95, + reasoning_split: false, + }, + "minimax/MiniMax-M2.7-highspeed-subscription": { + temperature: 1, + top_p: 0.95, + }, + "minimax/MiniMax-M2.7-subscription": { + temperature: 1, + top_p: 0.95, + }, + "minimax/minimax-m3": { + temperature: 1, + top_p: 0.95, + reasoning_split: false, + }, + "minimax/MiniMax-M3-subscription": { + temperature: 1, + top_p: 0.95, + }, + "mistral/codestral-latest": { + top_p: 1, + presence_penalty: 0, + frequency_penalty: 0, + "response_format.type": "text", + safe_prompt: false, + }, + "mistral/devstral-2512": { + top_p: 1, + presence_penalty: 0, + frequency_penalty: 0, + "response_format.type": "text", + safe_prompt: false, + }, + "mistral/devstral-latest": { + top_p: 1, + presence_penalty: 0, + frequency_penalty: 0, + "response_format.type": "text", + safe_prompt: false, + }, + "mistral/magistral-medium-latest": { + top_p: 1, + presence_penalty: 0, + frequency_penalty: 0, + "response_format.type": "text", + safe_prompt: false, + }, + "mistral/magistral-small-latest": { + top_p: 1, + presence_penalty: 0, + frequency_penalty: 0, + "response_format.type": "text", + safe_prompt: false, + }, + "mistral/ministral-14b-latest": { + top_p: 1, + presence_penalty: 0, + frequency_penalty: 0, + "response_format.type": "text", + safe_prompt: false, + }, + "mistral/ministral-3b-latest": { + top_p: 1, + presence_penalty: 0, + frequency_penalty: 0, + "response_format.type": "text", + safe_prompt: false, + }, + "mistral/ministral-8b-latest": { + top_p: 1, + presence_penalty: 0, + frequency_penalty: 0, + "response_format.type": "text", + safe_prompt: false, + }, + "mistral/mistral-large-latest": { + top_p: 1, + presence_penalty: 0, + frequency_penalty: 0, + "response_format.type": "text", + safe_prompt: false, + }, + "mistral/mistral-medium-3.5": { + top_p: 1, + presence_penalty: 0, + frequency_penalty: 0, + "response_format.type": "text", + safe_prompt: false, + }, + "mistral/mistral-medium-latest": { + top_p: 1, + presence_penalty: 0, + frequency_penalty: 0, + "response_format.type": "text", + safe_prompt: false, + }, + "mistral/mistral-small-latest": { + top_p: 1, + presence_penalty: 0, + frequency_penalty: 0, + "response_format.type": "text", + safe_prompt: false, + }, + "mistral/open-mistral-nemo": { + top_p: 1, + presence_penalty: 0, + frequency_penalty: 0, + "response_format.type": "text", + safe_prompt: false, + }, + "moonshot/kimi-k2.5": { + "response_format.type": "text", + }, + "moonshot/kimi-k2.6": { + "thinking.type": "enabled", + "response_format.type": "text", + }, + "moonshot/moonshot-v1-128k": { + temperature: 0.3, + top_p: 1, + n: 1, + presence_penalty: 0, + frequency_penalty: 0, + "response_format.type": "text", + }, + "moonshot/moonshot-v1-32k": { + temperature: 0.3, + top_p: 1, + n: 1, + presence_penalty: 0, + frequency_penalty: 0, + "response_format.type": "text", + }, + "moonshot/moonshot-v1-8k": { + temperature: 0.3, + top_p: 1, + n: 1, + presence_penalty: 0, + frequency_penalty: 0, + "response_format.type": "text", + }, + "openai/chatgpt-4o-latest": { + max_tokens: 4096, + temperature: 1, + top_p: 1, + }, + "openai/gpt-3.5-turbo": { + max_tokens: 4096, + temperature: 1, + top_p: 1, + }, + "openai/gpt-4-turbo": { + max_tokens: 4096, + temperature: 1, + top_p: 1, + }, + "openai/gpt-4-turbo-2024-04-09": { + max_tokens: 4096, + temperature: 1, + top_p: 1, + }, + "openai/gpt-4.1": { + max_tokens: 4096, + temperature: 1, + top_p: 1, + }, + "openai/gpt-4.1-mini": { + max_tokens: 4096, + temperature: 1, + top_p: 1, + }, + "openai/gpt-4.1-nano": { + max_tokens: 4096, + temperature: 1, + top_p: 1, + }, + "openai/gpt-4o": { + max_tokens: 4096, + temperature: 1, + top_p: 1, + }, + "openai/gpt-4o-2024-11-20": { + max_tokens: 4096, + temperature: 1, + top_p: 1, + }, + "openai/gpt-4o-mini": { + max_tokens: 4096, + temperature: 1, + top_p: 1, + }, + "openai/gpt-5": { + max_completion_tokens: 4096, + reasoning_effort: "medium", + }, + "openai/gpt-5-chat-latest": { + max_completion_tokens: 4096, + }, + "openai/gpt-5-mini": { + max_completion_tokens: 4096, + reasoning_effort: "medium", + }, + "openai/gpt-5-nano": { + max_completion_tokens: 4096, + reasoning_effort: "medium", + }, + "openai/gpt-5.1": { + max_completion_tokens: 4096, + reasoning_effort: "none", + }, + "openai/gpt-5.1-codex-max-subscription": { + "reasoning.effort": "medium", + "reasoning.summary": "auto", + "text.verbosity": "medium", + }, + "openai/gpt-5.1-codex-subscription": { + "reasoning.effort": "medium", + "reasoning.summary": "auto", + "text.verbosity": "medium", + }, + "openai/gpt-5.2": { + max_completion_tokens: 4096, + reasoning_effort: "medium", + }, + "openai/gpt-5.2-codex-subscription": { + "reasoning.effort": "medium", + "reasoning.summary": "auto", + "text.verbosity": "medium", + }, + "openai/gpt-5.2-subscription": { + "reasoning.effort": "medium", + "reasoning.summary": "auto", + "text.verbosity": "medium", + }, + "openai/gpt-5.3-codex": { + max_completion_tokens: 4096, + reasoning_effort: "medium", + }, + "openai/gpt-5.3-codex-spark-subscription": { + "reasoning.effort": "medium", + "reasoning.summary": "auto", + "text.verbosity": "medium", + }, + "openai/gpt-5.3-codex-subscription": { + "reasoning.effort": "medium", + "reasoning.summary": "auto", + "text.verbosity": "medium", + }, + "openai/gpt-5.4": { + max_completion_tokens: 4096, + reasoning_effort: "medium", + }, + "openai/gpt-5.4-mini": { + max_completion_tokens: 4096, + reasoning_effort: "medium", + }, + "openai/gpt-5.4-mini-subscription": { + "reasoning.effort": "medium", + "reasoning.summary": "auto", + "text.verbosity": "medium", + }, + "openai/gpt-5.4-nano": { + max_completion_tokens: 4096, + reasoning_effort: "medium", + }, + "openai/gpt-5.4-pro": { + max_completion_tokens: 4096, + reasoning_effort: "medium", + }, + "openai/gpt-5.4-pro-subscription": { + "reasoning.effort": "medium", + "reasoning.summary": "auto", + "text.verbosity": "medium", + }, + "openai/gpt-5.4-subscription": { + "reasoning.effort": "medium", + "reasoning.summary": "auto", + "text.verbosity": "medium", + }, + "openai/gpt-5.5": { + max_completion_tokens: 4096, + reasoning_effort: "medium", + }, + "openai/gpt-5.5-pro": { + max_completion_tokens: 4096, + reasoning_effort: "medium", + }, + "openai/gpt-5.5-pro-subscription": { + "reasoning.effort": "medium", + "reasoning.summary": "auto", + "text.verbosity": "medium", + }, + "openai/gpt-5.5-subscription": { + "reasoning.effort": "medium", + "reasoning.summary": "auto", + "text.verbosity": "medium", + }, + "openai/o1": { + max_completion_tokens: 4096, + reasoning_effort: "medium", + }, + "openai/o1-mini": { + max_tokens: 4096, + reasoning_effort: "medium", + }, + "openai/o1-preview": { + max_tokens: 4096, + reasoning_effort: "medium", + }, + "openai/o3": { + max_completion_tokens: 4096, + reasoning_effort: "medium", + }, + "openai/o3-mini": { + max_completion_tokens: 4096, + reasoning_effort: "medium", + }, + "openai/o3-pro": { + max_completion_tokens: 4096, + reasoning_effort: "medium", + }, + "openai/o4-mini": { + max_completion_tokens: 4096, + reasoning_effort: "medium", + }, + "perplexity/sonar": { + "web_search_options.search_context_size": "low", + return_images: false, + return_related_questions: false, + disable_search: false, + }, + "perplexity/sonar-deep-research": { + "web_search_options.search_context_size": "low", + return_images: false, + return_related_questions: false, + }, + "perplexity/sonar-pro": { + "web_search_options.search_context_size": "low", + return_images: false, + return_related_questions: false, + disable_search: false, + }, + "perplexity/sonar-reasoning-pro": { + "web_search_options.search_context_size": "low", + return_images: false, + return_related_questions: false, + disable_search: false, + }, + "xai/grok-4.20-0309-non-reasoning": { + temperature: 1, + top_p: 1, + "response_format.type": "text", + }, + "xai/grok-4.20-0309-reasoning": { + temperature: 1, + top_p: 1, + "response_format.type": "text", + }, + "xai/grok-4.20-multi-agent-0309": { + temperature: 0.7, + top_p: 0.95, + "text.format.type": "text", + }, + "xai/grok-4.3": { + temperature: 1, + top_p: 1, + reasoning_effort: "low", + "response_format.type": "text", + }, + "xai/grok-build-0.1": { + temperature: 1, + top_p: 1, + "response_format.type": "text", + }, + "z-ai/glm-4.5": { + temperature: 0.6, + top_p: 0.95, + do_sample: true, + "thinking.type": "enabled", + "response_format.type": "text", + }, + "z-ai/glm-4.5-air": { + temperature: 0.6, + top_p: 0.95, + do_sample: true, + "thinking.type": "enabled", + "response_format.type": "text", + }, + "z-ai/glm-4.5-air-subscription": { + temperature: 0.6, + top_p: 0.95, + do_sample: true, + "thinking.type": "enabled", + "response_format.type": "text", + }, + "z-ai/glm-4.5-airx": { + temperature: 0.6, + top_p: 0.95, + do_sample: true, + "thinking.type": "enabled", + "response_format.type": "text", + }, + "z-ai/glm-4.5-flash": { + temperature: 0.6, + top_p: 0.95, + do_sample: true, + "thinking.type": "enabled", + "response_format.type": "text", + }, + "z-ai/glm-4.5-subscription": { + temperature: 0.6, + top_p: 0.95, + do_sample: true, + "thinking.type": "enabled", + "response_format.type": "text", + }, + "z-ai/glm-4.5-x": { + temperature: 0.6, + top_p: 0.95, + do_sample: true, + "thinking.type": "enabled", + "response_format.type": "text", + }, + "z-ai/glm-4.6": { + temperature: 1, + top_p: 0.95, + do_sample: true, + "thinking.type": "enabled", + "response_format.type": "text", + }, + "z-ai/glm-4.6-subscription": { + temperature: 1, + top_p: 0.95, + do_sample: true, + "thinking.type": "enabled", + "response_format.type": "text", + }, + "z-ai/glm-4.7": { + temperature: 1, + top_p: 0.95, + do_sample: true, + "thinking.type": "enabled", + "response_format.type": "text", + }, + "z-ai/glm-4.7-flash": { + temperature: 1, + top_p: 0.95, + do_sample: true, + "thinking.type": "enabled", + "response_format.type": "text", + }, + "z-ai/glm-4.7-flashx": { + temperature: 1, + top_p: 0.95, + do_sample: true, + "thinking.type": "enabled", + "response_format.type": "text", + }, + "z-ai/glm-4.7-subscription": { + temperature: 1, + top_p: 0.95, + do_sample: true, + "thinking.type": "enabled", + "response_format.type": "text", + }, + "z-ai/glm-5": { + temperature: 1, + top_p: 0.95, + do_sample: true, + "thinking.type": "enabled", + "response_format.type": "text", + }, + "z-ai/glm-5-subscription": { + temperature: 1, + top_p: 0.95, + do_sample: true, + "thinking.type": "enabled", + "response_format.type": "text", + }, + "z-ai/glm-5-turbo": { + temperature: 1, + top_p: 0.95, + do_sample: true, + "thinking.type": "enabled", + "response_format.type": "text", + }, + "z-ai/glm-5-turbo-subscription": { + temperature: 1, + top_p: 0.95, + do_sample: true, + "thinking.type": "enabled", + "response_format.type": "text", + }, + "z-ai/glm-5.1": { + temperature: 1, + top_p: 0.95, + do_sample: true, + "thinking.type": "enabled", + "response_format.type": "text", + }, + "z-ai/glm-5.1-subscription": { + temperature: 1, + top_p: 0.95, + do_sample: true, + "thinking.type": "enabled", + "response_format.type": "text", + }, +} as const satisfies { [K in ModelId]: Partial }; diff --git a/packages/modelparams/src/generated/index.ts b/packages/modelparams/src/generated/index.ts new file mode 100644 index 0000000..41bc2be --- /dev/null +++ b/packages/modelparams/src/generated/index.ts @@ -0,0 +1,7 @@ +// AUTO-GENERATED by packages/modelparams/scripts/codegen.ts. Do not edit by hand. +// Source of truth: the YAML catalog under /models in modelparams.dev. + +export * from "./model-ids.js"; +export * from "./params-by-id.js"; +export * from "./defaults.js"; +export * from "./data.js"; diff --git a/packages/modelparams/src/generated/model-ids.ts b/packages/modelparams/src/generated/model-ids.ts new file mode 100644 index 0000000..6ce0b76 --- /dev/null +++ b/packages/modelparams/src/generated/model-ids.ts @@ -0,0 +1,199 @@ +// AUTO-GENERATED by packages/modelparams/scripts/codegen.ts. Do not edit by hand. +// Source of truth: the YAML catalog under /models in modelparams.dev. + +export const MODEL_IDS = [ + "alibaba/qwen-flash", + "alibaba/qwen-plus", + "alibaba/qwen3-coder-flash", + "alibaba/qwen3-coder-plus", + "alibaba/qwen3-max", + "alibaba/qwen3.5", + "alibaba/qwen3.5-flash", + "alibaba/qwq-plus", + "anthropic/claude-3-5-haiku-20241022", + "anthropic/claude-3-5-haiku-latest", + "anthropic/claude-3-5-sonnet-20241022", + "anthropic/claude-3-5-sonnet-latest", + "anthropic/claude-3-7-sonnet-20250219", + "anthropic/claude-3-7-sonnet-latest", + "anthropic/claude-3-opus-20240229", + "anthropic/claude-3-opus-latest", + "anthropic/claude-haiku-4", + "anthropic/claude-haiku-4-5", + "anthropic/claude-haiku-4-5-20251001", + "anthropic/claude-haiku-4-5-20251001-subscription", + "anthropic/claude-haiku-4-5-subscription", + "anthropic/claude-haiku-4-subscription", + "anthropic/claude-opus-4-1-20250805", + "anthropic/claude-opus-4-1-20250805-subscription", + "anthropic/claude-opus-4-20250514", + "anthropic/claude-opus-4-20250514-subscription", + "anthropic/claude-opus-4-5-20251101", + "anthropic/claude-opus-4-5-20251101-subscription", + "anthropic/claude-opus-4-6", + "anthropic/claude-opus-4-6-subscription", + "anthropic/claude-opus-4-7", + "anthropic/claude-opus-4-7-subscription", + "anthropic/claude-opus-4-8", + "anthropic/claude-opus-4-8-subscription", + "anthropic/claude-opus-4-subscription", + "anthropic/claude-sonnet-4-20250514", + "anthropic/claude-sonnet-4-20250514-subscription", + "anthropic/claude-sonnet-4-5", + "anthropic/claude-sonnet-4-5-20250929", + "anthropic/claude-sonnet-4-5-20250929-subscription", + "anthropic/claude-sonnet-4-5-subscription", + "anthropic/claude-sonnet-4-6", + "anthropic/claude-sonnet-4-6-subscription", + "anthropic/claude-sonnet-4-subscription", + "cohere/command-a-03-2025", + "cohere/command-a-plus-05-2026", + "cohere/command-a-reasoning-08-2025", + "cohere/command-a-translate-08-2025", + "cohere/command-a-vision-07-2025", + "cohere/command-r-08-2024", + "cohere/command-r-plus-08-2024", + "cohere/command-r7b-12-2024", + "deepseek/deepseek-chat", + "deepseek/deepseek-reasoner", + "deepseek/deepseek-v4-flash", + "deepseek/deepseek-v4-pro", + "google/gemini-2.5-flash", + "google/gemini-2.5-flash-lite", + "google/gemini-2.5-flash-lite-subscription", + "google/gemini-2.5-flash-subscription", + "google/gemini-2.5-pro", + "google/gemini-2.5-pro-subscription", + "google/gemini-3-flash-preview-subscription", + "google/gemini-3.1-flash-lite-preview-subscription", + "google/gemini-3.1-flash-lite-subscription", + "google/gemini-3.1-pro-preview-subscription", + "google/gemini-3.5-flash", + "meta/Llama-3.3-70B-Instruct", + "meta/Llama-3.3-8B-Instruct", + "meta/Llama-4-Maverick-17B-128E-Instruct-FP8", + "meta/Llama-4-Scout-17B-16E-Instruct-FP8", + "minimax/minimax-m2", + "minimax/MiniMax-M2-subscription", + "minimax/minimax-m2.1", + "minimax/minimax-m2.1-highspeed", + "minimax/MiniMax-M2.1-highspeed-subscription", + "minimax/MiniMax-M2.1-subscription", + "minimax/minimax-m2.5", + "minimax/minimax-m2.5-highspeed", + "minimax/MiniMax-M2.5-highspeed-subscription", + "minimax/MiniMax-M2.5-subscription", + "minimax/minimax-m2.7", + "minimax/minimax-m2.7-highspeed", + "minimax/MiniMax-M2.7-highspeed-subscription", + "minimax/MiniMax-M2.7-subscription", + "minimax/minimax-m3", + "minimax/MiniMax-M3-subscription", + "mistral/codestral-latest", + "mistral/devstral-2512", + "mistral/devstral-latest", + "mistral/magistral-medium-latest", + "mistral/magistral-small-latest", + "mistral/ministral-14b-latest", + "mistral/ministral-3b-latest", + "mistral/ministral-8b-latest", + "mistral/mistral-large-latest", + "mistral/mistral-medium-3.5", + "mistral/mistral-medium-latest", + "mistral/mistral-small-latest", + "mistral/open-mistral-nemo", + "moonshot/kimi-k2.5", + "moonshot/kimi-k2.6", + "moonshot/moonshot-v1-128k", + "moonshot/moonshot-v1-32k", + "moonshot/moonshot-v1-8k", + "openai/chatgpt-4o-latest", + "openai/gpt-3.5-turbo", + "openai/gpt-4-turbo", + "openai/gpt-4-turbo-2024-04-09", + "openai/gpt-4.1", + "openai/gpt-4.1-mini", + "openai/gpt-4.1-nano", + "openai/gpt-4o", + "openai/gpt-4o-2024-11-20", + "openai/gpt-4o-mini", + "openai/gpt-5", + "openai/gpt-5-chat-latest", + "openai/gpt-5-mini", + "openai/gpt-5-nano", + "openai/gpt-5.1", + "openai/gpt-5.1-codex-max-subscription", + "openai/gpt-5.1-codex-subscription", + "openai/gpt-5.2", + "openai/gpt-5.2-codex-subscription", + "openai/gpt-5.2-subscription", + "openai/gpt-5.3-codex", + "openai/gpt-5.3-codex-spark-subscription", + "openai/gpt-5.3-codex-subscription", + "openai/gpt-5.4", + "openai/gpt-5.4-mini", + "openai/gpt-5.4-mini-subscription", + "openai/gpt-5.4-nano", + "openai/gpt-5.4-pro", + "openai/gpt-5.4-pro-subscription", + "openai/gpt-5.4-subscription", + "openai/gpt-5.5", + "openai/gpt-5.5-pro", + "openai/gpt-5.5-pro-subscription", + "openai/gpt-5.5-subscription", + "openai/o1", + "openai/o1-mini", + "openai/o1-preview", + "openai/o3", + "openai/o3-mini", + "openai/o3-pro", + "openai/o4-mini", + "perplexity/sonar", + "perplexity/sonar-deep-research", + "perplexity/sonar-pro", + "perplexity/sonar-reasoning-pro", + "xai/grok-4.20-0309-non-reasoning", + "xai/grok-4.20-0309-reasoning", + "xai/grok-4.20-multi-agent-0309", + "xai/grok-4.3", + "xai/grok-build-0.1", + "z-ai/glm-4.5", + "z-ai/glm-4.5-air", + "z-ai/glm-4.5-air-subscription", + "z-ai/glm-4.5-airx", + "z-ai/glm-4.5-flash", + "z-ai/glm-4.5-subscription", + "z-ai/glm-4.5-x", + "z-ai/glm-4.6", + "z-ai/glm-4.6-subscription", + "z-ai/glm-4.7", + "z-ai/glm-4.7-flash", + "z-ai/glm-4.7-flashx", + "z-ai/glm-4.7-subscription", + "z-ai/glm-5", + "z-ai/glm-5-subscription", + "z-ai/glm-5-turbo", + "z-ai/glm-5-turbo-subscription", + "z-ai/glm-5.1", + "z-ai/glm-5.1-subscription" +] as const; + +export type ModelId = (typeof MODEL_IDS)[number]; + +export const PROVIDERS = [ + "alibaba", + "anthropic", + "cohere", + "deepseek", + "google", + "meta", + "minimax", + "mistral", + "moonshot", + "openai", + "perplexity", + "xai", + "z-ai" +] as const; + +export type Provider = (typeof PROVIDERS)[number]; diff --git a/packages/modelparams/src/generated/params-by-id.ts b/packages/modelparams/src/generated/params-by-id.ts new file mode 100644 index 0000000..88b821b --- /dev/null +++ b/packages/modelparams/src/generated/params-by-id.ts @@ -0,0 +1,1333 @@ +// AUTO-GENERATED by packages/modelparams/scripts/codegen.ts. Do not edit by hand. +// Source of truth: the YAML catalog under /models in modelparams.dev. + +/** + * Full parameter shape for each model id. The headline `ParamsOf` type in + * `../types` is `Partial` so consumers can set only the + * parameters they want to override. + */ +export type ParamsById = { + "alibaba/qwen-flash": { + max_tokens: number; + temperature: number; + top_p: number; + "extra_body.top_k": number; + "extra_body.chat_template_kwargs.enable_thinking": boolean; + }; + "alibaba/qwen-plus": { + max_tokens: number; + temperature: number; + top_p: number; + "extra_body.top_k": number; + "extra_body.chat_template_kwargs.enable_thinking": boolean; + }; + "alibaba/qwen3-coder-flash": { + max_tokens: number; + temperature: number; + top_p: number; + "extra_body.top_k": number; + }; + "alibaba/qwen3-coder-plus": { + max_tokens: number; + temperature: number; + top_p: number; + "extra_body.top_k": number; + }; + "alibaba/qwen3-max": { + max_tokens: number; + temperature: number; + top_p: number; + "extra_body.top_k": number; + "extra_body.chat_template_kwargs.enable_thinking": boolean; + }; + "alibaba/qwen3.5": { + max_tokens: number; + temperature: number; + top_p: number; + "extra_body.top_k": number; + "extra_body.chat_template_kwargs.enable_thinking": boolean; + }; + "alibaba/qwen3.5-flash": { + max_tokens: number; + temperature: number; + top_p: number; + "extra_body.top_k": number; + "extra_body.chat_template_kwargs.enable_thinking": boolean; + }; + "alibaba/qwq-plus": { + max_tokens: number; + temperature: number; + top_p: number; + "extra_body.top_k": number; + }; + "anthropic/claude-3-5-haiku-20241022": { + max_tokens: number; + temperature: number; + top_p: number; + top_k: number; + }; + "anthropic/claude-3-5-haiku-latest": { + max_tokens: number; + temperature: number; + top_p: number; + top_k: number; + }; + "anthropic/claude-3-5-sonnet-20241022": { + max_tokens: number; + temperature: number; + top_p: number; + top_k: number; + }; + "anthropic/claude-3-5-sonnet-latest": { + max_tokens: number; + temperature: number; + top_p: number; + top_k: number; + }; + "anthropic/claude-3-7-sonnet-20250219": { + max_tokens: number; + temperature: number; + top_p: number; + top_k: number; + "thinking.type": "disabled" | "enabled"; + "thinking.budget_tokens": number; + }; + "anthropic/claude-3-7-sonnet-latest": { + max_tokens: number; + temperature: number; + top_p: number; + top_k: number; + "thinking.type": "disabled" | "enabled"; + "thinking.budget_tokens": number; + }; + "anthropic/claude-3-opus-20240229": { + max_tokens: number; + temperature: number; + top_p: number; + top_k: number; + }; + "anthropic/claude-3-opus-latest": { + max_tokens: number; + temperature: number; + top_p: number; + top_k: number; + }; + "anthropic/claude-haiku-4": { + max_tokens: number; + temperature: number; + top_p: number; + top_k: number; + "thinking.type": "disabled" | "enabled"; + "thinking.budget_tokens": number; + }; + "anthropic/claude-haiku-4-5": { + max_tokens: number; + temperature: number; + top_p: number; + top_k: number; + "thinking.type": "disabled" | "enabled"; + "thinking.budget_tokens": number; + }; + "anthropic/claude-haiku-4-5-20251001": { + max_tokens: number; + temperature: number; + top_p: number; + top_k: number; + "thinking.type": "disabled" | "enabled"; + "thinking.budget_tokens": number; + }; + "anthropic/claude-haiku-4-5-20251001-subscription": { + max_tokens: number; + temperature: number; + top_p: number; + top_k: number; + "thinking.type": "disabled" | "enabled"; + "thinking.budget_tokens": number; + }; + "anthropic/claude-haiku-4-5-subscription": { + max_tokens: number; + temperature: number; + top_p: number; + top_k: number; + "thinking.type": "disabled" | "enabled"; + "thinking.budget_tokens": number; + }; + "anthropic/claude-haiku-4-subscription": { + max_tokens: number; + temperature: number; + top_p: number; + top_k: number; + "thinking.type": "disabled" | "enabled"; + "thinking.budget_tokens": number; + }; + "anthropic/claude-opus-4-1-20250805": { + max_tokens: number; + temperature: number; + top_p: number; + top_k: number; + "thinking.type": "disabled" | "enabled"; + "thinking.budget_tokens": number; + "thinking.display": "summarized" | "omitted"; + }; + "anthropic/claude-opus-4-1-20250805-subscription": { + max_tokens: number; + temperature: number; + top_p: number; + top_k: number; + "thinking.type": "disabled" | "enabled"; + "thinking.budget_tokens": number; + "thinking.display": "summarized" | "omitted"; + }; + "anthropic/claude-opus-4-20250514": { + max_tokens: number; + temperature: number; + top_p: number; + top_k: number; + "thinking.type": "disabled" | "enabled"; + "thinking.budget_tokens": number; + "thinking.display": "summarized" | "omitted"; + }; + "anthropic/claude-opus-4-20250514-subscription": { + max_tokens: number; + temperature: number; + top_p: number; + top_k: number; + "thinking.type": "disabled" | "enabled"; + "thinking.budget_tokens": number; + "thinking.display": "summarized" | "omitted"; + }; + "anthropic/claude-opus-4-5-20251101": { + max_tokens: number; + temperature: number; + top_p: number; + top_k: number; + "thinking.type": "disabled" | "enabled"; + "thinking.budget_tokens": number; + "thinking.display": "summarized" | "omitted"; + "output_config.effort": "low" | "medium" | "high"; + }; + "anthropic/claude-opus-4-5-20251101-subscription": { + max_tokens: number; + temperature: number; + top_p: number; + top_k: number; + "thinking.type": "disabled" | "enabled"; + "thinking.budget_tokens": number; + "thinking.display": "summarized" | "omitted"; + "output_config.effort": "low" | "medium" | "high"; + }; + "anthropic/claude-opus-4-6": { + max_tokens: number; + temperature: number; + top_p: number; + top_k: number; + "thinking.type": "disabled" | "adaptive" | "enabled"; + "thinking.budget_tokens": number; + "thinking.display": "summarized" | "omitted"; + "output_config.effort": "low" | "medium" | "high" | "max"; + }; + "anthropic/claude-opus-4-6-subscription": { + max_tokens: number; + temperature: number; + top_p: number; + top_k: number; + "thinking.type": "disabled" | "adaptive" | "enabled"; + "thinking.budget_tokens": number; + "thinking.display": "summarized" | "omitted"; + "output_config.effort": "low" | "medium" | "high" | "max"; + }; + "anthropic/claude-opus-4-7": { + max_tokens: number; + "thinking.type": "disabled" | "adaptive"; + "thinking.display": "summarized" | "omitted"; + "output_config.effort": "low" | "medium" | "high" | "xhigh" | "max"; + }; + "anthropic/claude-opus-4-7-subscription": { + max_tokens: number; + "thinking.type": "disabled" | "adaptive"; + "thinking.display": "summarized" | "omitted"; + "output_config.effort": "low" | "medium" | "high" | "xhigh" | "max"; + }; + "anthropic/claude-opus-4-8": { + max_tokens: number; + "thinking.type": "disabled" | "adaptive"; + "thinking.display": "summarized" | "omitted"; + "output_config.effort": "low" | "medium" | "high" | "xhigh" | "max"; + }; + "anthropic/claude-opus-4-8-subscription": { + max_tokens: number; + "thinking.type": "disabled" | "adaptive"; + "thinking.display": "summarized" | "omitted"; + "output_config.effort": "low" | "medium" | "high" | "xhigh" | "max"; + }; + "anthropic/claude-opus-4-subscription": { + max_tokens: number; + temperature: number; + top_p: number; + top_k: number; + "thinking.type": "disabled" | "adaptive" | "enabled"; + "thinking.budget_tokens": number; + }; + "anthropic/claude-sonnet-4-20250514": { + max_tokens: number; + temperature: number; + top_p: number; + top_k: number; + "thinking.type": "disabled" | "enabled"; + "thinking.budget_tokens": number; + "thinking.display": "summarized" | "omitted"; + }; + "anthropic/claude-sonnet-4-20250514-subscription": { + max_tokens: number; + temperature: number; + top_p: number; + top_k: number; + "thinking.type": "disabled" | "enabled"; + "thinking.budget_tokens": number; + "thinking.display": "summarized" | "omitted"; + }; + "anthropic/claude-sonnet-4-5": { + max_tokens: number; + temperature: number; + top_p: number; + top_k: number; + "thinking.type": "disabled" | "adaptive" | "enabled"; + "thinking.budget_tokens": number; + }; + "anthropic/claude-sonnet-4-5-20250929": { + max_tokens: number; + temperature: number; + top_p: number; + top_k: number; + "thinking.type": "disabled" | "enabled"; + "thinking.budget_tokens": number; + }; + "anthropic/claude-sonnet-4-5-20250929-subscription": { + max_tokens: number; + temperature: number; + top_p: number; + top_k: number; + "thinking.type": "disabled" | "enabled"; + "thinking.budget_tokens": number; + }; + "anthropic/claude-sonnet-4-5-subscription": { + max_tokens: number; + temperature: number; + top_p: number; + top_k: number; + "thinking.type": "disabled" | "adaptive" | "enabled"; + "thinking.budget_tokens": number; + }; + "anthropic/claude-sonnet-4-6": { + max_tokens: number; + temperature: number; + top_p: number; + top_k: number; + "thinking.type": "disabled" | "adaptive" | "enabled"; + "thinking.budget_tokens": number; + "thinking.display": "summarized" | "omitted"; + "output_config.effort": "low" | "medium" | "high" | "max"; + }; + "anthropic/claude-sonnet-4-6-subscription": { + max_tokens: number; + temperature: number; + top_p: number; + top_k: number; + "thinking.type": "disabled" | "adaptive" | "enabled"; + "thinking.budget_tokens": number; + "thinking.display": "summarized" | "omitted"; + "output_config.effort": "low" | "medium" | "high" | "max"; + }; + "anthropic/claude-sonnet-4-subscription": { + max_tokens: number; + temperature: number; + top_p: number; + top_k: number; + "thinking.type": "disabled" | "adaptive" | "enabled"; + "thinking.budget_tokens": number; + }; + "cohere/command-a-03-2025": { + max_tokens: number; + stop_sequences: string; + temperature: number; + p: number; + k: number; + frequency_penalty: number; + presence_penalty: number; + seed: number; + "response_format.type": "text" | "json_object"; + logprobs: boolean; + tool_choice: "REQUIRED" | "NONE"; + safety_mode: "CONTEXTUAL" | "STRICT"; + }; + "cohere/command-a-plus-05-2026": { + max_tokens: number; + stop_sequences: string; + temperature: number; + p: number; + k: number; + frequency_penalty: number; + presence_penalty: number; + seed: number; + "response_format.type": "text" | "json_object"; + logprobs: boolean; + tool_choice: "REQUIRED" | "NONE"; + safety_mode: "CONTEXTUAL" | "STRICT"; + }; + "cohere/command-a-reasoning-08-2025": { + max_tokens: number; + stop_sequences: string; + temperature: number; + p: number; + k: number; + frequency_penalty: number; + presence_penalty: number; + seed: number; + "thinking.type": "enabled" | "disabled"; + "thinking.token_budget": number; + "response_format.type": "text" | "json_object"; + logprobs: boolean; + tool_choice: "REQUIRED" | "NONE"; + safety_mode: "CONTEXTUAL" | "STRICT"; + }; + "cohere/command-a-translate-08-2025": { + max_tokens: number; + stop_sequences: string; + temperature: number; + p: number; + k: number; + frequency_penalty: number; + presence_penalty: number; + seed: number; + "response_format.type": "text" | "json_object"; + logprobs: boolean; + tool_choice: "REQUIRED" | "NONE"; + safety_mode: "CONTEXTUAL" | "STRICT"; + }; + "cohere/command-a-vision-07-2025": { + max_tokens: number; + stop_sequences: string; + temperature: number; + p: number; + k: number; + frequency_penalty: number; + presence_penalty: number; + seed: number; + "response_format.type": "text" | "json_object"; + logprobs: boolean; + tool_choice: "REQUIRED" | "NONE"; + safety_mode: "CONTEXTUAL" | "STRICT"; + }; + "cohere/command-r-08-2024": { + max_tokens: number; + stop_sequences: string; + temperature: number; + p: number; + k: number; + frequency_penalty: number; + presence_penalty: number; + seed: number; + "response_format.type": "text" | "json_object"; + logprobs: boolean; + safety_mode: "CONTEXTUAL" | "STRICT" | "OFF"; + }; + "cohere/command-r-plus-08-2024": { + max_tokens: number; + stop_sequences: string; + temperature: number; + p: number; + k: number; + frequency_penalty: number; + presence_penalty: number; + seed: number; + "response_format.type": "text" | "json_object"; + logprobs: boolean; + safety_mode: "CONTEXTUAL" | "STRICT" | "OFF"; + }; + "cohere/command-r7b-12-2024": { + max_tokens: number; + stop_sequences: string; + temperature: number; + p: number; + k: number; + frequency_penalty: number; + presence_penalty: number; + seed: number; + "response_format.type": "text" | "json_object"; + logprobs: boolean; + tool_choice: "REQUIRED" | "NONE"; + safety_mode: "CONTEXTUAL" | "STRICT"; + }; + "deepseek/deepseek-chat": { + max_tokens: number; + temperature: number; + top_p: number; + "thinking.type": "disabled" | "enabled"; + }; + "deepseek/deepseek-reasoner": { + max_tokens: number; + temperature: number; + top_p: number; + "thinking.type": "enabled" | "disabled"; + reasoning_effort: "high" | "max"; + }; + "deepseek/deepseek-v4-flash": { + max_tokens: number; + temperature: number; + top_p: number; + "thinking.type": "enabled" | "disabled"; + reasoning_effort: "high" | "max"; + }; + "deepseek/deepseek-v4-pro": { + max_tokens: number; + temperature: number; + top_p: number; + "thinking.type": "enabled" | "disabled"; + reasoning_effort: "high" | "max"; + }; + "google/gemini-2.5-flash": { + "generationConfig.maxOutputTokens": number; + "generationConfig.temperature": number; + "generationConfig.topP": number; + "generationConfig.topK": number; + "generationConfig.seed": number; + "generationConfig.thinkingConfig.thinkingBudget": number; + "generationConfig.thinkingConfig.includeThoughts": boolean; + "generationConfig.responseMimeType": "text/plain" | "application/json"; + }; + "google/gemini-2.5-flash-lite": { + "generationConfig.maxOutputTokens": number; + "generationConfig.temperature": number; + "generationConfig.topP": number; + "generationConfig.topK": number; + "generationConfig.seed": number; + "generationConfig.thinkingConfig.thinkingBudget": number; + "generationConfig.thinkingConfig.includeThoughts": boolean; + "generationConfig.responseMimeType": "text/plain" | "application/json"; + }; + "google/gemini-2.5-flash-lite-subscription": { + "generationConfig.maxOutputTokens": number; + "generationConfig.temperature": number; + "generationConfig.topP": number; + "generationConfig.topK": number; + "generationConfig.seed": number; + "generationConfig.thinkingConfig.thinkingBudget": number; + "generationConfig.thinkingConfig.includeThoughts": boolean; + "generationConfig.responseMimeType": "text/plain" | "application/json"; + }; + "google/gemini-2.5-flash-subscription": { + "generationConfig.maxOutputTokens": number; + "generationConfig.temperature": number; + "generationConfig.topP": number; + "generationConfig.topK": number; + "generationConfig.seed": number; + "generationConfig.thinkingConfig.thinkingBudget": number; + "generationConfig.thinkingConfig.includeThoughts": boolean; + "generationConfig.responseMimeType": "text/plain" | "application/json"; + }; + "google/gemini-2.5-pro": { + "generationConfig.maxOutputTokens": number; + "generationConfig.temperature": number; + "generationConfig.topP": number; + "generationConfig.topK": number; + "generationConfig.seed": number; + "generationConfig.thinkingConfig.thinkingBudget": number; + "generationConfig.thinkingConfig.includeThoughts": boolean; + "generationConfig.responseMimeType": "text/plain" | "application/json"; + }; + "google/gemini-2.5-pro-subscription": { + "generationConfig.maxOutputTokens": number; + "generationConfig.temperature": number; + "generationConfig.topP": number; + "generationConfig.topK": number; + "generationConfig.seed": number; + "generationConfig.thinkingConfig.thinkingBudget": number; + "generationConfig.thinkingConfig.includeThoughts": boolean; + "generationConfig.responseMimeType": "text/plain" | "application/json"; + }; + "google/gemini-3-flash-preview-subscription": { + "generationConfig.maxOutputTokens": number; + "generationConfig.temperature": number; + "generationConfig.topP": number; + "generationConfig.topK": number; + "generationConfig.seed": number; + "generationConfig.thinkingConfig.thinkingLevel": "minimal" | "low" | "medium" | "high"; + "generationConfig.thinkingConfig.includeThoughts": boolean; + "generationConfig.responseMimeType": "text/plain" | "application/json"; + }; + "google/gemini-3.1-flash-lite-preview-subscription": { + "generationConfig.maxOutputTokens": number; + "generationConfig.temperature": number; + "generationConfig.topP": number; + "generationConfig.topK": number; + "generationConfig.seed": number; + "generationConfig.thinkingConfig.thinkingLevel": "minimal" | "low" | "medium" | "high"; + "generationConfig.thinkingConfig.includeThoughts": boolean; + "generationConfig.responseMimeType": "text/plain" | "application/json"; + }; + "google/gemini-3.1-flash-lite-subscription": { + "generationConfig.maxOutputTokens": number; + "generationConfig.temperature": number; + "generationConfig.topP": number; + "generationConfig.topK": number; + "generationConfig.seed": number; + "generationConfig.thinkingConfig.thinkingLevel": "minimal" | "low" | "medium" | "high"; + "generationConfig.thinkingConfig.includeThoughts": boolean; + "generationConfig.responseMimeType": "text/plain" | "application/json"; + }; + "google/gemini-3.1-pro-preview-subscription": { + "generationConfig.maxOutputTokens": number; + "generationConfig.temperature": number; + "generationConfig.topP": number; + "generationConfig.topK": number; + "generationConfig.seed": number; + "generationConfig.thinkingConfig.thinkingLevel": "low" | "high"; + "generationConfig.thinkingConfig.includeThoughts": boolean; + "generationConfig.responseMimeType": "text/plain" | "application/json"; + }; + "google/gemini-3.5-flash": { + "generationConfig.maxOutputTokens": number; + "generationConfig.temperature": number; + "generationConfig.topP": number; + "generationConfig.topK": number; + "generationConfig.seed": number; + "generationConfig.thinkingConfig.thinkingLevel": "minimal" | "low" | "medium" | "high"; + "generationConfig.thinkingConfig.includeThoughts": boolean; + "generationConfig.responseMimeType": "text/plain" | "application/json"; + }; + "meta/Llama-3.3-70B-Instruct": { + max_completion_tokens: number; + temperature: number; + top_p: number; + top_k: number; + repetition_penalty: number; + "response_format.type": "text" | "json_schema"; + tool_choice: "auto" | "none" | "required"; + }; + "meta/Llama-3.3-8B-Instruct": { + max_completion_tokens: number; + temperature: number; + top_p: number; + top_k: number; + repetition_penalty: number; + "response_format.type": "text" | "json_schema"; + tool_choice: "auto" | "none" | "required"; + }; + "meta/Llama-4-Maverick-17B-128E-Instruct-FP8": { + max_completion_tokens: number; + temperature: number; + top_p: number; + top_k: number; + repetition_penalty: number; + "response_format.type": "text" | "json_schema"; + tool_choice: "auto" | "none" | "required"; + }; + "meta/Llama-4-Scout-17B-16E-Instruct-FP8": { + max_completion_tokens: number; + temperature: number; + top_p: number; + top_k: number; + repetition_penalty: number; + "response_format.type": "text" | "json_schema"; + tool_choice: "auto" | "none" | "required"; + }; + "minimax/minimax-m2": { + max_completion_tokens: number; + temperature: number; + top_p: number; + reasoning_split: boolean; + }; + "minimax/MiniMax-M2-subscription": { + max_tokens: number; + temperature: number; + top_p: number; + }; + "minimax/minimax-m2.1": { + max_completion_tokens: number; + temperature: number; + top_p: number; + reasoning_split: boolean; + }; + "minimax/minimax-m2.1-highspeed": { + max_completion_tokens: number; + temperature: number; + top_p: number; + reasoning_split: boolean; + }; + "minimax/MiniMax-M2.1-highspeed-subscription": { + max_tokens: number; + temperature: number; + top_p: number; + }; + "minimax/MiniMax-M2.1-subscription": { + max_tokens: number; + temperature: number; + top_p: number; + }; + "minimax/minimax-m2.5": { + max_completion_tokens: number; + temperature: number; + top_p: number; + reasoning_split: boolean; + }; + "minimax/minimax-m2.5-highspeed": { + max_completion_tokens: number; + temperature: number; + top_p: number; + reasoning_split: boolean; + }; + "minimax/MiniMax-M2.5-highspeed-subscription": { + max_tokens: number; + temperature: number; + top_p: number; + }; + "minimax/MiniMax-M2.5-subscription": { + max_tokens: number; + temperature: number; + top_p: number; + }; + "minimax/minimax-m2.7": { + max_completion_tokens: number; + temperature: number; + top_p: number; + reasoning_split: boolean; + }; + "minimax/minimax-m2.7-highspeed": { + max_completion_tokens: number; + temperature: number; + top_p: number; + reasoning_split: boolean; + }; + "minimax/MiniMax-M2.7-highspeed-subscription": { + max_tokens: number; + temperature: number; + top_p: number; + }; + "minimax/MiniMax-M2.7-subscription": { + max_tokens: number; + temperature: number; + top_p: number; + }; + "minimax/minimax-m3": { + max_completion_tokens: number; + temperature: number; + top_p: number; + reasoning_split: boolean; + }; + "minimax/MiniMax-M3-subscription": { + max_tokens: number; + temperature: number; + top_p: number; + }; + "mistral/codestral-latest": { + max_tokens: number; + stop: string; + temperature: number; + top_p: number; + random_seed: number; + presence_penalty: number; + frequency_penalty: number; + "response_format.type": "text" | "json_object"; + safe_prompt: boolean; + }; + "mistral/devstral-2512": { + max_tokens: number; + stop: string; + temperature: number; + top_p: number; + random_seed: number; + presence_penalty: number; + frequency_penalty: number; + "response_format.type": "text" | "json_object"; + safe_prompt: boolean; + }; + "mistral/devstral-latest": { + max_tokens: number; + stop: string; + temperature: number; + top_p: number; + random_seed: number; + presence_penalty: number; + frequency_penalty: number; + "response_format.type": "text" | "json_object"; + safe_prompt: boolean; + }; + "mistral/magistral-medium-latest": { + max_tokens: number; + stop: string; + temperature: number; + top_p: number; + random_seed: number; + presence_penalty: number; + frequency_penalty: number; + prompt_mode: "reasoning"; + "response_format.type": "text" | "json_object"; + safe_prompt: boolean; + }; + "mistral/magistral-small-latest": { + max_tokens: number; + stop: string; + temperature: number; + top_p: number; + random_seed: number; + presence_penalty: number; + frequency_penalty: number; + prompt_mode: "reasoning"; + "response_format.type": "text" | "json_object"; + safe_prompt: boolean; + }; + "mistral/ministral-14b-latest": { + max_tokens: number; + stop: string; + temperature: number; + top_p: number; + random_seed: number; + presence_penalty: number; + frequency_penalty: number; + "response_format.type": "text" | "json_object"; + safe_prompt: boolean; + }; + "mistral/ministral-3b-latest": { + max_tokens: number; + stop: string; + temperature: number; + top_p: number; + random_seed: number; + presence_penalty: number; + frequency_penalty: number; + "response_format.type": "text" | "json_object"; + safe_prompt: boolean; + }; + "mistral/ministral-8b-latest": { + max_tokens: number; + stop: string; + temperature: number; + top_p: number; + random_seed: number; + presence_penalty: number; + frequency_penalty: number; + "response_format.type": "text" | "json_object"; + safe_prompt: boolean; + }; + "mistral/mistral-large-latest": { + max_tokens: number; + stop: string; + temperature: number; + top_p: number; + random_seed: number; + presence_penalty: number; + frequency_penalty: number; + "response_format.type": "text" | "json_object"; + safe_prompt: boolean; + }; + "mistral/mistral-medium-3.5": { + max_tokens: number; + stop: string; + temperature: number; + top_p: number; + random_seed: number; + presence_penalty: number; + frequency_penalty: number; + "response_format.type": "text" | "json_object"; + safe_prompt: boolean; + }; + "mistral/mistral-medium-latest": { + max_tokens: number; + stop: string; + temperature: number; + top_p: number; + random_seed: number; + presence_penalty: number; + frequency_penalty: number; + "response_format.type": "text" | "json_object"; + safe_prompt: boolean; + }; + "mistral/mistral-small-latest": { + max_tokens: number; + stop: string; + temperature: number; + top_p: number; + random_seed: number; + presence_penalty: number; + frequency_penalty: number; + "response_format.type": "text" | "json_object"; + safe_prompt: boolean; + }; + "mistral/open-mistral-nemo": { + max_tokens: number; + stop: string; + temperature: number; + top_p: number; + random_seed: number; + presence_penalty: number; + frequency_penalty: number; + "response_format.type": "text" | "json_object"; + safe_prompt: boolean; + }; + "moonshot/kimi-k2.5": { + max_completion_tokens: number; + "thinking.type": "enabled" | "disabled"; + "response_format.type": "text" | "json_object"; + }; + "moonshot/kimi-k2.6": { + max_completion_tokens: number; + "thinking.type": "enabled" | "disabled"; + "response_format.type": "text" | "json_object"; + }; + "moonshot/moonshot-v1-128k": { + max_completion_tokens: number; + temperature: number; + top_p: number; + n: number; + presence_penalty: number; + frequency_penalty: number; + "response_format.type": "text" | "json_object"; + }; + "moonshot/moonshot-v1-32k": { + max_completion_tokens: number; + temperature: number; + top_p: number; + n: number; + presence_penalty: number; + frequency_penalty: number; + "response_format.type": "text" | "json_object"; + }; + "moonshot/moonshot-v1-8k": { + max_completion_tokens: number; + temperature: number; + top_p: number; + n: number; + presence_penalty: number; + frequency_penalty: number; + "response_format.type": "text" | "json_object"; + }; + "openai/chatgpt-4o-latest": { + max_tokens: number; + temperature: number; + top_p: number; + }; + "openai/gpt-3.5-turbo": { + max_tokens: number; + temperature: number; + top_p: number; + }; + "openai/gpt-4-turbo": { + max_tokens: number; + temperature: number; + top_p: number; + }; + "openai/gpt-4-turbo-2024-04-09": { + max_tokens: number; + temperature: number; + top_p: number; + }; + "openai/gpt-4.1": { + max_tokens: number; + temperature: number; + top_p: number; + }; + "openai/gpt-4.1-mini": { + max_tokens: number; + temperature: number; + top_p: number; + }; + "openai/gpt-4.1-nano": { + max_tokens: number; + temperature: number; + top_p: number; + }; + "openai/gpt-4o": { + max_tokens: number; + temperature: number; + top_p: number; + }; + "openai/gpt-4o-2024-11-20": { + max_tokens: number; + temperature: number; + top_p: number; + }; + "openai/gpt-4o-mini": { + max_tokens: number; + temperature: number; + top_p: number; + }; + "openai/gpt-5": { + max_completion_tokens: number; + reasoning_effort: "minimal" | "low" | "medium" | "high"; + }; + "openai/gpt-5-chat-latest": { + max_completion_tokens: number; + }; + "openai/gpt-5-mini": { + max_completion_tokens: number; + reasoning_effort: "minimal" | "low" | "medium" | "high"; + }; + "openai/gpt-5-nano": { + max_completion_tokens: number; + reasoning_effort: "minimal" | "low" | "medium" | "high"; + }; + "openai/gpt-5.1": { + max_completion_tokens: number; + reasoning_effort: "none" | "low" | "medium" | "high"; + }; + "openai/gpt-5.1-codex-max-subscription": { + "reasoning.effort": "minimal" | "low" | "medium" | "high" | "xhigh"; + "reasoning.summary": "auto" | "concise" | "detailed" | "none"; + "text.verbosity": "low" | "medium" | "high"; + }; + "openai/gpt-5.1-codex-subscription": { + "reasoning.effort": "minimal" | "low" | "medium" | "high"; + "reasoning.summary": "auto" | "concise" | "detailed" | "none"; + "text.verbosity": "low" | "medium" | "high"; + }; + "openai/gpt-5.2": { + max_completion_tokens: number; + reasoning_effort: "none" | "low" | "medium" | "high" | "xhigh"; + }; + "openai/gpt-5.2-codex-subscription": { + "reasoning.effort": "minimal" | "low" | "medium" | "high" | "xhigh"; + "reasoning.summary": "auto" | "concise" | "detailed" | "none"; + "text.verbosity": "low" | "medium" | "high"; + }; + "openai/gpt-5.2-subscription": { + "reasoning.effort": "minimal" | "low" | "medium" | "high" | "xhigh"; + "reasoning.summary": "auto" | "concise" | "detailed" | "none"; + "text.verbosity": "low" | "medium" | "high"; + }; + "openai/gpt-5.3-codex": { + max_completion_tokens: number; + reasoning_effort: "low" | "medium" | "high" | "xhigh"; + }; + "openai/gpt-5.3-codex-spark-subscription": { + "reasoning.effort": "minimal" | "low" | "medium" | "high" | "xhigh"; + "reasoning.summary": "auto" | "concise" | "detailed" | "none"; + "text.verbosity": "low" | "medium" | "high"; + }; + "openai/gpt-5.3-codex-subscription": { + "reasoning.effort": "minimal" | "low" | "medium" | "high" | "xhigh"; + "reasoning.summary": "auto" | "concise" | "detailed" | "none"; + "text.verbosity": "low" | "medium" | "high"; + }; + "openai/gpt-5.4": { + max_completion_tokens: number; + reasoning_effort: "none" | "low" | "medium" | "high" | "xhigh"; + }; + "openai/gpt-5.4-mini": { + max_completion_tokens: number; + reasoning_effort: "none" | "low" | "medium" | "high" | "xhigh"; + }; + "openai/gpt-5.4-mini-subscription": { + "reasoning.effort": "minimal" | "low" | "medium" | "high" | "xhigh"; + "reasoning.summary": "auto" | "concise" | "detailed" | "none"; + "text.verbosity": "low" | "medium" | "high"; + }; + "openai/gpt-5.4-nano": { + max_completion_tokens: number; + reasoning_effort: "none" | "low" | "medium" | "high" | "xhigh"; + }; + "openai/gpt-5.4-pro": { + max_completion_tokens: number; + reasoning_effort: "medium" | "high" | "xhigh"; + }; + "openai/gpt-5.4-pro-subscription": { + "reasoning.effort": "medium" | "high" | "xhigh"; + "reasoning.summary": "auto" | "concise" | "detailed" | "none"; + "text.verbosity": "low" | "medium" | "high"; + }; + "openai/gpt-5.4-subscription": { + "reasoning.effort": "minimal" | "low" | "medium" | "high" | "xhigh"; + "reasoning.summary": "auto" | "concise" | "detailed" | "none"; + "text.verbosity": "low" | "medium" | "high"; + }; + "openai/gpt-5.5": { + max_completion_tokens: number; + reasoning_effort: "none" | "low" | "medium" | "high" | "xhigh"; + }; + "openai/gpt-5.5-pro": { + max_completion_tokens: number; + reasoning_effort: "medium" | "high" | "xhigh"; + }; + "openai/gpt-5.5-pro-subscription": { + "reasoning.effort": "medium" | "high" | "xhigh"; + "reasoning.summary": "auto" | "concise" | "detailed" | "none"; + "text.verbosity": "low" | "medium" | "high"; + }; + "openai/gpt-5.5-subscription": { + "reasoning.effort": "minimal" | "low" | "medium" | "high" | "xhigh"; + "reasoning.summary": "auto" | "concise" | "detailed" | "none"; + "text.verbosity": "low" | "medium" | "high"; + }; + "openai/o1": { + max_completion_tokens: number; + reasoning_effort: "low" | "medium" | "high" | "xhigh"; + }; + "openai/o1-mini": { + max_tokens: number; + reasoning_effort: "minimal" | "low" | "medium" | "high"; + }; + "openai/o1-preview": { + max_tokens: number; + reasoning_effort: "minimal" | "low" | "medium" | "high"; + }; + "openai/o3": { + max_completion_tokens: number; + reasoning_effort: "low" | "medium" | "high" | "xhigh"; + }; + "openai/o3-mini": { + max_completion_tokens: number; + reasoning_effort: "low" | "medium" | "high" | "xhigh"; + }; + "openai/o3-pro": { + max_completion_tokens: number; + reasoning_effort: "low" | "medium" | "high" | "xhigh"; + }; + "openai/o4-mini": { + max_completion_tokens: number; + reasoning_effort: "low" | "medium" | "high" | "xhigh"; + }; + "perplexity/sonar": { + max_tokens: number; + temperature: number; + top_p: number; + search_mode: "web" | "academic" | "sec"; + search_recency_filter: "hour" | "day" | "week" | "month" | "year"; + search_domain_filter: string; + search_after_date_filter: string; + search_before_date_filter: string; + "web_search_options.search_context_size": "low" | "medium" | "high"; + return_images: boolean; + return_related_questions: boolean; + disable_search: boolean; + }; + "perplexity/sonar-deep-research": { + max_tokens: number; + temperature: number; + top_p: number; + reasoning_effort: "minimal" | "low" | "medium" | "high"; + search_mode: "web" | "academic" | "sec"; + search_recency_filter: "hour" | "day" | "week" | "month" | "year"; + search_domain_filter: string; + search_after_date_filter: string; + search_before_date_filter: string; + "web_search_options.search_context_size": "low" | "medium" | "high"; + return_images: boolean; + return_related_questions: boolean; + }; + "perplexity/sonar-pro": { + max_tokens: number; + temperature: number; + top_p: number; + search_mode: "web" | "academic" | "sec"; + search_recency_filter: "hour" | "day" | "week" | "month" | "year"; + search_domain_filter: string; + search_after_date_filter: string; + search_before_date_filter: string; + "web_search_options.search_context_size": "low" | "medium" | "high"; + return_images: boolean; + return_related_questions: boolean; + disable_search: boolean; + }; + "perplexity/sonar-reasoning-pro": { + max_tokens: number; + temperature: number; + top_p: number; + search_mode: "web" | "academic" | "sec"; + search_recency_filter: "hour" | "day" | "week" | "month" | "year"; + search_domain_filter: string; + search_after_date_filter: string; + search_before_date_filter: string; + "web_search_options.search_context_size": "low" | "medium" | "high"; + return_images: boolean; + return_related_questions: boolean; + disable_search: boolean; + }; + "xai/grok-4.20-0309-non-reasoning": { + max_completion_tokens: number; + temperature: number; + top_p: number; + seed: number; + stop: string; + "response_format.type": "text" | "json_object" | "json_schema"; + }; + "xai/grok-4.20-0309-reasoning": { + max_completion_tokens: number; + temperature: number; + top_p: number; + seed: number; + "response_format.type": "text" | "json_object" | "json_schema"; + }; + "xai/grok-4.20-multi-agent-0309": { + max_output_tokens: number; + temperature: number; + top_p: number; + "reasoning.effort": "low" | "medium" | "high" | "xhigh"; + "text.format.type": "text" | "json_object" | "json_schema"; + }; + "xai/grok-4.3": { + max_completion_tokens: number; + temperature: number; + top_p: number; + seed: number; + reasoning_effort: "none" | "low" | "medium" | "high"; + "response_format.type": "text" | "json_object" | "json_schema"; + }; + "xai/grok-build-0.1": { + max_completion_tokens: number; + temperature: number; + top_p: number; + seed: number; + "response_format.type": "text" | "json_object" | "json_schema"; + }; + "z-ai/glm-4.5": { + max_tokens: number; + temperature: number; + top_p: number; + do_sample: boolean; + "thinking.type": "enabled" | "disabled"; + "response_format.type": "text" | "json_object"; + }; + "z-ai/glm-4.5-air": { + max_tokens: number; + temperature: number; + top_p: number; + do_sample: boolean; + "thinking.type": "enabled" | "disabled"; + "response_format.type": "text" | "json_object"; + }; + "z-ai/glm-4.5-air-subscription": { + max_tokens: number; + temperature: number; + top_p: number; + do_sample: boolean; + "thinking.type": "enabled" | "disabled"; + "response_format.type": "text" | "json_object"; + }; + "z-ai/glm-4.5-airx": { + max_tokens: number; + temperature: number; + top_p: number; + do_sample: boolean; + "thinking.type": "enabled" | "disabled"; + "response_format.type": "text" | "json_object"; + }; + "z-ai/glm-4.5-flash": { + max_tokens: number; + temperature: number; + top_p: number; + do_sample: boolean; + "thinking.type": "enabled" | "disabled"; + "response_format.type": "text" | "json_object"; + }; + "z-ai/glm-4.5-subscription": { + max_tokens: number; + temperature: number; + top_p: number; + do_sample: boolean; + "thinking.type": "enabled" | "disabled"; + "response_format.type": "text" | "json_object"; + }; + "z-ai/glm-4.5-x": { + max_tokens: number; + temperature: number; + top_p: number; + do_sample: boolean; + "thinking.type": "enabled" | "disabled"; + "response_format.type": "text" | "json_object"; + }; + "z-ai/glm-4.6": { + max_tokens: number; + temperature: number; + top_p: number; + do_sample: boolean; + "thinking.type": "enabled" | "disabled"; + "response_format.type": "text" | "json_object"; + }; + "z-ai/glm-4.6-subscription": { + max_tokens: number; + temperature: number; + top_p: number; + do_sample: boolean; + "thinking.type": "enabled" | "disabled"; + "response_format.type": "text" | "json_object"; + }; + "z-ai/glm-4.7": { + max_tokens: number; + temperature: number; + top_p: number; + do_sample: boolean; + "thinking.type": "enabled" | "disabled"; + "response_format.type": "text" | "json_object"; + }; + "z-ai/glm-4.7-flash": { + max_tokens: number; + temperature: number; + top_p: number; + do_sample: boolean; + "thinking.type": "enabled" | "disabled"; + "response_format.type": "text" | "json_object"; + }; + "z-ai/glm-4.7-flashx": { + max_tokens: number; + temperature: number; + top_p: number; + do_sample: boolean; + "thinking.type": "enabled" | "disabled"; + "response_format.type": "text" | "json_object"; + }; + "z-ai/glm-4.7-subscription": { + max_tokens: number; + temperature: number; + top_p: number; + do_sample: boolean; + "thinking.type": "enabled" | "disabled"; + "response_format.type": "text" | "json_object"; + }; + "z-ai/glm-5": { + max_tokens: number; + temperature: number; + top_p: number; + do_sample: boolean; + "thinking.type": "enabled" | "disabled"; + "response_format.type": "text" | "json_object"; + }; + "z-ai/glm-5-subscription": { + max_tokens: number; + temperature: number; + top_p: number; + do_sample: boolean; + "thinking.type": "enabled" | "disabled"; + "response_format.type": "text" | "json_object"; + }; + "z-ai/glm-5-turbo": { + max_tokens: number; + temperature: number; + top_p: number; + do_sample: boolean; + "thinking.type": "enabled" | "disabled"; + "response_format.type": "text" | "json_object"; + }; + "z-ai/glm-5-turbo-subscription": { + max_tokens: number; + temperature: number; + top_p: number; + do_sample: boolean; + "thinking.type": "enabled" | "disabled"; + "response_format.type": "text" | "json_object"; + }; + "z-ai/glm-5.1": { + max_tokens: number; + temperature: number; + top_p: number; + do_sample: boolean; + "thinking.type": "enabled" | "disabled"; + "response_format.type": "text" | "json_object"; + }; + "z-ai/glm-5.1-subscription": { + max_tokens: number; + temperature: number; + top_p: number; + do_sample: boolean; + "thinking.type": "enabled" | "disabled"; + "response_format.type": "text" | "json_object"; + }; +}; diff --git a/packages/modelparams/src/helpers.ts b/packages/modelparams/src/helpers.ts new file mode 100644 index 0000000..a1d0334 --- /dev/null +++ b/packages/modelparams/src/helpers.ts @@ -0,0 +1,63 @@ +import { BY_ID, CATALOG, type CatalogEntry } from "./generated/data.js"; +import { DEFAULTS } from "./generated/defaults.js"; +import { MODEL_IDS, type ModelId, type Provider } from "./generated/model-ids.js"; + +/** + * Return the catalog entry for a model id. The returned object includes the + * provider, authType, and the full list of parameters with their ranges, + * defaults, enum values, applicability rules, etc. + * + * @example + * const m = getModel("anthropic/claude-haiku-4-5-20251001"); + * m.params.forEach((p) => console.log(p.path, p.type)); + */ +export function getModel(id: ModelId): CatalogEntry { + return BY_ID[id]; +} + +/** + * Return the catalog-declared defaults for a model id. Only parameters that + * declare a `default` in the catalog appear in the returned object. + * + * @example + * const defaults = getDefaults("anthropic/claude-haiku-4-5-20251001"); + * // { max_tokens: 4096, temperature: 1, top_p: 1, top_k: 0, "thinking.type": "disabled", ... } + */ +export function getDefaults(id: Id): (typeof DEFAULTS)[Id] { + return DEFAULTS[id]; +} + +/** + * List model ids, optionally filtered by provider. Order matches the canonical + * sort used in the catalog (alphabetical by `provider/model`). + * + * @example + * for (const id of listModels({ provider: "anthropic" })) { ... } + */ +export function listModels(opts: { provider?: Provider } = {}): readonly ModelId[] { + if (!opts.provider) return MODEL_IDS; + const prefix = `${opts.provider}/`; + return MODEL_IDS.filter((id) => id.startsWith(prefix)); +} + +/** + * Look up a specific parameter's catalog definition (range, enum values, + * description, applicability rules). Returns `undefined` if the model doesn't + * declare that parameter. + * + * @example + * const thinking = getParam("anthropic/claude-haiku-4-5-20251001", "thinking.type"); + * if (thinking?.type === "enum") console.log(thinking.values); + */ +export function getParam(id: ModelId, path: string): CatalogEntry["params"][number] | undefined { + return BY_ID[id].params.find((p) => p.path === path); +} + +/** + * Iterate every catalog entry. Equivalent to importing `CATALOG` directly but + * available as a function for callers that prefer not to pull in the runtime + * data symbol explicitly. + */ +export function listAllModels(): readonly CatalogEntry[] { + return CATALOG; +} diff --git a/packages/modelparams/src/index.ts b/packages/modelparams/src/index.ts new file mode 100644 index 0000000..7cfae9b --- /dev/null +++ b/packages/modelparams/src/index.ts @@ -0,0 +1,10 @@ +export type { ParamsOf, StrictParamsOf } from "./types.js"; +export type { ModelId, Provider } from "./generated/model-ids.js"; +export type { ParamsById } from "./generated/params-by-id.js"; +export type { CatalogEntry } from "./generated/data.js"; + +export { MODEL_IDS, PROVIDERS } from "./generated/model-ids.js"; +export { DEFAULTS } from "./generated/defaults.js"; +export { CATALOG, BY_ID } from "./generated/data.js"; + +export { getModel, getDefaults, listModels, getParam, listAllModels } from "./helpers.js"; diff --git a/packages/modelparams/src/types.ts b/packages/modelparams/src/types.ts new file mode 100644 index 0000000..19569ee --- /dev/null +++ b/packages/modelparams/src/types.ts @@ -0,0 +1,25 @@ +import type { ModelId } from "./generated/model-ids.js"; +import type { ParamsById } from "./generated/params-by-id.js"; + +/** + * Parameters a builder can pass when calling a given model. Every key is + * optional — set the ones you want to override and let the SDK or provider + * apply its own default for the rest. + * + * Compile-time errors on unknown keys and invalid enum values. + * + * @example + * import type { ParamsOf } from "modelparams"; + * const params: ParamsOf<"anthropic/claude-haiku-4-5-20251001"> = { + * max_tokens: 4096, + * "thinking.type": "enabled", + * }; + */ +export type ParamsOf = Partial; + +/** + * Fully-specified parameter shape for a given model id. Every catalog-declared + * parameter is required. Useful when round-tripping defaults + overrides + * through the type system. + */ +export type StrictParamsOf = ParamsById[Id]; diff --git a/packages/modelparams/test-d/types.test-d.ts b/packages/modelparams/test-d/types.test-d.ts new file mode 100644 index 0000000..de81786 --- /dev/null +++ b/packages/modelparams/test-d/types.test-d.ts @@ -0,0 +1,26 @@ +import { expectAssignable, expectError, expectType } from "tsd"; +import type { ParamsOf } from "../dist/index.js"; + +type Haiku = ParamsOf<"anthropic/claude-haiku-4-5-20251001">; + +// Allowed: any subset of declared parameters +expectAssignable({}); +expectAssignable({ max_tokens: 4096 }); +expectAssignable({ + max_tokens: 4096, + temperature: 0.7, + "thinking.type": "enabled", +}); + +// Enum values are narrowed to the catalog's literal union +expectError({ "thinking.type": "off" }); + +// Unknown keys are rejected +expectError({ definitely_not_a_param: 1 }); + +// Wrong type for a known key is rejected +expectError({ max_tokens: "lots" }); + +// All keys are optional (we use Partial) +const empty: Haiku = {}; +expectType(empty); diff --git a/packages/modelparams/tests/runtime.test.ts b/packages/modelparams/tests/runtime.test.ts new file mode 100644 index 0000000..2bf4f09 --- /dev/null +++ b/packages/modelparams/tests/runtime.test.ts @@ -0,0 +1,114 @@ +import { describe, expect, it } from "vitest"; +import { + BY_ID, + CATALOG, + DEFAULTS, + MODEL_IDS, + PROVIDERS, + getDefaults, + getModel, + getParam, + listAllModels, + listModels, +} from "../src/index.js"; + +const HAIKU = "anthropic/claude-haiku-4-5-20251001" as const; + +describe("MODEL_IDS / PROVIDERS", () => { + it("contains at least one model and one provider", () => { + expect(MODEL_IDS.length).toBeGreaterThan(0); + expect(PROVIDERS.length).toBeGreaterThan(0); + }); + + it("includes the Anthropic Haiku 4.5 model id", () => { + expect(MODEL_IDS).toContain(HAIKU); + }); + + it("contains only kebab-case provider slugs", () => { + for (const p of PROVIDERS) { + expect(p).toMatch(/^[a-z0-9][a-z0-9-]*$/); + } + }); + + it("contains no duplicate model ids", () => { + expect(new Set(MODEL_IDS).size).toBe(MODEL_IDS.length); + }); +}); + +describe("CATALOG / BY_ID", () => { + it("CATALOG has the same length as MODEL_IDS", () => { + expect(CATALOG.length).toBe(MODEL_IDS.length); + }); + + it("BY_ID has an entry for every model id", () => { + for (const id of MODEL_IDS) { + expect(BY_ID[id]).toBeDefined(); + } + }); + + it("BY_ID is read-only at runtime", () => { + expect(Object.isFrozen(BY_ID)).toBe(true); + }); +}); + +describe("getModel", () => { + it("returns the expected model entry", () => { + const m = getModel(HAIKU); + expect(m.provider).toBe("anthropic"); + expect(m.authType).toBe("api_key"); + expect(m.model).toBe("claude-haiku-4-5-20251001"); + expect(m.params.length).toBeGreaterThan(0); + }); +}); + +describe("getDefaults", () => { + it("includes max_tokens=4096 for Haiku 4.5", () => { + const d = getDefaults(HAIKU); + expect(d.max_tokens).toBe(4096); + }); + + it("uses the catalog default for enum params", () => { + const d = getDefaults(HAIKU); + expect(d["thinking.type"]).toBe("disabled"); + }); + + it("matches DEFAULTS[id] directly", () => { + expect(getDefaults(HAIKU)).toBe(DEFAULTS[HAIKU]); + }); +}); + +describe("listModels", () => { + it("returns the full list when no provider is given", () => { + expect(listModels()).toBe(MODEL_IDS); + }); + + it("filters by provider", () => { + const anthropic = listModels({ provider: "anthropic" }); + expect(anthropic.length).toBeGreaterThan(0); + for (const id of anthropic) { + expect(id.startsWith("anthropic/")).toBe(true); + } + }); +}); + +describe("getParam", () => { + it("returns the parameter definition for a known path", () => { + const p = getParam(HAIKU, "thinking.type"); + expect(p).toBeDefined(); + expect(p?.type).toBe("enum"); + if (p?.type === "enum") { + expect(p.values).toEqual(expect.arrayContaining(["disabled", "enabled"])); + } + }); + + it("returns undefined for an unknown path", () => { + const p = getParam(HAIKU, "definitely.not.a.param"); + expect(p).toBeUndefined(); + }); +}); + +describe("listAllModels", () => { + it("returns the CATALOG", () => { + expect(listAllModels()).toBe(CATALOG); + }); +}); diff --git a/packages/modelparams/tests/version.test.ts b/packages/modelparams/tests/version.test.ts new file mode 100644 index 0000000..81319b8 --- /dev/null +++ b/packages/modelparams/tests/version.test.ts @@ -0,0 +1,126 @@ +import { describe, expect, it } from "vitest"; +import type { Model } from "../../../src/schema/model.js"; +import { bumpVersion, canonicalCatalog, decideBump } from "../scripts/lib/version.js"; + +const baseModel: Model = { + provider: "anthropic", + authType: "api_key", + model: "claude-test", + params: [ + { + path: "max_tokens", + label: "Max tokens", + description: "Max tokens", + group: "generation_length", + type: "integer", + default: 4096, + }, + { + path: "temperature", + label: "Temperature", + description: "Sampling temperature", + group: "sampling", + type: "number", + default: 1, + }, + ], +}; + +const baseCanon = canonicalCatalog([baseModel]); + +describe("decideBump", () => { + it("returns major when a parameter is removed", () => { + const current: Model = { + ...baseModel, + params: baseModel.params.filter((p) => p.path !== "temperature"), + }; + expect( + decideBump({ + baseCanon, + currentCanon: canonicalCatalog([current]), + hasRemovals: true, + }), + ).toBe("major"); + }); + + it("returns patch when a parameter is added", () => { + const current: Model = { + ...baseModel, + params: [ + ...baseModel.params, + { + path: "top_p", + label: "Top P", + description: "Nucleus sampling cutoff", + group: "sampling", + type: "number", + default: 1, + }, + ], + }; + expect( + decideBump({ + baseCanon, + currentCanon: canonicalCatalog([current]), + hasRemovals: false, + }), + ).toBe("patch"); + }); + + it("returns patch when a default changes", () => { + const current: Model = { + ...baseModel, + params: baseModel.params.map((p) => (p.path === "max_tokens" ? { ...p, default: 8192 } : p)), + }; + expect( + decideBump({ + baseCanon, + currentCanon: canonicalCatalog([current]), + hasRemovals: false, + }), + ).toBe("patch"); + }); + + it("returns patch when a new model is added", () => { + const sibling: Model = { ...baseModel, model: "claude-other" }; + expect( + decideBump({ + baseCanon, + currentCanon: canonicalCatalog([baseModel, sibling]), + hasRemovals: false, + }), + ).toBe("patch"); + }); + + it("returns null when nothing semantic changed", () => { + expect( + decideBump({ + baseCanon, + currentCanon: canonicalCatalog([baseModel]), + hasRemovals: false, + }), + ).toBeNull(); + }); + + it("is stable across param order", () => { + const reordered: Model = { ...baseModel, params: [...baseModel.params].reverse() }; + expect(canonicalCatalog([reordered])).toBe(baseCanon); + }); +}); + +describe("bumpVersion", () => { + it("bumps major resets minor and patch", () => { + expect(bumpVersion("0.3.4", "major")).toBe("1.0.0"); + expect(bumpVersion("1.2.7", "major")).toBe("2.0.0"); + }); + + it("bumps patch increments only the patch segment", () => { + expect(bumpVersion("0.0.0", "patch")).toBe("0.0.1"); + expect(bumpVersion("1.2.7", "patch")).toBe("1.2.8"); + }); + + it("throws on a non-semver string", () => { + expect(() => bumpVersion("v1.2.3", "patch")).toThrow(); + expect(() => bumpVersion("1.2", "patch")).toThrow(); + }); +}); diff --git a/packages/modelparams/tsconfig.build.json b/packages/modelparams/tsconfig.build.json new file mode 100644 index 0000000..cc5774c --- /dev/null +++ b/packages/modelparams/tsconfig.build.json @@ -0,0 +1,6 @@ +{ + "extends": "./tsconfig.json", + "compilerOptions": { + "noEmit": false + } +} diff --git a/packages/modelparams/tsconfig.json b/packages/modelparams/tsconfig.json new file mode 100644 index 0000000..83543ad --- /dev/null +++ b/packages/modelparams/tsconfig.json @@ -0,0 +1,14 @@ +{ + "extends": "../../tsconfig.json", + "compilerOptions": { + "rootDir": "./src", + "outDir": "./dist", + "declaration": true, + "declarationMap": true, + "sourceMap": true, + "composite": false, + "paths": {} + }, + "include": ["src/**/*.ts"], + "exclude": ["node_modules", "dist", "tests", "scripts"] +} diff --git a/packages/modelparams/vitest.config.ts b/packages/modelparams/vitest.config.ts new file mode 100644 index 0000000..ad1485e --- /dev/null +++ b/packages/modelparams/vitest.config.ts @@ -0,0 +1,10 @@ +import { defineConfig } from "vitest/config"; + +export default defineConfig({ + test: { + environment: "node", + include: ["tests/**/*.test.ts"], + globals: false, + reporters: "default", + }, +}); diff --git a/src/data/check-removals.ts b/src/data/check-removals.ts index 3cbbeb1..801c8a8 100644 --- a/src/data/check-removals.ts +++ b/src/data/check-removals.ts @@ -1,31 +1,9 @@ -import { execFileSync } from "node:child_process"; -import fs from "node:fs/promises"; -import os from "node:os"; -import path from "node:path"; -import type { Model } from "../schema/model.js"; import { loadAllModels } from "./load.js"; -import { REPO_ROOT } from "./paths.js"; +import { loadModelsAtRef, refExists } from "./git-baseline.js"; import { findRemovedParams, type ParamRemoval } from "./removals.js"; const OVERRIDE_LABEL = "allow-param-removal"; -function git(args: string[]): string { - return execFileSync("git", args, { - cwd: REPO_ROOT, - encoding: "utf8", - maxBuffer: 64 * 1024 * 1024, - }); -} - -function refExists(ref: string): boolean { - try { - git(["rev-parse", "--verify", "--quiet", `${ref}^{commit}`]); - return true; - } catch { - return false; - } -} - function argBase(): string | undefined { const eq = process.argv.find((a) => a.startsWith("--base=")); if (eq) return eq.slice("--base=".length); @@ -46,27 +24,6 @@ function resolveBaseRef(): string | null { return null; } -/** Materialize the `models/` tree at `ref` into a temp dir and load it. */ -async function loadModelsAtRef(ref: string): Promise { - const listing = git(["ls-tree", "-r", "--name-only", ref, "--", "models"]).trim(); - const files = listing ? listing.split("\n").filter((f) => /\.ya?ml$/i.test(f)) : []; - if (files.length === 0) return []; - - const tmp = await fs.mkdtemp(path.join(os.tmpdir(), "mp-baseline-")); - try { - for (const file of files) { - const content = git(["show", `${ref}:${file}`]); - const dest = path.join(tmp, ...file.split("/")); - await fs.mkdir(path.dirname(dest), { recursive: true }); - await fs.writeFile(dest, content, "utf8"); - } - const { models } = await loadAllModels(path.join(tmp, "models")); - return models; - } finally { - await fs.rm(tmp, { recursive: true, force: true }); - } -} - function reportRemovals(removals: ParamRemoval[], baseRef: string): void { console.error(`\n✖ Parameter removal detected vs ${baseRef} — blocked.\n`); console.error( diff --git a/src/data/git-baseline.ts b/src/data/git-baseline.ts new file mode 100644 index 0000000..bbd5a8e --- /dev/null +++ b/src/data/git-baseline.ts @@ -0,0 +1,50 @@ +import { execFileSync } from "node:child_process"; +import fs from "node:fs/promises"; +import os from "node:os"; +import path from "node:path"; +import type { Model } from "../schema/model.js"; +import { loadAllModels } from "./load.js"; +import { REPO_ROOT } from "./paths.js"; + +/** Run a git command from the repo root and return its stdout. */ +export function git(args: string[]): string { + return execFileSync("git", args, { + cwd: REPO_ROOT, + encoding: "utf8", + maxBuffer: 64 * 1024 * 1024, + }); +} + +/** Return true if `ref` resolves to a commit. */ +export function refExists(ref: string): boolean { + try { + git(["rev-parse", "--verify", "--quiet", `${ref}^{commit}`]); + return true; + } catch { + return false; + } +} + +/** + * Materialize the `models/` tree at `ref` into a temp dir and load it. Returns + * an empty array when `ref` has no catalog (e.g. before the catalog existed). + */ +export async function loadModelsAtRef(ref: string): Promise { + const listing = git(["ls-tree", "-r", "--name-only", ref, "--", "models"]).trim(); + const files = listing ? listing.split("\n").filter((f) => /\.ya?ml$/i.test(f)) : []; + if (files.length === 0) return []; + + const tmp = await fs.mkdtemp(path.join(os.tmpdir(), "mp-baseline-")); + try { + for (const file of files) { + const content = git(["show", `${ref}:${file}`]); + const dest = path.join(tmp, ...file.split("/")); + await fs.mkdir(path.dirname(dest), { recursive: true }); + await fs.writeFile(dest, content, "utf8"); + } + const { models } = await loadAllModels(path.join(tmp, "models")); + return models; + } finally { + await fs.rm(tmp, { recursive: true, force: true }); + } +} diff --git a/src/views/index.ejs b/src/views/index.ejs index df633a0..ffaa580 100644 --- a/src/views/index.ejs +++ b/src/views/index.ejs @@ -12,6 +12,30 @@ variants of the same model are listed separately, because they behave differently.

+ +