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.
+
+